docker_ROSのusb_camの使い方と調整

目次

準備する

校正プレートの準備

新しいコンテナを作成する

usb_cam トピックの新しい ROS 関数パッケージを作成します。

コードを書く

コンパイル

関数パッケージを実行する

較正

Camera_calibration キャリブレーション機能パッケージのインストール

usb_cam トピックを公開するための関数パッケージを開始します

Camera_calibration キャリブレーション関数パッケージを開始します


準備する

USBカメラ

校正ボード

ROS を使用した Docker イメージ。

校正プレートの準備

画像リンク:

チェッカーボードの写真

印刷して貼り付けます。または、携帯電話またはタブレットの画面を使用してチェス盤の写真を表示し、チェス盤のグリッドのサイズを測定し、キャリブレーション プロセス中に画像が拡大縮小されていないことを確認することもできます。

新しいコンテナを作成する

--privileged パラメータを使用してイメージを作成します。基本コード:

sudo docker run -it --privileged --name=lab1 your_image_name  /bin/bash

your_image_name を Docker イメージ名に変更します。--privileged パラメーターを使用すると、コンテナーとホストがデバイスを共有し、同じ /dev ファイルを持つようになります。ただし、コンテナに入った後にカメラが更新されないように、コンテナに入る前に最初にカメラを接続してからコンテナに入ります。

docker run のその他のパラメーターは必要に応じて設定できます。

カメラを接続する

コンテナに入る

usb_cam トピックの新しい ROS 関数パッケージを作成します。

新しい ROS 関数パッケージを作成して、usb_cam トピックを公開します。

コードを書く

C++ 言語で書かれた例は次のとおりです。

新しい関数パッケージを作成し、コア コードを記述します。

img_publisher.cpp ファイル


#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui.hpp>
#include <opencv2/calib3d.hpp>
#include <cv_bridge/cv_bridge.h>
#include <iostream>

int main(int argc, char** argv) {
    ros::init(argc, argv, "img_publisher");
    ros::NodeHandle nh;
    image_transport::ImageTransport it(nh);
    image_transport::Publisher pub = it.advertise("camera/image", 1);

    cv::VideoCapture cap;
    cv::Mat frame;
    int deviceID = 0;
    if (argc > 1)
        deviceID = argv[1][0] - '0';
    int apiID = cv::CAP_ANY;
    cap.open(deviceID + apiID);
    if (!cap.isOpened()) {
        std::cerr << "ERROR! Unable to open camera" << std::endl;
        return -1;
    }

    ros::Rate loop_rate(30);
    while (nh.ok()) {
        cap.read(frame);
        if (!frame.empty()) {
            sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", frame).toImageMsg();
            pub.publish(msg);
        }
        ros::spinOnce();
        loop_rate.sleep();
    }
    return 0;
}

CMakeLists.txt ファイル

cmake_minimum_required(VERSION 3.0.2)
project(usb_cam)

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

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
  cv_bridge
  image_transport
  roscpp
  sensor_msgs
  std_msgs
)
find_package(OpenCV REQUIRED)
message(${OpenCV_VERSION})


###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES usb_cam
#  CATKIN_DEPENDS cv_bridge image_transport roscpp sensor_msgs std_msgs
#  DEPENDS system_lib
)

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

## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include
  ${catkin_INCLUDE_DIRS}
  ${OpenCV_INCLUDE_DIRS}
)


add_executable(img_publisher src/img_publisher.cpp)
add_executable(img_viewer src/img_viewer.cpp)


target_link_libraries(img_publisher ${catkin_LIBRARIES} ${OpenCV_LIBS})
target_link_libraries(img_viewer ${catkin_LIBRARIES} ${OpenCV_LIBS})

コンパイル

ターミナルを開く:

catkin_make

環境変数を ~/.bashrc に追加します。

ターミナルを開く:

gedit ~/.bashrc

記事の最後に書いてください

source ~/catkin_ws/devel/setup.bash

ファイルを保存して閉じます。

関数パッケージを実行する

ターミナルを開く:

rosrun usb_cam img_publisher

トピックを投稿します

トピックを見る

rostopic list

カメラが正常に接続された場合にのみ機能パッケージが正常に動作し、このとき /camera/image トピックを含む一連のトピックが表示されます。

較正

Camera_calibration キャリブレーション機能パッケージのインストール

ROS 機能パッケージを表示します。

rospack list

「camera_calibration」機能パッケージがあるかどうかを確認し、ない場合はインストールする必要があります。

rosdep install camera_calibration

usb_cam トピックを公開するための関数パッケージを開始します

ターミナルを開く:

rosrun usb_cam img_publisher

トピックを見る 

rostopic list

カメラが正常に接続された場合にのみ機能パッケージが正常に動作し、このとき /camera/image トピックを含む一連のトピックが表示されます。 

Camera_calibration キャリブレーション関数パッケージを開始します

ターミナルを開く:

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.20 image:=/camera/image

このうち --size 8x6 はチェス盤上の交点の数で、9*7 のグリッドには 8*6 の交点が存在します。

--square 0.20 は小さなチェッカーボードのサイズで、単位はメートルです。

image:=/camera/image、image:=カメラのトピック名。

通常起動後、キャリブレーションウィンドウが表示されますので、右側の「キャリブレーション」ボタンが点灯するまでカメラ位置を断続的に調整してください。

チェッカーボードの移動

適切なキャリブレーションを行うには、次のようにカメラ フレーム内でチェッカーボードを移動する必要があります。

    カメラの視野の左、右、上、下のチェッカー
        ボード X バー - 視野の左/右
        Y バー - 視野の上部/下
        サイズ バー - カメラに向かう/離れる、およびカメラからの傾き
    全体を埋めるチェッカーボード視野
    チェッカーボードが左右上下に傾いている (Skew)

各ステップで、キャリブレーション ウィンドウで画像がハイライト表示されるまでチェッカーボードを静止させます。

チェス盤の移動適切なキャリブレーションを行うには、次のようにカメラ
フレーム内でチェス盤を移動する必要があります:チェス盤遠ざけるように傾けて、視野全体を埋めるようにします。各ステップで、キャリブレーションウィンドウで画像が強調表示されるまでチェス盤を静止させます。






クリックすると計算が始まります。計算が完了すると「保存」ボタンが点灯しますので、「保存」ボタンをクリックして結果を保存します。

キャリブレーションに満足したら、[コミット] をクリックしてキャリブレーション パラメータをカメラに送信し、永続的に保存します。GUI が終了し、コンソールに「キャリブレーション データを ... に書き込んでいます」と表示されます。

キャリブレーションに満足したら、[コミット] をクリックしてキャリブレーション パラメータをカメラに送信し、永続的に保存します。GUI が終了し、コンソールに「キャリブレーション データの書き込み中...」と表示されます。

参考

校正プロセスとパラメータ:

カメラの内部パラメータ校正とは具体的に何ですか? カメラの内部パラメータと外部パラメータに関する乳母レベルのチュートリアル - Zhihu

Camera_calibration キャリブレーション関数パッケージの紹介:

カメラキャリブレーション/チュートリアル/単眼キャリブレーション - ROS Wiki

おすすめ

転載: blog.csdn.net/weixin_56337147/article/details/135307634