赞
踩
这部分因为之前的ROS编程已经很详细了,这里记录一些简单的理解
$ mkdir -p ~/catkin_ws/src #必须包含src
$ cd ~/catkin_ws/
$ catkin_make
$ 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文件具体发挥的作用和使用方法
这里首先要创建一个自己的工作空间,然后到其目录下,如果不会创建,还是去看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键获取更多内容选择
msg文件就是文本文件,用于描述ROS消息的字段。它们用于为不同编程语言编写的消息生成源代码。
存放在msg文件夹下
msg文件就是简单的文本文件,每行都有一个字段类型和字段名称。可以使用的类型为:
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文件描述一个服务。它由两部分组成:请求(request)和响应(response)。
简单理解,srv和msg就是数据结构,用于不同的场景,方便信息交互
srv常见的文件样例, — 号之前是请求,Sum是响应:
int64 A
int64 B
---
int64 Sum
… 开始的部分已经很详细了,接下来还是需要跟着wiki继续完成,去练习,只要要点我才会记录。
http://wiki.ros.org/cn/ROS/Tutorials/CreatingMsgAndSrv
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。