鐳神激光雷達對於Autoware的適配


1. 前言

我們的自動駕駛采用鐳神激光雷達,在使用Autoware的時候,需要對鐳神激光雷達的底層驅動,進行一些改變以適配Autoware。

 

2. 修改

(1)首先修改lslidar_c32.launch文件:

 1 <launch>
 2 
 3   <node pkg="lslidar_c32_driver" type="lslidar_c32_driver_node" name="leishen_lslidar_c32_driver" output="screen" >
 4     <param name="frame_id" value="laser_link"/>
 5     <param name="device_ip" value="192.168.1.200"/>
 6     <param name="device_port" value="2368"/>
 7   </node>
 8 
 9   <node pkg="lslidar_c32_decoder" type="lslidar_c32_decoder_node" name="leishen_lslidar_c32_decoder" output="screen">
10     <!-- <param name="child_frame_id" value="world"/> -->
11     <param name="child_frame_id" value="velodyne"/>
12     <param name="point_num" value="2000"/>
13     <param name="channel_num" value="0"/>
14     <param name="angle_disable_min" value="0"/>
15     <param name="angle_disable_max" value="0"/>
16     <param name="min_range" value="0.15"/>
17     <param name="max_range" value="500.0"/>
18     <param name="frequency" value="10.0"/>
19     <param name="publish_point_cloud" value="true"/>
20     <param name="publish_channels" value="false"/>
21     <remap from="lslidar_point_cloud" to="/points_raw" />
22   </node>
23   
24   <!--node name="rviz" pkg="rviz" type="rviz" args="-d $(find lslidar_c32_decoder)/launch/lslidar_c32.rviz" output="screen"/-->
25 
26 </launch>

這里貼出了修改后的launch文件,第10行修改為11行,21行去掉s。我們修改了frame_id,將之前的“world”改為“velodyne”。還有就是Autoware需要的點雲topic為points_raw,而鐳神的點雲topic為point_raw,我們講point_raw改為points_raw。

 

(2)修改時間戳

根據鐳神的手冊:“如果鐳神接入GPS,那么會采用GPS時間,如果不接入GPS,雷達會采用內部時間,從0開始以微秒為單位計數,計數值賦值到主數據流時間戳的字節,計數到1小時在從0開始”。這樣會導致在使用TF變換的時候時間戳出錯,所以,需要修改時間戳,找到如下代碼

 1 void LslidarC32Decoder::publishPointCloud() {
 2 //    pcl::PointCloud<pcl::PointXYZI>::Ptr point_cloud(
 3 //                new pcl::PointCloud<pcl::PointXYZI>());
 4     VPointCloud::Ptr point_cloud(new VPointCloud());
 5 
 6     //point_cloud->header.stamp =
 7             //pcl_conversions::toPCL(sweep_data->header).stamp;
 8     point_cloud->header.frame_id = child_frame_id;
 9     point_cloud->height = 1;
10 
11     for (size_t i = 0; i < 32; ++i) {
12         const lslidar_c32_msgs::LslidarC32Scan& scan = sweep_data->scans[i];
13         // The first and last point in each scan is ignored, which
14         // seems to be corrupted based on the received data.
15         // TODO: The two end points should be removed directly
16         //    in the scans.
17         // point_time unit is sec
18         double timestamp = point_time;
19         //point_cloud->header.stamp = static_cast<uint64_t>(timestamp * 1e6);
20         point_cloud->header.stamp = ros::Time::now().toSec() * 1e6; 
21         if (scan.points.size() == 0) continue;
22         size_t j;
23         VPoint point;
24         for (j = 1; j < scan.points.size()-1; ++j) {
25             point.timestamp = timestamp - (scan.points.size()-1 - j)*0.00005;  // time interval for each point is 50us
26             point.x = scan.points[j].x;
27             point.y = scan.points[j].y;
28             point.z = scan.points[j].z;
29             point.intensity = scan.points[j].intensity;
30             point.range = scan.points[j].distance;
31             point.h_angle = scan.points[j].azimuth;
32             point.v_angle = layer_altitude[i];
33             point.laserid = layer_id[i];
34 
35             point_cloud->points.push_back(point);
36             ++point_cloud->width;
37         }
38 
39     }
40 
41     //      if(point_cloud->width > 2000)
42     {
43         point_cloud_pub.publish(point_cloud);
44     }
45 
46 
47     return;
48 }

同樣是貼上修改后的代碼,將19行變為20行。


免責聲明!

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



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