Verwendung und Kalibrierung von usb_cam von docker_ROS

Inhaltsverzeichnis

Vorbereiten

Kalibrierplatte vorbereiten

Erstellen Sie einen neuen Container

Erstellen Sie ein neues ROS-Funktionspaket für das Thema usb_cam

Code schreiben

kompilieren

Funktionspaket ausführen

Kalibrierung

Installieren Sie das Kalibrierungsfunktionspaket camera_libration

Starten Sie das Funktionspaket zum Veröffentlichen des Themas usb_cam

Starten Sie das Kalibrierungsfunktionspaket camera_libration


Vorbereiten

USB-Kamera

Kalibrierungsplatine

Ein Docker-Image mit ROS.

Kalibrierplatte vorbereiten

Bildlink:

Schachbrettbilder

Drucken und einfügen. Oder Sie können das Schachbrettfoto auf dem Bildschirm eines Mobiltelefons oder Tablets anzeigen, die Größe des Schachbrettgitters messen und sicherstellen, dass das Bild während des Kalibrierungsvorgangs nicht skaliert wird.

Erstellen Sie einen neuen Container

Verwenden Sie den Parameter --privileged, um ein Bild zu erstellen. Basiscode:

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

Ändern Sie your_image_name in den Namen Ihres Docker-Images. Der Parameter --privileged bewirkt, dass der Container und der Host das Gerät gemeinsam nutzen und über dieselbe /dev-Datei verfügen. Schließen Sie jedoch vor dem Betreten des Containers zuerst die Kamera an und betreten Sie dann den Container, um zu verhindern, dass die Kamera nach dem Betreten des Containers aktualisiert wird.

Andere Parameter von Docker Run können nach Bedarf eingestellt werden.

Kamera anschließen

Betreten Sie den Container

Erstellen Sie ein neues ROS-Funktionspaket für das Thema usb_cam

Erstellen Sie ein neues ROS-Funktionspaket, um das Thema usb_cam zu veröffentlichen.

Code schreiben

Das in der Sprache C++ geschriebene Beispiel lautet wie folgt:

Erstellen Sie ein neues Funktionspaket und schreiben Sie den Kerncode:

img_publisher.cpp-Datei


#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-Datei

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})

kompilieren

Terminal öffnen:

catkin_make

Fügen Sie Umgebungsvariablen zu ~/.bashrc hinzu.

Terminal öffnen:

gedit ~/.bashrc

Schreiben Sie am Ende des Artikels

source ~/catkin_ws/devel/setup.bash

Speichern Sie die Datei und schließen Sie sie.

Funktionspaket ausführen

Terminal öffnen:

rosrun usb_cam img_publisher

werde ein Thema posten

Themen anzeigen

rostopic list

Nur wenn die Kamera normal angeschlossen ist, wird das Funktionspaket normal ausgeführt. Zu diesem Zeitpunkt wird eine Reihe von Themen angezeigt, einschließlich des Themas /camera/image.

Kalibrierung

Installieren Sie das Kalibrierungsfunktionspaket camera_libration

ROS-Funktionspakete anzeigen:

rospack list

Prüfen Sie, ob das Funktionspaket „camera_libration“ vorhanden ist. Wenn nicht, müssen Sie es installieren:

rosdep install camera_calibration

Starten Sie das Funktionspaket zum Veröffentlichen des Themas usb_cam

Terminal öffnen:

rosrun usb_cam img_publisher

Themen anzeigen 

rostopic list

Nur wenn die Kamera normal angeschlossen ist, wird das Funktionspaket normal ausgeführt. Zu diesem Zeitpunkt wird eine Reihe von Themen angezeigt, einschließlich des Themas /camera/image. 

Starten Sie das Kalibrierungsfunktionspaket camera_libration

Terminal öffnen:

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

Unter diesen ist --size 8x6 die Anzahl der Schnittpunkte auf dem Schachbrett, und ein 9*7-Gitter hat 8*6 Schnittpunkte.

--square 0,20 ist die Größe eines kleinen Schachbretts, Einheit: Meter.

image:=/camera/image, image:=Kamera-Themenname.

Nach dem normalen Start wird das Kalibrierungsfenster angezeigt. Passen Sie die Kameraposition schrittweise an, bis die Schaltfläche „Kalibrieren“ rechts aufleuchtet.

Das Schachbrett verschieben

Um eine gute Kalibrierung zu erhalten, müssen Sie das Schachbrett im Kamerarahmen verschieben, sodass:

    Schachbrettmuster links, rechts,         oben und unten im
        Sichtfeld     der         Kamera Sichtfeld     schachbrettartig nach links, rechts, oben und unten geneigt (Skew)



Halten Sie das Schachbrett bei jedem Schritt ruhig, bis das Bild im Kalibrierungsfenster hervorgehoben wird.

Bewegen des Schachbretts
Um eine gute Kalibrierung zu erhalten, müssen Sie das Schachbrett im Kamerarahmen
so verschieben
, dass :
Schachbrett das gesamte Sichtfeld auszufüllen. Neigen Sie das Schachbrett nach links, rechts, oben, und nach unten (neigen) . Halten Sie das Schachbrett bei jedem Schritt ruhig, bis das Bild im Kalibrierungsfenster hervorgehoben wird.



Klicken Sie hier, um die Berechnung zu starten. Nachdem die Berechnung abgeschlossen ist, leuchtet die Schaltfläche „Speichern“ auf. Klicken Sie auf die Schaltfläche „Speichern“, um das Ergebnis zu speichern.

Wenn Sie mit der Kalibrierung zufrieden sind, klicken Sie auf COMMIT, um die Kalibrierungsparameter zur dauerhaften Speicherung an die Kamera zu senden. Die GUI wird beendet und in der Konsole sollte „Kalibrierungsdaten schreiben nach ...“ angezeigt werden.

Wenn Sie mit der Kalibrierung zufrieden sind, klicken Sie auf COMMIT, um die Kalibrierungsparameter zur dauerhaften Speicherung an die Kamera zu senden. Die GUI wird beendet und in der Konsole sollte „Kalibrierungsdaten werden geschrieben...“ angezeigt werden.

Referenz

Kalibrierungsprozess und Parameter:

Was genau ist die interne Parameterkalibrierung der Kamera? Tutorial auf Nanny-Niveau zu internen und externen Parametern der Kamera – Zhihu

Einführung in das Kamera_Kalibrierungs-Kalibrierungsfunktionspaket:

camera_libration/Tutorials/MonocularCalibration – ROS Wiki

Supongo que te gusta

Origin blog.csdn.net/weixin_56337147/article/details/135307634
Recomendado
Clasificación