mirror of
https://github.com/CopterExpress/clover.git
synced 2026-05-31 06:59:32 +00:00
- untracked .gitattributes - untracked .gitignore - untracked apps/ios/.gitignore - untracked apps/ios/cleverrc.xcodeproj/project.pbxproj - untracked apps/ios/cleverrc.xcodeproj/project.xcworkspace/contents.xcworkspacedata - untracked apps/ios/cleverrc.xcworkspace/contents.xcworkspacedata - untracked apps/ios/cleverrc/AppDelegate.swift - untracked apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverios180-1.png - untracked apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/cleverios180.png - untracked apps/ios/cleverrc/Assets.xcassets/AppIcon.appiconset/Contents.json - untracked apps/ios/cleverrc/Assets.xcassets/Contents.json - untracked apps/ios/cleverrc/Assets.xcassets/Image.imageset/Contents.json - untracked apps/ios/cleverrc/Base.lproj/LaunchScreen.storyboard - untracked apps/ios/cleverrc/Base.lproj/Main.storyboard - untracked apps/ios/cleverrc/BinUtils.swift - untracked apps/ios/cleverrc/clever.svg - untracked apps/ios/cleverrc/index.html - untracked apps/ios/cleverrc/Info.plist - untracked apps/ios/cleverrc/main.css - untracked apps/ios/cleverrc/main.js - untracked apps/ios/cleverrc/README.md - untracked apps/ios/cleverrc/roslib.js - untracked apps/ios/cleverrc/telemetry.js - untracked apps/ios/cleverrc/ViewController.swift - untracked apps/ios/Podfile - untracked apps/ios/Podfile.lock - untracked apps/ios/README.md - untracked aruco_pose/CMakeLists.txt - untracked aruco_pose/nodelet_plugins.xml - untracked aruco_pose/package.xml - untracked aruco_pose/src/aruco_pose.cpp - untracked aruco_pose/src/fix.cpp - untracked assets/11_1.png - untracked assets/11_2.png - untracked assets/11_3.png - untracked assets/11_4.png - untracked assets/11_5.png - untracked assets/13_1.png - untracked assets/13_10.png - untracked assets/13_11.png - untracked assets/13_2.png - untracked assets/13_3.jpg - untracked assets/13_4.png - untracked assets/13_5.png - untracked assets/13_6.png - untracked assets/13_7.png - untracked assets/13_8.png - untracked assets/13_9.png - untracked assets/15_1.png - untracked assets/15_2.png - untracked assets/15_3.png - untracked assets/15_4.png - untracked assets/15_5.png - untracked assets/15_6.png - untracked assets/15_7.png - untracked assets/16_1.png - untracked assets/16_2.png - untracked assets/16_3.png - untracked assets/16_4.png - untracked assets/1_1.png - untracked assets/1_10.png - untracked assets/1_11.png - untracked assets/1_12.png - untracked assets/1_13.png - untracked assets/1_2.png - untracked assets/1_3.png - untracked assets/1_4.png - untracked assets/1_5.png - untracked assets/1_6.png - untracked assets/1_7.png - untracked assets/1_8.png - untracked assets/1_9.png - untracked assets/2_1.png - untracked assets/2_2.png - untracked assets/2_3.png - untracked assets/2_4.png - untracked assets/2_5.png - untracked assets/2_6.png - untracked assets/2_7.png - untracked assets/2_8.png - untracked assets/2_9.png - untracked assets/4_1.png - untracked assets/4_2.png - untracked assets/4_3.png - untracked assets/4_4.png - untracked assets/4_5.png - untracked assets/4_6.png - untracked assets/7_1.png - untracked assets/7_2.png - untracked assets/7_3.png - untracked assets/7_4.png - untracked assets/8_1.png - untracked assets/8_2.png - untracked assets/8_3.png - untracked assets/8_4.png - untracked assets/8_5.png - untracked assets/8_6.png - untracked assets/9_1.png - untracked assets/9_2.png - untracked assets/addEqipment.jpg - untracked assets/airframeSetup.jpg - untracked assets/allElements.png - untracked assets/attentionSave.jpg - untracked assets/brrc2205.png - untracked assets/brrc2205on.png - untracked assets/brrc2205ondeck.png - untracked assets/calibrateaxcel.jpg - untracked assets/calibrateaxcelstart.jpg - untracked assets/calibratecompass.jpg - untracked assets/calibrateESC.jpg - untracked assets/calibrategyro.jpg - untracked assets/calibratePIDparams.jpg - untracked assets/calibrateView.jpg - untracked assets/calibrateViewStart.jpg - untracked assets/casebattery.png - untracked assets/chooseSwitch.jpg - untracked assets/Clever main.png - untracked assets/clever.jpg - untracked assets/Clevermain.png - untracked assets/connectBattery.png - untracked assets/connectingRadio.png - untracked assets/connectionESCtoReceiver.png - untracked assets/connectionLost.jpg - untracked assets/connectionOK.jpg - untracked assets/connectionPixhawk.png - untracked assets/consistofTransmitter.jpg - untracked assets/cutwire14AWG.jpg - untracked assets/escDYSzap.png - untracked assets/escWires.png - untracked assets/explosion.png - untracked assets/firmwarePX4.jpg - untracked assets/flightModes.jpg - untracked assets/helphand.jpg - untracked assets/holderLegs.png - untracked assets/isoViewmountHolder.png - untracked assets/jumper.png - untracked assets/keep.png - untracked assets/lockradio.jpg - untracked assets/lockradio.png - untracked assets/lowsafeDeck.png - untracked assets/mainWindow.jpg - untracked assets/motorsTopview.png - untracked assets/mount5vconnector.png - untracked assets/mountAntenna.png - untracked assets/mountBeams.png - untracked assets/mountBottomDeck.png - untracked assets/mountHolder.png - untracked assets/mountPDB.png - untracked assets/mountReceiverDeck.png - untracked assets/mountReceiverStud.png - untracked assets/mountxt60pinsocket.png - untracked assets/notmoveslider.jpg - untracked assets/pixhawk.png - untracked assets/radioTransmitter.png - untracked assets/readyBatteryholder.png - untracked assets/receiver5V.png - untracked assets/receiverPPM.png - untracked assets/resolderingESC.png - untracked assets/safehighRadial.png - untracked assets/safeLegs.png - untracked assets/safelowRadial.png - untracked assets/safetybyassem.png - untracked assets/safetyINflight.png - untracked assets/safetyPower.png - untracked assets/safetyPreflight.png - untracked assets/soldering5VTOpdb.png - untracked assets/solderingBrrc2205ondeckTOescDYSzap.png - untracked assets/solderingPowerwires.png - untracked assets/solderingxt60socketTOpdb.png - untracked assets/stand.jpg - untracked assets/startPDBtest.jpg - untracked assets/testMotors.png - untracked assets/topESCcaseview.png - untracked assets/topPreview.png - untracked assets/topviewmountPDB.png - untracked assets/topviewpixhawk.png - untracked assets/turnoffSafetyswitch.jpg - untracked assets/xt60pinsocket.jpg - untracked assets/zap.jpg - untracked assets/zapPDBtest.jpg - untracked clever/camera_info/fisheye_cam_320.yaml - untracked clever/camera_info/fisheye_cam_640.yaml - untracked clever/CMakeLists.txt - untracked clever/launch/arduino.launch - untracked clever/launch/aruco.launch - untracked clever/launch/clever.launch - untracked clever/launch/copter_visualization.launch - untracked clever/launch/fpv_camera.launch - untracked clever/launch/main_camera.launch - untracked clever/launch/mavros.launch - untracked clever/launch/sitl.launch - untracked clever/launch/web_server.launch - untracked clever/nodelet_plugins.xml - untracked clever/package.xml - untracked clever/requirements.txt - untracked clever/src/aruco_vpe.cpp - untracked clever/src/fcu_horiz.cpp - untracked clever/src/fpv_camera - untracked clever/src/global_local.py - untracked clever/src/rc.cpp - untracked clever/src/simple_offboard.py - untracked clever/src/util.h - untracked clever/src/util.py - untracked clever/src/web_server.py - untracked clever/srv/GetTelemetry.srv - untracked clever/srv/Navigate.srv - untracked clever/srv/SetAttitude.srv - untracked clever/srv/SetAttitudeYawRate.srv - untracked clever/srv/SetPosition.srv - untracked clever/srv/SetPositionGlobal.srv - untracked clever/srv/SetPositionGlobalYawRate.srv - untracked clever/srv/SetPositionYawRate.srv - untracked clever/srv/SetRates.srv - untracked clever/srv/SetRatesYaw.srv - untracked clever/srv/SetVelocity.srv - untracked clever/srv/SetVelocityYawRate.srv - untracked deploy/clever.service - untracked deploy/clever_arudino.tar.gz - untracked deploy/generate_ros_lib - untracked deploy/roscore.env - untracked deploy/roscore.service - modified docs/3g.md - modified docs/assemble.md - untracked docs/deck.md - modified docs/etcher.md - modified docs/frames.md - modified docs/les1.md - modified docs/les11.md - modified docs/les13.md - modified docs/les15.md - modified docs/les16.md - modified docs/les2.md - modified docs/les4.md - modified docs/les7.md - modified docs/les8.md - modified docs/les9.md - modified docs/modes.md - untracked docs/powerConnection.md - modified docs/radioerrors.md - modified docs/radioerrors1.md - modified docs/safety.md - modified docs/setup.md - modified docs/simple_offboard.md - modified docs/tb.md - untracked docs/testConnection.md - modified docs/wifi.md - untracked docs/zap.md - removed gpsmd.md - untracked image/apps.sh - untracked image/git_release.py - untracked image/iface.sh - untracked image/image-config.sh - untracked image/Jenkinsfile - untracked image/ros.sh - untracked image/yadisk.py - removed img/11_1.png - removed img/11_2.png - removed img/11_3.png - removed img/11_4.png - removed img/11_5.png - removed img/13_1.png - removed img/13_10.png - removed img/13_11.png - removed img/13_2.png - removed img/13_3.jpg - removed img/13_4.png - removed img/13_5.png - removed img/13_6.png - removed img/13_7.png - removed img/13_8.png - removed img/13_9.png - removed img/15_1.png - removed img/15_2.png - removed img/15_3.png - removed img/15_4.png - removed img/15_5.png - removed img/15_6.png - removed img/15_7.png - removed img/16_1.png - removed img/16_2.png - removed img/16_3.png - removed img/16_4.png - removed img/1_1.png - removed img/1_10.png - removed img/1_11.png - removed img/1_12.png - removed img/1_13.png - removed img/1_2.png - removed img/1_3.png - removed img/1_4.png - removed img/1_5.png - removed img/1_6.png - removed img/1_7.png - removed img/1_8.png - removed img/1_9.png - removed img/2_1.png - removed img/2_2.png - removed img/2_3.png - removed img/2_4.png - removed img/2_5.png - removed img/2_6.png - removed img/2_7.png - removed img/2_8.png - removed img/2_9.png - removed img/4_1.png - removed img/4_2.png - removed img/4_3.png - removed img/4_4.png - removed img/4_5.png - removed img/4_6.png - removed img/7_1.png - removed img/7_2.png - removed img/7_3.png - removed img/7_4.png - removed img/8_1.png - removed img/8_2.png - removed img/8_3.png - removed img/8_4.png - removed img/8_5.png - removed img/8_6.png - removed img/9_1.png - removed img/9_2.png - removed img/addEqipment.jpg - removed img/airframeSetup.jpg - removed img/allElements.png - removed img/attentionSave.jpg - removed img/brrc2205.png - removed img/brrc2205on.png - removed img/brrc2205ondeck.png - removed img/calibrateaxcel.jpg - removed img/calibrateaxcelstart.jpg - removed img/calibratecompass.jpg - removed img/calibrateESC.jpg - removed img/calibrategyro.jpg - removed img/calibratePIDparams.jpg - removed img/calibrateView.jpg - removed img/calibrateViewStart.jpg - removed img/casebattery.png - removed img/chooseSwitch.jpg - removed img/Clever main.png - removed img/clever.jpg - removed img/Clevermain.png - removed img/connectBattery.png - removed img/connectingRadio.png - removed img/connectionESCtoReceiver.png - removed img/connectionLost.jpg - removed img/connectionOK.jpg - removed img/connectionPixhawk.png - removed img/consistofTransmitter.jpg - removed img/cutwire14AWG.jpg - removed img/escDYSzap.png - removed img/escWires.png - removed img/explosion.png - removed img/firmwarePX4.jpg - removed img/flightModes.jpg - removed img/helphand.jpg - removed img/holderLegs.png - removed img/isoViewmountHolder.png - removed img/jumper.png - removed img/keep.png - removed img/lockradio.jpg - removed img/lockradio.png - removed img/lowsafeDeck.png - removed img/mainWindow.jpg - removed img/motorsTopview.png - removed img/mount5vconnector.png - removed img/mountAntenna.png - removed img/mountBeams.png - removed img/mountBottomDeck.png - removed img/mountHolder.png - removed img/mountPDB.png - removed img/mountReceiverDeck.png - removed img/mountReceiverStud.png - removed img/mountxt60pinsocket.png - removed img/notmoveslider.jpg - removed img/pixhawk.png - removed img/radioTransmitter.png - removed img/readyBatteryholder.png - removed img/receiver5V.png - removed img/receiverPPM.png - removed img/resolderingESC.png - removed img/safehighRadial.png - removed img/safeLegs.png - removed img/safelowRadial.png - removed img/safetybyassem.png - removed img/safetyINflight.png - removed img/safetyPower.png - removed img/safetyPreflight.png - removed img/soldering5VTOpdb.png - removed img/solderingBrrc2205ondeckTOescDYSzap.png - removed img/solderingPowerwires.png - removed img/solderingxt60socketTOpdb.png - removed img/stand.jpg - removed img/startPDBtest.jpg - removed img/testMotors.png - removed img/topESCcaseview.png - removed img/topPreview.png - removed img/topviewmountPDB.png - removed img/topviewpixhawk.png - removed img/turnoffSafetyswitch.jpg - removed img/xt60pinsocket.jpg - removed img/zap.jpg - removed img/zapPDBtest.jpg - removed notes/deck.md - removed notes/powerConnection.md - removed notes/testConnection.md - removed notes/zap.md - removed primeri-programm.md - modified README.md - removed sborka.md - removed sitl.md Auto commit by GitBook Editor
293 lines
10 KiB
C++
293 lines
10 KiB
C++
#include <algorithm>
|
|
#include <nodelet/nodelet.h>
|
|
#include <image_transport/image_transport.h>
|
|
#include <cv_bridge/cv_bridge.h>
|
|
#include <opencv2/imgproc/imgproc.hpp>
|
|
#include <pluginlib/class_list_macros.h>
|
|
#include <geometry_msgs/TransformStamped.h>
|
|
#include <geometry_msgs/PoseStamped.h>
|
|
#include <geometry_msgs/PoseWithCovarianceStamped.h>
|
|
#include <visualization_msgs/MarkerArray.h>
|
|
#include <tf/transform_datatypes.h>
|
|
#include <opencv2/calib3d/calib3d.hpp>
|
|
#include <opencv2/opencv.hpp>
|
|
#include <opencv2/aruco.hpp>
|
|
#include <opencv2/aruco/dictionary.hpp>
|
|
#include <stdio.h>
|
|
#include <tf/transform_broadcaster.h>
|
|
|
|
namespace aruco_pose {
|
|
|
|
class ArucoPose : public nodelet::Nodelet {
|
|
tf::TransformBroadcaster br;
|
|
cv::Ptr<cv::aruco::Dictionary> dictionary;
|
|
cv::Ptr<cv::aruco::DetectorParameters> parameters;
|
|
cv::Ptr<cv::aruco::Board> board;
|
|
std::string frame_id_;
|
|
image_transport::CameraSubscriber img_sub;
|
|
image_transport::Publisher img_pub;
|
|
ros::Publisher marker_pub;
|
|
ros::Publisher pose_pub;
|
|
ros::NodeHandle nh_, nh_priv_;
|
|
|
|
virtual void onInit();
|
|
void createBoard();
|
|
cv::Point3f getObjPointsCenter(cv::Mat objPoints);
|
|
void detect(const sensor_msgs::ImageConstPtr&, const sensor_msgs::CameraInfoConstPtr&);
|
|
void parseCameraInfo(const sensor_msgs::CameraInfoConstPtr&, cv::Mat&, cv::Mat&);
|
|
tf::Transform aruco2tf(cv::Mat rvec, cv::Mat tvec);
|
|
};
|
|
|
|
void ArucoPose::onInit() {
|
|
ROS_INFO("Initializing aruco_pose");
|
|
nh_ = getNodeHandle();
|
|
nh_priv_ = getPrivateNodeHandle();
|
|
|
|
nh_priv_.param("frame_id", frame_id_, std::string("aruco_map"));
|
|
|
|
dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_4X4_1000);
|
|
parameters = cv::aruco::DetectorParameters::create();
|
|
|
|
try
|
|
{
|
|
createBoard();
|
|
}
|
|
catch (const std::exception &exc)
|
|
{
|
|
std::cerr << exc.what();
|
|
exit(0);
|
|
}
|
|
|
|
image_transport::ImageTransport it(nh_);
|
|
img_sub = it.subscribeCamera("image", 1, &ArucoPose::detect, this);
|
|
|
|
image_transport::ImageTransport it_priv(nh_priv_);
|
|
img_pub = it_priv.advertise("debug", 1);
|
|
|
|
pose_pub = nh_priv_.advertise<geometry_msgs::PoseStamped>("pose", 1);
|
|
|
|
ROS_INFO("aruco_pose nodelet inited");
|
|
}
|
|
|
|
cv::Ptr<cv::aruco::Board> createCustomGridBoard(int markersX, int markersY, float markerLength, float markerSeparationX, float markerSeparationY,
|
|
const cv::Ptr<cv::aruco::Dictionary> &dictionary, std::vector<int> ids) {
|
|
|
|
CV_Assert(markersX > 0 && markersY > 0 && markerLength > 0 && markerSeparationX > 0 && markerSeparationY > 0);
|
|
|
|
cv::Ptr<cv::aruco::Board> res = cv::makePtr<cv::aruco::Board>();
|
|
|
|
res->dictionary = dictionary;
|
|
|
|
size_t totalMarkers = (size_t) markersX * markersY;
|
|
res->ids = ids;
|
|
res->objPoints.reserve(totalMarkers);
|
|
|
|
// calculate Board objPoints
|
|
float maxY = (float)markersY * markerLength + (markersY - 1) * markerSeparationY;
|
|
for(int y = 0; y < markersY; y++) {
|
|
for(int x = 0; x < markersX; x++) {
|
|
std::vector< cv::Point3f > corners;
|
|
corners.resize(4);
|
|
corners[0] = cv::Point3f(x * (markerLength + markerSeparationX),
|
|
maxY - y * (markerLength + markerSeparationY), 0);
|
|
corners[1] = corners[0] + cv::Point3f(markerLength, 0, 0);
|
|
corners[2] = corners[0] + cv::Point3f(markerLength, -markerLength, 0);
|
|
corners[3] = corners[0] + cv::Point3f(0, -markerLength, 0);
|
|
res->objPoints.push_back(corners);
|
|
}
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
#include "fix.cpp"
|
|
|
|
void ArucoPose::createBoard()
|
|
{
|
|
static auto map_image_pub = nh_priv_.advertise<sensor_msgs::Image>("map_image", 1, true);
|
|
cv_bridge::CvImage map_image_msg;
|
|
cv::Mat map_image;
|
|
|
|
std::string type;
|
|
|
|
nh_priv_.param<std::string>("type", type, "gridboard");
|
|
if (type == "gridboard")
|
|
{
|
|
ROS_INFO("Initialize gridboard");
|
|
|
|
int markers_x, markers_y, first_marker;
|
|
float markers_side, markers_sep_x, markers_sep_y;
|
|
std::vector<int> marker_ids;
|
|
nh_priv_.param<int>("markers_x", markers_x, 10);
|
|
nh_priv_.param<int>("markers_y", markers_y, 10);
|
|
nh_priv_.param<int>("first_marker", first_marker, 0);
|
|
|
|
if (!nh_priv_.getParam("markers_side", markers_side))
|
|
{
|
|
ROS_ERROR("gridboard: required parameter ~markers_side is not set.");
|
|
exit(1);
|
|
}
|
|
|
|
if (!nh_priv_.getParam("markers_sep_x", markers_sep_x))
|
|
{
|
|
if (!nh_priv_.getParam("markers_sep", markers_sep_x))
|
|
{
|
|
ROS_ERROR("gridboard: ~markers_sep_x or ~markers_sep parameters are required");
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
if (!nh_priv_.getParam("markers_sep_y", markers_sep_y))
|
|
{
|
|
if (!nh_priv_.getParam("markers_sep", markers_sep_y))
|
|
{
|
|
ROS_ERROR("gridboard: ~markers_sep_y or ~markers_sep parameters are required");
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
if (nh_priv_.getParam("marker_ids", marker_ids))
|
|
{
|
|
if (markers_x * markers_y != marker_ids.size())
|
|
{
|
|
ROS_FATAL("~marker_ids length should be equal to ~markers_x * ~markers_y");
|
|
exit(1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Fill marker_ids automatically
|
|
marker_ids.resize(markers_x * markers_y);
|
|
for(int i = 0; i < markers_x * markers_y; i++)
|
|
{
|
|
marker_ids.at(i) = first_marker++;
|
|
}
|
|
}
|
|
|
|
// Create grid board
|
|
board = createCustomGridBoard(markers_x, markers_y, markers_side, markers_sep_x, markers_sep_y, dictionary, marker_ids);
|
|
|
|
// Publish map image for debugging
|
|
_drawPlanarBoard(board, cv::Size(2000, 2000), map_image, 50, 1);
|
|
|
|
cv::cvtColor(map_image, map_image, CV_GRAY2BGR);
|
|
|
|
map_image_msg.encoding = sensor_msgs::image_encodings::BGR8;
|
|
map_image_msg.image = map_image;
|
|
map_image_pub.publish(map_image_msg.toImageMsg());
|
|
}
|
|
else if (type == "custom")
|
|
{
|
|
// Not implemented yet
|
|
ROS_FATAL("Custom boards are not implemented yet.");
|
|
}
|
|
else
|
|
{
|
|
ROS_ERROR("Incorrect map type '%s'", type.c_str());
|
|
}
|
|
}
|
|
|
|
cv::Point3f ArucoPose::getObjPointsCenter(cv::Mat objPoints) {
|
|
float min_x = std::numeric_limits<float>::max();
|
|
float max_x = std::numeric_limits<float>::min();
|
|
float min_y = min_x, max_y = max_x;
|
|
for (int i = 0; i < objPoints.rows; i++) {
|
|
max_x = std::max(max_x, objPoints.at<float>(i, 0));
|
|
max_y = std::max(max_y, objPoints.at<float>(i, 1));
|
|
min_x = std::min(min_x, objPoints.at<float>(i, 0));
|
|
min_y = std::min(min_y, objPoints.at<float>(i, 1));
|
|
}
|
|
cv::Point3f res((min_x + max_x) / 2, (min_y + max_y) / 2, 0);
|
|
return res;
|
|
}
|
|
|
|
void ArucoPose::detect(const sensor_msgs::ImageConstPtr& msg, const sensor_msgs::CameraInfoConstPtr &cinfo) {
|
|
cv::Mat image = cv_bridge::toCvShare(msg, "bgr8")->image;
|
|
|
|
std::vector<int> markerIds;
|
|
std::vector<std::vector<cv::Point2f>> markerCorners;
|
|
std::vector<std::vector<cv::Point2f>> rejectedCandidates;
|
|
|
|
cv::aruco::detectMarkers(image, dictionary, markerCorners, markerIds, parameters, rejectedCandidates);
|
|
|
|
cv::Mat cameraMatrix(3, 3, CV_64F);
|
|
cv::Mat distCoeffs(8, 1, CV_64F);
|
|
parseCameraInfo(cinfo, cameraMatrix, distCoeffs);
|
|
|
|
if (markerIds.size() > 0) {
|
|
|
|
cv::Mat rvec, tvec, objPoints;
|
|
int valid = _estimatePoseBoard(markerCorners, markerIds, board, cameraMatrix, distCoeffs,
|
|
rvec, tvec, false, objPoints);
|
|
|
|
if (valid) {
|
|
// Send map transform
|
|
tf::StampedTransform transform(aruco2tf(rvec, tvec), msg->header.stamp, cinfo->header.frame_id, frame_id_);
|
|
br.sendTransform(transform);
|
|
|
|
// Publish map pose
|
|
static geometry_msgs::PoseStamped ps;
|
|
ps.header.frame_id = frame_id_;
|
|
ps.header.stamp = msg->header.stamp;
|
|
ps.pose.orientation.w = 1;
|
|
pose_pub.publish(ps);
|
|
|
|
// Send reference point
|
|
cv::Point3f ref = getObjPointsCenter(objPoints);
|
|
tf::Vector3 ref_vector3 = tf::Vector3(ref.x, ref.y, ref.z);
|
|
tf::Quaternion q(0, 0, 0);
|
|
static tf::StampedTransform ref_transform;
|
|
ref_transform.stamp_ = msg->header.stamp;
|
|
ref_transform.frame_id_ = frame_id_;
|
|
ref_transform.child_frame_id_ = "aruco_map_reference";
|
|
ref_transform.setOrigin(ref_vector3);
|
|
ref_transform.setRotation(q);
|
|
br.sendTransform(ref_transform);
|
|
|
|
if(img_pub.getNumSubscribers() > 0)
|
|
{
|
|
// Publish debug image
|
|
cv::aruco::drawDetectedMarkers(image, markerCorners, markerIds);
|
|
cv::aruco::drawAxis(image, cameraMatrix, distCoeffs, rvec, tvec, 0.3);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (img_pub.getNumSubscribers() > 0)
|
|
{
|
|
cv_bridge::CvImage out_msg;
|
|
out_msg.header.frame_id = msg->header.frame_id;
|
|
out_msg.header.stamp = msg->header.stamp;
|
|
out_msg.encoding = sensor_msgs::image_encodings::BGR8;
|
|
out_msg.image = image;
|
|
img_pub.publish(out_msg.toImageMsg());
|
|
}
|
|
}
|
|
|
|
void ArucoPose::parseCameraInfo(const sensor_msgs::CameraInfoConstPtr &cinfo, cv::Mat &cameraMat, cv::Mat &distCoeffs) {
|
|
for (int i = 0; i < 3; ++i) {
|
|
for (int j = 0; j < 3; ++j) {
|
|
cameraMat.at<double>(i, j) = cinfo->K[3 * i + j];
|
|
}
|
|
}
|
|
for (int k = 0; k < cinfo->D.size(); k++) {
|
|
distCoeffs.at<double>(k) = cinfo->D[k];
|
|
}
|
|
}
|
|
|
|
tf::Transform ArucoPose::aruco2tf(cv::Mat rvec, cv::Mat tvec) {
|
|
|
|
cv::Mat rot;
|
|
cv::Rodrigues(rvec, rot);
|
|
|
|
tf::Matrix3x3 tf_rot(rot.at<double>(0,0), rot.at<double>(0,1), rot.at<double>(0,2),
|
|
rot.at<double>(1,0), rot.at<double>(1,1), rot.at<double>(1,2),
|
|
rot.at<double>(2,0), rot.at<double>(2,1), rot.at<double>(2,2));
|
|
tf::Vector3 tf_orig(tvec.at<double>(0,0), tvec.at<double>(1,0), tvec.at<double>(2,0));
|
|
return tf::Transform(tf_rot, tf_orig);
|
|
}
|
|
|
|
PLUGINLIB_EXPORT_CLASS(ArucoPose, nodelet::Nodelet)
|
|
|
|
}
|