- 以LVI-SAM为例,cloud_info.msg就是LVI-SAM自定义的消息类型;
- 通常,都是利用msg文件,生成.h文件,然后cpp文件添加.h就可以正常使用自定义消息了;
自定义msg消息步骤
- Step1:创建并编写msg文件;
- Step2:在Cmakelist.txt文件中,进行相应的修改:
(1)find_package中添加“message_generation”(2)添加find_package(Boost REQUIRED COMPONENTS filesystem program_options system timer)(3)重点!
### Message generation
######################
add_message_files(DIRECTORY msgFILEScloud_info.msg
)generate_messages(DEPENDENCIESgeometry_msgsstd_msgsnav_msgssensor_msgs
)######################(4)在对应的可执行文件(cpp)中添加:
add_dependenciesexample:
add_executable(lidar_camera src/lidar_camera.cpp)
add_dependencies(lidar_camera ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_generate_messages_cpp)
target_link_libraries(lidar_camera${catkin_LIBRARIES}${OpenCV_LIBRARIES}${PCL_LIBRARIES}${CERES_LIBRARIES}Boost::timer
)
-
Step3:catkin_make
-
Step4:然后在工作空间/home/lanzy/ouster_ws/devel/include/sensors下,就生成了对应的.h文件:
注意!sensors是“功能包的名字”,即在cmakelist.txt中project(sensors)
-
Step5:在cpp文件中,引入对应的头文件;
-
Step6:重点来了!
- 因为要使用自定义的消息,所以在定义“接收器”和消息话题的时候,跟一般的话题肯定是不一样的!
- 以激光点云为例:
// * 接受点云 sensors::cloud_info就是自定义的点云类型ros::Subscriber subPointCloud = nh.subscribe<sensors::cloud_info>("/pointcloud", 10, laserCloudCalllback);
对应的回调函数,也要修改:
// * 点云的回调函数
void laserCloudCalllback(const sensors::cloud_infoConstPtr& cornerPointsSharp2) {// * 新建一个点云cloudInfo = *cornerPointsSharp2;// * 点云时间戳cloudHeader = cornerPointsSharp2->header;// * ROS->PCLpcl::fromROSMsg(cornerPointsSharp2->cloud_deskewed, *curr_PointCloud);}
- Step7:完成;