$search
00001 #include <ros/ros.h> 00002 #include <image_transport/image_transport.h> 00003 #include <opencv/cv.h> 00004 #include <cv_bridge/CvBridge.h> 00005 #include <LinearMath/btVector3.h> 00006 #include <LinearMath/btQuaternion.h> 00007 00008 #include <sensor_msgs/Image.h> 00009 #include <sensor_msgs/CameraInfo.h> 00010 00011 #include "aruco/aruco.h" 00012 00013 #include <iostream> 00014 #include <XmlRpcValue.h> 00015 00016 #include "PoseEstimator.h" 00017 #include "CameraModelPointCorrector.h" 00018 #include "MarkerRefiner.h" 00019 #include "MarkerPublisher.h" 00020 #include "TransformPublisher.h" 00021 00022 using namespace std; 00023 using namespace XmlRpc; 00024 using namespace ros; 00025 using namespace image_transport; 00026 using namespace sensor_msgs; 00027 using namespace aruco; 00028 using namespace EdgeDetection; 00029 00030 PoseEstimator* poseEstimator; 00031 CameraModelPointCorrector* cameraModelPointCorrector; 00032 MarkerRefiner* markerRefiner; 00033 MarkerPublisher* markerPublisher; 00034 TransformPublisher* transformPublisher; 00035 00036 void handleImage(const ImageConstPtr& image, const CameraInfoConstPtr& cameraInfo) 00037 { 00038 CvBridge bridge; 00039 IplImage* iplImage = bridge.imgMsgToCv(image, "rgb8"); 00040 Mat matrixImage = iplImage; 00041 00042 cameraModelPointCorrector->updateCameraModel(cameraInfo); 00043 00044 double intrinsicCameraMatrix[9]; 00045 for (int index = 0; index < 9; index++) intrinsicCameraMatrix[index] = cameraInfo->K[index]; 00046 00047 vector<aruco::Marker> markers; 00048 00049 MarkerDetector markerDetector; 00050 markerDetector.detect(matrixImage, markers, CameraParameters()); 00051 00052 for (vector<aruco::Marker>::iterator marker = markers.begin(); marker < markers.end(); marker++) 00053 { 00054 aruco::Marker refinedMarker = markerRefiner->refineMarker(*marker, matrixImage); 00055 00056 btVector3 position; 00057 btQuaternion orientation; 00058 if (poseEstimator->estimatePose(refinedMarker, intrinsicCameraMatrix, position, orientation)) 00059 { 00060 if (markerPublisher != 0) markerPublisher->publishMarker(image->header, refinedMarker, position, orientation); 00061 if (transformPublisher != 0) transformPublisher->publishTransform(image->header, refinedMarker, position, orientation); 00062 } 00063 } 00064 } 00065 00066 int main(int argc, char** argv) 00067 { 00068 init(argc, argv, "aruco_pose"); 00069 00070 NodeHandle nodeHandle("~"); 00071 00072 string correctionTablePath; 00073 nodeHandle.param("correction_table_path", correctionTablePath, string("MicroEdgeCorrectionTable.bin")); 00074 double markerSize; 00075 nodeHandle.param("marker_size", markerSize, 1.0); 00076 bool publishMarkers; 00077 nodeHandle.param("publish_markers", publishMarkers, false); 00078 bool publishTransforms; 00079 nodeHandle.param("publish_transforms", publishTransforms, true); 00080 00081 ImageTransport imageTransport(nodeHandle); 00082 imageTransport.subscribeCamera("/image", 1, handleImage); 00083 00084 poseEstimator = new PoseEstimator(markerSize); 00085 cameraModelPointCorrector = new CameraModelPointCorrector(); 00086 markerRefiner = new MarkerRefiner(correctionTablePath, cameraModelPointCorrector); 00087 if (publishMarkers) markerPublisher = new MarkerPublisher(nodeHandle, markerSize); 00088 if (publishTransforms) transformPublisher = new TransformPublisher(); 00089 00090 spin(); 00091 00092 delete transformPublisher; 00093 delete markerPublisher; 00094 delete markerRefiner; 00095 delete cameraModelPointCorrector; 00096 delete poseEstimator; 00097 }