- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
四轴姿态解算分析
又花了将近一个星期,终于把姿态解算的框架完成了。仅仅是把陀螺仪、加速度计、罗盘融合在一起,得出旋转姿态,没有对加速度积分,没有用到气压计,几乎没有滤波。算是阶段性的工作吧,把框架设计得合理一点,以后添加/修改就很简单了。从传感器的读取,到四元数的学习,到空间旋转的处理方法,循序渐进,逐个击破。主要参考了以下资料(按阅读的时间循序):《计算机图形学几何工具算法详解》(四元数转矩阵的公式是错的!)《交互式计算机图形学——基于OpenGL的自顶向下方法》维基百科——四元数框框的日记——四元数青衫湮痕——四元数Heaths blog——四元数与欧拉角之间的转换阿莫电子论坛——【原创】姿态估计下面总结一下“姿态解算”的过程,分为“传感器”、“四元数与旋转”、“姿态解算框架”、“长期融合”、“快速融合”四部分。1.传感器我用的是10轴姿态传感器模块,其中陀螺仪是L3G4200D,加速度计是ADXL345,罗盘是HMC5883L,气压计是BMP085。全部都通过一条共用的I2C总线访问,速度都支持400kHz。先讲讲I2C库。要配置、读取传感器,首先把通信做好,这里就是I2C库了。现在大部分单片机都有支持中断的硬件I2C了,可以写个高效的I2C库。我只实现了主机发送和主机接收模式,这里简单介绍一下接口。接口函数主要有2个:uint8_t I2C_transmit???????????(uint8_t which,I2C_transmitCallback cb);void I2C_setNextCallback???????(uint8_t which,I2C_transmitCallback cb);I2C_transmit()用于触发一次传输(发送或接收),异步执行,调用后马上返回。其中有一个I2C_transmitCallback类型的参数,就是决定发送或接收、如何处理数据的回调函数了,其定义如下:/*?数据传输回调函数。?* 每(准备)传输一个字节都调用一次。?* 参数:?*??????seq??= 序号,第一次调用时为0,以后每次调用递增。?*??????data = seq==0时写(从机地址+W/R)到data。?*??????????????seq!=0时data是数据。发送就写data,接收就读data。?* 返回值表示下一步的行为:?*???I2C_RT_START = 发送开始信号。?*???I2C_RT_STOP??= 发送停止信号。?*???I2C_RT_REPEAT_START_OR_STOP = 如果有下一次传输,就发送RepeatStart,否则发送Stop。?*???I2C_RT_ACK???= 继续传送,回应ACK。?*???I2C_RT_NACK??= 继续传送,回应NACK。??*/typedef uint8_t (* I2C_transmitCallback)(uint8_t seq,uint8_t * data);当用I2C_transmit()成功触发一次传输后,I2C库会根据需要调用回调函数,所以使用这个I2C库就是写回调函数了。而I2C_setNextCallback()则是用来设置紧接着的一次传输的。当本次传输结束时,不发送“Stop”信号,而是发送“Repeat Start”信号,然后开始下一个传输。利用这个函数可以发起连续多次传输。有了I2C库就可以操作传感器了,以L3G4200D为例讲解。先看看DataSheet,操作L3G4200D有两个步骤,首先配置好寄存器,然后不断获取数据。配置寄存器比较简单,就是发送一段数据,用到两个函数:/*??* 初始化芯片。?* 返回值: {L3G4200D_RT_NORMAL,L3G4200D_RT_BUS_BUSY} */uint8_t l3g4200d_init(void){????if(I2C_transmit(L3G4200D_WHICH_I2C,l3g4200d_init_callback) == I2C_RT_TRANSMIT_NORMAL)????????return L3G4200D_RT_NORMAL;????return L3G4200D_RT_BUS_BUSY;}/*?* 初始化使用的I2C回调函数。 */uint8_t l3g4200d_init_callback(uint8_t seq,uint8_t * data){????const static uint8_t value[] = {????????I2C_addressToByte_write(L3G4200D_ADDRESS),?/* 总线地址。 */????????(0x80 | 0x20),?/* 寄存器地址。或0x80表示连续写。*/????????0xEF,?
文档评论(0)