LIDAR和IMU的外参标定

一、lidar_align

我们使用的lidar_align这个算法来进行标定。

1.下载源码

在ros工作空间下的src文件夹下运行这个命令。

    git clone https://github.com/ethz-asl/lidar_align.git
    sudo apt-get install libnlopt-dev
    cd ..
    catkin_make

这里编译的时候会爆一些错误。我遇到的是:LIDAR和IMU的外参标定_第1张图片

这是因为我们没有nlopt这个库。运行下面的命令安装。

git clone https://github.com/stevengj/nlopt.git
cd nlopt
mkdir build
cd build
cmake ..
make
sudo make install

make的时候会报版本的问题,需要把cmake版本升级,我不知道咋升级,就把路径下文件里需要的地方版本改低一点,就编译成功了。

LIDAR和IMU的外参标定_第2张图片

安装完在 /usr/local/lib/cmake 目录下出现 nlopt 文件。在lidar_align-master文件夹中的CMakeLists.txt添加以下代码:

list(APPEND CMAKE_FIND_ROOT_PATH ${CMAKE_SOURCE_DIR})
set (CMAKE_PREFIX_PATH "/usr/local/lib/cmake/nlopt")

这样改完catkin_make应该就没问题了。如果还有报错,看这个博客。使用lidar_align进行激光雷达与IMU的外参标定(超详细教程)_lidar与imu外参标定_╰︶ ̄ 莫等闲۩۩۩的博客-CSDN博客

 2.调整配置

修改lidar_align.launch里的配置。

主要是你数据集所在的路径:bag_file的路径

LIDAR和IMU的外参标定_第3张图片

第二步是要进行代码的修改,因为这个代码要想完成lidar和imu的标定需要对 loader.cpp里面的代码进行修改,头部导入#include

  std::vector types;
  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());
 
    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);
    }
  }
  /*
  std::vector types;
  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());

    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);
  }
  */

这样搞完就可以运行了,最终结果在result文件夹下。

roscore
source devel/setup.bash
roslaunch lidar_align lidar_align.launch

二、lidar_imu_init

在工作空间的src下面下载源码

git clone https://github.com/hku-mars/LiDAR_IMU_Init.git

查看readme,安装相关的依赖库。切忌里面ceres_solver的安装,必须是2.0.0版本,而不能是最新的版本,否则编译的时候会报下面的错误。

LIDAR和IMU的外参标定_第4张图片

当前在src下面,运行以下代码

cd ..
catkin_make -j
source devel/setup.bash

你可能感兴趣的:(算法)