Pynote

Python、機械学習、画像処理について

ROS - USB カメラを利用する

概要

ROS で USB カメラを利用する方法について

手順

1. usb-cam パッケージをインストールする
試した環境は ROS Kinetic です。

apt-get install ros-kinetic-usb-cam

2. パッケージを作成する。

catkin_create_pkg webcam roscpp std_msgs

3. cpp ファイルを作成する。

src フォルダ以下に image_subscriber.cpp を作成し、以下の内容を記述する。

#include <cv_bridge/cv_bridge.h>
#include <opencv2/opencv.hpp>
#include <ros/ros.h>
#include <sensor_msgs/Image.h>
#include <sensor_msgs/image_encodings.h>

void image_recieved(const sensor_msgs::Image &image)
{
    ROS_INFO("width: %d, height: %d, encoding: %s, is_bigendian: %d, step: %d",
             image.height, image.width, image.encoding.c_str(),
             image.is_bigendian, image.step);
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "image_subscriber_node");

    ros::NodeHandle node_handler;
    ros::Subscriber sub = node_handler.subscribe("/usb_cam/image_raw", 10, image_recieved);

    ros::spin();
    return 0;
}

4. CMakeLists.txt を編集する。

以下のようにする。

cmake_minimum_required(VERSION 2.8.3)
project(webcam)

## Compile as C++11, supported in ROS Kinetic and newer
add_compile_options(-std=c++11)

## Find catkin macros and libraries
find_package(catkin REQUIRED COMPONENTS
   roscpp
   std_msgs
   cv_bridge
   sensor_msgs
)

###################################
## catkin specific configuration ##
###################################

catkin_package(
   INCLUDE_DIRS include
   CATKIN_DEPENDS roscpp std_msgs
)

###########
## Build ##
###########

## Specify additional locations of header files
include_directories(
  ${catkin_INCLUDE_DIRS}
)

# server
add_executable(image_subscriber_node src/image_subscriber.cpp)
target_link_libraries(image_subscriber_node ${catkin_LIBRARIES})
add_dependencies(image_subscriber_node ${PROJECT_NAME}_gencpp)

5. ノードを起動する。

ROS マスターが起動していない場合は起動します。

roscore

web_cam を立ち上げます。

rosrun usb_cam usb_cam_node

image_subscriber_node を立ち上げます。

rosrun webcam image_subscriber_node

画像がサブスクライブできているのを確認できました。

[ INFO] [1505736098.910457824]: width: 480, height: 640, encoding: rgb8, is_bigendian: 0, step: 1920