Skip to main content

ROS、惯导、OpenCV、开源算法中坐标表示的理解

ros中tf系统的坐标表示:
http://wiki.ros.org/tf/Overview/Transformations
tf中坐标转换方向

ros中各个坐标系的定义:
http://www.ros.org/reps/rep-0105.html#odom

rovio算法中的坐标表示:
https://github.com/ethz-asl/rovio/wiki/Coordinate-Frames-and-Notation

变换的理解:
      两个坐标系的同一个点,由c1系转换到c2系,称为坐标变换,或俗称点变换;只考虑两个坐标系的变换,称为基变换,俗称坐标系变换。坐标变换和基变换方向相反,但表达的坐标系是同一个。变换要考虑变换的方向和描述的坐标系两个问题。


一般的变换中,都是以坐标系下的一个坐标点作为参照进行转换推导,参见《视觉SLAM14讲》P41的推导。因此,得到的变换R、t,是坐标的变换,即简单的理解为点的变换。
在VIO中一样,IMU即使看不到点,也以其坐标系下的 一个点作为参考(比如,将重力从n系转换到b系,将重力看作一个点)。
考虑点P在1、2坐标系的表示分别为P1、P2,
坐标点P从P1变换到P2:
P2 = R_21*P1+ t_21_2
坐标系1、2的坐标基变换则为从2变换到1: R_12 、 t_12_2
因此,坐标变换的描述坐标系为终点坐标系,基变换的描述坐标系为起点坐标系

在tf/message的ros框架下,以tf为例:
描述坐标系为frame_id, -> 全局坐标系
坐标基变换(坐标系变换):frame_id -> child_frame_id
坐标变换(点变换):child_frame_id -> frame_id
在ros message中变换也是基于坐标基的变换。  有的是基于点的,查看源码的注释,比如loockTransform(),注释中就说了是变换data。sendTrsnform()中通过frame_id和child_frame_id进行识别。

更新:
最直接的记忆方式就跟据全局坐标系,
比如,标定结果中,T_cam0_imu, 意味着将点从imu坐标系转换到cam0坐标系,对于坐标变换就是cam0变换到imu,同时,cam0是全局坐标系(参考坐标系),整个结果就是在cam0坐标系下描述imu(考虑可以理解为imu坐标系原点,考虑旋转时就考虑三个轴)。
平移:局部坐标系 - 全局坐标系
旋转:局部坐标系旋转到全局坐标系


惯导计算:
纯惯导解算中,也是点从t1时刻到tn时刻的变换,见秦永元《惯性导航》绪论部分的推导,或者直接理解为重力g在n系和b系之间的变换。
若系统状态中的姿态,采用的是n到b,则更新时是左乘(坐标系的表达从右到左),如果是b到n,则是右乘(坐标系的表达从左到右)->旋转矩阵。。。。四元数也一样。一般都是b到n。
左乘与右乘只是在姿态更新时有区别,因为全局姿态欧拉角的问题。在多个传感器间变换时,都还是左乘好像。。。。。(待继续验证)

在vio中会涉及到的一个:(符号从右到左,坐标的变换)
t_imu_cam0 - t_imu_cam1 : cam0 -> cam1 在imu下表示
t_imu_cam0: cam0->imu在imu下的表示
在数学中学到矢量减法时,规则是两矢量相减,方向为从减数指向被减数,即 a - b 为从b指向a。这是坐标系变换的规则。而坐标变换是反过来的,a指向b。
或者都按照坐标系变换来看:
(- t_imu_cam1) - (-t_imu_cam0 ),坐标变换与坐标系变换存在负号,这样看也是cam0 -> cam1


参见tf的ros wiki:
Transforms are specified in the direction such that they will transform the coordinate frame "frame_id" into "child_frame_id" in tf::StampedTransform and geometry_msgs/TransformStamped. This is the same transform which will take data from "child_frame_id" into "frame_id". 


 具体的实例见lsd_slam的
