ros学习记录(4)——ROS基本流程、命令总结及视频内容补充

对ros通信、服务、功能包相关流程进行梳理,顺便对视频教学内容扩展的地方进行补充

Posted by R on 2023-05-11

前言

到现在ros最基本的流程已经预备了,一些常用的命令也可以梳理总结出来供于参考。另外前几篇笔记均是一边实操一边看书面教程记录的,在教学视频中还有一些我没注意的细节点,打算把视频过一遍,梳理梳理知识点把流程变成自己的东西。

ros 基本流程

功能包及源码创建、编译

  1. 创建工作空间并初始化

    1
    2
    3
    mkdir -p 自定义空间名称/src
    cd 自定义空间名称
    catkin_make
  2. ros包创建及其依赖添加

    1
    2
    cd src
    catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs
  3. 在ros包中添加scripts目录并编辑python文件

    1
    2
    3
    4
    cd ros包
    mkdir scripts
    touch XXX.py
    gedit XXX.py
  4. 为 python 文件添加可执行权限

    1
    chmod +x 自定义文件名.py
  5. 编辑 ros 包下的 CamkeList.txt 文件(直接找到对应部分取消注释修改即可,各种配置语句已经在文件中存在)

    1
    2
    3
    catkin_install_python(PROGRAMS scripts/自定义文件名.py
    DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
    )
  6. 进入工作空间目录并编译

    1
    2
    cd 自定义空间名称
    catkin_make
  7. 进入工作空间目录并执行

    命令行1:

     
    1
    roscore

    命令行2:

     
    1
    2
    3
    cd 工作空间
    source ./devel/setup.bash
    rosrun 包名 自定义文件名.py

整个流程简言之就是:创建工作空间——功能包创建——源码编辑——配置文件——编译并执行。

话题通信自定义msg文件流程(在已有功能包基础上)

  1. 定义msg文件

    功能包下新建msg目录,添加msg文件

    1
    2
    3
    4
    5
    cd 工作空间/src
    mkdir msg
    cd msg
    touch XXX.msg
    gedit XXX.msg

    文件格式如下:

    1
    2
    3
    string XXX
    uint16 XXX
    float64 XXX
  2. 编辑配置文件

package.xml中添加编译依赖与执行依赖

1
2
3
4
5
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
<!--
exce_depend 以前对应的是 run_depend 现在非法
-->

CMakeLists.txt编辑 msg 相关配置(以下内容同样找到对应位置修改即可,位置顺序尽量不要变)

1
2
3
4
5
6
7
8
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
# 需要加入 message_generation,必须有 std_msgs
# 此处添加的是相关包
1
2
3
4
5
## 配置 msg 源文件
add_message_files(
FILES
Person.msg
)
1
2
3
4
5
# 生成消息时依赖于 std_msgs
generate_messages(
DEPENDENCIES
std_msgs
)
1
2
3
4
5
6
7
#执行时依赖
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES demo02_talker_listener
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)

配置完成后编译即可,整体流程为按照相关文件格式创建文件,编辑配置文件,编译生成中间文件

服务通信自定义srv文件流程(在已有功能包基础上)

  1. 定义srv文件

    服务通信中,数据分成两部分,请求与响应,在 srv 文件中请求和响应使用—-分割,具体实现如下:

    1
    2
    3
    4
    5
    cd 工作空间/src
    mkdir srv
    cd srv
    touch XXX.srv
    gedit XXX.srv

    文件格式如下(在 srv 文件中请求和响应使用—-分割):

    1
    2
    3
    4
    5
    6
    # 客户端请求时发送的两个数字
    int32 num1
    int32 num2
    ---
    # 服务器响应发送的数据
    int32 sum
  2. 编辑配置文件

    基本内容和msg文件流程相同,只有配置源文件方面需要改为srv文件,官网没有在 catkin_package 中配置 message_runtime,经测试配置也可以实现。

常用命令行命令

机器人系统中启动的节点少则几个,多则十几个、几十个,不同的节点名称各异,通信时使用话题、服务、消息、参数等等都各不相同,一个显而易见的问题是: 当需要自定义节点和其他某个已经存在的节点通信时,如何获取对方的话题、以及消息载体的格式呢?

