ROS下多雷達融合算法


有些小車車身比較長,如果是一個激光雷達,顧前不顧后,有比較大的視野盲區,這對小車導航定位避障來說都是一個問題,比如AGV小車,

所有想在小車前后各加一個雷達,那問題是ROS的建圖或者定位導航都只是支持一個雷達,這個時候就需要我們做2個雷達的融合了。

方法比較簡單:我的思路是先將兩個激光雷達獲得的laser_scan轉成point_cloud也就是點雲,利用pcl庫將兩個點雲拼接在一起,然后在把拼接后的點雲重新轉成laser_scan。

這樣ros里面建圖導航都可以用了。

關鍵點是要把兩個激光雷達的偏移量算好,以及雷達的時間同步。代碼也比較簡單,貼出部分關鍵代碼:

//時間同步

message_filters::Subscriber<sensor_msgs::PointCloud2> points_sub_left(nh, left_topic, 10);
message_filters::Subscriber<sensor_msgs::PointCloud2> points_sub_right(nh, right_topic, 10);
typedef message_filters::sync_policies::ApproximateTime<sensor_msgs::PointCloud2, sensor_msgs::PointCloud2, sensor_msgs::PointCloud2> MySyncPolicy;
message_filters::Synchronizer<MySyncPolicy> sync(MySyncPolicy(100000), points_sub_left, points_sub_right);
sync.registerCallback(boost::bind(&callback, _1, _2));

g_left_right_point_pub = nh.advertise<sensor_msgs::PointCloud2>(fusion_topic, 10);

 

//ros回調函數,拼接點雲

void callback(const sensor_msgs::PointCloud2::ConstPtr& left_input, const sensor_msgs::PointCloud2::ConstPtr& right_input)
{
pcl::PointCloud<pcl::PointXYZI>::Ptr left_local_laser(new pcl::PointCloud<pcl::PointXYZI>());
pcl::fromROSMsg(*left_input, *left_local_laser);

pcl::PointCloud<pcl::PointXYZI>::Ptr left_calibration_cloud(new pcl::PointCloud<pcl::PointXYZI>());
pcl::transformPointCloud(*left_local_laser, *left_calibration_cloud, g_left_calibration_matrix);

for(std::size_t i = 0; i < left_calibration_cloud->size(); ++i)
{
left_calibration_cloud->points[i].intensity = 64;
}

// publishCloudI(&g_left_calib_point_pub, *left_calibration_cloud);

pcl::PointCloud<pcl::PointXYZI>::Ptr right_local_laser(new pcl::PointCloud<pcl::PointXYZI>());
pcl::fromROSMsg(*right_input, *right_local_laser);

pcl::PointCloud<pcl::PointXYZI>::Ptr right_calibration_cloud(new pcl::PointCloud<pcl::PointXYZI>());
pcl::transformPointCloud(*right_local_laser, *right_calibration_cloud, g_right_calibration_matrix);
for(std::size_t i = 0; i < right_calibration_cloud->size(); ++i)
{
right_calibration_cloud->points[i].intensity = 128;
}

pcl::PointCloud<pcl::PointXYZI>::Ptr left_right_middle_calibration_cloud(new pcl::PointCloud<pcl::PointXYZI>());
*left_right_middle_calibration_cloud = *left_calibration_cloud + *right_calibration_cloud;

publishCloudI(&g_left_right_point_pub, *left_right_middle_calibration_cloud);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM