本教程介绍了如何创建msg和srv文件,以及rosmsg,rossrv,roscp等命令行工具。至于为什么选择deepin而不是ROS通用的ubuntu,也仅仅是为了支持国产系统。鉴于本人水平有限,如哪位攻城狮网友发现本文存在的问题,烦请留言指正,谢谢!
msg文件存储在包的msg目录中,srv文件存储在srv目录中。
msg文件只是每行带有字段类型和字段名称的简单文本文件,你可以使用的字段类型有:
在ROS中还有一种特殊的类型:Header.Header通常包括ROS中常用的时间戳和坐标帧信息。您经常会看到在msg文件中的第一行有Header.下面是一个包含Header,string,以及另外两个msg的示例
Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist
srv文件除了包含request和response两部分外其他与msg基本一致,这两部分使用—进行拆分。下面是一个srv文件的例子
int64 A
int64 B
---
int64 Sum
在上面的例子中A,B是request,Sum是response.
让我在之前创建的beginner_tutorials包中创建msg文件
roscd beginner_tutorials
mkdir msg
echo "int64 num" >> msg/Num.msg
上面的示例中Num.msg文件只包含一行。你可以通过添加多个元素来实现一个更为复杂的msg文件。
string first_name
string last_name
uint8 age
uint32 score
不过还有一步,我们需要确保msg文件可以被转换为C++,python和其他语言的源代码。打开package.xml文件,添加如下两行,并确保这两行没被注释掉:
<build_depend>message_generationbuild_depend>
<exec_depend>message_runtimeexec_depend>
注意,在构建时,我们需要message_generation,在运行时需要message_runtime.使用你喜欢的编辑器,打开CMakeList.txt.将message_generation依赖添加到已经存在的CMakeList.txt的find_package调用中。
# Do not just add this to your CMakeLists.txt, modify the existing text to add message_generation before the closing parenthesis
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
你可能注意到,有时候即使你没有为所有的依赖项使用find_package,你的项目也能正常构建。这是因为catkin将您的项目合成为一个,所以如果之前的项目调用find_package,你的项目会配置相同的值。要养成在项目中添加构建依赖的习惯。
另外要确保导出了消息运行依赖
catkin_package(
...
CATKIN_DEPENDS message_runtime ...
...)
然后需要在CMakeList.txt中添加msg文件
add_message_files(
FILES
Num.msg
)
通过手动添加.msg文件,我们可以确保CMake在添加其他msg文件后知道何时需要重新配置项目。现在我们需要确保调用generate_message()函数
generate_messages(
DEPENDENCIES
std_msgs
)
# 用法
rosmsg show [message type]
# 示例
# 前提你已经catkin_make过,并source对应的setup.bash
rosmsg show beginner_tutorials/Num
int64 num
上面所述的message type包含:包名 和msg文件名。当然如果你记不清对应的msg属于哪个包。
也可以调用
rosmsg show Num
[beginner_tutorials/Num]:
int64 num
同样切换到beginner_tutorials包目录,然后创建srv目录
roscd beginner_tutorials
mkdir srv
在手动创建一个srv文件之前我们可以使用roscp从其他ROS包复制一个srv文件
# 语法
roscp [package_name] [file_to_copy_path(src)] [copy_Path(dst)]
# 示例
roscp rospy_tutrials AddTwoInts.srv srv/AddTwoInts.srv
另外还有一步,我们需要确认srv文件能转成C++或python源码或其他语言。除非你已经做过了,否则
打开package.xml,增加如下两行
<build_depend>message_generationbuild_depend>
<exec_depend>message_runtimeexec_depend>
和使用msg保持一致,我们需要在运行时需要message_runtime,构建时需要message_generation.
需要按照如下修改CMakeList.txt.需要注意message_generation可用于srv和msg文件。
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
# 另外需要增加srv文件
add_service_files(
FILES
AddTwoInts.srv
)
rosrv可用于查看srv的具体内容
# 语法
rossrv show <service type>
# 示例
rossrv show beginner_tutorials/AddTwoInts
int64 a
int64 b
---
int64 sum
# 与rosmsg类似如果记不清包名,可以不加
rossrv show AddTwoInts
[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum
generate_messages(
DEPENDENCIES
std_msgs
beginner_tutorials
)
# 修改CMakeList.txt后即可构建此包
roscd beginner_tutorials
cd ../../
catkin_make
# 或者
catkin build
包的msg目录下的任何.msg文件都将生成用于所有所支持语言的代码。C++语言的头文件生成在
devel/include/beginner_tutorials/*,h Python脚本存放在devel/lib/python3/dist-packages/beginner_tutorials/msg/。相应的srv文件也会在对应的位置生成对应的头文件,或者python脚本。
消息格式完整规范
如果你正在构建使用新消息的C++节点,你还需要声明节点和消息之间的依赖关系
rosmsg -h
rosmsg is a command-line tool for displaying information about ROS Message types.
Commands:
rosmsg show Show message description
rosmsg info Alias for rosmsg show
rosmsg list List all messages
rosmsg md5 Display message md5sum
rosmsg package List messages in a package
rosmsg packages List packages that contain messages
rossrv -h
rossrv is a command-line tool for displaying information about ROS Service types.
Commands:
rossrv show Show service description
rossrv info Alias for rossrv show
rossrv list List all services
rossrv md5 Display service md5sum
rossrv package List services in a package
rossrv packages List packages that contain services
Type rossrv <command> -h for more detailed usage