在ROS中使用摄像头的前提是,摄像头在Linux系统下是可识别的,通常来说UVC协议的USB摄像头都可以正常使用,例如这一类。

uvc_camera参考链接:uvc_camera - ROS Wiki

usb_cam参考链接:usb_cam - ROS Wiki

External Player - 哔哩哔哩嵌入式外链播放器

什么样摄像头可以用

在ROS中使用摄像头的前提是,摄像头在Linux系统下是可识别的,通常来说UVC协议的USB摄像头都可以正常使用,例如这一类。

大部分笔记本电脑自带的摄像头都是UVC协议的,所以也是可以直接使用的。

对于一些具有CSI或者MIPI接口的嵌入式板卡,在接入对应接口的摄像头后可能也可以使用,但不是绝对的。

例如树莓派接入CSI摄像头后启用bcm2835-v4l2驱动可以正常使用,但是JetsonNano使用CSI摄像头就不可以通过本文的方法驱动。

验证摄像头设备可用

使用命令检查当前设备列表

ls /dev

如果设备列表中有video*设备,则摄像头设备在当前系统中有被正确的识别。

如果使用虚拟机,需要将摄像头设备连接到虚拟机中。

检查有video设备后可以使用Ubuntu下的拍照软件cheese进一步验证

cheese

拍照软件能显示摄像头画面就基本稳了

获取摄像头驱动包

ROS下摄像头的驱动包有多款,这里笔者常用的两款为例,如果你有更好用的功能包也欢迎留言推荐给我

usb_cam

usb_cam可以通过apt方式直接安装二进制包,如果使用其他版本的ROS,自行替换命令中的noetic字段

sudo apt install ros-noetic-usb-cam

安装没有报错即为完成

rosrun方式运行

先启动roscore,然后运行驱动节点usb_cam_node

roscore
rosrun usb_cam usb_cam_node 

启动节点后终端中可能会报如下的警告,可以忽略,实测不影响使用

摄像头启动后启用rqt工具查看图像

rqt_image_view

选择正确的话题即可预览到摄像头的画面

roslaunch方式运行

usb_cam包中提供了一个launch文件例程usb_cam-test.launch

roslaunch usb_cam usb_cam-test.launch

在这个launch文件中除了启动usb_cam_node节点外还会包含一个image_view用于预览摄像头画面

uvc_camera

在Melodic版本中,uvc_camera有提供二进制安装包,可以通过apt方式安装

sudo apt install ros-melodic-ucv-camera

在Noetic版本中,uvc_camera目前还没有提供二进制安装包,需要通过源码编译的方式安装

源码编译前需要先安装依赖的软件

sudo apt install libv4l-dev

然后将源码克隆到你的工作空间src目录下,这里以catkin_ws工作空间为例

cd ~/catkin_ws/src/
git clone https://github.com/ros-drivers/camera_umd.git

github在不同的时间,不同的地区可能会出现无法访问的问题,可以借助ghproxy来牵线搭桥

cd ~/catkin_ws/src/
git clone https://ghproxy.com/github.com/ros-drivers/camera_umd.git

成功获取源码后就可以编译功能包

cd ~/catkin_ws/ && catkin_make

编译完成后就可以使用uvc_camera功能包了

rosrun方式运行
roscore
rosrun uvc_camera uvc_camera_node

节点启动后可以通过rqt等工具查看图像

roslaunch方式运行
roslaunch uvc_camera camera_node.launch

有多个摄像头时

以上两个功能包无论时通过使用rosrun还是roslaunch的方式启动,使用的视频设备都是/dev/video0。当你有多个摄像头或者需要使用的摄像头设备不是/dev/video0时候,通过这两种方式启动就不能达到预期的效果了。

我的建议是编写launch文件来启动,launch文件可以参考功能包目录下的luanch。

Tips:我不建议对原功能包中的文件做修改,如果编写launch文件,我建议你将launch文件放在你自己开发的功能包目录下。

例如usb_cam功能包下的usb_cam-test.launch文件

<launch>
	<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
		<param name="video_device" value="/dev/video0" />
		<param name="image_width" value="640" />
		<param name="image_height" value="480" />
		<param name="pixel_format" value="yuyv" />
		<param name="camera_frame_id" value="usb_cam" />
		<param name="io_method" value="mmap"/>
	</node>
	<node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
		<remap from="image" to="/usb_cam/image_raw"/>
		<param name="autosize" value="true" />
	</node>
</launch>

通过修改video_device参数的值即可修改摄像头设备为你需要启动的设备名。其余的参数例如image_width和image_height是用于设备图像的分辨率,完整的参数列表和参数含义可以在功能包的wiki页面中查看。

其他的问题

带compressed的图像话题

如果你已经安装了compressed-image-transport功能包,则相机节点发布的话题中,除了image_raw话题外,应该还有image_raw/compressed这样一个话题。

带有compressed的话题是一种压缩后的图像格式,在跨设备或者带宽资源有限的网络中传输时会更流畅,以640*480分辨率的图像为例。通过rostopic bw工具分别查看两个话题的带宽。

rostopic bw /usb_cam/image_raw
rostopic bw /usb_cam/image_raw/compressed

可以看到两个话题分别占用的带宽,差距还是很明显的。

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个比较复杂的问题,需要分几步来回答。首先,我们需要安装apriltag的ROS包,可以使用以下命令在终端进行安装: ``` sudo apt-get install ros-<distro>-apriltag-ros ``` 其,`<distro>`替换为你使用ROS发行版,比如`melodic`或`noetic`。 接下来,我们需要使用Python编写代码来实现摄像头实时识别apriltag二维码。可以使用`cv2`库来读取摄像头数据,并使用`apriltag_ros`包的`Detector`类来进行apriltag识别。具体代码如下: ```python import cv2 from apriltag_ros.msg import AprilTagDetectionArray def callback(data): for detection in data.detections: print('AprilTag ID:', detection.id[0]) print('AprilTag pose:', detection.pose.pose) rospy.init_node('apriltag_detector') rospy.Subscriber('/tag_detections', AprilTagDetectionArray, callback) cap = cv2.VideoCapture(0) while not rospy.is_shutdown(): ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) detections = detector.detect(gray) cv2.imshow('frame', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() ``` 其,回调函数`callback`会在每次识别到apriltag时被调用,将apriltag的ID和位姿信息打印出来。`rospy.Subscriber`用来订阅apriltag识别结果的ROS话题,`/tag_detections`是apriltag_ros默认的话题。`cv2.VideoCapture`用来打开摄像头,`cv2.imshow`用来显示摄像头的画面。按下`q`键可以退出程序。 最后,我们需要将识别到的apriltag数据保存为txt文件。可以在回调函数添加以下代码: ```python with open('apriltag_data.txt', 'a') as f: f.write('{}\n'.format(detection.pose.pose)) ``` 这样就可以将每次识别到的apriltag位姿信息保存到名为`apriltag_data.txt`的文件。 希望这些代码可以帮助到你。如果你有进一步的问题,请随时问我。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值