Use tf2 package to develop auto aim task
Opened this issue · 2 comments
gezp commented
Feature request
Feature description
在自瞄中,需要在相机与云台之间做坐标变换,采用tf2可以方便的管理维护坐标关系,其还提供了简洁的坐标变换接口,以及tf消息同步功能(将IMU转换为tf,间接的实现IMU-相机同步),可以极大的方便开发。
Implementation considerations
(1)建立坐标系之间关系:
- base_link->gimbal_yaw->gimbal_pitch->camera->camera_optical->target(识别到的目标装甲板):其中gimbal_yaw和gimbal_pitch根据云台角度实时更新维护,camera_optical->target之间的变换由自瞄算法计算出来。
- 在使用枪管瞄准的时候,需要使用一个额外的参考坐标系gimbal_home,用于计算瞄准所需要的云台转动yaw,pitch角度,其为当云台角度为0时的gimbal_pitch参考系,可使用静态tf维护base_link->gimbal_home。
Tip:
- gimbal_pitch->camera->camera_optical 可简化为gimbal_pitch->camera_optical
- gimbal_home参考系可以灵活选取,如果base_link->gimbal_home绑定静态变换,那计算出来的yaw为绝对角,如果gimbal_yaw->gimbal_home绑定静态变换,则计算出的yaw为相对角度。
(2)瞄准解算:
- 使用tf2工具,将target转换到gimbal_home坐标系下,计算云台转到绝对角。
gezp commented
这种方式可能会限制开发模式,从中间件(ROS)-算法功能解耦的角度看,建议采用的开发模式为:
- 使用Eigen自行实现内部的云台模型(独立的类,增加复用性),读取云台编码器传感器数据,进行相应的换算。
- 自瞄功能调用云台模型,得到最终的目标控制命令。
同时,也可以支持tf的发布,方便进行可视化调试,而不是直接用tf参与自瞄目标位置到控制命令的计算。
另一方面,对于数据同步,可以采用buffer进行自行处理,更加方便,如需插值,也可实现插值工具类(可支持线性插值,球面插值等不同插值算法)。