ROS学习笔记一
- 0、引言
- 1、开始学习ROS
- 1.1、Ubuntu和ROS的安装
- 1.2、[ROS文件系统导览](http://wiki.ros.org/cn/ROS/Tutorials/NavigatingTheFilesystem)
- 1.3 [创建ROS软件包](http://wiki.ros.org/cn/ROS/Tutorials/CreatingPackage)(catkin)
- 1.4 [构建软件包](http://wiki.ros.org/cn/ROS/Tutorials/BuildingPackages)
- 1.5 [理解ROS节点](http://wiki.ros.org/cn/ROS/Tutorials/UnderstandingNodes)
- 1.6、[理解ROS话题](http://wiki.ros.org/cn/ROS/Tutorials/UnderstandingTopics)
- 1.7、[使用rqt_console和roslaunch](http://wiki.ros.org/cn/ROS/Tutorials/UsingRqtconsoleRoslaunch)
- 1.8、[使用rosed在ROS中编辑文件](http://wiki.ros.org/cn/ROS/Tutorials/UsingRosEd)
- 1.9、[创建ROS消息和服务](http://wiki.ros.org/cn/ROS/Tutorials/CreatingMsgAndSrv)
- 1.10、[发布者、订阅者](http://wiki.ros.org/cn/ROS/Tutorials/WritingPublisherSubscriber%28c++%29)和[服务、客户端](http://wiki.ros.org/cn/ROS/Tutorials/WritingServiceClient%28c++%29)
- 1.11、rosbag
- 参考文献
0、引言
之前做过一个使用了ROS的项目,但是在那个项目中ROS并不是主体,只用了一点点,只是各种安装,照着其他人的博客复制粘贴代码,所以对ROS并不了解,我本身是做机器人硬件的,现在机器人绝大多数都使用ROS了我做的一些底层硬件需要和上位机进行talk,所以需要用到ROS_Control,但了解了一下ROS_Control发现想要学这个东西要绕过ROS很难,所以准备系统的学习一下ROS。
0.1、ROS 和ROS2
之前了解到过ROS2,想必是比ROS更先进的新版本吧,我们知道机器人这个行业发展迅速,那么ROS是否将要被淘汰呢?如果要开始学习一个要被淘汰的东西还是很亏的,但查了一写资料后我发现目前阶段,以我的水平还是学ROS比较合适,因为ROS目前已经成熟了,同时入门也比较简单,很多坑都被踩过,当然最重要的还是ROS相对当前的ROS2来说比较成熟。
0.2、ROS版本
ROS版本这里我选择了melodic,ubuntu版本选择的是18。因为之前已经完成了ROS的安装了,这里也就不再从“0”开始了。
0.3、大体了解ROS
首先我选择对ROS进行一个大体的了解,这有助于后面的学习,同时可以让我对ROS 整体有一个基本的了解,同时确定自己需要学习哪部分,避免浪费时间。
0.3.1、知乎一下
首先我在知乎上找到这样一篇文章 《ROS学习入门(抛砖引玉篇)》 这篇文章很好的规划了ROS学习的整体方案,我准备参照这个进行学习,主要还是依靠官方的Tutorial: ROS Tutorials当然也有 中文版
https://zhuanlan.zhihu.com/p/26007106
然后注意到这个博主在做一个项目点开看了下:
https://zhuanlan.zhihu.com/p/26644994
在这篇文章中看到了一个rosserial_arduino,这个包是可以和Arduino单片机进行链接的,它还说到了rosserial,这个包中提供了和STM32单片机连接的方法,所以我决定之后会重点看一下这个包。
1、开始学习ROS
前面提到过,我准备使用ROS官方的tutorials来学习ROS,但我的英语水平不允许我用英文版的学习,所以我选择的是中文版的教程。
1.1、Ubuntu和ROS的安装
这一部分因为在之前项目中安装过,所以这里就直接使用了。
1.2、ROS文件系统导览
记录几个有用的命令:
1、rospack find
$ rospack find [package_name]
用包的名称取代*[package_name]*这个命令可以输出包的路径。
2、roscd
$ roscd [locationname[/subdir]]
输入包的名称后可以直接cd到目标目录下后面加上/
也可以切换到其子目录。
注意,就像ROS中的其它工具一样,roscd只能切换到那些路径已经包含在ROS_PACKAGE_PATH环境变量中的软件包。要查看 ROS_PACKAGE_PATH中包含的路径,可以输入:
$ echo $ROS_PACKAGE_PATH
3、rosls
$ rosls [locationname[/subdir]]
能够直接查看某软件包文件夹下的列表。
上述的命令均属于rosbash命令集有空要都看一下。
4、Tab补全功能
这个功能就是可以直接按Tab补全剩下的内容,比如:
$ roscd roscpp_tut<<<按TAB键>>>
会自动补全
$ roscd roscpp_tutorials/
如果要查看当前安装的所有软件包的列表,你也可以利用TAB补全:
$ rosls <<<双击TAB键>>>
1.3 创建ROS软件包(catkin)
记录一个命令:
1.3.1、查看与rospy
直接相关的依赖包。
$ rospack depends1 rospy
1.3.2、查看与rospy
间接相关的依赖包。
$ rospack depends rospy
二者的区别就是 depends
后有没有“1”。
此外该节还说明了在软件包中一些标签的作用和格式,
1.4 构建软件包
这一节就按照教程一步一步操作,结果没出什么问题,但是过程中遇到了问题
在0.02中 $ catkin_make
后,cmake和make输出的内容与教程中不一样,不过最后的结果是一样的,在这里记录一下,出现问题再来看。
输出内容如下:
$ catkin_make
Base path: /home/waitingforwind/catkin_ws
Source space: /home/waitingforwind/catkin_ws/src
Build space: /home/waitingforwind/catkin_ws/build
Devel space: /home/waitingforwind/catkin_ws/devel
Install space: /home/waitingforwind/catkin_ws/install
####
#### Running command: "make cmake_check_build_system" in "/home/waitingforwind/catkin_ws/build"
####
####
#### Running command: "make -j4 -l4" in "/home/waitingforwind/catkin_ws/build"
####
1.5 理解ROS节点
这一节终于见到了之前安装ROS后测试的小乌龟。
一些知识点:
计算图(Computation Graph)是一个由ROS进程组成的点对点网络,它们能够共同处理数据。ROS的基本计算图概念有节点(Nodes)、主节点(Master)、参数服务器(Parameter Server)、消息(Messages)、服务(Services)、话题(Topics)和袋(Bags),它们都以不同的方式向图(Graph)提供数据。
节点(Nodes):节点是一个可执行文件,它可以通过ROS来与其他节点进行通信。
消息(Messages):订阅或发布话题时所使用的ROS数据类型。
话题(Topics):节点可以将消息发布到话题,或通过订阅话题来接收消息。
主节点(Master):ROS的命名服务,例如帮助节点发现彼此。
rosout:在ROS中相当于stdout/stderr(标准输出/标准错误)。
roscore:主节点 + rosout + 参数服务器(会在以后介绍)。
Tutorials中还给出了一个非常好的例子:
注:节点是ROS中非常重要的一个概念,为了帮助初学者理解这个概念,这里举一个通俗的例子:
例如,咱们有一个机器人,和一个遥控器,那么这个机器人和遥控器开始工作后,就是两个节点。遥控器起到了下达指 令的作用;机器人负责监听遥控器下达的指令,完成相应动作。从这里我们可以看出,节点是一个能执行特定工作任 务的工作单元,并且能够相互通信,从而实现一个机器人系统整体的功能。在这里我们把遥控器和机器人简单定义为两个节点,实际上在机器人中根据控制器、传感器、执行机构等不同组成模块,还可以将其进一步细分为更多的节点,这个是根据用户编写的程序来定义的。)
我通过这个例子:大致理解了节点的概念, 它大致就相当于挂载在一条总线上的各个设备,每一个设备就是一个节点。
上图就是百度百科中总线的图示[1]。
这张图是CAN总线的示意图[2],
刚好在CAN总线中挂载的设备也叫做节点,而根据我的理解这个ROS中的节点和这个类似。
比如我们现在要控制一个AGV,那么我们能想到以下节点,两个电机的控制器分别是两个节点,激光雷达是一个节点,摄像头是一个节点,等等,但实际上我们看到的就只有一台AGV和我们使用的上位机(电脑)。
记录几个命令:
1、roscore
$ roscore
roscore是你在运行所有ROS程序前首先要运行的命令。 不知道是干什么的,刚刚在帮师兄录制.bag文件的 时候就没运行这个命令。
2、rosnode list
$ rosnode list
该命令会列出活动的节点。
3、rosnode info
$ rosnode info /rosout
返回某个特定节点的信息。
4、rosrun
$ rosrun [package_name] [node_name]
可以直接运行某个软件包的某个节点,而不用知道这个节点的路径
5、节点重命名
$ rosrun turtlesim turtlesim_node __name:=my_turtle
将turtlesim_node
节点重命名为my_turtle
6、ping
$ rosnode ping my_turtle
查看my_turtle
节点的延迟,即连接状态。
1.6、理解ROS话题
画个重点这一节我感觉是重中之重,有很多重要的命令在这一节,这里建议直接看原文,我在这里记录一些重要的命令:
1.6.1、使用rqt_graph查看节点、话题之间的关系
在真正使用ROS的机器人中,其节点以及话题的数量非常多,很难对其进行解析,而ROS为我们准备了一个实用的工具:rqt_graph 它可以用图示的的方式展示话题、节点间相互的关系,方便我们梳理他们的关系。
开启命令:
$ rosrun rqt_graph rqt_graph
输入上述命令,如果你的Ubuntu正在运行ROS则会出现下图:
这里我运行了乌龟模拟器和键盘操控乌龟的指令出现了上述图片,如果将鼠标放置到节点或话题名称上还会有颜色区分。
1.6.2、rostopic echo
rostopic echo可以显示在某个话题上发布的数据。
$ rostopic echo [topic]
在使用乌龟模拟器,检测键盘输入话题时,使用这个命令查看时发现执行该命令后终端没有输出任何值,这是因为这个话题还没有任何输入所以这个echo命令不会输出任何东西,当我们切换到键盘输入捕获的窗口,并进行输入时,就会有所反应。
1.6.3、rostopic list
rostopic list能够列出当前已被订阅和发布的所有话题。
该命令有子命令 双击Tab可以查看子命令。
其中
$ rostopic list -v
命令会列出所有发布和订阅的主题及其类型的详细信息。
1.6.4、rostopic type
从这部分开始就要涉及到消息了,目前在我看来ROS的话题就像是一个布告栏,而消息就像便签,各个节点把数据写到便签上放在布告栏上面,而这些便签长得也不一样,有的是寻人启示,有的是招聘,有的是招租。
rostopic type命令用来查看所发布话题的消息类型。
该命令的用法如下:
$ rostopic type [topic]
可以用这个命令来查看发送到键盘捕获话题的消息。
1.6.5、用rosmsg show
这个命令可以查看消息的详细信息。
用法如下
$ rosmsg show [msg]
将1.6.4中查看到的消息作为这个命令的输入,我们看看到返回了两个浮点型的三维向量,分别是乌龟的角速度和线速度。
1.6.6、rostopic pub
rostopic pub可以把数据发布到当前某个正在广播的话题上。
用法如下:
$ rostopic pub [topic] [msg_type] [args]
在如下命令中:
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
这条命令将消息发布到指定的话题:
rostopic pub
这一选项会让rostopic只发布一条消息,然后退出:
-1
这是要发布到的话题的名称:
/turtle1/cmd_vel
这是发布到话题时要使用的消息的类型:
geometry_msgs/Twist
这一选项(两个破折号)用来告诉选项解析器,表明之后的参数都不是选项。如果参数前有破折号(-)比如负数,那么这是必需的。
" --"
如前所述,一个turtlesim/Velocity消息有两个浮点型元素:linear和angular。在本例中,’[2.0, 0.0, 0.0]‘表示linear的值为x=2.0, y=0.0, z=0.0,而’[0.0, 0.0, 1.8]'是说angular的值为x=0.0, y=0.0, z=1.8。这些参数实际上使用的是YAML语法,在YAML命令行文档中有描述。
‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’
用rostopic pub -r
命令可以发布源源不断的命令,若没有子命令-r
则只发送一次,-r
后面的数字为发送的频率单位Hz。
1.6.7、rostopic hz
rostopic hz报告数据发布的速率。
用法:
$ rostopic hz [topic]
1.6.?、双击Tab查看子命令
1.6.?、命令后输入-h
查看命令帮助
rqt_plot的使用
在这里遇到了问题
首先是打开的窗口不正常,与Tutorials的结果不同,点加号之后也没有反应。
后面就报错了。
最后查到了解决方案,是因为缺少了matplotlib这个包安装该包即可,需要根据报错安装python2 or python3版本的matplotlib。
参考博客ubuntu18.04无法使用rqt_plot问题,解决大全
按照这个博客做完后,点加号发现还是没有反应, 是因为窗口太小了,在右下角把窗口托大即可。
1.7、使用rqt_console和roslaunch
这一节主要介绍了标题所述的两个软件包吧,都没太搞懂是干嘛的,
1.8、使用rosed在ROS中编辑文件
rosed是rosbash套件的一部分。利用它可以直接通过软件包名编辑包中的文件,而无需键入完整路径。
用法:
$ rosed [package_name] [filename]
1.9、创建ROS消息和服务
这一节看的我有些迷茫,其实后面的几节都是,不知道到底在干什么,尤其是从修改package.xml文件和CMakeLists.txt文件开始。
他说这样做的目的是:
确保msg文件能被转换为C++、Python和其他语言的源代码。
我觉得应该就像是C语言中的include一样把文件msg文件和srv文件 include进去。
记录几个命令:
1.9.1、用echo命令输出内容到文件
如下命令:
$ echo "int64 num" > msg/Num.msg
向Num.msg文件中输出了 int64 num
的内容。
1.9.2、cd 后退操作
$ cd -
返回到上一次cd
命令时的位置,类似文件管理器中的后退操作。
1.9.3、rosmsg show 和rossrv show 命令
这两个命令用法基本一样这里只列出rosmsg命令。
用法:
$ rosmsg show [message type]
如果忘记msg文件的位置还可以直接输入msg文件的名称,而不用输入包名。
1.10、发布者、订阅者和服务、客户端
这几节的内容,实际上大体相似,实际所做 内容大致类似于用MDK5编写C语言程序时,将c文件和h文件首先加入到工程文件夹,然后对c文件和h文件内容进行编写,然后进行编译这个过程。只不过这些都是在操作系统命令行中完成的,没有 图形界面罢了,这种理解肯定是不对的,但大体上没有什么问题,暂且这样。
1.11、rosbag
之前帮师兄录制过这个bag文件,所以这部分操作还有一点点熟悉。主要记录几个重要命令吧。
$ rosbag record -a
会自动创建一个以当前时间命名的bag文件,-a
表示录制所有的话题。
$ rosbag info <your bagfile>
这个命令可以查看bag文件的详细信息,如录制时间等,例如:
path: 2014-12-10-20-08-34.bag
version: 2.0
duration: 1:38s (98s)
start: Dec 10 2014 20:08:35.83 (1418270915.83)
end: Dec 10 2014 20:10:14.38 (1418271014.38)
size: 865.0 KB
messages: 12471
compression: none [1/1 chunks]
types: geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
rosgraph_msgs/Log [acffd30cd6b6de30f120938c17c593fb]
turtlesim/Color [353891e354491c51aabe32df673fb446]
turtlesim/Pose [863b248d5016ca62ea2e895ae5265cf9]
topics: /rosout 4 msgs : rosgraph_msgs/Log (2 connections)
/turtle1/cmd_vel 169 msgs : geometry_msgs/Twist
/turtle1/color_sensor 6149 msgs : turtlesim/Color
/turtle1/pose 6149 msgs : turtlesim/Pose
bag文件的播放
$ rosbag play -r 2 <your bagfile>
-r
后的参数表示播放的倍率。
--immediate
将以计算机能达到的最快速度回放
录制数据子集
$ rosbag record -O subset /turtle1/cmd_vel /turtle1/pose
-o
表示将数据录制到名为subset
的文件中。
而其后面的topic名字则为本次要录制的topic,如若此做,那么rosbag record
只会录制制定的话题。