Inhaltsverzeichnis
Erstellen Sie einen neuen Container
Erstellen Sie ein neues ROS-Funktionspaket für das Thema usb_cam
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:
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:
Einführung in das Kamera_Kalibrierungs-Kalibrierungsfunktionspaket: