目录
博主创建了一个科研互助群Q:772356582,欢迎大家加入讨论。
一、设置IP 先能够成功接受数据
16线激光雷达默认:196.168.1.102 255.255.255.0
验证ping 196.168.1.201 ping自己的ip地址
验证ping 196.168.1.202
40线激光雷达默认:196.168.20.100 255.255.255.0
和赛的激光雷达是广播的不用ping
可以用rostopic echo /pandar_point检验是否有数据
二、Robosence16驱动
sudo apt-get install libpcap-dev
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
git clone https://github.com/RoboSense-LiDAR/ros_rslidar
cd ~/catkin_ws/src/ros_rslidar/rslidar_drvier
chmod 777 cfg/*
cd ~/catkin_ws/src/ros_rslidar/rslidar_pointcloud
chmod 777 cfg/*
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roslaunch rslidar_pointcloud rs_lidar_16.launch
三、和赛40驱动
sudo apt install libpcap-dev libyaml-cpp-dev
mkdir -p rosworkspace/src ; cd rosworkspace/src
git clone https://github.com/CastielLiu/HesaiLidar-ros.git --recursive
cd ../
catkin_make --cmake-args -DCamera_Enable=ON
roslaunch hesai_lidar p40p.launch
四、同时启动两个16线与一个40线
首先16激光雷达1的IP是196.168.1.201 静态IP是196.168.1.102
包端口号是6699 7788
激光雷达2的IP是196.168.1.202 静态IP是196.168.1.102
包端口号是6688 7799
激光雷达3的IP是广播的 静态IP是196.168.20.100
包端口号是9870 2368
同时启动三个激光雷达需要满足
- 每个激光雷达的包端口号不同
- 本地电脑的IP相同
- 激光雷达本身的IP不同
设置本机IP是196.168.1.102
子网掩码是255.255.0.0 这样可以接收到196.168.*.*的数据
写三个雷达的launch文件如下
<launch>
<group ns="ns1">
<node name="rslidar_node" pkg="rslidar_driver" type="rslidar_node" output="screen" >
<param name="model" value="RS16"/>
<!--param name="pcap" value="/home/tony-sti/lidar_data/lm75-170616-roadtest.pcap"/ -->
<param name="device_ip" value="192.168.1.202" />
<param name="msop_port" value="6688"/>
<param name="difop_port" value="7799"/>
</node>
<node name="cloud_node" pkg="rslidar_pointcloud" type="cloud_node" output="screen" >
<param name="model" value="RS16"/>
<param name="curves_path" value="$(find rslidar_pointcloud)/data/lidar1/curves.csv" />
<param name="angle_path" value="$(find rslidar_pointcloud)/data/lidar1/angle.csv" />
<param name="channel_path" value="$(find rslidar_pointcloud)/data/lidar1/ChannelNum.csv" />
</node>
</group>
<group ns="ns2">
<node name="rslidar_node" pkg="rslidar_driver" type="rslidar_node" output="screen" >
<param name="model" value="RS16"/>
<!--param name="pcap" value="/home/tony-sti/lidar_data/lm75-170616-roadtest.pcap"/ -->
<param name="device_ip" value="192.168.1.201"/>
<param name="msop_port" value="6699"/>
<param name="difop_port" value="7788"/>
</node>
<node name="cloud_node" pkg="rslidar_pointcloud" type="cloud_node" output="screen" >
<param name="model" value="RS16"/>
<param name="curves_path" value="$(find rslidar_pointcloud)/data/lidar2/curves.csv" />
<param name="angle_path" value="$(find rslidar_pointcloud)/data/lidar2/angle.csv" />
<param name="channel_path" value="$(find rslidar_pointcloud)/data/lidar2/ChannelNum.csv" />
</node>
</group>
<group ns="ns3">
<arg name="pcap_file" default=""/>
<arg name="server_ip" default=""/>
<arg name="server_port" default="9870"/>
<arg name="lidar_recv_port" default="2368"/>
<arg name="gps_port" default="10110"/>
<arg name="start_angle" default="0"/>
<arg name="laser_return_type" default="1"/>
<arg name="laser_count" default="40"/>
<arg name="pcldata_type" default="0"/>
<arg name="lidar_correction_file" default="$(find hesai_lidar)/config/correction.csv"/>
<arg name="calibration_file" default="$(find hesai_lidar)/config/calibration.yml"/>
<arg name="rviz" default="false"/>
<node pkg="hesai_lidar" name="hesai_lidar" type="hesai_lidar_node" output="screen" >
<param name="pcap_file" type="string" value="$(arg pcap_file)"/>
<param name="server_ip" type="string" value="$(arg server_ip)"/>
<param name="server_port" type="int" value="$(arg server_port)"/>
<param name="lidar_recv_port" type="int" value="$(arg lidar_recv_port)"/>
<param name="gps_port" type="int" value="$(arg gps_port)"/>
<param name="start_angle" type="double" value="$(arg start_angle)"/>
<param name="calibration_file" type="string" value="$(arg calibration_file)"/>
<param name="lidar_correction_file" type="string" value="$(arg lidar_correction_file)"/>
<param name="laser_return_type" type="int" value="$(arg laser_return_type)"/>
<param name="laser_count" type="int" value="$(arg laser_count)"/>
<param name="pcldata_type" type="int" value="$(arg pcldata_type)"/>
</node>
</group>
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find rslidar_pointcloud)/rviz_cfg/rslidar.rviz" />
</launch>
同时运行成功
PS:速腾激光雷达可以下载官方软件去更改IP和端口值
tar zxvf 20220118110102_65404.gz 解压
./run_rsview.sh 启动程序脚本
在左上角tools里找到Sensor Network Configration填写相应的IP
设置激光雷达的类型
在sensor information里点击get修改值
更改后再点击Set LiDAR
五、多激光雷达标定
5.1 静态TF发布
首先尽量保证安装时三个激光雷达坐标系xyz尽量在一个方位,为了后面比较好变换
修改激光雷达的frame_id,即保证每一个激光雷达有一个单独的坐标系
进行TF父子类坐标系变换
<launch>
<group ns="ns1">
<node name="rslidar_node" pkg="rslidar_driver" type="rslidar_node" output="screen" >
<param name="model" value="RS16"/>
<!--param name="pcap" value="/home/tony-sti/lidar_data/lm75-170616-roadtest.pcap"/ -->
<param name="device_ip" value="192.168.1.202" />
<param name="msop_port" value="6688"/>
<param name="difop_port" value="7799"/>
<param name="frame_id" value="rs_lidar_right"/>
</node>
<node name="cloud_node" pkg="rslidar_pointcloud" type="cloud_node" output="screen" >
<param name="model" value="RS16"/>
<param name="curves_path" value="$(find rslidar_pointcloud)/data/lidar1/curves.csv" />
<param name="angle_path" value="$(find rslidar_pointcloud)/data/lidar1/angle.csv" />
<param name="channel_path" value="$(find rslidar_pointcloud)/data/lidar1/ChannelNum.csv" />
</node>
</group>
<group ns="ns2">
<node name="rslidar_node" pkg="rslidar_driver" type="rslidar_node" output="screen" >
<param name="model" value="RS16"/>
<!--param name="pcap" value="/home/tony-sti/lidar_data/lm75-170616-roadtest.pcap"/ -->
<param name="device_ip" value="192.168.1.201"/>
<param name="msop_port" value="6699"/>
<param name="difop_port" value="7788"/>
<param name="frame_id" value="rs_lidar_left"/>
</node>
<node name="cloud_node" pkg="rslidar_pointcloud" type="cloud_node" output="screen" >
<param name="model" value="RS16"/>
<param name="curves_path" value="$(find rslidar_pointcloud)/data/lidar2/curves.csv" />
<param name="angle_path" value="$(find rslidar_pointcloud)/data/lidar2/angle.csv" />
<param name="channel_path" value="$(find rslidar_pointcloud)/data/lidar2/ChannelNum.csv" />
</node>
</group>
<group ns="ns3">
<arg name="pcap_file" default=""/>
<arg name="server_ip" default=""/>
<arg name="server_port" default="9870"/>
<arg name="lidar_recv_port" default="2368"/>
<arg name="gps_port" default="10110"/>
<arg name="start_angle" default="0"/>
<arg name="laser_return_type" default="1"/>
<arg name="laser_count" default="40"/>
<arg name="pcldata_type" default="0"/>
<arg name="lidar_correction_file" default="$(find hesai_lidar)/config/correction.csv"/>
<arg name="calibration_file" default="$(find hesai_lidar)/config/calibration.yml"/>
<arg name="rviz" default="false"/>
<node pkg="hesai_lidar" name="hesai_lidar" type="hesai_lidar_node" output="screen" >
<param name="pcap_file" type="string" value="$(arg pcap_file)"/>
<param name="server_ip" type="string" value="$(arg server_ip)"/>
<param name="server_port" type="int" value="$(arg server_port)"/>
<param name="lidar_recv_port" type="int" value="$(arg lidar_recv_port)"/>
<param name="gps_port" type="int" value="$(arg gps_port)"/>
<param name="start_angle" type="double" value="$(arg start_angle)"/>
<param name="calibration_file" type="string" value="$(arg calibration_file)"/>
<param name="lidar_correction_file" type="string" value="$(arg lidar_correction_file)"/>
<param name="laser_return_type" type="int" value="$(arg laser_return_type)"/>
<param name="laser_count" type="int" value="$(arg laser_count)"/>
<param name="pcldata_type" type="int" value="$(arg pcldata_type)"/>
</node>
</group>
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find rslidar_pointcloud)/rviz_cfg/rslidar.rviz" />
<node name="tf_right_lidar" pkg="tf" type="static_transform_publisher" args="-0.0794421 -0.6 -0.272642 -3.14885 -3.127 -2.37181 pandar rs_lidar_right 20"/>
<node name="tf_left_lidar" pkg="tf" type="static_transform_publisher" args="-0.0309343 0.6 -0.272642 3.10685 -3.127 2.37681 pandar rs_lidar_left 20"/>
</launch>
pandar是父类坐标系 rs_lidar_left是子类坐标系
x.y.z.yaw,pitch,roll
对转换矩阵进行微调
在根据实际境况对参数进行微调
ps:静态TF发布
1、x,y,z,四元数
x y z 代表link2相对与link1的位置变换。
qx qy qz qw表示link2相对与link1的位姿变换的四元数。
既以link1为参考坐标系得出link2的坐标为x,y,z和角度信息qx qy qz qw。tf_tree为 link1->link2
角度信息为沿着link2的轴做调整。
参数100表示每隔100毫秒发布一次
<launch>
<node pkg="tf" type="static_transform_publisher" name="link1_link2_broadcaster" args="x y z qx qy qz qw link1 link2 100" />
</launch>
2、x,y,z,yaw,pitch,roll
x y z 代表link2相对与link1的位置变换。
yaw pitch roll表示link2相对与link1的位姿变换,其中yaw为绕z轴的旋转,pitch为绕y轴的旋转,roll为绕x轴的旋转,逆时针旋转为正,顺时针旋转为负。
角度信息为沿着link2的轴做调整。
既以link1为参考坐标系得出link2的坐标为x,y,z和角度信息yaw pitch roll。tf_tree为 link1->link2
参数100表示每隔100毫秒发布一次。
<launch>
<node pkg="tf" type="static_transform_publisher" name="link1_link2_broadcaster" args="x y z yaw pitch roll link1 link2 100" />
</launch>
3、/base_link 在 /base_footprint 上方18cm,其他为0
rosrun tf2_ros static_transform_publisher 0 0 0.18 0 0 0 /base_footprint /base_link
5.2 自动标定程序
https://github.com/AbangLZU/multi_lidar_calibration
- 参数初始化
cfg/child_topic_list⽂件中写要标定的激光雷达话题
2
/ns1/rslidar_points
0.0 -0.53 -0.1 0 0 0.7854
/ns2/rslidar_points
0.0 0.53 -0.1 -0.05 0 -0.7854
2代表子类激光雷达的个数
话题
变换矩阵x,y,z,yaw,pitch,roll
- 启动程序
rviz -d multi_lidar_calibration.rviz
roslaunch multi_lidar_calibrator multi_lidar_calibrator.launch
- 查看结果
rostopic echo /tf
5.3 手动调整
首先保证坐标轴的yaw pitch roll 与父类坐标系相同,再调整X,Y,Z
- 左右高低roll 2.3788 比绝对值大两边高,比绝对值小中间高
- 前后高低pitch 3.11 比绝对值大前低后高,比绝对值小前高后低
- 水平转向yaw 3.16 绝对值越小越往顺时针转
最终标定完成
最终配准参数如下:
六、激光雷达融合
- 三个topic融合成一个topic进行发布
- 注意点需要用TF消息将坐标系进行转化
- 时间戳一样时才会进入回调函数
bool ok1 = tf_listener_.waitForTransform(pandar_msg->header.frame_id, left_msg->header.frame_id, ros::Time(0), ros::Duration(2.0));
tf_listener_.lookupTransform(pandar_msg->header.frame_id, left_msg->header.frame_id, ros::Time(0), trans_left_lidar_in_base);
if(ok1)
- 因为后面的去地面处理对16线没有效果,所以在这一步对16线点云进行Z轴滤波。同时为提升聚类的速率对整体点云的Z轴进行滤波,车上方1.5m以外的点云不考虑,处理后点云效果如下。
七、点云后处理
7.1 地面点去除
地面点去除出现很大的问题,针对40线激光雷达的地面除点云方法对16线斜置无效,16线的模拟地面除点云方法时间又很慢,所以需要分开进行处理,且当汽车发生颠簸时,去除效果不好。