Lidar-Imu Calibration#
概述#
Lidar-Imu 校准对于定位和地图构建算法非常重要,用于自动驾驶.在本教程中,我们将校准 使用 OA-LICalib 的激光雷达和 IMU 传感器 由 APRIL Lab 开发的工具,在中国浙江大学.
OA-LICalib 是 LiDAR-IMU 的校准方法 在连续时间批量优化中,其中两个传感器的固有 传感器之间的时间偏移量和传感器之间的时空外在 经过全面校准,没有明确的手工目标。
警告
此校准工具是使用 ROS 1 开发的,与 ROS 2 不兼容. 因此,我们提供了一个 docker 镜像,其中包含 ROS 1 和所有必要的软件包. 在校准说明中,我们将要求您在您的系统.
我们的 tutorial_vehicle 校准过程的 ROS 2 bag示例
Files: rosbag2_2023_08_18-14_42_12_0.db3
Bag size: 12.4 GiB
Storage id: sqlite3
Duration: 202.140s
Start: Aug 18 2023 14:42:12.586 (1692358932.586)
End: Aug 18 2023 14:45:34.727 (1692359134.727)
Messages: 22237
Topic information: Topic: /sensing/gnss/sbg/ros/imu/data | Type: sensor_msgs/msg/Imu | Count: 20215 | Serialization Format: cdr
Topic: /sensing/lidar/top/pointcloud_raw | Type: sensor_msgs/msg/PointCloud2 | Count: 2022 | Serialization Format: cdr
数据收集和准备#
激光雷达 - IMU 校准需要一个 ROS 1 bag文件,其中包含 sensor_msgs/PointCloud2 和 sensor_msgs/Imu 消息.
为了在校准过程中获得良好的结果, 您需要在收集数据时在所有 6 个轴(X、Y、Z、滚动、俯仰、偏航)上移动传感器.
因此,在数据收集时将传感器拿在手中会得到更好的结果, 但您也可以收集有关车辆的数据.如果您正在收集有关车辆的数据, 你应该画 8 和网格的数字.
此外,校准精度还受数据收集环境的影响. 您应该在包含大量平面的地方收集数据, 而室内空间是这些条件下的最佳位置. 但是,您也可以在户外取得良好的效果. 收集数据时,请务必绘制 8 和网格的数字, 从各个角度捕获数据.
将 ROS 2 bag转换为 ROS 1 bag#
如果您在 ROS 2 中收集了校准数据, 您可以按照以下说明将其转换为 ROS 1 bag 文件:
- 如果 ROS 2 bag 文件包含非标准消息主题,则拆分该文件
(您只能选择
sensor_msgs/PointCloud2和sensor_msgs/Imu消息), 并将您的拆分 ROS 2 包文件转换为 ROS 1 包.
创建一个名为 out.yaml 的 yaml 文件,其中包含您的 lidar 和 imu 主题:
output_bags:
- uri: splitted_bag
topics: [/your/imu/topic, /your/pointcloud/topic]
拆分您的 ROS 2 bag 文件:
ros2 bag convert -i <YOUR-ROS2-BAG-FOLDER> -o out.yaml
将拆分后的 ROS 2 bag 文件转换为 ROS 1 bag 文件:
# 安装 bag 转换工具 (https://gitlab.com/ternaris/rosbags)
pip3 install rosbags
# 转换 bag
rosbags-convert <YOUR-SPLITTED-ROS2-BAG-FOLDER> --dst <OUTPUT-BAG-FILE>
rosbags-convert --src ./splitted_bag --dst tomato_ros1.bag --src-typestore ros2_humble
Lidar-Imu 校准#
作为第一步,我们需要在我们的系统上安装 docker. 您可以安装 docker 使用 此链接,或者您可以使用 以下命令使用 Apt 存储库安装 docker.
设置 Docker 的 Apt 存储库:
# 添加 Docker 的官方 GPG 密钥:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 将存储库添加到 Apt 源:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
安装 Docker 包:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
要检查 docker 是否安装正确,您可以运行以下命令:
sudo docker run hello-world
在完成安装之前,我们需要将我们的用户添加到 docker 组. 这将允许我们在没有 sudo 的情况下运行 docker 命令:
sudo groupadd docker
sudo usermod -aG docker $USER
警告
运行上述命令后,您需要注销并重新登录才能 在没有 sudo 的情况下运行 docker 命令.
安装 docker 后,我们就可以运行校准工具了.作为第一步,您应该克隆校准存储库:
git clone https://github.com/leo-drive/OA-LICalib.git
然后,您需要构建 docker 镜像:
cd OA-LICalib/docker
sudo docker build -t oalicalib .
构建 docker 镜像后,您需要从镜像创建一个容器:
警告
您需要使用克隆存储库的路径更新 REPO_PATH 在您的系统上.
export REPO_PATH="/home/ros/work/OA-LICalib"
docker run -it --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" --volume="$REPO_PATH:/root/catkin_oa_calib/src/OA-LICalib" oalicalib bash
docker run -it \
--gpus all \
--env="DISPLAY=$DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--env="NVIDIA_VISIBLE_DEVICES=all" \
--env="NVIDIA_DRIVER_CAPABILITIES=compute,utility,graphics" \
--volume="$HOME/.Xauthority:/root/.Xauthority:rw" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
--volume="$REPO_PATH:/root/catkin_oa_calib/src/OA-LICalib" \
--net=host \
oalicalib bash
在运行校准工具之前,您应该更改配置文件.您可以在 OA-LICalib/config 中找到配置文件
将配置文件中的以下参数更改为您的 topic 和 sensors:
- 这些是激光雷达型号选项: VLP_16_packet, VLP_16_points, VLP_32E_points, VLS_128_points, Ouster_16_points, Ouster_32_points, Ouster_64_points, Ouster_128_points, RS_16
start_time和end_time是您要使用的 rosbag 的间隔
path_bag是 rosbag 文件的路径,但您需要给出里面的路径 容器,而不是您的本地系统.例如 如果您在OA-LICalib/data目录中有一个 rosbag 文件, 您需要将路径指定为/root/calib_ws/src/OA-LICalib/data/rosbag2_2023_08_18-14_42_12_0.bag
topic_lidar: /sensing/lidar/top/pointcloud_raw
topic_imu: /sensing/gnss/sbg/ros/imu/data
LidarModel: VLP_16_SIMU
selected_segment:
- {
start_time: 0,
end_time: 40,
path_bag: /root/calib_ws/src/OA-LICalib/data/rosbag2_2023_08_18-14_42_12_0.bag,
}
创建容器并更改参数后, 您可以构建并运行 calibration 工具:
cd /root/catkin_oa_calib
catkin_make -DCATKIN_WHITELIST_PACKAGES=""
source devel/setup.bash
roslaunch oa_licalib li_calib.launch
运行校准工具后,您可以跟踪校准过程 连接到另一个终端上的容器.要连接到容器, 您可以运行以下命令:
xhost +local:docker
docker exec -it <container_name> bash
警告
您需要 docker ps 命令.此命令的
output 应该是这样的,你可以找到你的容器名称
在最后一列中:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
adb8b559c06e calib:v1 "/ros_entrypoint.sh …" 6 seconds ago Up 5 seconds your_awesome_container_name
连接到容器后,您可以看到校准过程. 运行 Rviz 后, 您需要添加以下内容 Rviz 的主题:
- /ndt_odometry/global_map
- /ndt_odometry/cur_cloud
rviz
如果 /ndt_odometry/global_map 看起来失真,您应该调整 ndt 参数
在 OA-LICalib/config/simu.yaml 文件中.
为了获得更好的结果,您可以调整 config/simu.yaml 文件中的参数.参数说明如下:
| 参数 | 值 |
|---|---|
| ndtResolution | 体素网格分辨率参数,用于 NDT 网格结构 (VoxelGridCovariance) 0,5 室内案例和室外案例 1.0 |
| ndt_key_frame_downsample | 体素网格下采样函数的分辨率参数 |
| map_downsample_size | 体素网格下采样函数的分辨率参数 |
| knot_distance | 时间间隔 |
| plane_motion | 如果您从车辆收集数据,请设置为 true |
| gyro_weight | 陀螺仪传感器输出的轨迹估计权重 |
| accel_weight | 加速度传感器输出的轨迹估计权重 |
| lidar_weight | 激光雷达传感器输出的轨迹估计权重 |