前言
由于比赛的需要,ros的话题通信需要使用自定义消息类型,按照常规的方法将生成的msg文件导入项目中,如果想要将自己的消息类型放到ros的库中,这样就可以在所有工作空间中像导入ros中的 from geometry_msgs.msg import Point 一样使用自定义的消息,不用再执行创建msg文件,非常方便,具体方法是直接导入ros的python库中。
ros自定义消息类型
创建msg文件
首先创建一个msg为后缀的文件,例如,其中bigcar_yolo是我的在src目录下的包名,你可以自行创建
假如我需要定义一个msg文件,包含Point()类型和string类型,那么我可以在文件中添加
geometry_msgs/Point obpoint
string data
配置CMakeLists.txt
将文件添加到cmakelists,在cmakelists文件中添加以下,其中gesture.msg是你创建的msg
add_message_files(
FILES
gesture.msg
)
关联包
generate_messages(
DEPENDENCIES
std_msgs
geometry_msgs
)
其中 std_msgs geometry_msgs 根据你的msg文件中的数据类型添加
添加依赖
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
geometry_msgs
message_generation
)
message_generation十分重要
编译包
catkin_package(
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
)
message_runtime十分重要
配置package.xml
<exec_depend>message_runtime</exec_depend>
<build_depend>message_generation</build_depend>
最后catkin_make编译运行
将msg文件导入程序中使用
C++版
按照图片打开你的该路径 devel/include/包名,就会看到和msg文件同名的头文件
在你的项目中直接像这样
#include <bigcar_yolo/gesture.h>
如果提示includepath错误
这按照路径打开 c_cpp_properties.json文件
把你的include路径像这样加进去
就ok了。
Python版
按照路径打开devel/lib/python3/dist-packages/包名
打开setting.json文件
像这样添加
最后导入
from bigcar_yolo.msg import gesture
将msg文件导入ros的python库
上图中有一个默认的路径
"/opt/ros/noetic/lib/python3/dist-packages"
这个路径是从我们默认的ros中的python库中找文件,因此我们想要将文件添加到其中的话,需要打开这个路径
我选择了std_msgs这个包打开
发现里面用到的数据类型,比如float32,bool,uint8都在这里,这就是我们平时使用from std_msgs.msg import XXX 的具体位置。
将自定义文件导入该库
按照路径打开devel/lib/python3/dist-packages/包名
找到这两个文件
注意__init__.py中应该有 from ._gesture import *
右键打开所在文件夹,由于复制到ros中需要管理员权限,在当前目录打开终端
像这样
sudo cp _gesture.py /opt/ros/noetic/lib/python3/dist-packages/std_msgs/msg
然后你就会在 /opt/ros/noetic/lib/python3/dist-packages/std_msgs/msg 目录下看到
说明导入成功
最后找到上图中的__init__.py
sudo gedit __init__.py
加入前面提到的from ._gesture import *
最后在程序中直接使用
from std_msgs.msg import gesture
大功告成!