编者推荐使用视觉检测目标,将检测结果的2D包围盒坐标信息投影到点云中,得到3D包围盒x坐标。这就需要对相机和激光雷达进行联合标定,即获得两个坐标系之间的空间变换关系。
一、简介
最近,我们正在为车辆添加障碍物检测模块。障碍物检测可以使用激光雷达进行物体聚类。然而,我们使用的是16 线velodyne。行数还是有点稀疏。对于远处的物体,线的数量对于聚类来说太稀疏。效果不好,所以考虑使用视觉进行目标检测,然后将其投影到3D点云中以获得障碍物的位置。同时,视觉还可以给出障碍物类别的信息。利用视觉进行目标检测,将检测结果的2D边界框坐标信息投影到点云中,得到3D边界框x坐标。这就需要对相机和激光雷达进行联合标定,即获得两个坐标系之间的空间变换关系。相关代码已同步到我的github-smartcar链接:https://github.com/sunmiaozju/smartcar。标定部分在检测/校准文件夹中,信息融合部分在检测/camera_point_fusion中。
2. 联合标定换算关系
联合标定的作用是建立点云中的点与图像像素之间的对应关系。需要获取相机和激光雷达的外参数,将点云3D坐标系中的点投影到相机3D坐标系中。还需要通过相机标定来获取相机内部参数。这是将相机3D坐标系中的点投影到成像平面上。详情如下所示:
上图展示了联合标定得到的44变换矩阵的作用,它将我们的3D点云变换到相机坐标系中。
这张图展示了相机坐标系和成像坐标系的关系。相机标定将得到相机内参矩阵和畸变系数。畸变系数可以消除相机凸透镜的畸变影响。相机内参的信息可以被认为是相机坐标下的3D点。投影到2D 像素平面上。相机标定的具体原理请参考//zhuanlan.zhihu.com/p/24651968。 3、相机标定需要标定板,可以是硬板,也可以是泡沫标定板,因为标定板的平面必须是平的。标定板的文件可以从opencv官网下载。首先进行相机标定。相机标定模块编译在detector/calibration/camera_calibration 中。
cd your_rosworkspace_path/catkin_make -DCATKIN_BLACKLIST_PACKAGES=ndt_mapping;static_map;ndt_localization
这里我们就不编译ndt_mapping这三个软件包了;静态地图; ndt_本地化。如果出现错误,可以先编译消息文件,然后再编译所有文件:
catkin_make -DCATKIN_WHITELIST_PACKAGES=smartcar_msgs;yunle_msgs;smartcar_config_msgs catkin_make -DCATKIN_WHITELIST_PACKAGES=””
然后修改Detection/calibration/camera_calibration/nodes文件夹下的python文件的可执行权限:
sudo chmod a+x your_path/检测/校准/camera_calibration/。
启动摄像头驱动节点
roslaunch cv_camera cv_camera_driver.launch
这里注意自己的摄像头video_id,使用以下命令查看
ls /dev/视频*
然后根据需要修改your_path/driver/cv_camera/launch/cv_camera_driver.launch
打开新终端并执行
rosrun校准cameracalibrator.py --square 0.13 --size 8x6 image:=/cv_camera/image_raw
然后就可以进行校准了,弹出界面如下:
您只需移动校准版本,使右上角的四个条全部变成绿色(这里绿色的表示已调整,未调整的为淡黄色)。 x代表左右移动,y代表上下移动,size代表远近移动。 Skew代表倾斜侧角,可以向上、向下、向左、向右倾斜。只有四个秤的信息满足要求后,才会显示右侧的校准图标。这时,就意味着可以计算出校准结果了。单击校准,然后保存。校准结果将保存在主文件夹中。
4. 联合校准
联合标定使用autoware的CalibrationTookit模块。代码位于检测/校准/calibration_camera_lidar文件夹下。编译完代码后,首先要启动摄像头和激光雷达的驱动节点。
roslaunch cv_camera cv_camera_driver.launch
新航站楼
roslaunch velodyne_pointcloud VLP16_points.launch
然后驱动联合标定节点
roslaunchcalibration_camera_lidarcamera_lidar_calib.launch
启动后,可以看到UI界面。具体操作说明可以参考文档:Detection/calibration/calibration_camera_lidar/CalibrationToolkit_Manual.pdf的2.3节。您也可以参考链接//blog.csdn.net/AdamShan/article/details/81670732#commentBox。上面关于如何使用这个模块的链接已经说得很清楚了,这里简单说明一下: 首先在左上角加载之前校准好的相机内参文件,导入相机内参 调整点云的视角(操作方法参考上面链接),然后保证在点云中可以看到图像和完整的白色标定板。点击右上角的抓取,捕获单帧图像和点云。在捕获单帧的点云上,选择图像中相应校准板的位置。圆中的所有点均被选中。点不仅包含点的信息,还包含平面法向量。校准时,必须保证法向相量垂直于平面。因为我一开始没有注意这一点,结果后来验证的时候,投影点并没有显示在图片上。出来,图像范围内根本没有投影。校准完成后,右上角有一个项目,可以查看校准效果。一般可以看到如下效果:
左下角图片上的红线就是右下角点云的红线投影到图片上的位置。下图中,点以另一个角度投影,点云和图片中的相对位置基本一致:
这个效果基本上还是不错的。点击保存,输出的外部参数文件将保存在home文件夹下。
5、视觉与点云信息融合
通过联合标定的外部参数文件,我们可以进行信息融合。信息融合主要有两个模块:点云到图像、图像到点云
5.1 图像2点
这部分代码位于your_path/deteection/camera_point_fusion/packages/joint_pixel_pointcloud 的pkg 下。这部分代码的功能是将velodyne-16的点云投影到640480的图像上。如果点云投影的二维点在图像640480范围内,则记录这个三维激光雷达点的位置,同时匹配图像上对应像素的颜色,将其返回为pcl:XYZRGB 点,并显示它。此外,该模块还可以订阅目标检测信息。相机获取图像。经过目标检测模块后,得到二维边界框坐标。利用点云和图像像素之间的对应关系,获得3维边界框信息,并显示在RVIZ中。编译代码后,运行:
roslaunch joint_pixel_pointcloud joint_pixel_pointcloud.launch
同样,您需要先运行相机驱动节点和velodyne驱动节点,以及目标检测节点。但由于某些原因,目标检测模块无法公开到github。您可以使用自己的目标检测模块并将其作为ROS 节点添加到工作区。代码运行效果如下:
这是与图像像素对应的点云。可以看到点云已经添加了黑白颜色。点云周围有一些较浅的颜色。下图加深了颜色并显示了图像对应的点云。在整个点云框架中的位置:
以下是目标检测的效果:
可以看到,图像上检测到的物体基本对应于3D场景,其中不同的颜色代表不同的物体类别。不过由于这个目标检测模型是针对自动驾驶场景的,分类对象都是汽车、行人、信息标志等,而且由于实验条件的原因,我没有时间拿出来测试代码效果,所以我先在房间里测试了一下。暂时可以看到目标检测框有些无意义,但是并不影响验证信息融合效果。该节点可以促进我们的障碍物检测,因为视觉信息比低线数激光雷达聚类更适合障碍物检测。然而,虽然视觉信息在识别物体方面是准确的,但它不具有距离信息。激光雷达可以提供距离信息。因此,通过视觉和激光雷达相结合,可以获得障碍物的距离、类别和位置
5.2 点2像
这是将点云投影到图像上。具体操作我就不多说了。代码具体效果如下:
可以看到,点云与图像基本匹配。这个节点的作用是帮助我们进行交通灯识别或者其他info_sign识别。因为对于红绿灯检测来说,最好能够获得红绿灯在图像上的位置,也就是ROI,这样识别起来就会容易很多。我们可以将交通灯的位置添加到预先建立的场景语义图中,这样当车辆到达该位置时,可以立即在图像上找到交通灯的ROI,这将优化信息标志的检测。详情如下所示:
六、总结
本文主要介绍视觉和激光雷达相关的信息融合,包括相机标定、相机和激光雷达联合标定、信息融合节点等。利用激光雷达和视觉信息融合,我们可以结合两者的优点来优化障碍物检测或识别交通标志,以及优化其他相关任务等。
审稿人:李茜