实现环境:
- 系统环境: Ubuntu16.04
- 激光雷达: velodyne16线
- imu品牌 : xsens (频率400hz)
先放下效果图:
rviz建图中:
建图完保存的pcd:
作者使用的是500HZ的IMU,我这里使用的是XSENS 400hz的,基本没有踩过坑(看过有的博主用的100hz的出来也还是有效果的).激光雷达使用的是velodyne16,和作者使用的也一样,因此整个过程都很顺利.下面详细说一下流程.后面有空的话看下如何加入gps信息.
一 激光雷达和imu的联合标定
1.1 简介
联合标定使用的是lidar_align方法.dar-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.2 环境搭建
(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-sl/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<geome