参考

ROS构建工作空间

这部分因为之前的ROS编程已经很详细了,这里记录一些简单的理解

  • 整体围绕软件包开发,也就是pkg
  • 创建软件包有很多细节,主要是处理依赖的问题,还有保证自己的软件包的完整性,我理解这是一种规范,这样别人使用的时候也很方便。
  • 构建工作空间可以自定义名称,每次修改需要编译
  • 记得source
  • 当你发现你没地方输命令的时候,开新的终端 Ctrl + alt + T 快捷键

ROS基本命令

节点

$ roscore

这是最核心的命令,相当于启动一台机器,深入理解就是,启动rosmaster,这个是方便节点之间通信的,详细请看我的ROS通信那篇文章。

$ rosnode list

这个命令是用来查看当前启动的节点

$ rosnode info /节点名

这个命令当然是用来看节点一些服务、配置等

$ rosrun turtlesim turtlesim_node __name:=my_turtle

ROS中节点是不能重名的,原因是显而易见的,上面是自定义节点名的方法

$ rosnode ping 节点名

这个用来测试节点的通信情况,当然和操作系统的差不多

话题

$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key

上面就启动了可以用键盘控制的小海龟

$ rosrun rqt_graph rqt_graph 

此时启动ros的一个节点图展示窗口,就可以看到他们之间的关系

$ rostopic -h

上面命令用来查看话题命令的帮助,当然基本上所有你不懂的命令,都可以用这个-h,包括linux中的,这是一个通用做法。

$ rostopic list

可以查看当前运行的话题,我们可以知道,通常用于移动通信的话题是/cmd_vel,如果启动了小海龟,就可以看到

rostopic echo /turtle1/cmd_vel

这是一个等待的程序,当话题有信息的时候,就会输出,例如

linear: 
x: 2.0 #x方向前进2
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0

当然此时我们在计算图即rqt_grah中就可以看到有,话题被新的节点订阅

$ rostopic list -v

为了查看更详细的信息使用上面的命令,当然还有其他命令,-h自行查看,输出大概是下面的样子

Published topics:
* /turtle1/color_sensor [turtlesim/Color] 2 publishers
* /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
* /rosout [rosgraph_msgs/Log] 4 publishers
* /rosout_agg [rosgraph_msgs/Log] 1 publisher
* /turtle1/pose [turtlesim/Pose] 2 publishers

Subscribed topics:
* /turtle1/cmd_vel [geometry_msgs/Twist] 3 subscribers
* /rosout [rosgraph_msgs/Log] 1 subscriber

消息

刚才看到了话题通信,那么这些通信的到底是什么呢?是一种数据结构,具体的类型可以查看。

$ rostopic type /turtle1/cmd_vel

上面查看节点的类型信息,但是还不是很详细

$ rosmsg show geometry_msgs/Twist

这样我们就可以看到具体的数据类型的定义,海龟移动的类型是这样的:

geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z

我们知道了类型和结构,就可以用ros中的命令来控制海龟移动,而不是用键盘。

$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

这样我们就可以看到海龟在移动,原理就是利用了消息通信

但是我们还是要分析一下参数

rostopic pub  # 发布命令
-1 # 发几条,-1为只发一条
/turtle1/cmd_vel # 要发布的话题名
geometry_msgs/Twist # 选用的消息类型
-- # 告诉解析器之后的不是命令
'[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]' # 发送的内容,是YAML语言

yaml是一种用来表式数据结构的标记语言

但是上面的命令只能让它动一次,要想连续移动需要给更多参数

$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'

此时在rqt_graph中,我们可以看到有新的节点传给/turtlesim这个节点数据,而且我们还可以查看这种位置的变化

$ rostopic echo /turtle1/pose

这个是获取了/turtlesim的pose话题不断输出位置

$ rostopic hz /turtle1/pose

先查看一下,当前话题报告的速率,一般大约是60hz

$ rostopic type /turtle1/cmd_vel | rosmsg show

当然Linux的管道一样可以在ros的命令中使用,ros和Linux结合的非常好的

$ rosrun rqt_plot rqt_plot

此时,我们想分析一下当前的运动轨迹,则可以使用上面的命令,输出的是一个不断更新的pose状态波动图,用来分析机器人的轨迹

服务

服务(Services)是节点之间通讯的另一种方式。服务允许节点发送一个请求(request)并获得一个响应(response)

$ rosservice -h

新命令的第一课,

$ rosservice list

先查看一下所有的服务,选一个感兴趣的我们深入研究一下,比如clear

$ rosservice type /clear

返回的是 std_srvs/Empty,表示该服务不需要参数,我们可以直接使用,那我们就试试

$ rosservice call /clear

此时你会发现小海龟的轨迹没了,我们再来看看其他服务比如spawn

$ rosservice type /spawn | rossrv show

