ROS下通过USB端口读取摄像头数据(包括笔记本自带摄像头)

本人测试环境:ubuntu18.04。

这里有3中方法,方法1为ROS驱动版本,方法3为自己写的,推荐自己手写方式。

方法1:使用usb_cam驱动读取

1.1 安装编译usb_cam驱动

在终端运行以下命令:

cd ~/catkin_ws/src
git clone https://github.com/bosch-ros-pkg/usb_cam.git
cd ..
catkin_make

1.2 测试usb_cam驱动

  • 打开摄像头。
source devel/setup.bash
rosrun usb_cam usb_cam_node

默认打开的是/dev/video0摄像头,如果想要打开自己的usb摄像头,可以改为/dev/video1(查看自己的usb接口对应名字)。运行以上程序并不能看到图像,因为只是打开摄像头。

  • 运行显示图像
rosrun image_view image_view image:=/usb_cam/image_raw

1.3 使用launch打开

也可以使用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>

同样,可以对相应参数进行修改,推荐使用这种方法。

方法2:video-stream-opencv

推荐使用方式1进行读取,方法2只是用来进行另一种选择。

2.1 安装video-stream-opencv

在终端运行以下命令进行安装:

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

2.2 测试

source devel/setup.bash
rosrun video_stream_opencv test_video_resource.py 0  #后面的0是摄像头编号,也就是笔记本自带摄像头

方法3:自己手写

推荐这个方法,这种方式需要配置CMakeLists.txt文件,大致改动如下:

# 主要配置opencv
find_package(catkin REQUIRED COMPONENTS
  cv_bridge
  roscpp
  sensor_msgs
  std_msgs
)
find_package(OpenCV REQUIRED)

...
target_link_libraries(node_fisheye ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})
#include "ros/ros.h"
#include <sensor_msgs/Image.h>
#include <sensor_msgs/image_encodings.h>
#include <cv_bridge/cv_bridge.h>
#include <iostream>
#include <sstream>
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, char **argv)
{
    ros::init(argc, argv, "node_fisheye");
    ros::NodeHandle n;
    ros::Publisher image_pub_ = n.advertise<sensor_msgs::Image>("fisheye", 1000);
    
    VideoCapture camera(0);//设备驱动号
    if (!camera.isOpened())
    {
        printf("Failed to open camera!");
        return -1;
    }
    camera.set(CV_CAP_PROP_FRAME_WIDTH, 1024);
    camera.set(CV_CAP_PROP_FRAME_HEIGHT, 768 );
    camera.set(CV_CAP_PROP_FPS, 30);
    camera.set(CV_CAP_PROP_EXPOSURE, 1.0);
    camera.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M','J','P','G'));
    
    auto fps = camera.get(CAP_PROP_FPS);
    
    //vector<int> compression_params;
    //compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
    //compression_params.push_back(0);
    
    ros::Rate loop_rate(1000);
    
    while (ros::ok())
    {
        Mat frame;
        camera >> frame;
        
        cv_bridge::CvImage img_bridge;
        sensor_msgs::Image img_msg; // >> message to be sent
        std_msgs::Header header; // empty header
        header.stamp = ros::Time::now(); // time
        img_bridge = cv_bridge::CvImage(header, sensor_msgs::image_encodings::BGR8, frame);
        img_bridge.toImageMsg(img_msg);
        image_pub_.publish(img_msg);
        
        /*
        sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", frame).toImageMsg();
        // 发布图像
        image_pub_.publish(*msg);*/
        
        imshow("frame", frame);
        if (waitKey(30) > 0)
        {
            cout << "frame size: " << frame.rows << " x " <<frame.cols << endl;
            camera.release();
            frame.release();
            break;
        }
        //imu_pub.publish(imu_msg); //开始发布
        ros::spinOnce();
        loop_rate.sleep();
    }
    return 0;
}

  • 1
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要订阅usb_cam读取到的摄像头信息,你可以使用ROS中的图像订阅器。以下是一些步骤来实现这个目标: 1. 首先,确保你已经安装了usb_cam驱动包。你可以通过apt-get命令或者从源码进行安装。 2. 启动usb_cam节点,发布摄像头图像话题。你可以使用roslaunch命令来启动usb_cam节点,例如: ``` roslaunch usb_cam usb_cam-test.launch ``` 3. 查看节点和话题,确保usb_cam节点已经在运行并发布了图像话题。你可以使用rosnode list命令查看节点列表,使用rostopic list命令查看话题列表。 4. 创建一个ROS订阅器节点,订阅usb_cam发布的图像话题。你可以使用rospy(Python)或者roscpp(C++)来编写订阅器节点的代码。 - 在Python中,你可以使用rospy.Subscriber来创建一个订阅器对象,并指定要订阅的话题和回调函数。回调函数将在接收到新的图像消息时被调用。 - 在C++中,你可以使用ros::Subscriber类来创建一个订阅器对象,并指定要订阅的话题和回调函数。回调函数将在接收到新的图像消息时被调用。 在回调函数中,你可以处理接收到的图像数据,例如显示图像、进行图像处理等。 请注意,你需要确保订阅器节点和usb_cam节点在同一个ROS网络中运行,以便它们可以相互通信。 希望这些步骤可以帮助你订阅usb_cam读取到的摄像头信息。 #### 引用[.reference_title] - *1* *3* [ROS下使用usb_cam驱动读取摄像头数据](https://blog.csdn.net/Yangxiaoaijiejie/article/details/127061479)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【ROS2】使用摄像头功能包 usb_cam](https://blog.csdn.net/u010168781/article/details/131120968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非晚非晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值