18.外部相机校准——旋转(Rotation),R是什么样子的,绕Z轴旋转的例子,齐次坐标旋转_2

目录

旋转(rotation)

R是什么样子的

绕Z轴旋转的例子

齐次坐标旋转


旋转(rotation)

现在生活变得更加丑陋,旋转(rotation)。我这里有一个图,或者我想这也是来自四边复合幻灯片,我给你们看的是两个坐标系,a和b,你们会注意到A有一个 I 向量(如图1),一个J向量和一个K向量(如图2)。B有一个 I 向量,一个J向量和一个K向量(如图3)。

1 2 3

需要注意的一点是,这个P值(如图1),从原点(如图2)出发的向量,可以用两种方式表示。

1 2

它可以表示为a坐标系中的某些分量乘以x y z坐标系中的某些分量(如图),

也可以表示为B坐标系中的某些分量乘以x y z坐标系中的这些分量,right? 它们是相同的向量,right? 关键是要理解这些基向量(如图2)我们需要知道每个基向量的倍数。

1

2

我们想要做的是假设我们要把坐标系从A旋转到B,这就是这个公式的意思(如图1)。这就是说,给定A中描述的点(如图2),我将有一个旋转算子(如图3)它会给出现在在B坐标系中表示的P(如图4)。意味着在B的坐标系中描述框架A,它表示,所以,如果你根据A的分量给我一个点的位置,这就是应用R后它只是一个旋转,我得到了框架中的分量B。

 2 3

R是什么样子的

那么R是什么样子的呢?有两种方法来考虑这个问题,首先我们要用困难的方法来考虑。表示A中的每个基向量如何用B表示(如图)。

 

所以的第一列(如图1)是A的 I 向量的分量用它在B的 I 方向,B的 j 方向和B的 k 方向上的分量表示(如图2)。

 1 2

你可以把它想象成i_{A} 和 B的每一个分量的点积,i_{B}j_{B}k_{B}(如图1)。

 

同样的,下面每一列都是这样做的。

 

所以,一种思考方法是的列向量是在B坐标系中表示的A的i向量。然后是B坐标系下A的j向量,和B坐标系下A的k向量(如图)。为什么是这样是真确的呢?

 

我们这样想。假设我有一个点,向量,在A坐标系中。它的值是1,0,0(如图1) ,okay? 这意味着它在A坐标系的 i 方向上的距离是1在A坐标系的 j 和 k 方向上的距离是0。它的值应该是多少? all right? 我把它写下来。这个乘以这个(如图2)。

1 2

如此这般。那么它就会得到 iA 点乘 iB(如图1),所以变换后的坐标系的第一个分量就是 i 向量,在 B 的 i 方向上的量。一,二,三。还是得到iA.jB好的,再来一次iA.kB(如图2)。

1  2

换句话说,这就是它说的如果我们有一个1,0,0,需要得到的,就是这个向量是如何点乘每个分量的。这就是为什么这个矩阵可以被认为是它的列向量就像A坐标系的每一个基底向量用B坐标系表示(如图)。明白了吗? 所以两边是这个。只要按下暂停键就行了(教授show)。看看发生了什么。

提醒一下,我标记了这个旋转矩阵的列向量是坐标系B中坐标系A的坐标轴(如图),为什么? 因为我们刚刚给你们看了那些废话。

顺便说一下,它也可以被认为是行就是列(如图1),就是B向量在A坐标系中的基底,right? 这里是 iB 在A的 i 分量中,这是 iB 在 j 中,这是 iB 在 k 中(如图2),

1 2

你可以这样想,如果我转置这个向量。所以我把列变成了行,行变成了列,我现在得到的不是RAB,而是RBA,all right? 这是一个正交矩阵(如图1),right? 正交矩阵,所有的行,所有的列都是互相垂直的单位向量。所以行列式。行列式的磁体是1。这是传统的旋转矩阵顺便说一下,真正重要的是逆等于转置。所以,如果你有一个旋转矩阵你想在这两个矩阵之间来回变换,逆矩阵和转置矩阵,它们是必须的。因为RAB的逆必须是RBA我们刚刚展示了,这些行是如何被变换到列上的。

绕Z轴旋转的例子

举个简单的例子。这里有两个坐标系A到B的旋转大约是z轴。所以右边的图像,我向下看z轴。当我问你们旋转矩阵是什么时,你们应该很熟悉这个? 为什么? 因为你在代数中做过这个,right? 你说过旋转一个角度\theta,当你做x y的时候,关于原点,希望你们还记得像这样的东西(如图)。看,cos\theta - sin\theta sin\theta cos\theta,right? 乔治·托马斯写了我们很多人都用的微积分课本,他教我微积分的时候叫我查理的妹妹,索克·查理。这样你就能记住负号在哪里了。

