其他分享
首页 > 其他分享> > 唐浩原3.11--3.18学习记录

唐浩原3.11--3.18学习记录

作者:互联网

本周已完成
1.搭建好ubuntu18.4.2环境
2.搭建好Ros相关的环境
3.完成Ros2.0相关核心概念和命令行等基本知识的学习
4.实现了publisher发送topic,完成subscriber订阅的功能
5.leetcode刷题&&题解(C++)
6.github博客的搭建(暂未上传具体代码,项目已经创建好了,后面整理好一起上传):
https://github.com/functionctf/Ros-connected-material

文章目录


学习过程记录&&感悟

ubuntu18.4.2环境配置

01.ubuntu18.4.2配置还算顺利,但是中间也遇到了各种各样的问题。比如下载相关软件的拓展包过慢,通过自己一番摸索,换成了国内更快的镜像源网站,下载速度问题就解决了。
具体参照的csdn博客是:

https://blog.csdn.net/weixin_41762173/article/details/79480832?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161605740716780264018007%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161605740716780264018007&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-79480832.pc_search_result_no_baidu_js&utm_term=ubuntu%E9%95%9C%E5%83%8F%E6%BA%90

02.学习刚开始的时候出现ubuntu连不上网的问题,遂去csdn上进行搜索。试了很多方法都不管用…最后与室友的交流下,突然想到可能是自己的vmware的相关服务没有开。。。
win+r 启动services.msc
把NAT,DHCP等与ubuntu的网络相关的服务打开,问题解决
在ba这里插入图片描述![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210318165955253.png
ubuntu终于连上网了

搭建好Ros相关的环境

1.刚开始搭建好ubuntu,单纯的认为ROS很快就解决了,没想到遇到了极大的阻力。一度花了将近两天的时间。
问题是下面这这行命令:
sudo apt install ros-melodic-desktop-full
无论怎么尝试,总是安装不上
以及rosdep init 或者rosdep update 连接错误

提示的是 ERROR: unable to process source
网上的90%教程都是提示要改一个美国的ip通过进行访问下载资源。
后面发现根本没有用。
最终是乖乖到github上下载一个压缩文件rosdistro-master到本地。然后ubuntu指向本地资源,成功解决这个报错。

具体操作步骤参看这个大佬的blog
https://blog.csdn.net/xwmrqqq/article/details/114292547
(这个网站应该是2021年2月份进行永久性迁移了,所以按照之前的方法根本行不通,目前想要完成这个命令行的运行,靠ubuntu到外网上下载是不现实的)

ROS相关概念&&功能的实现

本人首先对ROS的概念进行学习,进行了一些简单的个人总结
Ros是什么?
提高机器人研发中的软件复用率
Ros=通信机制+开发工具+应用功能+生态系统

开发工具:
命令行&编译器,tf左边变换,qt工具箱,rviz

应用功能:
导航,
Navigation导航
Slam建图 深度学习,imu信息,里程计信息
Movelt!:运动计划

生态系统:
ros-wiki ros文档论坛
Ros answers

ROS核心概念:
1.节点:
2.执行单元:执行具体任务的可执行文件
不同节点可用不同的语言,分布于不同的主机中
3.节点管理器:控制中心,负责节点的管理和参数服务器的维护
为节点提供命名和注册服务

节点之间的通信方式:
1.话题通信(异步通信:无法得知发布者和订阅者之间的时效性)
在这里插入图片描述

发布者(publisher)发布消息(Message,具有一定的数据结构),通过topic(重要的数据传输总线,相当于导线),订阅者(subscriber)订阅,最终通过远端的上位机观看数据情况(同样需要订阅数据)

2.服务(service)通信(同步通信)
在这里插入图片描述
参数:

全局共享字典:用来存放参数

文件系统

ROS命令行工具使用方式

Rostopic
Rosservice
Rosnode
Rosparam
Rosmsg
Rossrv

功能的实现就是小海龟模型案例。通过键入上下左右键(给一个vel_cmd),publisher发送topic话题消息,随后subscriber进行订阅。之后的衍生是通过C++代码实现publish和subscribe。
roscore:首先启动Rosmaster,运行ros节点管理器

rosrun turtlesim turtlesim_node打开小海龟仿真器
解释:rosrun运行某个功能包turtlesim中某个节点(双击tab显示所有节点,选择合适的turtlesim_node)的指令

rosrun turtlesim turtle_teleop_key打开键盘控制节点

分析工具
1.rqt_graph:topic可视化,方便理解清楚话题之间的关系
在这里插入图片描述

Teleop代表键盘节点,数据通讯通过topic(turtle1话题,内容是cmd_vel速度,代表键盘控制的上下左右),turtlesim小海龟仿真器节点订阅

3.ros_node查看存在的命令,进行下一步输入
Rosnode list列出所有的节点
Rosnode info /xxx查看具体节点的信息
rostopic检查topic相关的信息
Rostopic list检查存在且活跃的所有topic信息

任务:给话题发布命令,让海龟动起来
ros pub +话题名(通过tab键补全) +具体的内容(双击tab完成),修改默认数据,单位是m/s,rad/s
Rostopic pub 只能发布一次
为了能让海龟一直运动
比如:rostopic pub -r 10 …
-r 代表rate是速度,10代表赫兹,一秒钟发布十次,这样小海龟就能一直运动了

查看消息的数据结构
Rosmsg show xxxx
在这里插入图片描述

前面的是用topic来进行的,现在学习查看服务相关的数据
Rosservice list
Rosservice call /spawn…(tab键补齐)
Call代表发出服务端消息,相当于打电话给客户端
在这里插入图片描述

创建了另一个海龟,同时命名为2,下面的几乎重复的命令相当于接收方接到电话之后的respones

话题记录,话题复现
意义在于,记录一次实验的数据,然后保存下来,到实验室中进行话题复现,进行数据的修改和完善

rosbag record -a -O cmd_record
-a代表存储all数据,O代表压缩,压缩文件名为cmd_record

回车,记录数据准备就绪

我们随便控制海龟的运动情况

完成之后按ctrl+c
数据保存在终端的默认路径下面

接下来进行复现
Rescore开启节点管理器,然后无需键盘控制节点,只需打开仿真器节点
运行Rosbag play cmd_record.bag即可复现之前的指令

问题复现
https://blog.csdn.net/qq_43310597/article/details/106008565?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

创建功能空间与功能包
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

完成publisher方的编程

C++实现发布者的创建

Publisher发布成功

订阅者subscribe端功能的实现

在python中实现订阅

补充:具体的C++代码如下:
publisher端:

/**
 * 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
 */
 
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>

int main(int argc, char **argv)
{
	// ROS节点初始化
	ros::init(argc, argv, "velocity_publisher");

	// 创建节点句柄
	ros::NodeHandle n;

	// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
	ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);

	// 设置循环的频率
	ros::Rate loop_rate(10);

	int count = 0;
	while (ros::ok())
	{
	    // 初始化geometry_msgs::Twist类型的消息
		geometry_msgs::Twist vel_msg;
		vel_msg.linear.x = 0.5;
		vel_msg.angular.z = 0.2;

	    // 发布消息
		turtle_vel_pub.publish(vel_msg);
		ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 
				vel_msg.linear.x, vel_msg.angular.z);

	    // 按照循环频率延时
	    loop_rate.sleep();
	}

	return 0;
}

