单、双激光雷达启动与双激光雷达的外参标定(VLP-16)

本文旨在帮助读者迅速完成双Velodyne16激光雷达的启动与外参标定!所用到的标定方法是NDT扫描匹配算法。废话不多说,直接开始!

一、单激光雷达的启动

#安装velodyne的ros依赖
sudo apt-get install ros-melodic-velodyne

#进入工作空间克隆velodyne包
git clone https://github.com/ros-drivers/velodyne.git

#完成编译
cd ..
catkin_make
source devel/setup.bash

velodyne16通电,用网线将激光雷达与主机相连(断掉无线网),点击右上角网络标志→ 编辑网络连接→ 点击左下角"+"号添加以太网→ 点击IPv4 Setting→ 将Adress、Netmask与Gateway分别设置为"192.168.1.100"(100是我自己设的,可以设置为1~254内除了201外的所有值,201是激光雷达的IP)、"255.255.255.0"与"192.168.1.1"。保存即可。浏览器进入192.168.1.201可以打开激光雷达配置界面,将转速"rpm"改为600,将Host(Destination)里的IP Adress改为网络设置中的Adress,用于向主机发送数据。在配置界面中看到"Data Port"的端口数字,默认是2368,如果不是,则记录该端口数字。并:

#打开velodyne启动launch文件
roscd velodyne_pointcloud/launch
gedit VLP16_points.launch

在其中修改"port"参数值为刚记录的"Data port"数字,至此单激光雷达配置完成,启动激光雷达:

roslaunch velodyne_pointclouds VLP16_points.launch
rosrun rviz rviz -f velodyne

可以在rviz中看到当前激光雷达的扫描信息。

二、双激光雷达的启动

双激光雷达启动与单激光雷达基本相同,但需要对激光雷达IP先做修改:先连接一只激光雷达,进入192.168.1.201激光雷达配置界面,将"Network(Sensor)"中的IP Adress修改为"192.168.1.200"。配置完成,接下来就是接线方式了:需要交换机或路由器,用三根网线分别将主机、两激光雷达连接至交换机或路由器。断开无线网,将主机网络连接至有线以太网。启动包下载:双激光雷达启动,提取码:0fit

multi_VLP16_points.launch需要修改:

<!-- Run two Velodyne VLP-16 LiDARs -->
 
<launch>
	<!-- Name lidar devices -->
	<arg name="lidar1_name" default="lidar_parent" />
	<arg name="lidar2_name" default="lidar_child" />
 
 
<!-- FOR first VLP16 -->
 	<group ns="$(arg lidar1_name)">
  <!-- hardware parameters -->
    <arg name="calibration" default="$(find velodyne_pointcloud)/params/VLP16db.yaml"/>
    <arg name="device_ip" default="192.168.1.201" />
    <arg name="port" default="xxxx" />#这是ip为"192.168.1.201" 的激光雷达的"Data Port"值
    <arg name="frame_id" default="velodyne" />#可修改
    <arg name="manager" default="$(arg frame_id)_nodelet_manager" />
    <arg name="max_range" default="130.0" />
    <arg name="min_range" default="0.4" />
    <arg name="pcap" default="" />
    <arg name="read_fast" default="false" />
    <arg name="read_once" default="false" />
    <arg name="repeat_delay" default="0.0" />
    <arg name="rpm" default="600.0" />
    <arg name="cut_angle" default="-0.01" />
    <arg name="laserscan_ring" default="-1" />
    <arg name="laserscan_resolution" default="0.007" />
 
  <!-- start nodelet manager and driver nodelets -->
    <include file="$(find velodyne_driver)/launch/nodelet_manager.launch">
      <arg name="device_ip" value="192.168.1.201"/>
      <arg name="frame_id" value="velodyne"/>#同上frame_id
      <arg name="manager" value="$(arg frame_id)_nodelet_manager" />
      <arg name="model" value="VLP16"/>
      <arg name="pcap" value="$(arg pcap)"/>
      <arg name="port" value="$(arg port)"/>
      <arg name="read_fast" value="$(arg read_fast)"/>
      <arg name="read_once" value="$(arg read_once)"/>
      <arg name="repeat_delay" value="$(arg repeat_delay)"/>
      <arg name="rpm" value="$(arg rpm)"/>
      <arg name="cut_angle" value="$(arg cut_angle)"/>
    </include>
 
  <!-- start cloud nodelet -->
    <include file="$(find velodyne_pointcloud)/launch/cloud_nodelet.launch">
      <arg name="calibration" value="$(arg calibration)"/>
      <arg name="manager" value="$(arg frame_id)_nodelet_manager" />
      <arg name="max_range" value="$(arg max_range)"/>
      <arg name="min_range" value="$(arg min_range)"/>
    </include>
  </group>
 