不管怎样,重点是这个矩阵(如图1)只是为了旋转 x 和 y,保持 z 不变。所以如果我想要得到任意的方向,基本上我可以做一系列的旋转来得到我想要的东西。

关于如何做到这一点有很多标准。我们很多人在数学和计算机视觉中都知道欧拉角。欧拉角表示,绕Z旋转,如果这是Z(教授比手势),就会旋转,假设Z是向上的,绕Z旋转,绕新的X旋转,然后再绕新的Z旋转,all right? 对于你们当中驾驶飞机的人,我认为它是头部,俯仰和滚动? 也许是船,我不知道。航向,你确定了自己的方向。你知道西北航空公司。你俯仰(教授比手势),这是向上和向下的方式,然后你滚动。这就是这个方向的旋转。all right。这是关于Z的世界,新的X,新的y,有滚动,俯仰和偏航。有方位角,仰角,我想对于你们中那些习惯发射迫击炮的人来说,方位角,el,无论如何。

基本上,有这三个基本矩阵,关于X Y z的旋转,顺序很重要,okay? 我们不用太担心,实际上根本不用担心得到那个顺序。但它是什么呢,这里有三个旋转矩阵(如图1),它们是,它们的角度的函数。这是关于x的旋转,关于z的旋转,关于y的旋转,我把它们排列成这个顺序。为什么? 我不知道它们以前是不同的顺序,但是没关系。你可以绕着这些不同的轴旋转。现在,不管你是预乘还是后乘,这都是一个问题。那么我们做x1,然后是y1和z1? 或者z1 y1 x1? 这取决于你是在新坐标系中旋转还是在旧坐标系中旋转。那么,\theta是正的还是负的? 所以当你这样做的时候,你必须很好地考虑这些事情。这就是为什么我们在建造飞船之前先进行模拟? 因为当它在模拟中不起作用时,工程师会说,我不知道,试试 - 20。因为知道角度的方向是非常困难的。

齐次坐标旋转

怎么样,只是一种更简单的方法。再一次,拯救我们的,是齐次坐标。我们假设我们有一个旋转矩阵,okay。这里,我取了上面的方程,即pb是pa的旋转版本,现在,不是左上角的单位矩阵,也不是右边的偏移量,我们在这里有一个旋转矩阵(如图1),这是一个3×3矩阵。所以这是0向量(如图2)是一个3×1的0,所以转置就是0 0 0(如图3),这边是0 0 0(如图4)。okay。这样,旋转就是矩阵乘法。再一次,我们使用齐次坐标(如图5)。提醒一下,不像变换,旋转不是可交换的。

1 2

3 4

5


有编过程的人的代码,比那些无知的人使用的软件更有价值。

MPU6050是一个六运动传感器模块,通常用于姿态跟踪和游戏手柄等应用中。它包含一个三加速度计(X、Y、Z)和一个三陀螺仪。为了计算Z旋转角度,你需要读取Z的加速度值,并结合一些数学计算。 以下是一个简单的示例,展示如何在C语言中使用I2C通信(假设已经初始化了I2C并配置好地址)从MPU6050获取Z加速度,然后基于简单的物理模型(如欧拉角或积分法)估算Z的角度。请注意,这只是一个基本的示例,实际应用中可能需要处理滤波、校准等因素: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define GYRO_SCALE 131.0 // MPU6050 Gyroscope raw data to degrees/s scaling factor #define ACCEL_SCALE 9.81 // gravity acceleration in m/s^2 // I2C functions (assuming you have a working I2C library) void read_gyro(int *x, int *y, int *z) { // Read gyro values from MPU6050 } void read_accel(int *x, int *y, int *z) { // Read accel values from MPU6050 } // Calculate rotation angle around Z axis based on accumulated change float get_z_rotation_angle(float prev_angle, float z_acc, float dt) { float acc_rad_per_s = z_acc * ACCEL_SCALE; return atan(acc_rad_per_s / GYRO_SCALE) + prev_angle * dt; // Simple integration approximation } int main() { int x, y, z; // Variables for storing sensor readings float prev_angle = 0.0f; float current_angle; float dt = 0.01f; // Sample time in seconds while (true) { read_gyro(&x, &y, &z); // Read gyro and accel current_angle = get_z_rotation_angle(prev_angle, z, dt); printf("Current Z-axis rotation angle: %.2f degrees\n", current_angle * 180.0f / M_PI); // Save previous angle for next iteration prev_angle = current_angle; } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值