miniIMU AHRS 姿态板首试 动如脱兔 静若处子
不断的改程序测试再改再试,经几几个星期的努力,姿态仪的数据终于可以拿出来见人了。硬件组成:
MPU-6050 集成3轴陀螺仪和3轴加速器
HMC5883L 3轴地磁传感器
BPM085气压高度计
STM32F103T8负责解算姿态
目前达到的效果是俯仰 横滚 航向稳定在0.1度内。高度与气压和温度有关,0.5米内波动。使用四元数表示姿态,
磁力计和加速度通过Pi环修正陀螺仪输出。
中间还有一些坎坷,上位机软件一直找不到有公开协议的,要么就是协议太复杂,要么就是效果不佳,自己动手做了一个:
http://player.youku.com/player.php/sid/XMzg0NzMyNjI0/v.swf
高手 不知道LZ开源不 我以为他会开源 看到他底下的淘宝地址后 我就知道他不会开源了 亮点是显示器左侧的彩页 kevinzcp 发表于 2012-4-21 18:59 static/image/common/back.gif
亮点是显示器左侧的彩页
这都让你看出来了,哈哈,房子是租的,平时焊接的时候我有甩锡的习惯,怕把人家房子搞脏了。
所以用超市的海报贴一层上去。
报名一下,有没有人想要这3D显示上位机的协议和软件,我拿出来给自己调试姿态仪的朋友。
/**************************实现函数********************************************
*函数原型: void UART1_ReportIMU(int16_t yaw,int16_t pitch,int16_t roll
,int16_t alt,int16_t tempr,int16_t press)
*功 能: 向上位机发送经过解算后的姿态数据
输入参数:
int16_t yaw 经过解算后的航向角度。单位为0.1度 0 -> 3600对应 0 -> 360.0度
int16_t pitch 解算得到的俯仰角度,单位 0.1度。-900 - 900 对应 -90.0 -> 90.0 度
int16_t roll解算后得到的横滚角度,单位0.1度。 -1800 -> 1800 对应 -180.0->180.0度
int16_t alt 气压高度。 单位0.1米。范围一个整型变量
int16_t tempr 温度 。 单位0.1摄氏度 范围:直到你的电路板不能正常工作
int16_t press 气压压力。单位10Pa一个大气压强在101300pa 这个已经超过一个整型的范围。需要除以10再发给上位机
int16_t IMUpersec姿态解算速率。运算IMUpersec每秒。
输出参数:没有
*******************************************************************************/
void UART1_ReportIMU(int16_t yaw,int16_t pitch,int16_t roll
,int16_t alt,int16_t tempr,int16_t press,int16_t IMUpersec)
{
unsigned int temp=0xaF+2;
char ctemp;
UART1_Put_Char(0xa5);
UART1_Put_Char(0x5a);
UART1_Put_Char(14+2);
UART1_Put_Char(0xA1);
if(yaw<0)yaw=32768-yaw;
ctemp=yaw>>8;
UART1_Put_Char(ctemp);
temp+=ctemp;
ctemp=yaw;
UART1_Put_Char(ctemp);
temp+=ctemp;
if(pitch<0)pitch=32768-pitch;
ctemp=pitch>>8;
UART1_Put_Char(ctemp);
temp+=ctemp;
ctemp=pitch;
UART1_Put_Char(ctemp);
temp+=ctemp;
if(roll<0)roll=32768-roll;
ctemp=roll>>8;
UART1_Put_Char(ctemp);
temp+=ctemp;
ctemp=roll;
UART1_Put_Char(ctemp);
temp+=ctemp;
if(alt<0)alt=32768-alt;
ctemp=alt>>8;
UART1_Put_Char(ctemp);
temp+=ctemp;
ctemp=alt;
UART1_Put_Char(ctemp);
temp+=ctemp;
if(tempr<0)tempr=32768-tempr;
ctemp=tempr>>8;
UART1_Put_Char(ctemp);
temp+=ctemp;
ctemp=tempr;
UART1_Put_Char(ctemp);
temp+=ctemp;
if(press<0)press=32768-press;
ctemp=press>>8;
UART1_Put_Char(ctemp);
temp+=ctemp;
ctemp=press;
UART1_Put_Char(ctemp);
temp+=ctemp;
UART1_Put_Char(temp%256);
UART1_Put_Char(0xaa);
}
/**************************实现函数********************************************
*函数原型: void UART1_ReportMotion(int16_t ax,int16_t ay,int16_t az,int16_t gx,int16_t gy,int16_t gz,
int16_t hx,int16_t hy,int16_t hz)
*功 能: 向上位机发送当前传感器的输出值
输入参数:
int16_t ax加速度 X轴ADC输出 范围 :一个有符号整型
int16_t ay加速度 Y轴ADC输出 范围 :一个有符号整型
int16_t az加速度 Z轴ADC输出 范围 :一个有符号整型
int16_t gx陀螺仪 X轴ADC输出 范围 :一个有符号整型
int16_t gy陀螺仪 Y轴ADC输出 范围 :一个有符号整型
int16_t gz陀螺仪 Z轴ADC输出 范围 :一个有符号整型
int16_t hx磁罗盘 X轴ADC输出 范围 :一个有符号整型
int16_t hy磁罗盘 Y轴ADC输出 范围 :一个有符号整型
int16_t hz磁罗盘 Z轴ADC输出 范围 :一个有符号整型
输出参数:没有
*******************************************************************************/
void UART1_ReportMotion(int16_t ax,int16_t ay,int16_t az,int16_t gx,int16_t gy,int16_t gz,
int16_t hx,int16_t hy,int16_t hz)
{
unsigned int temp=0xaF+9;
char ctemp;
UART1_Put_Char(0xa5);
UART1_Put_Char(0x5a);
UART1_Put_Char(14+8);
UART1_Put_Char(0xA2);
if(ax<0)ax=32768-ax;
ctemp=ax>>8;
UART1_Put_Char(ctemp);
temp+=ctemp;
ctemp=ax;
UART1_Put_Char(ctemp);
temp+=ctemp;
if(ay<0)ay=32768-ay;
ctemp=ay>>8;
UART1_Put_Char(ctemp);
temp+=ctemp;
ctemp=ay;
UART1_Put_Char(ctemp);
temp+=ctemp;
if(az<0)az=32768-az;
ctemp=az>>8;
UART1_Put_Char(ctemp);
temp+=ctemp;
ctemp=az;
UART1_Put_Char(ctemp);
temp+=ctemp;
if(gx<0)gx=32768-gx;
ctemp=gx>>8;
UART1_Put_Char(ctemp);
temp+=ctemp;
ctemp=gx;
UART1_Put_Char(ctemp);
temp+=ctemp;
if(gy<0)gy=32768-gy;
ctemp=gy>>8;
UART1_Put_Char(ctemp);
temp+=ctemp;
ctemp=gy;
UART1_Put_Char(ctemp);
temp+=ctemp;
//-------------------------
if(gz<0)gz=32768-gz;
ctemp=gz>>8;
UART1_Put_Char(ctemp);
temp+=ctemp;
ctemp=gz;
UART1_Put_Char(ctemp);
temp+=ctemp;
if(hx<0)hx=32768-hx;
ctemp=hx>>8;
UART1_Put_Char(ctemp);
temp+=ctemp;
ctemp=hx;
UART1_Put_Char(ctemp);
temp+=ctemp;
if(hy<0)hy=32768-hy;
ctemp=hy>>8;
UART1_Put_Char(ctemp);
temp+=ctemp;
ctemp=hy;
UART1_Put_Char(ctemp);
temp+=ctemp;
if(hz<0)hz=32768-hz;
ctemp=hz>>8;
UART1_Put_Char(ctemp);
temp+=ctemp;
ctemp=hz;
UART1_Put_Char(ctemp);
temp+=ctemp;
UART1_Put_Char(temp%256);
UART1_Put_Char(0xaa);
} 看起来还不错。 关注,看后很激动。请问上位机是用什么实现的? 直接共享就完了,还报什么名啊 顶一下. 不知道楼主的上位机是用什么软件做的? 非常不错的东西 ghostxdy 发表于 2012-4-21 19:35 static/image/common/back.gif
关注,看后很激动。请问上位机是用什么实现的?
上位机是VB做的,用了iocomp的控件
lisn3188 发表于 2012-4-22 09:18 static/image/common/back.gif
上位机是VB做的,用了iocomp的控件
楼主好厉害 搞了几星期就弄出来了我搞了 两三个月了 总是断断续续的 现在有被中断了 ~~~还没搞出来 {:cry:} 海报上面有奶罩!!!{:lol:} 楼主不是一般牛啊。上位机串口偶也在学习中,不过用的是C++Builder. 唉,目前用加速度传感器,并没有做到0.1度的精度!
很想知道LZ用的是什么型号加速度传感器? 唉,目前用加速度传感器,并没有做到0.1度的精度!
很想知道LZ用的是什么型号加速度传感器? 本帖最后由 lisn3188 于 2012-4-22 21:44 编辑
electrlife 发表于 2012-4-22 20:56 static/image/common/back.gif
唉,目前用加速度传感器,并没有做到0.1度的精度!
很想知道LZ用的是什么型号加速度传感器? ...
MPU6050
特征
具有131 LSBs/°/sec 敏感度与全格感测范围为±250、±500、±1000与±2000°/sec 的3轴角速度感测器(陀螺仪)。
可程式控制,且程式控制范围为±2g、±4g、±8g和±16g的3轴加速器。
移除加速器与陀螺仪轴间敏感度,降低设定给予的影响与感测器的飘移。
数字运动处理(DMP: Digital Motion Processing)引擎可减少复杂的融合演算数据、感测器同步化、姿势感应等的负荷。
运动处理数据库支持Android、Linux与Windows
内建之运作时间偏差与磁力感测器校正演算技术,免除了客户须另外进行校正的需求。
以数位输出的温度传感器
以数位输入的同步引脚(Sync pin)支援视频电子影相稳定技术与GPS
可程式控制的中断(interrupt)支援姿势识别、摇摄、画面放大缩小、滚动、快速下降中断、high-G中断、零动作感应、触击感应、摇动感应功能。
VDD供电电压为2.5V±5%、3.0V±5%、3.3V±5%;VDDIO为1.8V± 5%
陀螺仪运作电流:5mA,陀螺仪待命电流:5µA;加速器运作电流:350µA,加速器省电模式电流: 20µA@10Hz
高达400kHz快速模式的I2C,或最高至20MHz的SPI串行主机接口(serial host interface)
内建频率产生器在所有温度范围(full temperature range)仅有±1%频率变化。
使用者亲自测试
10,000 g 碰撞容忍度 这个也太复杂了,呵呵!
俺用的ADXL345 ! Name_006 发表于 2012-4-22 20:10 static/image/common/back.gif
楼主好厉害 搞了几星期就弄出来了我搞了 两三个月了 总是断断续续的 现在有被中断了 ~~~还没搞出来 { ...
这两天在忙写说明书,晚点整理一下把3D显示那一部分的软件发上来,让大家用这个调试。下位机的协议代码在6楼。 Nice Job! 做得挺好。 lisn3188 发表于 2012-4-21 19:12 static/image/common/back.gif
这都让你看出来了,哈哈,房子是租的,平时焊接的时候我有甩锡的习惯,怕把人家房子搞脏了。
所以用超市 ...
你也爱甩锡?你喜欢横甩,我喜欢垂直甩。 做得很好啊 哇确实很不错IMU强大。
解姿态算法方面说个思路吧 楼主,请在百忙之中抽点时间,针对初学者对加速度计、陀螺仪、磁罗盘等传感器使用方法,编程思路、注意事项。搞个讲座,造福菜鸟。一枝独秀不是春,万紫千红春満园。谢谢! 这个nb啊,不得不顶 有点想买...= = 本帖最后由 htjgdw 于 2012-4-23 22:11 编辑
楼主厉害啊。
姿态结算处理的很不错,很稳。看来我也得加把劲儿了!呵呵 仰慕你的上位软件 上位软件蛮漂亮 mark study LZ高级{:victory:} 终于找到一个大BUG,影响速度的Bug.现在上位机可以发布了。
可能还有更多的问题。希望用这个软件的同志们能及时反馈。
服务器无法上传这么大的文件?才3M不到。
下面是通信协议:
兄弟你太好了,功德无量啊!{:hug:} {:handshake:}楼主好犀利啊,真好需要,谢谢啦 楼主犀利
向楼主学习 我也顶一下 只用一个,如:void UART1_ReportIMU(int16_t yaw,int16_t pitch,int16_t roll,int16_t alt,int16_t tempr,int16_t press)发送给上位机就可以吧? 强大的上位机 wisology 发表于 2012-4-27 10:02 static/image/common/back.gif
只用一个,如:void UART1_ReportIMU(int16_t yaw,int16_t pitch,int16_t roll,int16_t alt,int16_t tempr, ...
可以的。两个函数可以独立调用 上位机的确很强大,如果再结合一下机械模型就碉堡了,记得之前有人发过用c#做的四轴那个可以借鉴一下。 这个真要做个记号,以备学习 楼主不是一般的强悍!!我们公司也有自己写这软件。用于XBOX/PS3/WII手把中的GYRO的数据与原厂手把比对。 楼主牛B啊,几周时间久搞定了,我现在断断续续还在弄呢。上位机用MFC就写了两周多的时间,还没有完全ok。姿态这一块还是一大片的模糊啊。。。向楼主学习了 回楼上,两个帧是独立的,所以你的做法是可行的 谢谢楼主的分享.....{:smile:} 楼主牛得可以啊 强帖留名,我的四轴之路有宽了{:lol:} 楼主放快速地变姿态的视频出来看看效果如何 现在这个只能说静若处子 动如脱兔还差一半吧 楼主太好了,非常感谢!学习学习 大头显示器也掩盖不住楼主横溢的才华 无法解压怎么回事? 楼主你好,使用了你的上位机,很好很强大,万分感谢~~
这两天试了试书上写的旋转矢量求四元数,用的三字样优化算法,但是解算出的倾角误差很大,跟直接积分的感觉一样,如果单轴转动效果不错,三轴都有转动时转动后回到初始姿态误差有几十度,如果做圆锥运动误差就更明显,按照书上以及很多论文的说法这种算法效果应该不错,我不清楚问题出在哪里,这种算法的误差会有这么大么,程序用仿真一点点检查过了,不知道是我程序问题还是理解问题或者是算法问题,希望能得到帮助~
我用的6050,算法是从《惯性导航》上找的 kevinzcp 发表于 2012-4-21 18:59 static/image/common/back.gif
亮点是显示器左侧的彩页
兄弟,够眼力。{:titter:} 40342zz 发表于 2012-6-10 18:02 static/image/common/back.gif
楼主你好,使用了你的上位机,很好很强大,万分感谢~~
这两天试了试书上写的旋转矢量求四元数,用的三字样 ...
这个方法我没有试过。书上的东西和实际有些差别的。 喜欢3D效果,可是我用VC,不知道有谁会弄啊 楼主威武 来顶你下 lisn3188 发表于 2012-4-21 19:13 static/image/common/back.gif
/**************************实现函数********************************************
*函数原型: void UA ...
需要上位机~~~可否传一下~~~ nongxiaoming 发表于 2012-6-11 15:20 static/image/common/back.gif
需要上位机~~~可否传一下~~~
需要上位机可以 到 http://www.chiplab7.com/goods.php?id=9 这里去下载最新的。 看视频里面那个方块有时候和实物的姿态在角度上有点偏移嘛。 zhengxg1990 发表于 2012-6-11 17:03 static/image/common/back.gif
看视频里面那个方块有时候和实物的姿态在角度上有点偏移嘛。
有偏是因为,我的显示器不是朝北的,与正北有角度。也就是在指向显示器的时候会有一个偏角。 谢谢LZ的分享 LZ能不能知道知道姿态解算啊,最近一直在看这个{:lol:} lz 厉害谢谢上位机 lisn3188 发表于 2012-6-11 16:47 static/image/common/back.gif
需要上位机可以 到 http://www.chiplab7.com/goods.php?id=9 这里去下载最新的。
看看效果如何再评论 lisn3188 发表于 2012-6-11 16:47 static/image/common/back.gif
需要上位机可以 到 http://www.chiplab7.com/goods.php?id=9 这里去下载最新的。
有BUG,每秒10帧居然,一打开端口就报错 相当NB!i不顶不行! 不错……借鉴 lizhijieli 发表于 2012-6-29 11:59 static/image/common/back.gif
有BUG,每秒10帧居然,一打开端口就报错
你好,你出现的这们问题是由于操作系统缺少了一些部件引起的,具体的解决办法请参考:
http://www.pcmmc.com/runtime-error-91-object-variable-or-with-block-variable.php 东西不错 真心佩服楼主 请问楼主:有姿态结算,最后能不能输出控制四轴电机电调的控制信号啊 顶!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 这个论坛真的很强大 很好很强大,正好需要上位机和STM32的串口发送数据的源程序,谢谢了,楼主! lisn3188 发表于 2012-6-30 00:22 static/image/common/back.gif
你好,你出现的这们问题是由于操作系统缺少了一些部件引起的,具体的解决办法请参考:
http://www.pcmmc. ...
我测试发现该软件运行时很占资源,显示数据时一拖动软件就挂了,3D显示也比较卡 楼主神人,软件很给力,对大家应该帮助很大。
算法什么的能公开就更给力了!呵呵 lizhijieli 发表于 2012-7-3 09:15 static/image/common/back.gif
我测试发现该软件运行时很占资源,显示数据时一拖动软件就挂了,3D显示也比较卡 ...
是的,这个波形显示非常占资源最新版本的 修正了一些bug但是还是建议上传的帧率不要超过 20hz。
当然电脑的配置 也是会影响图形显示的 楼主厉害 看起来好高级哦 赞。。。{:lol:} 求背景音乐。。。 收藏一下//用得着的时候好找 学习中,{:smile:} 谢谢楼主的分享 厉害,厉害,感谢楼主分享。 不知道LZ的陀螺仪积分周期是多少,这软件,单片机向上位机发送频率一大就显示溢出,会很卡,姿态解算的反三角函数很耗时间,不知道LZ是怎么解决的,就算我5ms的积分周期,采集数据+四元数更新+欧拉角解耦+数据放送,远远超过5ms了而且上位机还卡,显示数据溢出,是不是上位机姿态解算来不及??想知道LZ咋解决的,望解答! 本帖最后由 lisn3188 于 2012-7-25 15:01 编辑
蓝海de梦 发表于 2012-7-25 09:45 static/image/common/back.gif
不知道LZ的陀螺仪积分周期是多少,这软件,单片机向上位机发送频率一大就显示溢出,会很卡,姿态解算的反三 ...
陀螺仪积分周期 不限定 约有2ms 500Hz 。
你可能搞错了上位机的作用。你下面解算多快与电脑端的软件无关,它只是一个显示波形的软件,就算上传的不是姿态数据它也一样会按格式把接收到的数据显示出来。
所以 放心地加速计算。在有空或者是定期地上传数据给上位机显示。 lisn3188 发表于 2012-7-25 14:59 static/image/common/back.gif
陀螺仪积分周期 不限定 约有2ms 500Hz 。
你可能搞错了上位机的作用。你下面解算多快与电脑端的软件无关 ...
你2MS就可以解算出欧拉角啦!好快的速度啊,对了,我如果不加延时,就是每周期发送,上位机就卡了,但是如果我发送完一帧数据后加5ms延时,那么就OK,我也奇怪的,之前传ADXL和HMC5883啥的不加延时一点问题没有,传姿态数据,就卡, mark . 发现各位高手的关注焦点各不同!{:lol:} 蓝海de梦 发表于 2012-7-25 16:09 static/image/common/back.gif
你2MS就可以解算出欧拉角啦!好快的速度啊,对了,我如果不加延时,就是每周期发送,上位机就卡了,但是 ...
每个周期都 发送,那当然卡了,像你5ms 那已经是 200Hz了
这个上位机的最高接收帧频率是 20Hz不建议上传超过这个速度的。
因为波形显示和绘图是需要时间的。 为什么这个模块程序里面发送的是“ab”(随便发的,作为测试),电脑串口显示的却是“O'”(大写O和单引号)呢???{:sad:}{:sad:}{:sad:} lxl_lw 发表于 2012-8-3 15:11 static/image/common/back.gif
为什么这个模块程序里面发送的是“ab”(随便发的,作为测试),电脑串口显示的却是“O'”(大写O和单引号)呢? ...
你可能需要了解什么是 ASCII什么是十六进制 上位机是源程序还是一个可执行文件? 牛人!谢谢上位机。 上位机相当猛啊{:biggrin:} lisn3188 发表于 2012-8-3 16:29
你可能需要了解什么是 ASCII什么是十六进制
问题解决,原来板子输出的是TTL电平,还要转换成RS232才能接上电脑。 Lz的mpu6050与HMC5883L之间的数据是通过辅助I2c传输的么?是的话能否指教一下{:biggrin:}