我们使用的lidar_align这个算法来进行标定。
1.下载源码
在ros工作空间下的src文件夹下运行这个命令。
git clone https://github.com/ethz-asl/lidar_align.git
sudo apt-get install libnlopt-dev
cd ..
catkin_make
这是因为我们没有nlopt这个库。运行下面的命令安装。
git clone https://github.com/stevengj/nlopt.git
cd nlopt
mkdir build
cd build
cmake ..
make
sudo make install
make的时候会报版本的问题,需要把cmake版本升级,我不知道咋升级,就把路径下文件里需要的地方版本改低一点,就编译成功了。
安装完在 /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的标定需要对 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
在工作空间的src下面下载源码
git clone https://github.com/hku-mars/LiDAR_IMU_Init.git
查看readme,安装相关的依赖库。切忌里面ceres_solver的安装,必须是2.0.0版本,而不能是最新的版本,否则编译的时候会报下面的错误。
当前在src下面,运行以下代码
cd ..
catkin_make -j
source devel/setup.bash