<!--For VELODYNE 02 -->
 
	<group ns="$(arg lidar2_name)">
  <!-- declare arguments with default values -->
    <arg name="calibration" default="$(find velodyne_pointcloud)/params/VLP16db.yaml"/>
    <arg name="device_ip" default="192.168.1.200" />#我们将该激光雷达的ip修改了
    <arg name="port" default="xxxx" />#ip为"192.168.1.200"的激光雷达的"Data Port"
    <arg name="frame_id" default="velodyne" />
    <arg name="manager" default="$(arg frame_id)_nodelet_manager" />
    <arg name="max_range" default="130.0" />
    <arg name="min_range" default="0.4" />
    <arg name="pcap" default="" />
    <arg name="read_fast" default="false" />
    <arg name="read_once" default="false" />
    <arg name="repeat_delay" default="0.0" />
    <arg name="rpm" default="600.0" />
    <arg name="cut_angle" default="-0.01" />
    <arg name="laserscan_ring" default="-1" />
    <arg name="laserscan_resolution" default="0.007" />
 
  <!-- start nodelet manager and driver nodelets -->
    <include file="$(find velodyne_driver)/launch/nodelet_manager.launch">
      <arg name="device_ip" value="192.168.1.111"/>
      <arg name="frame_id" value="velodyne"/>
      <arg name="manager" value="$(arg frame_id)_nodelet_manager" />
      <arg name="model" value="VLP16"/>
      <arg name="pcap" value="$(arg pcap)"/>
      <arg name="port" value="$(arg port)"/>
      <arg name="read_fast" value="$(arg read_fast)"/>
      <arg name="read_once" value="$(arg read_once)"/>
      <arg name="repeat_delay" value="$(arg repeat_delay)"/>
      <arg name="rpm" value="$(arg rpm)"/>
      <arg name="cut_angle" value="$(arg cut_angle)"/>
    </include>
 
  <!-- start cloud nodelet -->
    <include file="$(find velodyne_pointcloud)/launch/cloud_nodelet.launch">
      <arg name="calibration" value="$(arg calibration)"/>
      <arg name="manager" value="$(arg frame_id)_nodelet_manager" />
      <arg name="max_range" value="$(arg max_range)"/>
      <arg name="min_range" value="$(arg min_range)"/>
    </include>
  </group>
 
</launch>

下面是包里针对velodyne修改后的:

<!-- -*- mode: XML -*- -->
<!-- run velodyne_pointcloud/CloudNodelet in a nodelet manager for a VLP-16 -->
<!-- Run two Velodyne VLP-16 LiDARs -->
 
<launch>

	<!-- Name lidar devices -->
	<arg name="lidar1_name" default="lidar_parent" />
	<arg name="lidar2_name" default="lidar_child" />
 
 
