SLAM中的坐标系旋转变换以及旋转矩阵的左乘和右乘问题

本文探讨了变换矩阵在计算机视觉中的应用,特别关注从相机坐标系到世界坐标系以及相机之间的转换,通过实例解析了不同基准下的矩阵定义及其计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于一个变换矩阵 T T T,具体的定义因人而异,例如一个变换 T w c T_{wc} Twc,代表了从相机坐标系到世界坐标系的变换,但是其基准(base)坐标系有时候定义为 w w w,也可以定义为 c c c,基准坐标系的不同,直接导致变换相反。

例如对于下图中的三个简单的坐标系,分别为相机坐标系 c 1 , c 2 c1,c2 c1c2,世界坐标系 w w w,其中点 P P P 在坐标系 c 1 c1 c1 下。接下来定义变换矩阵,为了简化计算,其中三个坐标系没有旋转,只需要考虑平移。

在这里插入图片描述

  1. 对于变换矩阵 T c w T_{cw} Tcw,理解为worldcamera的变换,如果以 camera 为基准坐标系,所以如果想将点 P P P 旋转到 c 2 c2 c2 坐标系下,那么变换矩阵的定义:
    T c 1 w = [ 1 0 0 0 0 1 0 − 1 0 0 1 0 0 0 0 1 ] T c 2 w = [ 1 0 0 − 1 0 1 0 0 0 0 1 0 0 0 0 1 ] T c 2 c 1 = [ 1 0 0 − 1 0 1 0 1 0 0 1 0 0 0 0 1 ] T_{c_1w} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & -1 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] T_{c_2w} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & -1 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] T_{c_2c_1} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & -1 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] Tc1w=1000010000100101Tc2w=1000010000101001Tc2c1=1000010000101101
    那么将一个点从 c 1 c_1 c1 坐标系转换到 c 2 c_2 c2 坐标系,需要先转换到世界坐标系。那么如下:
    c 2 P = T c 2 w T w c 1 c 1 P = T c 2 w T c 1 w − 1 c 1 P = [ 1 0 0 − 1 0 1 0 0 0 0 1 0 0 0 0 1 ] [ 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 ] [ 1 0 0 1 ] ^{c_2}P=T_{c_2w}T_{wc_1} {^{c_1}P} = T_{c_2w} T^{-1}_{c_1w}{^{c_1}P} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & -1 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] \left[ \begin{array}{ccc|c} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] \left[ \begin{array}{cc} 1 \\ 0 \\ 0 \\ \hline 1 \\ \end{array} \right] c2P=Tc2wTwc1c1P=Tc2wTc1w1c1P=100001000010100110000100001001011001 = [ 1 0 0 − 1 0 1 0 1 0 0 1 0 0 0 0 1 ] [ 1 0 0 1 ] = [ 0 1 0 1 ] = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & -1 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] \left[ \begin{array}{cc} 1 \\ 0 \\ 0 \\ \hline 1 \\ \end{array} \right] =\left[ \begin{array}{cc} 0 \\ 1 \\ 0 \\ \hline 1 \\ \end{array} \right] =10000100001011011001=0101

  2. 那么对于变换矩阵 T c w T_{cw} Tcw,理解为worldcamera的变换,如果以 world 为基准坐标系,所以如果想将点 P P P 旋转到 c 2 c2 c2 坐标系下,那么变换矩阵的定义:
    T c 1 w = [ 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 ] T c 2 w = [ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 ] T c 2 c 1 = [ 1 0 0 1 0 1 0 − 1 0 0 1 0 0 0 0 1 ] T_{c_1w} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] T_{c_2w} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] T_{c_2c_1} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & -1 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] Tc1w=1000010000100101Tc2w=1000010000101001Tc2c1=1000010000101101
    对于点P,假设其姿态与c1坐标系一致,则
    T p c 1 = [ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 ] T_{pc_1} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] Tpc1=1000010000101001
    那么可以得到,从c2到P的变换,等于从c2到c1的变换乘c1到P的变换:
    T p c 2 = T c 1 c 2 T p c 1 = [ 1 0 0 − 1 0 1 0 1 0 0 1 0 0 0 0 1 ] [ 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 ] = [ 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 ] T_{pc_2} = T_{c_1c_2}T_{pc_1} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & -1 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] \left[ \begin{array}{ccc|c} 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] Tpc2=Tc1c2Tpc1=10000100001011011000010000101001=1000010000100101所以在c2坐标系下,P点的坐标为 ( 0 , 1 , 0 ) ( 0 , 1 ,0) (0,1,0)

