利用Intel Realsense D455 进行Laser Camera标定总结
所有连接请右键在新建标签页中打开,直接点击会跳到别人的页面,不知道CSDN抽什么风
原文地址
原Github地址
注意如果你使用的是Hokuyo雷达 ,Hokuyo雷达配置
可以直接按照原文进行配置,不会出现下面我遇到的各种问题
Intel RealSense SDK 安装
Register the server’s public key:
sudo apt-key adv --keyserver keys.gnupg.net --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE
Add the server to the list of repositories:
sudo add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main" -u
Install the libraries (see section below if upgrading packages):
sudo apt-get install librealsense2-dkms
sudo apt-get install librealsense2-utils
run:
realsense-viewer
RealSense ROS 包
Github地址
请自行下载,新建ROS工作空间或者利用现有的工作空间,下载的源码移入/src,然后编译
或者
sudo apt-get install ros-$ROS_DISTRO-realsense2-camera
启动相机的命令
运行
roslaunch realsense2_camera rs_camera.launch
激光雷达
请根据自己使用的雷达型号使用对应的ROS包,并将激光雷达的正方向
朝向标定板安置
我使用的是思岚A2 雷达,启动雷达的命令
运行
roslaunch rplidar_ros rplidar.launch
前期准备
1.制作标定板
可以选择多 apriltag 的标定板 ( kalibr_tag.pdf ) 或者自己打印一个 apriltag 做标定板(apriltag.pdf)。
原作者采用的是多apriltag 的标定板,尺寸应该是A0纸,因为kalibr_tag.pdf的实际尺寸是80cm x 80cm的
2.修改Config文件
请注意:确定你所使用的相机的模型是哪一种,常用的有针孔相机(Pinhole)和鱼眼相机(Kannala-brandt)。
如果你所使用的相机模型为针孔相机(Pinhole)
,请将config/calibra_config_pinhole.yaml中的内容覆盖到config/calibra_config.yaml中,并修改config/calibra_config.yaml中的以下参数
1)savePath::后面标定结果的保存位置
2)bag_path:录制的bag数据包的保存位置,默认在/home/用户名/路径下
3)scan_topic_name:修改为 /scan
4)img_topic_name:修改为 /camera/color/image_raw
5)tag_type:1:多 apriltag 的标定板
2:单 apriltag 的标定板
6)tag_size:apriltag 的边长
7)tag_spacing:apriltag之间的间距/apriltag 的边长
8)black_border:1:单apriltag 的标定板
2:多apriltag 的标定板
9)model_type:PINHOLE
10)camera_name: cam0
11)image_width: 1280
12)image_height: 720
13)distortion_parameters:
k1:
k2:
k3:
k4:
14)projection_parameters:
fx:为相机内参K中的fx参数
fy:为相机内参K中的fy参数
cx:为相机内参K中的cx参数
cy:为相机内参K中的cy参数
realsense相机参数官方已经标定好了,可以通过订阅一个ROS节点来获得,运行
rostopic echo /camera/color/camera_info
就可以获得相机参数K 和 D 以及其他的参数
内参K :
3.录制bag数据
启动rviz,根据话题添加可视化,选择/camera/color/image_raw 中的Image 和 /scan 中的 LaserScan
根据 rviz 中显示的相机画面,调整标定板在相机中的位置。
录制数据时不应只平移标定板,还应该进行角度旋转,包括水平轴和竖直轴
确保标定板被相机完全捕捉到,并且同时确保雷达激光点能够扫描到标定板的下半部。
但在实际录制过程中,无法保证能够有效控制距离,所以如果后续程序运行出现异常,请根据异常结果和代码寻找可能的原因,并重新录制数据
大致位置请参考下图,注意该图片并不是此步骤得到的
然后输入以下代码
,记录雷达和相机数据
rosbag record /scan /camera/color/image_raw
根据rosbag录制的数据名称,修改calibra_config.yaml中的bagPath参数
标定开始
位姿计算
运行
roslaunch lasercamera_ros kalibra_apriltag.launch
之后会出现如上图所示的窗口,注意XYZ轴的显示是否正常,如果不正常,可能你的参数文件中相机内参没有配置正确。
标定板位置检测 以及 变换矩阵计算
运行
roslaunch lasercamera_ros calibra_offline.launch
如果没有什么问题的话,会出现下图所示的效果
但是,大概率不会显示上图中的红线,也就是标定板的位置。或者标定板确实被标红了,但是其他地方的激光点也被误标记为红色。
这里讲一下检测步骤:
1):将所有激光数据经过简单变换为平面坐标,并在窗口中以蓝色点显示
2):检测坐标满足一定条件(包括两点之间的距离,点到原点也就是激光雷达的位置,具体请查阅代码。代码位置在calibr_offline.cpp中 的 AutoGetLinePts 函数中)的连续点段,并对点段进行扩充,然后以绿色点显示
3):从上面的点段中,找到最长的点段作为最优的直线段,并以红色点显示
为了准确找到标定板上的激光点,需要修改代码,可以简单粗暴的将标定板上的点全部作为最优直线段输出。或者对原有的判断条件进行修改,使代码适应录制的数据。
变换矩阵验证
运行
roslaunch lasercamcal_ros debug.launch
如果变换矩阵计算正确的话,理想情况应该如下图所示:
但是,我们在标定的过程中却发现,图片中会出现相机视野中不应该存在的点,如下图
可以看到,有两条线,在debug过程中发现,验证代码应该是将相机视野背面的点也显示在了图片中,究其原因,大概是原作者采用的激光雷达数据仅包含相机相机前方的激光点,所以我们对验证代码进行了修改,只保留相机前方的点。验证结果如下:
重新录制了数据
结果如下
并将时间戳差值(calibr_offline.cpp中的min_dt值)从20ms修改为50ms ,结果如下图
时间戳差值修改为100ms,结果如下,接近完美