<!-- FOR first VLP16 -->
 	<group ns="$(arg lidar1_name)">
  <!-- hardware parameters -->
    <arg name="calibration" default="$(find velodyne_pointcloud)/params/VLP16db.yaml"/>
    <arg name="device_ip" default="192.168.1.201" />
    <arg name="port" default="2369" />
    <arg name="frame_id" default="velodyne1" />
    <arg name="manager" default="$(arg frame_id)_nodelet_manager" />
    <arg name="max_range" default="130.0" />
    <arg name="min_range" default="0.4" />
    <arg name="pcap" default="" />
    <arg name="read_fast" default="false" />
    <arg name="read_once" default="false" />
    <arg name="repeat_delay" default="0.0" />
    <arg name="rpm" default="600.0" />
    <arg name="cut_angle" default="-0.01" />
    <arg name="laserscan_ring" default="-1" />
    <arg name="laserscan_resolution" default="0.007" />
 
  <!-- start nodelet manager and driver nodelets -->
    <include file="$(find velodyne_driver)/launch/nodelet_manager.launch">
      <arg name="device_ip" value="192.168.1.201"/>
      <arg name="frame_id" value="velodyne1"/>
      <arg name="manager" value="$(arg frame_id)_nodelet_manager" />
      <arg name="model" value="VLP16"/>
      <arg name="pcap" value="$(arg pcap)"/>
      <arg name="port" value="$(arg port)"/>
      <arg name="read_fast" value="$(arg read_fast)"/>
      <arg name="read_once" value="$(arg read_once)"/>
      <arg name="repeat_delay" value="$(arg repeat_delay)"/>
      <arg name="rpm" value="$(arg rpm)"/>
      <arg name="cut_angle" value="$(arg cut_angle)"/>
    </include>
 
  <!-- start cloud nodelet -->
    <include file="$(find velodyne_pointcloud)/launch/cloud_nodelet.launch">
      <arg name="calibration" value="$(arg calibration)"/>
      <arg name="manager" value="$(arg frame_id)_nodelet_manager" />
      <arg name="max_range" value="$(arg max_range)"/>
      <arg name="min_range" value="$(arg min_range)"/>
    </include>
  </group>
 

<!--For VELODYNE 02 -->
 
	<group ns="$(arg lidar2_name)">
  <!-- declare arguments with default values -->
    <arg name="calibration" default="$(find velodyne_pointcloud)/params/VLP16db.yaml"/>
    <arg name="device_ip" default="192.168.1.200" />
    <arg name="port" default="2368" />
    <arg name="frame_id" default="velodyne2" />
    <arg name="manager" default="$(arg frame_id)_nodelet_manager" />
    <arg name="max_range" default="130.0" />
    <arg name="min_range" default="0.4" />
    <arg name="pcap" default="" />
    <arg name="read_fast" default="false" />
    <arg name="read_once" default="false" />
    <arg name="repeat_delay" default="0.0" />
    <arg name="rpm" default="600.0" />
    <arg name="cut_angle" default="-0.01" />
    <arg name="laserscan_ring" default="-1" />
    <arg name="laserscan_resolution" default="0.007" />
 
  <!-- start nodelet manager and driver nodelets -->
    <include file="$(find velodyne_driver)/launch/nodelet_manager1.launch">
      <arg name="device_ip" value="192.168.1.200"/>
      <arg name="frame_id" value="velodyne2"/>
      <arg name="manager" value="$(arg frame_id)_nodelet_manager" />
      <arg name="model" value="VLP16"/>
      <arg name="pcap" value="$(arg pcap)"/>
      <arg name="port" value="$(arg port)"/>
      <arg name="read_fast" value="$(arg read_fast)"/>
      <arg name="read_once" value="$(arg read_once)"/>
      <arg name="repeat_delay" value="$(arg repeat_delay)"/>
      <arg name="rpm" value="$(arg rpm)"/>
      <arg name="cut_angle" value="$(arg cut_angle)"/>
    </include>
 
  <!-- start cloud nodelet -->
    <include file="$(find velodyne_pointcloud)/launch/cloud_nodelet1.launch">
      <arg name="calibration" value="$(arg calibration)"/>
      <arg name="manager" value="$(arg frame_id)_nodelet_manager" />
      <arg name="max_range" value="$(arg max_range)"/>
      <arg name="min_range" value="$(arg min_range)"/>
    </include>
  </group>
 
