pcl自行编译ros的velodyne_*相关库

来源

object_track中lanunch文件启动了velodyne_pointcloud包的一个node:cloud_node。
velodyne系列的packge有:

  • velodyne_driver
  • velodyne_laserscan
  • velodyne_msgs
  • velodyne_pointcloud

其中,在[tag]1.5.2后的velodyne_pointcloud中不再有编译cloud_node的选项,也没有了cloud_node文件。
cloud_node编译位置在:velodyne/velodyne_pointcloud/src/conversions/CMakeLists.txt
cloud_node源文件为:velodyne/velodyne_pointcloud/src/conversions/cloud_node.cc

image

image

cloud_node的作用倒是很简单:converts raw Velodyne LIDAR packets to PointCloud2。
为了方便直接运行object_track的launch文件,使用1.5.2版本的仓库在ros noetic版本上再编译一下。

编译步骤

下载

 git clone -b 1.5.2 https://github.com/ros-drivers/velodyne.git

编译

参考:Ubuntu16.04 多版本pcl 1.11与pcl_ros pcl_conversion冲突错误
编译过程:

su
source /opt/ros/noetic
catkin_make install --cmake-args -DCATKIN_WHITELIST_PACKAGES="velodyne_driver;velodyne_msgs;velodyne_pointcloud" -DCMAKE_INSTALL_PREFIX=/opt/ros/noetic

编译问题

.__getMD5Sum()的报错问题。

  • 报错信息:

'''
loud<velodyne_pointcloud::PointXYZIR> >]’
/home/dfs/catkin_sysws/src/velodyne/velodyne_pointcloud/src/conversions/convert.cc:79:30: required from here
/opt/ros/noetic/include/ros/message_traits.h:125:14: error: ‘const class std::shared_ptr<pcl::PointCloud<velodyne_pointcloud::PointXYZIR> >’ has no member named ‘__getMD5Sum’
125 | return m.__getMD5Sum().c_str();
| ^~~~~~~~~
/opt/ros/noetic/include/ros/message_traits.h: In instantiation of ‘static const char* ros::message_traits::DataType::value(const M&) [with M = std::shared_ptr<pcl::PointCloud<velodyne_pointcloud::PointXYZIR> >]’:
/opt/ros/noetic/include/ros/message_traits.h:263:104: required from ‘const char* ros::message_traits::datatype(const M&) [with M = std::shared_ptr<pcl::PointCloud<velodyne_pointcloud::PointXYZIR> >]’
/opt/ros/noetic/include/ros/publisher.h:119:11: required from ‘void ros::Publisher::publish(const M&) const [with M = std::shared_ptr<pcl::PointCloud<velodyne_pointcloud::PointXYZIR> >]’
/home/dfs/catkin_sysws/src/velodyne/velodyne_pointcloud/src/conversions/convert.cc:79:30: required from here
/opt/ros/noetic/include/ros/message_traits.h:142:14: error: ‘const class std::shared_ptr<pcl::PointCloud<velodyne_pointcloud::PointXYZIR> >’ has no member named ‘__getDataType’
142 | return m.__getDataType().c_str();
| ^~~~~~~~~~~
In file included from /opt/ros/noetic/include/ros/publisher.h:34,
from /opt/ros/noetic/include/ros/node_handle.h:32,
from /opt/ros/noetic/include/ros/ros.h:45,
from /home/dfs/catkin_sysws/src/velodyne/velodyne_pointcloud/include/velodyne_pointcloud/convert.h:20,
from /home/dfs/catkin_sysws/src/velodyne/velodyne_pointcloud/src/conversions/convert.cc:16:
'''

  • 原因分析

应该是早期pcl版本和现在不兼容导致的数据类型转换的问题?
报错位置在:/home/dfs/catkin_sysws/src/velodyne/velodyne_pointcloud/src/conversions/convert.cc:79:30
具体代码为:

output_.publish(outMsg.pc);

outMsg.pc是pcl::PointCloud<velodyne_pointcloud::PointXYZIR>::Ptr类型。
而output是ros广播器,发布的数据类型为sensor_msgs::PointCloud2类型:

output_ =
  node.advertise<sensor_msgs::PointCloud2>("velodyne_points", 10);

因此很有可能是两者之间的转换需要重新写一下:

pcl::PointCloud<pcl::PointXYZI>::Ptr temp;
sensor_msgs::PointCloud2 temp_msg;
for(int i = 0; i < outMsg.pc->size(); i++){
pcl::PointXYZI point;
point.x = outMsg.pc->points[i].x;
point.y = outMsg.pc->points[i].y;
point.z = outMsg.pc->points[i].z;
point.intensity = outMsg.pc->points[i].intensity;
temp->points.emplace_back(point);
}
pcl::toROSMsg(*temp, temp_msg);
temp_msg.header.stamp = scanMsg->header.stamp;
temp_msg.header.frame_id = outMsg.pc->header.frame_id;
output_.publish(temp_msg);

serialize报错问题

解决上面问题后,此error没有再报了。【待】

注意:

object_track使用cloud_node的目的是将原始pcl点云数据类型转为ros消息类型,作为object_track的输入,但是用rosbag直接播放就不需要了。直接在launch文件里注释掉cloud_node即可,。。。

posted @ 2022-11-21 21:35  grdiv  阅读(352)  评论(0)    收藏  举报