Skip to content

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/PointCloud2sensor_msgs/Imu 消息. 为了在校准过程中获得良好的结果, 您需要在收集数据时在所有 6 个轴(X、Y、Z、滚动、俯仰、偏航)上移动传感器. 因此,在数据收集时将传感器拿在手中会得到更好的结果, 但您也可以收集有关车辆的数据.如果您正在收集有关车辆的数据, 你应该画 8 和网格的数字.

lidar-imu-calib-data-collection

激光雷达 - IMU 校准数据收集

此外,校准精度还受数据收集环境的影响. 您应该在包含大量平面的地方收集数据, 而室内空间是这些条件下的最佳位置. 但是,您也可以在户外取得良好的效果. 收集数据时,请务必绘制 8 和网格的数字, 从各个角度捕获数据.

ROS 2 bag转换为 ROS 1 bag#

如果您在 ROS 2 中收集了校准数据, 您可以按照以下说明将其转换为 ROS 1 bag 文件:

  • 如果 ROS 2 bag 文件包含非标准消息主题,则拆分该文件 (您只能选择 sensor_msgs/PointCloud2sensor_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_timeend_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 文件中.

lidar-imu-calib-rviz

激光雷达 - IMU 标定 RViz 屏幕

为了获得更好的结果,您可以调整 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 激光雷达传感器输出的轨迹估计权重