</launch>

至此,双激光雷达可以正常启动,但用NDT方法进行标定时,rviz报错"Ignoring transform from authority 'unknown_publisher' with frame_id and child_frame_id 'velodyne', because they are the same",是因为两个激光雷达默认的Fixed_Frame都是"velodyne"造成重复,应该修改激光雷达驱动发布的点云数据的坐标系名称.具体解决方式见下:

=======================================================

双激光雷达标定需要修改几个文件(提供的包里已改)

1.激光雷达启动文件:将两个激光雷达的frame_id分别改为velodyne1与velodyne2;将第二个激光雷达的"nodelet_manager.launch"与"cloud_nodelet.launch"改为"nodelet_manager1.launch"与"cloud_nodelet1.launch"

2.在velodyne_pointcloud的launch文件夹中新建一个"cloud_nodelet1.launch"文件,将cloud_nodelet.launch文件内容复制进去,然后将cloud_nodelet.launch中的"frame_id"与"target_id"名称"velodyne1",将cloud_nodelet.launch中的"frame_id"与"target_id"名称改为"velodyne2"。

3.在velodyne_driver的launch文件夹中新建一个"nodelet_manager1.launch"文件,将nodelet_manager.launch文件内容复制进去,然后将nodelet_manager.launch中的"frame_id"改成"velodyne1",将"port"改为velodyne1对应的端口数字;将nodelet_manager1.launch中的"frame_id"改成"velodyne2",将"port"改为velodyne2对应的端口数字;

=========================================================

启动该launch文件就可以启动两个激光雷达啦!

roslaunch velodyne_points multi_VLP16_points.launch

三、双激光雷达标定

本方法采用的双激光雷达标定方法是NDT扫描匹配算法,算法详解见https://adamshan.blog.csdn.net/article/details/105930565

首先在github上克隆标定包,并编译:

#创建工作空间
mkdir -p ~/calibration_ws/src
cd ~/calibration_ws/src
catkin_init_workspace

#克隆标定代码包并编译
git clone https://gitee.com/guomin9192/multi_lidar_calibration.git
cd ..
catkin_make

 编译成功后给双激光雷达外参一个初始值,该初始值可以通过大致的测量获得。

cd ~/calibration_ws/src/multi_lidar_calibration/cfg
gedit child_topic_list

该文件是运行文末rosbag对6个激光雷达进行标定时的初始值设定,我们现在对双激光雷达进行标定。第一行表示child frame的个数,即子激光雷达个数;第二行是子激光雷达的点云数据topic;第三行为子激光雷达到父激光雷达的坐标变换初始估计值,顺序为(x,y,z,yaw,pitch,roll) 。

根据前文对双激光雷达的启动设置,将文件改为:

1
/lidar_child/velodyne_points
#下面是我的双激光雷达位姿初始估计值,注意是子激光雷达到父激光雷达的变换
0.2 0.0 0.25 0.0 0.0 0.0

修改完成后,启动roscore

roscore

另起终端启动rviz

#进入标定包并启动rviz
roscd multi_lidar_calibration
rviz -d rviz/multi_lidar_calibration.rviz

另起新终端启动标定包

source ~/calibration_ws/devel/setup.bash
roslaunch multi_lidar_calibration multi_lidar_calibration.launch

至此,标定完成!此时可以看到程序会不断输出两个激光雷达标定的结果,rviz中会显示两只激光雷达标定完成的点云数据!

如果没有实物激光雷达的,也可以用AdamShan提供的rosbag,下载链接:rosbag,提取码: pemc

