使用Eclipse实现USB Camera的ROS Publisher

本文详细介绍了如何在ROS环境下,利用Eclipse创建一个USB Camera节点,包括创建ROS Package,导入到Eclipse,编写及运行USB Camera节点代码,并在RVIZ中显示图像。在Eclipse中运行节点时遇到的错误以及后期改进工作的讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

USB Camera ROS Publisher

现在完成自己的第一个工程.由于之前在网上寻找过关于USB Camera在ROS中的数据采集方法.找了很久一直没有找到一个比较有用的资料.所以想将其作为自己的第一个程序.获取USB Camera采集到的图像,然后发布出来.编写一个数据采集的节点.

1. 创建ROS Package

依次执行下述命令:
        $ roscd
        $ cd camera
        $ roscreate-pkg usbcamera_pub sensor_msgs image_transport cv_bridge roscpp

这个时候完成package创建,并添加附加依赖项sensor_msgs, image_transport, cv_bridge.详见图1.
图1:   创建usbcamera_pub包
图1: 创建usbcamera_pub包

2. 导入ROS Package到Eclipse

(这部分内容与前一篇重复)现在ls可以看到我们新建的包文件夹 usbcamera_pub. cd到该文件夹内,然后执行下述命令.

        $ cd usbcamera_pub
        $ make eclipse-project
        $ cd ..
        $ rosmake --target=eclipse-project --specified-only *

图2:   为你的packages or stacks编译一些Eclipse文件
图2: 为你的packages or stacks编译一些Eclipse文件

现在打开Eclipse, 点击 File → Import → Existing Projects into Workspace → Next → Browse,选择上述我们新建的Package目录,点击Finish.现在可以在Eclipse中看到我们新建的Package了.详见图3.可以看见,现在src文件夹和bin文件夹均是空文件夹.

3. 编写USB Camera节点代码

首先,我们需要完成一些配置工作.首先打开CMakeList.txt, 在该文件的最后添加下述文字.

        find_package(OpenCV)
        include_directories(${OpenCV_INCLUDE_DIRS})

对于任何第三方package, 均需在CMakeList.txt中添加find_package.在这儿我们添加OpenCV的库,不用自己配,加入这两句话即可.OpenCV的库在安装ROS的时候已经安装到Ubuntu上.其中还会用到ROS提供的另外一个工具cv_bridge.前面我们在新建Package的时候已经添加了该附加依赖项.cv_bridge所实现的功能很重要,从名字中就可以看出来,它就是提供一个ROS和OpenCV之间的一座桥梁.见图4.如果你想了解更多,请参阅http://wiki.ros.org/vision_opencv

图3:   导入Eclipse之后文件结构
图3: 导入Eclipse之后文件结构

图4:   cv_bridge的作用
图4: cv_bridge的作用

现在鼠标右键点击src → New → Source File, 输入usb_cam_pub.cpp,点击Finish.然后将下述代码复制到文件中.代码很简单,我就步一一解释了.该代码原作者是一个大三的小学妹.大部分工作都是她完成的.我只是做了总结而已.

/*
 * usb_cam_pub.cpp
 *
 *  Created on: Apr 28, 2015
 *      Author: burial
 */
#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

int main(int argc, char **argv )
{
  // 初始化,函数声明
  ros::init(argc, argv, "usbcamer_pub" );
  ros::NodeHandle nodeHandler;
  image_transport::ImageTransport imageTransport(nodeHandler);

  std_msgs::Header header;
  cv::Mat frame;
  cv::VideoCapture videoCapture(0);

  image_transport::Publisher imgPub = imageTransport.advertise("/usb_camera/rgb8", 1);

  while (ros::ok())
  {
    if (videoCapture.isOpened()) // 如果摄像头开启,处理图像转化为ros image message
    {
      videoCapture >> frame;
      cv_bridge::CvImage cvImage(header, sensor_msgs::image_encodings::RGB8, frame); // 利用cvbridge 将图像信息转化为rosmessage
      imgPub.publish(cvImage.toImageMsg()); // 发布消息
    }

    ros::spinOnce();
  }

  return 0;
}

现在打开CMakeList.txt将下述文字复制到文件的最后.

rosbuild_add_executable(usb_cam_pub src/usb_cam_pub.cpp)

然后,点击 Project → Build All.编译结束,你会发现bin文件夹里多出来一个文件.这就是生成的可执行文件.见图5.
图5:   编译结束后工程目录
图5: 编译结束后工程目录

这个节点不同于之前那个节点.上一个示例节点,可以通过Eclipse直接运行.并且可以在Console中看见输出内容.这个节点编译完成后,在Eclipse中运行总是会提示运行错误.但是在Terminal中运行就没有任何错误.我也没弄明白到底是为什么.错误输出建图6.尝试很多方法均未能修复这个错误.所以也只有放弃,编译完成后在Terminal中运行该节点.
图6:   在Eclipse中运行所提示错误
图6: 在Eclipse中运行所提示错误

4. 运行USB Camera节点

现在打开Terminal, 运行 $ roscore, 在打开一个Terminal, 执行 $ rosrun usbcamera_pub usb_cam_pub .如果提示未找到usbcamera_pub包的话,说明你没有执行 $ source ~/workspace/ROS/setup.bash .在Terminal中输入该命令,再运行节点.
现在是见证奇迹的时刻了.再打开一个Terminal, 输入 $ rosrun rviz rviz, 会弹出ROS 的一个可视化工具rviz.在左边工具栏中点击Add.
图7:   ROS RVIZ工具点击Add
图7: ROS RVIZ工具点击Add

选择Image, 点击确定.左边工具栏出现Image条目.展开后如图8展示.在Topic选项中选择 /usb_camera/rgb8,就可看到当前Image窗口中显示出当前摄像头所采集到的画面了.

图8:   选择Image后Rviz所示图
图8: 选择Image后Rviz所示图

5. 后期工作

或许你对上图中图像颜色有疑问.这是由于我们在转换的时候是以rgb8的方式编码.在源码中可看到.而现在是以raw的方式显示的.故有这样的问题.后期再编辑自己的Subsciber接收图像,然后显示,就不会出现这样的颜色问题了.
另外,从源码中可以看到,当前是从运行该节点开始,我们就使用VideoCapture类获得摄像头控制权,然后获取图像开始Publish, 不管是否有节点订阅了该Topic.这一点应该是可以再进行完善的.在有节点订阅我们的Topic后开始开启摄像头,Publish图像Message.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值