ros驱动insta360 oneR运动相机遇到的坑

问题1:

直接使用ros下usb_cam工具,

roslaunch usb_cam-test.launch
图像出现如下花屏:
在这里插入图片描述
查了一下说将摄像头的默认像素格式由原来的yuyv改为mjpeg格式:
进入功能包:

roscd uvc_camera

进入lanch文件夹,改:

<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:

像素格式由原来的yuyv改为mjpeg格式后,
运行报错outbuf size mismatch. pic_size: 345600 bufsize: 614400
在这里插入图片描述
然后看一下报错内容,大致意思就是,outbuf 大小不匹配。pic_size:3110400 bufsize:4147200
并且得到的是一个黑屏,rostopic 输出全为零
在这里插入图片描述
参考https://github.com/ros-drivers/usb_cam/issues/35,说
通过更改 usb_cam_node 的 pixel_format 参数的值来修复错误:

从:

<param name="pixel_format" value="mjpeg" />

到:

<param name="pixel_format" value="yuyv" />

那我岂不是又回到第一个问题了?
啊啊啊啊啊!

opencv读取视频正常

试了一下直接用opencv读取视频:正常

最后解决:

既然opencv能读到,
那我就先使用opencv读取图像

 mkdir -p cvImage2ros/src
 cd cvImage2ros/src
 catkin_create_pkg cvImage2ros sensor_msgs cv_bridge roscpp std_msgs image_transport
 cd ..
 catkin_make
 source ./devel/setup.bash

然后在src文件下新建文件cvImage2ros.cpp

#include <iostream>
#include <ros/ros.h>
#include <cv_bridge/cv_bridge.h>   
#include <sensor_msgs/image_encodings.h>  
#include <image_transport/image_transport.h>  

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/videoio.hpp>

int main(int argc, char** argv)
{
    ros::init(argc, argv, "imageGet_node");   
    ros::NodeHandle nh;                       
    image_transport::ImageTransport it(nh);   
    image_transport::Publisher image_pub = it.advertise("/cameraImage", 1);    

    ros::Rate loop_rate(200);    

    cv::Mat imageRaw;   
    cv::VideoCapture capture(0);    

    if(capture.isOpened() == 0)       
    {
        std::cout << "Read camera failed!" << std::endl;
        return -1;
    }

    while(nh.ok())
    {
        capture.read(imageRaw);           
        cv::imshow("veiwer", imageRaw);   
        sensor_msgs::ImagePtr  msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", imageRaw).toImageMsg();   
        image_pub.publish(msg);          
        ros::spinOnce();                 
        loop_rate.sleep();               
        if(cv::waitKey(2) >= 0)          
            break;        
    }
}

最后在CMakeLists.txt最下面添加:

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(cvImage2ros src/cvImage2ros.cpp)
target_link_libraries(cvImage2ros ${catkin_LIBRARIES} ${OpenCV_LIBS})

然后编译,运行

rosrun cvImage2ros cvImage2ros 

发布/cameraImage话题,在这里插入图片描述

在这里插入图片描述

其他说明:

参考linux系统下 USB 摄像头1080分辨率采集帧率低问题的解决方法
安装一个 v4l2-ctrl工具:

sudo apt install v4l-utils

查看摄像头支持的视频参数:

sudo v4l2-ctl --all --list-formats-ext

在这里插入图片描述
Pixel Format 是视频的格式,Size是视频分辨率,Interval是支持帧率。
通常的USB摄像头,对高清视频,如1080P,在YUYV格式下,都支持不到25-30帧,一般在3-5帧,原因可能是考虑USB的传输速度;
同时,摄像头一般会提供MJPEG的压缩视频格式,因此在使用USB摄像头进行1080分辨率的采集时,需要指定视频格式为MJPEG

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值