2751
- 收藏
- 点赞
- 分享
- 举报
在网上看到的四元数姿态解算
void AHRSupdate(float gx, float gy, float gz, float ax, float ay, float az/*, float mx, float my, float mz*/) {
unsigned long now,timeChange;
static unsigned long lastTime=0;
now = micros(); //us
timeChange =now - lastTime;
if(timeChange>=SampleTime){
lastTime = now;
float norm;
float hx, hy, hz, bx, bz;
float vx, vy, vz, wx, wy, wz;
float ex, ey, ez,lastex,lastey,lastez;
float q0q0 = q0*q0;
float q0q1 = q0*q1;
float q0q2 = q0*q2;
float q0q3 = q0*q3;
float q1q1 = q1*q1;
float q1q2 = q1*q2;
float q1q3 = q1*q3;
float q2q2 = q2*q2;
float q2q3 = q2*q3;
float q3q3 = q3*q3;
norm = sqrt(ax*ax + ay*ay + az*az);
ax = ax / norm;
ay = ay / norm;
az = az / norm;
/*norm = sqrt(mx*mx + my*my + mz*mz);
mx = mx / norm;
my = my / norm;
mz = mz / norm;
hx = 2*mx*(0.5 - q2q2 - q3q3) + 2*my*(q1q2 - q0q3) + 2*mz*(q1q3 + q0q2);
hy = 2*mx*(q1q2 + q0q3) + 2*my*(0.5 - q1q1 - q3q3) + 2*mz*(q2q3 - q0q1);
hz = 2*mx*(q1q3 - q0q2) + 2*my*(q2q3 + q0q1) + 2*mz*(0.5 - q1q1 - q2q2);
bx = sqrt((hx*hx) + (hy*hy));
bz = hz; */
vx = 2*(q1q3 - q0q2);
vy = 2*(q0q1 + q2q3);
vz = q0q0 - q1q1 - q2q2 + q3q3;
/* wx = 2*bx*(0.5 - q2q2 - q3q3) + 2*bz*(q1q3 - q0q2);
wy = 2*bx*(q1q2 - q0q3) + 2*bz*(q0q1 + q2q3);
wz = 2*bx*(q0q2 + q1q3) + 2*bz*(0.5 - q1q1 - q2q2); */
ex = (ay*vz - az*vy) ;/*+ (my*wz - mz*wy);*/
ey = (az*vx - ax*vz);/* + (mz*wx - mx*wz);*/
ez = (ax*vy - ay*vx);/* + (mx*wy - my*wx);*/
exInt = exInt + ex*Ki;
eyInt = eyInt + ey*Ki;
ezInt = ezInt + ez*Ki;
gx = gx + Kp*ex + exInt+exD;
gy = gy + Kp*ey + eyInt+eyD;
gz = gz + Kp*ez + ezInt+ezD;
exD=Kd * (ex - lastex)*1000/timeChange;
eyD=Kd * (ey - lastey)*1000/timeChange;
ezD=Kd * (ez - lastez)*1000/timeChange;
q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;
norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
q0 = q0 / norm;
q1 = q1 / norm;
q2 = q2 / norm;
q3 = q3 / norm;
lastex = ex;
lastey = ey;
lastez = ez;
yaw= atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3;
pitch= asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;
}
}
最后的角度计算是自己为了测试加上的,我用的是集成的10 DOF IMU,得到的姿态只有在静止时比较准确和稳定,在动态时有很大波动,没有规律,请问是需要滤波吗?
unsigned long now,timeChange;
static unsigned long lastTime=0;
now = micros(); //us
timeChange =now - lastTime;
if(timeChange>=SampleTime){
lastTime = now;
float norm;
float hx, hy, hz, bx, bz;
float vx, vy, vz, wx, wy, wz;
float ex, ey, ez,lastex,lastey,lastez;
float q0q0 = q0*q0;
float q0q1 = q0*q1;
float q0q2 = q0*q2;
float q0q3 = q0*q3;
float q1q1 = q1*q1;
float q1q2 = q1*q2;
float q1q3 = q1*q3;
float q2q2 = q2*q2;
float q2q3 = q2*q3;
float q3q3 = q3*q3;
norm = sqrt(ax*ax + ay*ay + az*az);
ax = ax / norm;
ay = ay / norm;
az = az / norm;
/*norm = sqrt(mx*mx + my*my + mz*mz);
mx = mx / norm;
my = my / norm;
mz = mz / norm;
hx = 2*mx*(0.5 - q2q2 - q3q3) + 2*my*(q1q2 - q0q3) + 2*mz*(q1q3 + q0q2);
hy = 2*mx*(q1q2 + q0q3) + 2*my*(0.5 - q1q1 - q3q3) + 2*mz*(q2q3 - q0q1);
hz = 2*mx*(q1q3 - q0q2) + 2*my*(q2q3 + q0q1) + 2*mz*(0.5 - q1q1 - q2q2);
bx = sqrt((hx*hx) + (hy*hy));
bz = hz; */
vx = 2*(q1q3 - q0q2);
vy = 2*(q0q1 + q2q3);
vz = q0q0 - q1q1 - q2q2 + q3q3;
/* wx = 2*bx*(0.5 - q2q2 - q3q3) + 2*bz*(q1q3 - q0q2);
wy = 2*bx*(q1q2 - q0q3) + 2*bz*(q0q1 + q2q3);
wz = 2*bx*(q0q2 + q1q3) + 2*bz*(0.5 - q1q1 - q2q2); */
ex = (ay*vz - az*vy) ;/*+ (my*wz - mz*wy);*/
ey = (az*vx - ax*vz);/* + (mz*wx - mx*wz);*/
ez = (ax*vy - ay*vx);/* + (mx*wy - my*wx);*/
exInt = exInt + ex*Ki;
eyInt = eyInt + ey*Ki;
ezInt = ezInt + ez*Ki;
gx = gx + Kp*ex + exInt+exD;
gy = gy + Kp*ey + eyInt+eyD;
gz = gz + Kp*ez + ezInt+ezD;
exD=Kd * (ex - lastex)*1000/timeChange;
eyD=Kd * (ey - lastey)*1000/timeChange;
ezD=Kd * (ez - lastez)*1000/timeChange;
q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;
norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
q0 = q0 / norm;
q1 = q1 / norm;
q2 = q2 / norm;
q3 = q3 / norm;
lastex = ex;
lastey = ey;
lastez = ez;
yaw= atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3;
pitch= asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;
}
}
最后的角度计算是自己为了测试加上的,我用的是集成的10 DOF IMU,得到的姿态只有在静止时比较准确和稳定,在动态时有很大波动,没有规律,请问是需要滤波吗?
我来回答
回答1个
时间排序
认可量排序
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2013-12-01 12:20:05
-
2013-08-23 13:07:36
-
2013-12-01 12:22:15
-
2013-08-23 11:43:53
-
2013-12-14 14:18:08
-
2015-10-02 22:48:32
-
2015-10-02 22:23:39
-
2015-06-09 11:09:38
-
2013-08-23 13:23:27
-
2020-11-11 18:28:52
-
2013-12-14 14:37:21
-
2015-01-19 22:11:42
-
2013-09-10 16:46:26
-
2019-01-17 09:46:45
-
2019-01-31 09:59:18
-
2018-11-21 17:07:06
-
2013-12-02 21:33:03
-
2013-08-23 12:36:57
-
2019-02-19 11:08:09
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认