subscriber端:

/**
 * 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
 */
 
#include <ros/ros.h>
#include "turtlesim/Pose.h"

// 接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
    // 将接收到的消息打印出来
    ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}

int main(int argc, char **argv)
{
    // 初始化ROS节点
    ros::init(argc, argv, "pose_subscriber");

    // 创建节点句柄
    ros::NodeHandle n;

    // 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
    ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);

    // 循环等待回调函数
    ros::spin();

    return 0;
}

最终小海龟就动起来啦
在这里插入图片描述

leetcode题解(简单)

leetcode给我的打击蛮大的。。。
不练不知道,练的时候才发现自己的代码有待提升,就C++而言,很多知识遗忘,题目看到有思路,但是让自己写却写不出来。
就挑了最简单的题目进行了练习:
1.两数之和问题:https://leetcode-cn.com/problems/two-sum/

题目:

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

题解:
拿到这个问题的第一反应是来一个o(n)²级别的循环运算,就是先拿第一个数,然后和后面的所有数进行相加,比对一下是否等于target值。所以等于是暴力求解问题。后面想了一下,如果用target作为被减数,然后用num中的值一一去减它。加入出现的结果中有num样本空间中的子集,问题就很快解决了。题解利用到的vector容器。属于STL库的知识,没有学过,所以还是蛮痛苦的。通过对vector的学习,根据自己的理解解决了问题

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int>record;//记录数据和下标
        for(int i=0; i < nums.size(); i++) {
            int difference = target - nums[i];
            if(record.find(difference) != record.end()){//如果target与该数的差能在该数之前的数中找到
                int result[]={record[difference], i};//记录符合条件的两数的下标
                return vector<int>(result, result+2);
            }
            record[nums[i]]=i;
        }
        return{};
    }
};

在这里插入图片描述

总结及下周安排:

1.把ROS相关的知识再温习一下,具体的操作和命令行熟悉
2.leetcode题不能停。。上周配ros和ubuntu花了不少时间,导致leetcode没有达到每周三题的标准。下周继续
3.C++/python的知识进一步学习
4.了解一下slam相关的知识
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

标签:3.18,ROS,--,3.11,topic,msg,vel,ros,节点
来源: https://blog.csdn.net/qq_45618337/article/details/114983513