对于上面两种定义方式,都可以求得正确的结果,但是定义不同,计算方式就不同。

旋转的左乘与右乘未完待更…

### 关于视觉SLAM中的坐标系变换 在视觉SLAM领域,坐标系变换是一个核心概念,它涉及如何通过不同的几何变换来描述空间中物体的位置姿态变化。以下是关于坐标系变换的一些关键知识点及其实现方法。 #### 几何变换的分类 几何变换可以分为四种主要类型:欧式变换、相似变换、仿射变换以及射影变换。每种变换都保留了一定的空间特性: - **欧式变换**保持了长度、角度体积不变[^1]。 - **相似变换**允许尺度缩放,因此只保持体积的比例关系不变。 - **仿射变换**进一步放松约束,仅保留平行性体积比例的关系。 - **射影变换**是最一般的线性变换形式,能够处理透视投影下的场景,其特点是接触平面的相交相切属性得以保存。 这些变换通常用于不同层次上的建模需求,在实际应用中可能需要根据具体任务选择合适的模型。 #### SLAM中的常用坐标系定义 对于具体的SLAM应用场景而言,存在多个相互关联但功能各异的坐标系: - 小车坐标系(Robot Frame)表示机器人自身的参考框架; - 地图坐标系(Map Frame)用来全局定位所有特征点及路径规划; - Odom坐标系(Odometry Frame)记录基于轮式编码器或其他测距手段得到的小车位移信息; - Sensor坐标系(Sensor Frame),特别是当采用LiDAR作为感知设备时,则需考虑该局部测量数据相对于整体环境的意义[^2]。 上述各坐标系之间存在着固定的或者动态的变化关系,理解并正确设置它们之间的转换矩阵至关重要。 #### 坐标变换的具体实现方式 为了完成从一个坐标系到另一个坐标系的数据映射操作,一般会利用齐次坐标的表达形式构建相应的变换矩阵T。假设我们有两组三维向量p_A p_B分别属于A,B两个不同的坐标体系下,则可通过如下公式计获得彼此间的相对位姿参数R(旋转部分)平移t: \[ \begin{bmatrix} x'_B \\ y'_B \\ z'_B \\ 1 \end{bmatrix} = T_{AB} * \begin{bmatrix} x_A \\ y_A \\ z_A \\ 1 \end{bmatrix}, where \ T_{AB}= \begin{bmatrix} R & t\\ 0&1 \end{bmatrix}\] 其中\(T_{AB}\)即为由A至B的标准刚体运动学方程所决定的整体转移子。 另外值得注意的是,在真实世界里由于噪声干扰等因素影响,估计出来的初始猜测往往不够精确,所以还需要借助优化法比如最小二法不断迭代调整直至收敛达到最终满意的精度水平。 ```python import numpy as np def transform_point(T, point): """ Transforms a single 3D point using the given transformation matrix. Parameters: T (np.ndarray): Transformation matrix of shape (4, 4). point (list or np.ndarray): Point coordinates [x, y, z]. Returns: transformed_point (np.ndarray): The new position after applying the transformation. """ homogeneous_point = np.array([*point, 1]) result = T @ homogeneous_point.T return result[:3]/result[-1] # Example usage with random values for demonstration purposes only rotation_matrix = np.eye(3) # Identity rotation here; replace accordingly translation_vector = np.random.rand(3)*5 - 2.5 # Random translation within [-2.5, +2.5]^3 space units transformation_matrix = np.vstack((np.hstack((rotation_matrix, translation_vector[:, None])), [0, 0, 0, 1])) original_points = [[1., 0., 0.], [0., 1., 0.]] transformed_points = [transform_point(transformation_matrix, pt).tolist() for pt in original_points] print(transformed_points) ``` 以上代码片段展示了如何使用Python编程语言配合NumPy库来进行基本的单一点云坐标转换过程演示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秃头队长

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

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

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

打赏作者

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

抵扣说明:

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

余额充值