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行。