SO2和SE2详细对比与解释

一、基本概念

SO2 - 特殊正交群(仅旋转)

  • 维度:2×2 矩阵
  • 功能仅旋转,绕原点
  • 自由度:1个(旋转角度)
  • 数学表示R = [ cosθ -sinθ ] [ sinθ cosθ ]

SE2 - 特殊欧氏群(旋转+平移)

  • 维度:3×3 矩阵
  • 功能旋转 + 平移
  • 自由度:3个(x平移, y平移, 旋转角度)
  • 数学表示T = [ R t ] [ 0 1 ] 其中 R 是 SO2 矩阵,t = [x, y]ᵀ

二、直观对比

比较项SO2SE2
形状https://latex.codecogs.com/svg.latex?\begin{bmatrix}\cos\theta&-\sin\theta\sin\theta&\cos\theta\end{bmatrix}https://latex.codecogs.com/svg.latex?\begin{bmatrix}\cos\theta&-\sin\theta&x\sin\theta&\cos\theta&y\0&0&1\end{bmatrix}
维度2×23×3
作用只旋转,不移动先旋转,再移动
应用方向变换位置+方向变换
例子指南针旋转机器人移动到某位置并转向

三、实际例子说明

场景:一个点在平面上的变换

假设点 P = (2, 3),旋转30°,平移(5, 4)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// 初始点
Point P = new Point(2, 3);

// 1. 只使用 SO2(仅旋转)
Mat R = SO2(30 * Math.PI / 180);  // 旋转30°
Mat P_mat = Mat.FromArray(new double[,] { {2}, {3} });
Mat P_rotated = R * P_mat;  // 结果: 绕原点旋转30°
// P_rotated ≈ (0.23, 3.60)

// 2. 使用 SE2(旋转+平移)
Mat T = SE2(5, 4, 30 * Math.PI / 180);
Mat P_homo = Mat.FromArray(new double[,] { {2}, {3}, {1} });  // 齐次坐标
Mat P_transformed = T * P_homo;  // 结果: 先旋转30°,再平移到(5,4)
// P_transformed ≈ (5.23, 7.60)

四、几何可视化

SO2 变换:绕原点旋转

1
2
3
4
5
6
7
8
9
初始:    旋转θ后:
   Y         Y
   ↑         ↑
   │  P      │   P'
   │  •      │    •
   └────X    └─────X
   原点        原点
   
P' = R * P  (位置改变,但绕原点旋转)

SE2 变换:任意位置旋转+平移

1
2
3
4
5
6
7
8
9
初始:          SE2变换后:
   Y              Y
   ↑              ↑
   │  P           │
   │  •           │       P'
   └────X         └────────X
   原点           新原点(平移后)
   
P' = R * P + t   (先旋转,再加平移向量t)

五、在芯片检测中的应用

情况1:计算芯片边缘方向(使用SO2)

1
2
3
4
5
6
7
// 已知芯片角度θ,计算边缘单位向量
double chipAngle = 45 * Math.PI / 180;
Mat rotation = SO2(chipAngle);

// 局部X轴方向(芯片长边方向)
Mat localX = Mat.FromArray(new double[,] { {1}, {0} });
Mat edgeDirection = rotation * localX;  // 全局坐标系下的边缘方向

情况2:生成芯片包络框(使用SE2)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// 芯片中心(x0,y0),角度θ
double x0 = 100, y0 = 150;
double theta = 45 * Math.PI / 180;

// 局部坐标系下的四个角点(以芯片中心为原点)
Mat cornersLocal = Mat.FromArray(new double[,]
{
    {-w/2, w/2, w/2, -w/2},  // x
    {-h/2, -h/2, h/2, h/2},   // y
    {1, 1, 1, 1}              // 齐次坐标
});

// 使用SE2变换到全局坐标
Mat T = SE2(x0, y0, theta);
Mat cornersGlobal = T * cornersLocal;  // 得到实际图像中的坐标

六、数学关系

SE2 包含 SO2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// SE2 可以分解为:
SE2(x, y, θ) = [ SO2(θ)   [x, y]ᵀ ]
               [   0         1    ]

// 提取旋转部分
Mat GetRotationPart(Mat se2)
{
    // 取左上角2×2子矩阵
    return se2.RowRange(0, 2).ColRange(0, 2);
}

// 提取平移部分
Mat GetTranslationPart(Mat se2)
{
    // 取右上角2×1子矩阵
    return se2.RowRange(0, 2).ColRange(2, 3);
}

变换组合

1
2
3
4
5
6
7
8
// 先旋转R1,平移t1,再旋转R2,平移t2
Mat T1 = SE2(t1.x, t1.y, θ1);
Mat T2 = SE2(t2.x, t2.y, θ2);
Mat combined = T2 * T1;  // 注意顺序:T2作用在T1之后

// 等价于:
// 总旋转 R_total = R2 * R1
// 总平移 t_total = R2 * t1 + t2

七、选择使用场景

什么时候用SO2?

  1. 只关心方向(如边缘方向、法线方向)
  2. 点在局部坐标系中(以某点为中心)
  3. 计算角度关系(向量夹角)
  4. 归一化方向向量
1
2
3
4
// 例子:计算两个芯片的角度差
Mat R1 = SO2(chip1.Angle);
Mat R2 = SO2(chip2.Angle);
Mat relativeRotation = R2 * R1.T();  // 相对旋转矩阵

什么时候用SE2?

  1. 需要同时处理位置和方向
  2. 坐标变换(局部↔全局)
  3. 生成检测区域
  4. 物体定位
1
2
3
// 例子:将局部检测点转换到图像坐标
Mat localPoints = GetLocalInspectionPoints();
Mat globalPoints = SE2(chip.X, chip.Y, chip.Angle) * localPoints;

八、简单记忆法

记忆点SO2SE2
字母含义S=特殊,O=正交(旋转)S=特殊,E=欧氏(欧几里得)
维度2维,2×2矩阵3维,3×3矩阵
功能只能转(原地旋转)能转能走(旋转+移动)
类比人原地转身人走到某位置并转身

口诀

  • SO2:Special Orthogonal → 只转不动
  • SE2:Special Euclidean → 又转又动

九、实际代码对比

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 任务:将点P绕点C旋转θ角度

// 方法1:使用SO2(需要手动处理平移)
Mat P_relative = P - C;                // 1. 转到以C为中心的坐标系
Mat P_rotated_relative = SO2(θ) * P_relative;  // 2. 旋转
Mat P_final = P_rotated_relative + C;  // 3. 转回全局坐标系

// 方法2:使用SE2(一步完成)
Mat P_homo = ToHomogeneous(P);        // 转换为齐次坐标
Mat T = SE2(C.X, C.Y, θ);             // 以C为中心的变换
Mat P_final = T * P_homo;             // 一步完成旋转+平移

// SE2版本更简洁,因为它内置了"转到局部→旋转→转回全局"的逻辑

十、总结表格

特性SO2SE2
完整名称2D特殊正交群2D特殊欧氏群
矩阵大小2×23×3
表示内容纯旋转旋转+平移
齐次坐标不需要需要
组合变换矩阵乘法矩阵乘法
逆变换R⁻¹ = RᵀT⁻¹ = [Rᵀ -Rᵀt; 0 1]
应用领域方向计算、向量旋转坐标变换、物体定位

关键理解:SE2 = SO2 + 平移。当平移为0时,SE2退化为SO2。

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计