工程(三)——多激光雷达标定、融合、聚类

目录

一、设置IP 先能够成功接受数据

二、Robosence16驱动

三、和赛40驱动

四、同时启动两个16线与一个40线

五、多激光雷达标定

5.1 静态TF发布

5.2 自动标定程序

5.3 手动调整

六、激光雷达融合

 七、点云后处理

7.1 地面点去除

7.2 聚类

7.3  跟踪 

7.4 可行域划分


博主创建了一个科研互助群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线的模拟地面除点云方法时间又很慢,所以需要分开进行处理,且当汽车发生颠簸时,去除效果不好。

7.2 聚类

7.3  跟踪 

7.4 可行域划分

  • 19
    点赞
  • 132
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
信息融合工程实践涉及到多个技术和方法,以下是一些常见的: 1. 数据采集和处理:信息融合的第一步是收集和处理各种数据源的信息。这可以包括从传感器、数据库、网络爬虫等收集数据,并对其进行清洗、过滤和转换,以便进一步处理和分析。 2. 数据集成和融合:在数据收集和处理之后,需要将来自不同数据源的信息进行集成和融合。这可能涉及到数据匹配、关联、转换等技术,以确保不同数据源的信息可以有效地结合在一起。 3. 数据挖掘和分析:信息融合的目标是从多个数据源中发现潜在的关联和模式。数据挖掘和分析技术,如聚类、分类、关联规则挖掘等,可以帮助揭示隐藏在数据中的有价值的信息。 4. 信息推理和推断:在信息融合中,有时需要根据已有的信息进行推理和推断。这可能涉及到知识表示和推理技术,如基于规则的推理、模糊逻辑、贝叶斯网络等,以便从已有的信息中推导出新的结论。 5. 可视化和交互:为了更好地理解和利用融合后的信息,可视化和交互技术变得至关重要。通过将信息以可视化的方式呈现,并提供交互功能,可以帮助用户更好地理解和分析融合后的信息。 以上只是一些常见的技术和方法,实际的信息融合工程实践可能涉及到更多领域的知识和技术。具体应用情境下,需要根据需求和约束来选择适合的技术和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桦树无泪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值