Rviz2 摄像头视频采集与图像标定
Rviz2 摄像头视频采集与图像标定
准备摄像头
有摄像头的可以直接设置虚拟机的 USB 兼容性来设置即可,但是由于我们的设备没有摄像头,所以这里我们要安装一些摄像头驱动来通过手机摄像头做外设进行使用
如果电脑在 Ubuntu 环境下而且没有摄像头,又需要使用摄像,那该怎么办?
最简单的办法就是在手机和电脑上同时安装 DroidCam ,可以通过 WiFi/LAN 或 USB 连接手机作为摄像驱动而使用
DroidCam 驱动官网:dev-47
安装可以直接参考官网教程,注意这里在使用虚拟摄像头的时候,一定要通过 USB 进行连接
这里 ROS2 使用的是 v4l2_camera 功能包,不同于 ROS1 的 USB_CAM,所以我们要进行安装:
sudo apt install ros-<ros2-distro>-camera-calibration-parsers
sudo apt install ros-<ros2-distro>-camera-info-manager
sudo apt install ros-<ros2-distro>-launch-testing-ament-cmake
# 查看摄像头
lsusb
#ros2-cam驱动安装
sudo apt-get install ros-humble-usb-cam
# cv2安装
pip install opencv-python
# 启动
ros2 launch usb_cam demo_launch.py
使用 Rviz2
首先我们通过可视化打开 Rviz2:
ros2 run rviz2 rviz2
然后我们添加摄像头画面,并进行配置:
可以使用ROS 2的内建相机视频图像发布节点,即v4l2_camera软件包的v4l2_camera_node节点,具体运行命令如下:
ros2 run v4l2_camera v4l2_camera_node
运行上述命令后,会发布以下几个与相机视频图像相关的话题:
/camera_info
/image_raw
/image_raw/compressed
/image_raw/compressedDepth
/image_raw/theora
从中可以看出,v4l2_camera_node 节点不仅可以发布一般的视频图像数据(即 /image_raw 话题),还可以发布压缩的视频数据和压缩的深度相机视频数据(发布压缩视频数据需要安装 ros-perception/vision_opencv 和 image_transport_plugins 等依赖包)
这里我们需要通过运行 ROS 2 的软件包 image_transport 的 republish 节点对视频数据解压缩并进行重新发布,解压缩后视频数据话题名称为 image_raw/uncompressed:
ros2 run image_transport republish compressed in/compressed:=image_raw/compressed out:=image_raw/uncompressed
当然,也可以使用用户自定义的软件包及其节点进行相机视频图像发布:
ros2 run spreader_camera_pubsub images_publisher
这样,会发布以下两个与吊具相机视频图像相关的话题:
/camera_info
/image_raw
如果使用用户自定义的软件包及其节点进行相机视频图像发布,必须在发布的类型为 sensor_msgs/msgs/Image 消息变量(如image_msg)中填充其 header 字段的相关信息,包括时间戳(stamp)和坐标系名称(frame_id),如下 Python 代码所示:
image_msg.header.stamp = self. get_clock().now().to_msg()
image_msg.header.frame_id = 'camera'
如果不填充这两个头信息,由于发布的消息其 frame_id 为空,也没有时间戳,就不能正确配置其固定坐标系,也就不能在 RViz2 中显示该话题发布的视频图像数据了
刚开始我们是看不到我们的相机图像的:
为解决这个问题,需要对该视频图像话题的固定坐标系(Fixed Frame)和话题名称(Topic Name)进行配置。对于该话题的固定坐标系,可以通过两种方式进行配置:一是直接将 “Displays” 面板顶部固定坐标系(Fixed Frame)的值由默认的“map”修改为“camera”。注意,对于使用自定义软件包节点发布的视频图像话题来说,坐标系名称有可能并不是 “camera”,而是其它 frame_id,这就需要运行以下命令来查看该视频图像话题的 frame_id:
ros2 topic echo /image_raw --no-arr
这样就会看到如下所示的消息:
header:
stamp:
sec: 1639564328
nanosec: 59671685
frame_id: camera
height: 480
width: 640
encoding: rgb8
is_bigendian: 0
step: 1920
data: '<sequence type: uint8, length: 921600>'
当固定坐标系和话题名称被正确配置后,就可以在“Displays”面板底部的“Image”窗口中正常显示相机视频图像了,如下图所示:
相机标定
首先需要使用包管理器安装软件包:
sudo apt install ros-<ros2-distro>-camera-calibration-parsers
sudo apt install ros-<ros2-distro>-camera-info-manager
sudo apt install ros-<ros2-distro>-launch-testing-ament-cmake
需要在工作空间中从源代码构建 Image Pipeline 软件包:
git clone – b <ros2-distro> git@github.com:ros-perception/image_pipeline.git
启动的步骤如下:
-
在GUI中启动一个终端
-
启动所使用相机的ROS驱动程序。
-
确保相机正在通过ROS发布图像。这可以通过运行来测试:
ros2 topic list
- 这将显示你所有发布的话题,确保里面有一个图像话题 /camera/image_raw。确保image_raw话题是一个真实的话题且正在发布图像,需要检查该话题的发布频率:
···shell
ros2 topic hz /camera/image_raw
···
- 启动摄像机标定节点
···shell
ros2 run camera_calibration cameracalibrator --size 7x9 --square 0.20 image:=/my_camera/image_raw camera:=/my_camera
···
这里我们使用棋盘进行标定:
-
按保存按钮后可以查看到结果。数据保存到 "/tmp/calibrationdata.tar.gz"
-
要使用该相机标定结果的文件,请执行以下命令解压缩该文件(calibration.tar.gz)
最后我们在标定结果文件夹中,可以看到用于标定的所有图像以及 “ost.yaml” 和 “ost.txt”文件。您可以使用包含相机驱动程序的校准参数的yaml文件。