ROS学习笔记一

ROS学习笔记一

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总线
这张图是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则会出现下图:
rqt_graph
这里我运行了乌龟模拟器和键盘操控乌龟的指令出现了上述图片,如果将鼠标放置到节点或话题名称上还会有颜色区分。

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 只会录制制定的话题。

参考文献

[1] 百度: 百度百科.[X] 总线
[2] CSDN: 还是羊脂球.[B] CAN总线详解

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥杨同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值