ROSOutput3DWrapper::publishTrackedFrame(Frame* kf)
 
备注:
 点P从1系变换到2系叫做变换, 在不考虑点只考虑坐标系问题时,就不存在变换一说了,而只是1系在2系的表达、或者2系在1系的表达。上面的实例中的变量命名就体现了这一点。
同时,1系在2系下面的描述,等价与1系相对于2系 


      考虑变换的目的,就是为了对不同坐标系下的坐标值进行转换,因此一般的SLAM、VIO中的变换以及标定结果的变换都是基于坐标的变换,但想直观对标定结 果进行验证时,无法肉眼对一个点进行变换,只能通过变换两个坐标系。还有,定位结果也是一个坐标系在另一个坐标系下的描述,也是坐标基的变换。因此,用于计算的库应该都是基于坐标变换的,比如opencv、sophus、标定、惯导等,用于展示的都是以坐标基的描述为主的,比如ros中的tf等,。。。。有点基于验证。
总结为一点:坐标变换和坐标基描述,描述坐标系相同但反向

Comments

Popular posts from this blog

ros调试----rosparm

当程序有许多参数传入时,通常会通过rosparm进行传递, 传递形式为在roslaunch文件中的node中,使用rosparm,比如 <node pkg="tvio" type="image_processor_node" name="image_processor"  output="screen" >       <rosparam command="load" file="$(arg calibration_file)"/>       <param name="grid_row" value="4"/>       <param name="grid_col" value="5"/>       <remap from="~imu" to="/xsens_imu_data"/>       <remap from="~cam0_image" to="/camera/left/image_raw"/>       <remap from="~cam1_image" to="/camera/right/image_raw"/>  </node> 其中,calibration_file为指定的rosparam格式的yaml文件。 可以通过launch文件启动调试,但是不是很习惯,还是喜欢用Clion的可视化调试。 方法: 1)在终端中手动加载rosparam参数: python /opt/ros/kinetic/bin/rosparam  load  /xxxx/camchain.yaml 参数一旦加载后,会保持在本机上的参数服务器中(是不是和roscore相关),程序运行就能读取到。 2)remap中的参数项通过程序的命令行参数形式传入: image_processor   ~imu:=/xsens_imu_data...

一、VO篇(monocular、stereo)

单目相关的一些资源 1、该作者实现了最简单的单目、Stereo VO,都是基于点特征的 Monocular Visual Odometry using OpenCV Visual Odmetry from scratch - A tutorial for beginners     2、Matlab官方文档中的例子: Monocular Visual Odometry 3、基于RANSC野点剔除: https://github.com/sunzuolei/mvo_ransac/tree/master/mvo_ransac   在Android平台的实现: https://github.com/sunzuolei/mvo_android  https://github.com/sunzuolei/vo_basis 这里还向相关的视频  4、论文+代码   http://www.cs.cmu.edu/~rahuls/pub/icra2005-rahuls.pdf http://www.cs.cmu.edu/~vo/vo-0-2.tgz  5、libviso2  单双目   基于点和线的VO:包括双目、单目(svo) http://mapir.uma.es/mapirwebsite/index.php/people/115-people/164-ruben-gomez.html   6、fovis 7、bpvo https://github.com/halismai/bpvo  该套算法来自CMU,以及作者的另一套开源算法photobundle,有作者的博士论文链接,拜读。       双目vo:  https://github.com/ucsdxiaoyuzhou/CSE252C_visual_odometry https://github.com/fovis/fovis 深度相机或者stereo https://github.com/jaiprakashgogi/visualodometry 带有简...

AHRS开源项目

ros中集成的组件: 9DOF https://github.com/ccny-ros-pkg/imu_tools 该算法是Sebastian Madgwick博士 2009 年开源的研究项目。 原始项目: http://x-io.co.uk/open-source-imu-and-ahrs-algorithms/ 但是一直没有在维护更新,后被集成到ros中。  另一套6DOF的开源AHRS系统, http://autopilot.sourceforge.net/kalman.html