USB CAM NODE
下巴摄像头节点,package 位于 robot_ros_application/catkin_ws/usb_cam ,是一种用于 V4L USB 摄像机的 ROS 驱动程序。该节点会随机器人开机自启动脚本一同运行,节点名为 /chin_camera
package 目录结构
usb_cam:.
│ .gitignore
│ .travis.yml
│ AUTHORS.md
│ CHANGELOG.rst
│ CMakeLists.txt
│ LICENSE
│ mainpage.dox
│ package.xml
│ README.md
│
├─include
│ └─usb_cam
│ usb_cam.h # 头文件
│
├─launch
│ usb_cam-test.launch
│ usb_cam.launch # 节点启动文件
│
├─nodes
│ usb_cam_node.cpp # 节点主文件
│
├─src
│ LICENSE
│ test_realsense.py
│ usb_cam.cpp # usb_cam 的 sdk
│
└─srv
usb_camSRV.srv # ros 服务文件
参数配置
该节点可以通过运行 usb_cam.launch 文件启动,在 launch 文件中定义了摄像机相关的参数
video_device
需指向设备文件,可以通过
ls /dev
查看摄像机设备的设备名这里机器人上的摄像机被识别且命名为 usb_cam,这是通过 udev rules 实现的
image_width / image_height
- 定义了摄像机的分辨率
pixel_format
- 像素编码,可选值:mjepg、yuyv、uyvy
camera_frame_id
- 摄像头坐标系
io_method
- IO 通道,可选值:mmap、read、userptr
订阅 topic
topic_name
- /chin_camera/image
Python 示例
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy # ros 的 python 库
from cv_bridge import CvBridge, CvBridgeError # 用于将 msg 数据类型的图像转成 opencv 图像格式的库
from sensor_msgs.msg import Image # topic 的消息类型
import cv2 # opencv-python 库
class ChinVision():
def __init__(self):
self.topic_name = '/chin_camera/image' # 消息名称
self.__cv_bridge = CvBridge()
rospy.Subscriber(self.topic_name, Image, self.__image_callback, queue_size=1) # 定义消息订阅者,包含消息名称、消息类型、消息回调及队列大小等
def __image_callback(self, msg): # 消息回调函数,收到的消息在 msg 中
try:
self.__image_origin = self.__cv_bridge.imgmsg_to_cv2(msg, 'bgr8') # 转成 rgb 格式的图像类型保存到 self.__image_origin 变量中
except CvBridgeError as err:
rospy.logerr(err)
def main(self):
rospy.sleep(0.1) # 这里的延时 0.1s 为了等订阅者收到至少一个数据
image_copy = self.__image_origin.copy() # 从原图中复制到 image_copy 中使用
cv2.imshow("image_copy", image_copy) # 显示图像
cv2.waitKey(0) # 等待按键按下
def rosShutdownHook(): # 当节点退出时会调用
rospy.loginfo("chinVision node is killed.")
if __name__ == "__main__":
rospy.init_node("chinVision", anonymous=True) # 初始化 ros 节点
rospy.on_shutdown(rosShutdownHook) # 设置节点退出时的调用
chinV = ChinVision()
chinV.main()