在 ROS 同提供了一些实用的命令行工具,可以用于获取不同节点的各类信息,常用的命令如下:

  • rosnode : 操作节点
  • rostopic : 操作话题
  • rosservice : 操作服务
  • rosmsg : 操作 msg 消息
  • rossrv : 操作 srv 消息
  • rosparam : 操作参数

上述命令是动态的,在ROS程序启动后,可以动态的获取运行中的节点或参数的相关信息。

rosnode

rosnode 是用于获取节点信息的命令

1
2
3
4
5
6
rosnode ping    测试到节点的连接状态
rosnode list 列出活动节点
rosnode info 打印节点信息
rosnode machine 列出指定设备上节点
rosnode kill 杀死某个节点
rosnode cleanup 清除不可连接的节点

rostopic

rostopic 包含 rostopic 命令行工具,用于显示有关 ROS 主题的调试信息,包括发布者,订阅者,发布频率和 ROS 消息。它还包含一个实验性 Python 库,用于动态获取有关主题的信息并与之交互。

1
2
3
4
5
6
7
8
9
rostopic bw     显示主题使用的带宽
rostopic delay 显示带有 header 的主题延迟
rostopic echo 打印消息到屏幕
rostopic find 根据类型查找主题
rostopic hz 显示主题的发布频率
rostopic info 显示主题相关信息
rostopic list 显示所有活动状态下的主题
rostopic pub 将数据发布到主题
rostopic type 打印主题类型

rosmsg

rosmsg是用于显示有关 ROS 消息类型的信息的命令行工具。

1
2
3
4
5
6
rosmsg show    显示消息描述
rosmsg info 显示消息信息
rosmsg list 列出所有消息
rosmsg md5 显示 md5 加密后的消息
rosmsg package 显示某个功能包下的所有消息
rosmsg packages 列出包含消息的功能包

rosservice

rosservice 包含用于列出和查询 ROSServices 的 rosservice 命令行工具。

调用部分服务时,如果对相关工作空间没有配置 path,需要进入工作空间调用 source ./devel/setup.bash

1
2
3
4
5
6
7
rosservice args 打印服务参数
rosservice call 使用提供的参数调用服务
rosservice find 按照服务类型查找服务
rosservice info 打印有关服务的信息
rosservice list 列出所有活动的服务
rosservice type 打印服务类型
rosservice uri 打印服务的 ROSRPC uri

rossrv

rossrv是用于显示有关ROS服务类型的信息的命令行工具,与 rosmsg 使用语法高度雷同。

1
2
3
4
5
6
rossrv show    显示服务消息详情
rossrv info 显示服务消息相关信息
rossrv list 列出所有服务信息
rossrv md5 显示 md5 加密后的服务消息
rossrv package 显示某个包下所有服务消息
rossrv packages 显示包含服务消息的所有包

rosparam

rosparam包含rosparam命令行工具,用于使用YAML编码文件在参数服务器上获取和设置ROS参数。

1
2
3
4
5
6
rosparam set    设置参数
rosparam get 获取参数
rosparam load 从外部文件加载参数
rosparam dump 将参数写出到外部文件
rosparam delete 删除参数
rosparam list 列出所有参数

视频内容补充

python配置问题

在老版本的python脚本是可以直接运行的,不需要进行配置和编译,但在最新的noetic版本却需要进行配置,主要是由于会产生一些异常,此处介绍不配置的情况下会出现的异常以及解决办法

现象: 当没有配置cmakelists直接执行时会抛出异常,异常内容为“python:没有文件或目录”

原因: 不配置的情况下,会去脚本文件声明目录下寻找解释器,这种情况下找不到解释器。原因在于 noetic 版本的对应目录下没有 python 而是 python3(之前的版本中有 python2 和 python3,其中 python2 默认为 python).而如果配置了 cmake 则会自动找到 python3。

解决:

1. 直接声明解释器为python3(不建议使用,因为之后使用别人的代码时往往不能去直接修改)
    ![1](https://pic2.imgdb.cn/item/645c99660d2dde5777a6ed04.jpg)
2. 通过软链接将 python 链接到 python3,控制台输入指令:

    
1
sudo ln -s /usr/bin/python3 /usr/bin/python

package.xml

package.xml主要的部分是用于确定编译使用的工具和相关依赖包,包括它们的导出执行语句。