ROS创建功能包并自定义消息

2023-05-16

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(使用前将#替换为@)

ROS创建功能包并自定义消息 的相关文章

随机推荐