1-应用领域:
游戏交互、3D模型控制、机器人、设备姿态检测、翻转状态检测、无人机、无人船、无人车、VR/AR、AHRS、姿态算法研究与分析,短距无效姿态测量、车辆调平系统,机器震动检测
2-产品硬件规格:
尺寸:
蓝牙:5.0
电池:默认150ma,可自行更换为大容量电池
充电电流:600ma
通信方式:蓝牙5.0/type-c串口 波特率115200
数据刷新频率:100HZ
特性:
三轴(加速度、陀螺仪、地磁、欧拉角)
蓝牙5.0 带电池充电管理、100HZ输出
购买地址:
https://item.taobao.com/item.htm?spm=a21xtw.29178619/evo565760b742010.product_shelf.1.55968e698CVB3i&id=819389123995
3-软件协议设计:
传感器每秒通过串口和蓝牙同时输出100个32字节的数据包,数据帧格式如下:
0x88+0xAF+0x1C+ACC DATA+GYRO DATA+MAG DATA+ANGLE DATA+ 0x00 0x00 + 0x00 0x00+SUM,共32字节,ACC/GYRO/MAG/ANGLE(roll/pitch/yaw)数据为int16格式,其
中ANGLE的roll和pitch数据为实际值乘以100以后得到的整数值,yaw为乘以10以后得到的整数值,
上位机在显示时再 除以100和10
以下是例子
88af 帧头
1c 长度LEN为DATA的长度(不包括0x88、0xAF、LEN、CRC)
01e6 ACC DATA -X
ff09 ACC DATA -Y
0f8f ACC DATA -Z
0144 GYRO DATA-X
0028 GYRO DATA-Y
0046 GYRO DATA-Z
0084 MAG DATA -X
03e9 MAG DATA -Y
fa66 MAG DATA -Z
01c8 roll
0287 pitch
03e2 yaw
00000000
9a CRC CRC是0x88一直到DATA最后一字节的和,uint8格式
以下是java解析代码(其他语言类似):
short acc_data_x = (short) ((dataBuff[3]&0xFF)<<8 |dataBuff[4]&0xFF);
short acc_data_y = (short) ((dataBuff[5]&0xFF)<<8 |dataBuff[6]&0xFF);
short acc_data_z = (short) ((dataBuff[7]&0xFF)<<8 |dataBuff[8]&0xFF);
short gyro_data_x = (short) ((dataBuff[9]&0xFF)<<8 |dataBuff[10]&0xFF);
short gyro_data_y = (short) ((dataBuff[11]&0xFF)<<8 |dataBuff[12]&0xFF);
short gyro_data_z = (short) ((dataBuff[13]&0xFF)<<8 |dataBuff[14]&0xFF);
short mag_data_x = (short) ((dataBuff[15]&0xFF)<<8 |dataBuff[16]&0xFF);
short mag_data_y = (short) ((dataBuff[17]&0xFF)<<8 |dataBuff[18]&0xFF);
short mag_data_z = (short) ((dataBuff[19]&0xFF)<<8 |dataBuff[20]&0xFF);
short roll = (short) ((value[21]&0xFF)<<8 |value[22]&0xFF);
short pitch = (short) ((value[23]&0xFF) <<8|value[24]&0xFF);
short yaw = (short)((value[25]&0xFF) <<8|value[26]&0xFF);
Log.i(TAG, "data1:"+roll +" " +pitch+" "+yaw);
float roll_f = (float) (roll/100.0);
float pitch_f = (float) (pitch/100.0);
float yaw_f = (float) (yaw/10.0);
String txtData = "roll:"+roll_f +"\r\n"+"pitch:"+pitch_f+"\r\n"+"yaw:"+yaw_f;
imuDataTxtView.setText(txtData);
String txtOrigData = "acc_x:"+acc_data_x+" acc_y:"+acc_data_y+" acc_z:"+acc_data_z+"\n";
txtOrigData += "gyro_x:"+gyro_data_x+" gyro_y:"+gyro_data_y+" gyro_z:"+gyro_data_z+"\n";
txtOrigData += "mag_x:"+mag_data_x+" mag_y:"+mag_data_y+" mag_z:"+mag_data_z;
imuOrignDataTxtView.setText(txtOrigData);
Android DEMO --中数据显示如下图: (可能部分手机无法运行,需要自行编译修改适配)
4-传感器坐标系统:
将传感器水平放置于桌面,则:
Z轴向上, X 轴向前,Y轴向右
Roll 对应沿 X 轴旋转 顺时针 -》 0 ->180度 增加 ,逆时针 减小
Pitch 对应沿Y轴旋转 后仰:0->90 增加(正值) 前倾:0 -》-90度 减小
Yaw 对应沿 Z轴旋转 水平 顺时针增加 逆时针减小 绝对0度在 北极方向。
注:如果要控制的模型坐标系统和设备不一致,需要进行对模型的坐标系统进行修改或者添加变换逻辑。
- 配置协议说明:
固定长度12字节
帧头-1 Byte | 功能码-1 Byte | 参数 | CRC |
0x89 | 参考功能表 | 基于功能参数不同 | 校验(帧头+功能码+参数的累加和的最后一个字节) |
功能表
0x01 | 工作模式 | 0 主动上传 1 Modbus被动查询 3 校准模式 |
例:
设置工作模式为 0x01
0x89 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
备注(以下仅为搜集到的资料,仅供分析和研究):
校准方法参考以下连接:https://blog.csdn.net/slowdownbabe/article/details/124657041
一、校准加速度计
加速度计有零偏和尺度误差。还有其他误差,这里只讨论这两种误差。
六面校准法:目的是让输出的数据在9.8mss左右(可以将Xmax = 9.44, Xmin = -10.24代进去感受一下)
公式:以X轴为例
依次按照如下放置:
操作:六个面朝上的时候,可以获取每个轴的最大值和最小值。首先,如下图,此面朝上,加速度计的Z轴是9.44。此面朝下,测量的值是-10.24.这样Z轴的最大值和最小值就计算出来了。同理可以获取X,Y轴的最大值最小值(可多测量几次求平均)。如下表:
X | Y | Z | |
最大值 | |||
最小值 |
二、校准陀螺仪
陀螺仪的校准只校正零偏误差。其操作是:在上电后,水平静止一段时间,获取陀螺仪N组数据,然后求平均值,该平均值作为初始零偏,最终校准的结果是陀螺仪原始测量值减去初始零偏。
初始零偏 = N组陀螺仪数据的和 / N
陀螺仪校准值 = 陀螺仪测量值 - 初始零偏
三、 磁罗盘的校准
磁罗盘的校准使用椭球拟合的方式进行校准。
理论上,如果将磁力计绕一个点,做各个方向的旋转,绘制出来的三维图像是一个圆的球面,然而,因为磁力计容易受周遭环境的影响,实际绘制出来的三维图像是一个椭球面,且球心不在[0,0,0]。而椭球拟合就可以解决球心不在[0,0,0],三维图像不是一个椭球面。
具体算法原理可以参考以下博主的文章:
IMU加速度、磁力计校正--椭球拟合_加速度计椭球拟合-CSDN博客
磁力计校准方法比较复杂,具体请参考以下文章
- https://blog.csdn.net/qq_39512995/article/details/88750653?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-88750653-blog-124657041.235%5Ev39%5Epc_relevant_anti_t3&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-88750653-blog-124657041.235%5Ev39%5Epc_relevant_anti_t3&utm_relevant_index=1
- 陀螺仪加速度计磁罗盘的校准_磁罗盘标定-CSDN博客
3.https://blog.csdn.net/wuwuku123/article/details/105540349/