跳到主要内容

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()