ROS有时需要自定义消息,本文叙述如何通过创建功能包并自定义消息
创建ROS工作空间具体实现:https://blog.csdn.net/qq_34911636/article/details/100103448
创建一个package需要在catkin_ws/src下,用到catkin_create_pkg命令,用法是:catkin_create_pkg package depends,其中package是包名,depends是依赖的包名,可以依赖多个软件包。上面的命令创建了serve_test软件包,依赖于roscpp rospy std_msgs。
一个package下常见的文件、路径有:
CMakeLists.txt: 定义package的包名、依赖、源文件、目标文件等编译规则,是package不可少的成分
package.xml: 描述package的包名、版本号、作者、依赖等信息,是package不可少的成分
src/: 存放ROS的源代码,包括C++的源码和(.cpp)以及Python的module(.py)
include/: 存放C++源码对应的头文件
scripts/: 存放可执行脚本,例如shell脚本(.sh)、Python脚本(.py)
msg/: 存放自定义格式的消息(.msg)
srv/: 存放自定义格式的服务(.srv)
models/: 存放机器人或仿真场景的3D模型(.sda, .stl, .dae等)
urdf/: 存放机器人的模型描述(.urdf或.xacro)
launch/: 存放launch文件(.launch或.xml)
其中定义package的是CMakeLists.txt和package.xml,这两个文件是package中必不可少的。catkin编译系统在编译前,首先就要解析这两个文件。这两个文件就定义了一个package。 通常ROS文件组织都是按照以上的形式,这是约定俗成的命名习惯,建议遵守,以上路径中只有CMakeLists.txt和package.xml是必须的,其余路径根据软件包是否需要来决定。
1.在工作空间catkin_trollycontrol中创建功能包Publishkey
cd ~catkin_trollycontrol/src
catkin_create_pkg Publishkey std_msgs rospy roscpp
然后重新编译工作空间切换到cd ~catkin_trollycontrol目录,编译工作空间catkin_make
2.在功能包目录Publishkey下创建文件夹msg用于存放自定义消息文件differentialwheel.msg
cd ~catkin_trollycontrol/src/Publishkey
mkdir msg
cd msg
touch differentialwheel.msg
3.在differentialwheel.msg里面自定义消息如下举例所述:
#定义智能车的运动控制消息
#小车前进的速度
float32 goforwardspeed
#小车向后的速度
float32 backwardspeed
#小车左旋转的速度
float32 leftrotationspeed
#小车右旋转的速度
float32 rightrotationspeed
#定义小车运动模式,0x01为前进标识,0x02后退标识,0x03左旋转标识,0x04右旋转标识
char directionofmotion
4.打开功能包Publishkey目录下面package.xml文件添加编译和运行的相关依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
5.打开功能包Publishkey目录下面CMakeLists.txt,修改CMakeLists.txt文件
ROS中的编译器使用的是CMake,编译规则通过功能包中的CMakeLists.txt文件设置,使用catkin命令创建
的功能包中会包含自动生成该文件已经配置多数编译选项,并包含详细的注解,几乎不需要查看相关手册
稍作修改即可。打开功能包对于这个较为简单的功能包,主要用到了以下四种编译配置项。
include_directories(include ${catkin_INCLUDE_DIRS})
add_executable(mrobot_motor src/mrobot_bringup.cpp src/mrobot.cpp)
target_link_libraries(mrobot_motor ${catkin_LIBRARIES})
add_dependencies(mrobot_motor ${PROJECT_NAME}_generate_messages_cpp)
(1 ) include_directories
用于设置头文件的相对路径。全局路径默认是功能包的所在目录,比如功能包的头文件一
般会放到功能包根目录下的include文件夹中,所以此处需要添加该文件夹。此外,该配置项还
包含ROS catkin编译器默认包含的其他头文件路径,比如ROS默认安装路径、Linux系统路径等。
(2 ) add_executable
用于设置需要编译的代码和生成的可执行文件。第一个参数为期望生成的可执行文件的
名称,后边的参数为参与编译的源码文件(cpp),如果需要多个代码文件,则可在后面依次
列出,中间使用空格进行分隔。
(3 ) target_link_libraries
用于设置链接库。很多功能需要使用系统或者第三方的库函数,通过该选项可以配置执行
文件链接的库文件,其第一个参数与add_executable相同,是可执行文件的名称,后面依次列
出需要链接的库。此处编译的Publisher和Subscriber没有使用其他库,添加默认链接库即可。
(4 ) add_dependencies
用于设置依赖。在很多应用中,我们需要定义语言无关的消息类型,消息类型会在编译
过程中产生相应语言的代码,如果编译的可执行文件依赖这些动态生成的代码,则需要使用
add_dependencies 添加 ${PROJECT_NAME}_generate_messages_cpp 配置,即该功能包动态
产生的消息代码。该编译规则也可以添加其他需要依赖的功能包。
以上编译内容会帮助系统生成mrobot_motor可执行文件
⑶抓CMakeLists.txt修改完成后,在工作空间的根路径下开始编译
(1)在find_package添加message_generation
(2)add_message_files的注释去掉,并在add_message_files里面添加differentialwheel.msg
(3)generate_messages的注释去掉,并在generate_messages里面添加std_msgs
(4)catkin_package的注释去掉,并在catkin_package里面CATKIN_DEPENDS roscpp rospy std_msgs 的末尾添加 message_runtime
6.以上工作都配置完成之后切换到cd ~catkin_trollycontrol目录,重新编译工作空间catkin_make
cd ~catkin_trollycontrol
catkin_make
7.验证是否正确完成自定义消息
在终端中输入:rosmsg show differentialwheel
如果出现Could not find msg 'differentialwheel'错误则在终端中重新输入:
source devel/setup.bash 配置工作空间的环境变量,即可解决
若配置正确则在终端中输出:
输出消息类型
[Publishkey/differentialwheel]:
float32 goforwardspeed
float32 backwardspeed
float32 leftrotationspeed
float32 rightrotationspeed
char directionofmotion
其中Publishkey/differentialwheel为消息的路径
在.cpp需要用到该消息类型只需要添加头文件路径#include“Publishkey/differentialwheel.h”
另外在/root/catkin_trollycontrol/devel/include/Publishkey,文件下面可以看到自动生成的
differentialwheel.h文件
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)