当前位置:   article > 正文

ROS编程深入理解(Python)_ros python

ros python

参考

  • 官方的wiki http://wiki.ros.org/cn/ROS/Tutorials/
  • 中文ROS教程社区 https://www.ncnynl.com/
  • 之前没有详细看官方的wiki,而是选择看网上的课程,现在看来是错误的,不过也是一个学习的过程。
    在这里插入图片描述

ROS构建工作空间

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

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

ROS基本命令

节点

$ roscore
  • 1

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

$ rosnode list
  • 1

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

$ rosnode info /节点名
  • 1

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

$ rosrun turtlesim turtlesim_node __name:=my_turtle
  • 1

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

$ rosnode ping 节点名
  • 1

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

话题

$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
  • 1
  • 2
  • 3

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

$ rosrun rqt_graph rqt_graph 
  • 1

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

$ rostopic -h
  • 1

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

$ rostopic list
  • 1

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

rostopic echo /turtle1/cmd_vel
  • 1

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

linear: 
  x: 2.0  #x方向前进2
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

$ rostopic list -v
  • 1

为了查看更详细的信息使用上面的命令,当然还有其他命令,-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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

消息

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

$ rostopic type /turtle1/cmd_vel
  • 1

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

$ rosmsg show geometry_msgs/Twist
  • 1

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

geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

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

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

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

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

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

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

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

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

$ rostopic echo /turtle1/pose
  • 1

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

$ rostopic hz /turtle1/pose
  • 1

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

$ rostopic type /turtle1/cmd_vel | rosmsg show
  • 1

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

$ rosrun rqt_plot rqt_plot
  • 1

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

服务

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

$ rosservice -h
  • 1

新命令的第一课,

$ rosservice list
  • 1

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

$ rosservice type /clear
  • 1

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

$ rosservice call /clear
  • 1

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

$ rosservice type /spawn | rossrv show
  • 1

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

$ rosservice call /spawn 2 2 0.2 "myturtle"
  • 1

参数

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

$ rosparam -h
  • 1

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

$ rosparam list
  • 1

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

$ rosparam set /turtlesim/background_r 150
  • 1

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

$ rosservice call /clear
  • 1

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

$ rosparam get /turtlesim/background_g 
  • 1

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

$ rosparam get /
  • 1

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

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

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

日志

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

$ rosrun rqt_console rqt_console
$ rosrun rqt_logger_level rqt_logger_level
  • 1
  • 2

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

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

Fatal (致命)
Error (错误)
Warn  (警告)
Info  (信息)
Debug (调试)
  • 1
  • 2
  • 3
  • 4
  • 5

launch文件

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

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

roscd 自己的功能空间名
  • 1

然后创建一个launch目录

$ mkdir launch
$ cd launch
  • 1
  • 2

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

touch turtlemimic.launch 
  • 1

这样我们就可以创建一个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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

我们要仔细来看一下这个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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

接下来就要尝试去启动

$ roslaunch 项目名 文件名.launch
  • 1

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

$ roslaunch 文件名.launch
  • 1

在启动的新终端中

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

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

编辑文件

rosed 包名 文件名
  • 1

相当于快速打开该文件的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
  • 1
  • 2
  • 3
  • 4

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

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

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

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
  • 1
  • 2

srv(服务)

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

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

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

int64 A
int64 B
---
int64 Sum

  • 1
  • 2
  • 3
  • 4
  • 5

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/401080
推荐阅读
相关标签
  

闽ICP备14008679号