采用rosbag标定结果rviz显示为:

  • 12
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: VLP-16激光雷达是Velodyne公司推出的一款小型三维激光雷达。该手册在CSDN上提供,内容涵盖了VLP-16激光雷达的使用方法、技术参数、数据处理等方面的内容。 手册首先介绍了VLP-16激光雷达的基本原理和工作方式,说明了它通过发射激光束并接收反射回来的信号来获取目标物体的距离和位置信息。接着,手册详细介绍了VLP-16激光雷达的技术参数,包括激光束数量、旋转速度、水平和垂直分辨率等。这些参数的了解对于使用者来说非常重要,可以帮助他们更好地理解和应用这款激光雷达。 手册还介绍了VLP-16激光雷达的使用方法和注意事项。它提供了详细的操作步骤和示例代码,帮助使用者快速上手,并了解如何通过编程控制激光雷达的工作模式和数据输出。同时,手册还列举了一些使用过程中可能遇到的常见问题和解决方法,以及一些使用技巧和注意事项,帮助使用者更好地应对各种情况。 除了基本的使用方法,手册还介绍了一些高级的应用和数据处理技术。它涵盖了点云数据的获取和处理、目标检测和跟踪、地图构建等方面的内容,为使用者提供了一些实用的技术指南和示例代码,帮助他们在实际应用中更好地利用VLP-16激光雷达。 总之,VLP-16激光雷达手册在CSDN上提供了全面的使用指南和技术支持,覆盖了激光雷达的基本原理、使用方法、数据处理等方面的内容,对于想要使用VLP-16激光雷达的人来说非常有价值。 ### 回答2: vlp16激光雷达手册是一本包含关于使用和操作vlp16激光雷达的重要信息的指南。该手册为用户提供了详细的技术规格、安装步骤、软件设置和使用指导等内容。 首先,手册中包含了vlp16激光雷达的技术规格,用户可以通过阅读手册了解到该激光雷达的测距范围、测距精度、水平和垂直角度等参数,以便更好地了解激光雷达的性能特点。 其次,手册中还介绍了vlp16激光雷达的安装步骤。用户可以根据手册提供的详细说明,正确地安装并固定激光雷达,确保其与所需的应用环境相匹配。 此外,手册还提供了关于软件设置的指导。用户可以了解到如何配置和调整激光雷达的参数,以满足特定的应用需求。手册中还包含了一些常见问题和解决方案的部分,用户可以通过查阅手册,找到针对特定问题的解决方案。 最后,手册还介绍了如何使用vlp16激光雷达进行数据采集和处理。用户可以了解到如何使用相应的软件工具来获取并分析激光雷达所获得的数据,并将其应用于具体的领域,如无人驾驶、环境监测等。 总之,vlp16激光雷达手册是一本实用指南,为用户提供了使用和操作该激光雷达所需的关键信息和指导。通过阅读手册,用户能够更好地了解激光雷达的技术特点,正确安装和设置激光雷达,并有效地利用激光雷达的数据进行相关应用。 ### 回答3: VLP-16激光雷达手册是一份关于该型号激光雷达的使用说明书,通常可以在CSDN上找到相关的资料。该手册主要包括了设备的基本功能、技术参数、使用方法以及常见问题的解答等内容。 首先,在手册中会介绍VLP-16激光雷达的基本功能和应用场景。该型号激光雷达一般用于机器人导航、环境感知、三维重建等领域,在自动驾驶、无人机等行业有着重要的应用价值。 其次,手册会详细列出VLP-16激光雷达的技术参数,包括激光器的功率、工作距离、扫描速度等指标。这些参数可以让用户了解设备的性能和限制,从而更好地应用于实际的项目中。 手册还会介绍VLP-16激光雷达的使用方法。它可能包括设备的安装步骤、连接方式和软件设置等内容。用户可以根据手册中提供的指导,正确使用激光雷达,以获取稳定和准确的数据。 此外,手册还会列举一些可能遇到的问题,并提供解决方案。例如,激光雷达的扫描数据异常、设备连接问题等。用户可以根据手册中的指引,进行故障排除,提高设备的稳定性和可靠性。 总结来说,VLP-16激光雷达手册是一份重要的使用说明书,可以帮助用户了解设备的功能和技术参数,并提供使用和故障排除的指导。通过阅读和学习手册,用户可以更好地应用激光雷达技术,提高工作效率和准确性。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值