返回的是数据结构,我们根据数据结构可以定义命令,来创建新的海龟这是这个方法的意思

$ rosservice call /spawn 2 2 0.2 "myturtle"

参数

又来了新命令,根据标题我们就知道命令是干嘛用的,传递参数

$ rosparam -h

当然我们同样可以用list看一下有哪些参数

$ rosparam list

通过参数,可以知道我们能够改变的内容,比如改变颜色

$ rosparam set /turtlesim/background_r 150

这样我们就改变了参数,但是这样并不会导致界面变化,需要刷新一下

$ rosservice call /clear

当然我们可以set就可以get,同样的方法即可获取对应参数的具体值

$ rosparam get /turtlesim/background_g 

这样我们想想是不是有这样一个服务器,管理着所有的参数,确实是有的,这样我们就可以查看参数

$ rosparam get /

得到了参数后,我们可以用命令存储和载入

$ rosparam dump params.yaml #写入文件
$ rosparam load params.yaml copy_turtle

载入的时候,需要指定命名空间,我们新建了一个命名空间copy_turtle,这样我们就可以获取其中的值了。

日志

rqt_console连接到了ROS的日志框架,以显示节点的输出信息。

$ rosrun rqt_console rqt_console
$ rosrun rqt_logger_level rqt_logger_level

执行上面的命令,启动了两个日志控制窗口,用于管理日志,就是记录当前的变化,状态、报错之类的。

当然还有记录了日志的级别

Fatal (致命)
Error (错误)
Warn (警告)
Info (信息)
Debug (调试)

launch文件

这里我们要详细的了解一下,launch文件具体发挥的作用和使用方法

这里首先要创建一个自己的工作空间,然后到其目录下,如果不会创建,还是去看ROS编程那个文章

roscd 自己的功能空间名

然后创建一个launch目录

$ mkdir launch
$ cd launch

launch文件并不是必须写道launch文件夹中,只是通用做法,系统会自动查找

touch turtlemimic.launch 

这样我们就可以创建一个launch文件,文件的内容先放置如下

<launch>
<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>

<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>

<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>

</launch>

我们要仔细来看一下这个launch文件的内容的具体含义

<launch> 表示是lacunch文件
<group ns="turtlesim1"> 创建分组1,ns表示通过命名空间区分,命名为turtlesim1
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<group ns="turtlesim2"> 创建分组2,ns表示通过命名空间区分,命名为turtlesim2
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
都有相同的名为sim的turtlesim节点。这样可以让我们同时启动两个turtlesim模拟器,而不会产生命名冲突。
<node pkg="turtlesim" name="mimic" type="mimic">
启动模仿节点,话题的输入和输出分别重命名为turtlesim1和turtlesim2,这样就可以让turtlesim2模仿turtlesim1了。
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>
</launch>

接下来就要尝试去启动

$ roslaunch 项目名 文件名.launch

如果是在工作空间中直接创建的,则可以直接使用

$ roslaunch 文件名.launch

在启动的新终端中

$ rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'

当前就实现了一个模仿的模型,也可以使用rqt_graph来看到计算图

编辑文件

rosed 包名 文件名

相当于快速打开该文件的vim,因此需要vim支持,安装即可

通过在输入指令时,通过按tab键获取更多内容选择

创建ROS消息服务

msg(消息)

msg文件就是文本文件,用于描述ROS消息的字段。它们用于为不同编程语言编写的消息生成源代码。

存放在msg文件夹下

msg文件就是简单的文本文件,每行都有一个字段类型和字段名称。可以使用的类型为:

  • int8, int16, int32, int64 (以及 uint*)
  • float32, float64
  • string
  • time, duration
  • 其他msg文件
  • variable-length array[] 和 fixed-length array[C]

ROS中还有一个特殊的数据类型:Header,它含有时间戳和ROS中广泛使用的坐标帧信息。在msg文件的第一行经常可以看到Header header。

下面是一个msg文件的样例,它使用了Header,string,和其他另外两个消息的类型:

Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist

在软件包中定义新的消息,在软件包中创建msg目录,执行

$ roscd 你的软件包
$ mkdir msg
$ echo "int64 num" > msg/Num.msg

此时创建了一个简单的msg文件,但是需要被编译转换,则需要在package.xml中添加

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

srv(服务)

一个srv文件描述一个服务。它由两部分组成:请求(request)和响应(response)。

简单理解,srv和msg就是数据结构,用于不同的场景,方便信息交互

srv常见的文件样例, — 号之前是请求,Sum是响应:

int64 A
int64 B
---
int64 Sum

… 开始的部分已经很详细了,接下来还是需要跟着wiki继续完成,去练习,只要要点我才会记录。

http://wiki.ros.org/cn/ROS/Tutorials/CreatingMsgAndSrv