easy_aruco包代码逻辑梳理

easy_aruco包代码逻辑梳理

easy_aruco源码

OpenCV tutorial

请配合源码阅读该文章

ROS 节点的配置

  <node pkg="tf2_ros" type="static_transform_publisher" name="board_mid"
    args="0.1 0.0 0.0 0.0 0.0 0.0 1.0 board board_mid">
  </node>
  
  <node pkg="easy_aruco" type="easy_aruco_node" name="easy_aruco_node" output="screen" >
    <param name="object_type" value="charuco_board" />
    <param name="camera_namespace" value="/usb_cam" />
    <param name="dictionary" value="DICT_4X4_250"/>
    <param name="camera_frame" value="camera_frame"/>
    <param name="reference_frame" value="base_link"/>
    <param name="marker_size" value="0.03"/>
    <param name="square_size" value="0.04"/>
    <param name="square_number_x" value="5"/>
    <param name="square_number_y" value="7"/>
  </node>

这里面设置了easy_aruco_node的一些参数,例如类型、相机的命名空间、参照系等等,这里是他的用法,接下来进入逻辑的分析

easy_aruco_node.cpp

在easy_aruco/src下存在该文件,根据上面的launch文件的配置,设置了object_type,并且根据object_type选择合适的detector,完成选择后调用 detector->start(),该函数存在于 Detector.cpp中

Detector.cpp

包含三个函数

start()

1、根据launch文件,设置基本参数,包括 camera_namespacecamera_frame

2、创建broadcasterlistener,用于发布和订阅坐标变换(transformation)相关的消息

3、创建debugImagePublisherbase2boardPublisher用于发布调试图像信息(“/easy_aruco_node/debug_image”)以及位姿变换信息(“/easy_aruco_node/base2board_pose”)

4、获取相机信息并调用onCameraInfo()方法,完成对相机参数的传递,以及坐标变换关系的设置

5、调用/easy_aruco/src/ArucoMarker或CharucoBoardDetector.cppstartImpl()方法,完成对检测器(Detector)的初始化

6、订阅图像话题,获取图像信息,并调用onImage()方法,准备进行标记检测与位姿估计

onCameraInfo()

注:以下智能指针的声明在/easy_aruco/include/Detector.h

1、传递相机参数,内参、畸变(默认为0)、尺寸,保存到 newParams

2、将本地变量 newParams 转换为 全局的智能指针 cameraParameters

3、获取referenceFramecameraFrame之间的转换关系,并将其保存到 cameraToReferenceTransform

4、将本地变量 cameraToReferenceTransform 转换为全局智能指针 cameraToReference

5、获取board_midboard之间的转换关系,将其保存在BoardToBoardmidTransform

​ 在实际应用时需要自己设置,如上面launch文件

6、将本地变量BoardToBoardmidTransform转换为全局智能指针 BoardToBoardmid

7、完成参数的获取与保存后停止订阅话题

onImage()

如果cameraParameterscameraToReference有一个为空,跳出,否则执行/easy_aruco/src/Arucomarker或CharucoBoardDetector.cpponImageImpl()

ArucoMarker或CharucoBoardDetector.cpp

startImpl()

获取标记尺寸(marker_size)、字典、并实例化detectorParams,用于存放检测后的信息

onImageImpl()

1、把从传感器中读到的ROS消息数据通过cv_bridge::toCvShare转换成openCV的格式并保存到img

2、调用aruco::detectMarkers(),传入之前的参数,进行标记检测

void cv::aruco::detectMarkers	(	InputArray 	image,
const Ptr< Dictionary > & 			dictionary,
OutputArrayOfArrays 				corners,
OutputArray 						ids,
const Ptr< DetectorParameters > & 	parameters = makePtr< DetectorParameters >(),
OutputArrayOfArrays 				rejectedImgPoints = noArray() 
)	

3、调用aruco::estimatePoseSingleMarkers或aruco::estimatePoseCharucoBoard进行位姿估计

bool cv::aruco::estimatePoseCharucoBoard	(	InputArray 	charucoCorners,
InputArray 										charucoIds,
const Ptr< CharucoBoard > & 					board,
InputArray 										cameraMatrix,
InputArray 										distCoeffs,
InputOutputArray 								rvec,
InputOutputArray 								tvec,
bool 											useExtrinsicGuess = false 
)	

4、发布tf消息

5、发布debug图像

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Smile Hun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值