前言
到现在ros最基本的流程已经预备了,一些常用的命令也可以梳理总结出来供于参考。另外前几篇笔记均是一边实操一边看书面教程记录的,在教学视频中还有一些我没注意的细节点,打算把视频过一遍,梳理梳理知识点把流程变成自己的东西。
ros 基本流程
功能包及源码创建、编译
创建工作空间并初始化
1
2
3mkdir -p 自定义空间名称/src
cd 自定义空间名称
catkin_makeros包创建及其依赖添加
1
2cd src
catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs在ros包中添加scripts目录并编辑python文件
1
2
3
4cd ros包
mkdir scripts
touch XXX.py
gedit XXX.py为 python 文件添加可执行权限
1
chmod +x 自定义文件名.py
编辑 ros 包下的 CamkeList.txt 文件(直接找到对应部分取消注释修改即可,各种配置语句已经在文件中存在)
1
2
3catkin_install_python(PROGRAMS scripts/自定义文件名.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)进入工作空间目录并编译
1
2cd 自定义空间名称
catkin_make进入工作空间目录并执行
命令行1:
1
roscore
命令行2:
1
2
3cd 工作空间
source ./devel/setup.bash
rosrun 包名 自定义文件名.py
整个流程简言之就是:创建工作空间——功能包创建——源码编辑——配置文件——编译并执行。
话题通信自定义msg文件流程(在已有功能包基础上)
定义msg文件
功能包下新建msg目录,添加msg文件
1
2
3
4
5cd 工作空间/src
mkdir msg
cd msg
touch XXX.msg
gedit XXX.msg文件格式如下:
1
2
3string XXX
uint16 XXX
float64 XXX编辑配置文件
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文件流程(在已有功能包基础上)
定义srv文件
服务通信中,数据分成两部分,请求与响应,在 srv 文件中请求和响应使用—-分割,具体实现如下:
1
2
3
4
5cd 工作空间/src
mkdir srv
cd srv
touch XXX.srv
gedit XXX.srv文件格式如下(在 srv 文件中请求和响应使用—-分割):
1
2
3
4
5
6# 客户端请求时发送的两个数字
int32 num1
int32 num2
---
# 服务器响应发送的数据
int32 sum编辑配置文件
基本内容和msg文件流程相同,只有配置源文件方面需要改为srv文件,官网没有在 catkin_package 中配置 message_runtime,经测试配置也可以实现。
常用命令行命令
机器人系统中启动的节点少则几个,多则十几个、几十个,不同的节点名称各异,通信时使用话题、服务、消息、参数等等都各不相同,一个显而易见的问题是: 当需要自定义节点和其他某个已经存在的节点通信时,如何获取对方的话题、以及消息载体的格式呢?
在 ROS 同提供了一些实用的命令行工具,可以用于获取不同节点的各类信息,常用的命令如下:
- rosnode : 操作节点
- rostopic : 操作话题
- rosservice : 操作服务
- rosmsg : 操作 msg 消息
- rossrv : 操作 srv 消息
- rosparam : 操作参数
上述命令是动态的,在ROS程序启动后,可以动态的获取运行中的节点或参数的相关信息。
rosnode
rosnode 是用于获取节点信息的命令
1 | rosnode ping 测试到节点的连接状态 |
rostopic
rostopic 包含 rostopic 命令行工具,用于显示有关 ROS 主题的调试信息,包括发布者,订阅者,发布频率和 ROS 消息。它还包含一个实验性 Python 库,用于动态获取有关主题的信息并与之交互。
1 | rostopic bw 显示主题使用的带宽 |
rosmsg
rosmsg是用于显示有关 ROS 消息类型的信息的命令行工具。
1 | rosmsg show 显示消息描述 |
rosservice
rosservice 包含用于列出和查询 ROSServices 的 rosservice 命令行工具。
调用部分服务时,如果对相关工作空间没有配置 path,需要进入工作空间调用 source ./devel/setup.bash
1 | rosservice args 打印服务参数 |
rossrv
rossrv是用于显示有关ROS服务类型的信息的命令行工具,与 rosmsg 使用语法高度雷同。
1 | rossrv show 显示服务消息详情 |
rosparam
rosparam包含rosparam命令行工具,用于使用YAML编码文件在参数服务器上获取和设置ROS参数。
1 | rosparam set 设置参数 |
视频内容补充
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主要的部分是用于确定编译使用的工具和相关依赖包,包括它们的导出执行语句。