|
UWB定位结合运动传感器IMU可以实现更为精准的定位功能,在之前的一个帖子我们记录了当时imu 工程的开发历程。
参见之前的帖子:http://51uwb.cn/forum.php?mod=viewthread&tid=410&extra=page%3D1
本帖主要是分享最新源代码。相对于之前的工程,这里的代码imu 支持STM32F1 BP30/BP50 两款模块做参考基站,降低学习成本。
工程代码上,属于我们我们第三代固件架构,使用STM32Cube 初始化硬件,底层驱动大部分实现共用,易于二次移植开发。
源码路径:https://gitee.com/bpuwb/bpuwb_imu.git
代码工程截图:
目录结构说明:
BP-UWB_LIB -- > 公共底层驱动
STM32F1_UWB -- > STM32F1 Cube 工程,基站硬件初始化
STM32F4_UWB_PA --> STM32F4 Cube 工程,IMU 标签硬件初始化
Trilateration_PyDQ5 --> 基于Python 的UWB上位机源码
测试HEX --> 已经编译好的HEX
twr_51uwb.exe --> 已经编译好的上位机
编译说明:
由于我们采用的标签和基站硬件不一样,需要再两个工程中分别编译基站和标签。
打开工程后,通过bphero_uwb.h 文件对设备类型(标签或者基站)以及设备短地址等信息进行配置。
基站编译
基站使用的是STM32F1,Cube工程目录为STM32F1_UWB 。
如下图所示,基站编译,需要首先确保#define RX_NODE 是“打开的”,每个基站分配一个短地址(SHORT_ADDR),4个基站可以分配0x0001到0x0004
标签编译
标签使用的是STM32F4 IMU,Cube工程目录为STM32F4_UWB_PA
如下图所示,标签编译,首先需要确保#define TX_NODE 是“打开”的,由于IMU 模块没有液晶,所以 #define LCD_ENABLE需要注释掉,
最重要一点,模块有IMU模块,通过#define IMU_ENABLE 使能IMU功能。 短地址保持默认不需要更改。
硬件购买
这个帖子中的代码 基站可以采用BP30或者BP50,标签必须是F4_PA 标签。
以最高性价比组合,4个BP30基站+F4_PA模块
BP30 基站:https://item.taobao.com/item.htm?ft=t&id=650965811316
F4_PA模块:https://item.taobao.com/item.htm?ft=t&id=617598108897
IMU数据测试
默认我们使用了运动检测(motion detection)功能,只有1bit数据,标识模块是否有移位改变。 在调试的时候,可以将九轴数据全部打印出来。 代码修改如下(注意,需要将Enable_MPU9250_MovetionDetection 注释掉)
- void Mpu9250_Test(void)
- {
- Sw_I2C_Init();
- MPU9250_Init(&mpu9250, MPU9250_Device_0, ACCEL_SCALE_16G, GYRO_SCALE_2000dps, MAG_SCALE_16bit);
- //Enable_MPU9250_MovetionDetection(&mpu9250);
- while (1)
- {
- MPU9250_ReadAcc(&mpu9250);
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, !GPIO_PIN_SET); //PB7 = 1 LED_ON
-
- printf("acc.x = %0.2f acc.y = %0.2f acc.z= %0.2f\n",mpu9250.acc[0],mpu9250.acc[1],mpu9250.acc[2]);
- MPU9250_ReadGyro(&mpu9250);
- HAL_Delay(300);
- printf("gyro.x = %0.2f gyro.y = %0.2f gyro.z= %0.2f\n",mpu9250.gyro[0],mpu9250.gyro[1],mpu9250.gyro[2]);
- MPU9250_ReadMag(&mpu9250);
- printf("mag.x = %0.2f mag.y = %0.2f mag.z = %0.2f\n",mpu9250.mag[0],mpu9250.mag[1],mpu9250.mag[2]);
- MPU9250_ReadTemperature(&mpu9250);
- printf("Temp = %0.2f\n",mpu9250.temp);
- HAL_Delay(1000);
- }
- }
复制代码
串口log 打印如下:
- acc.x = 0.01 acc.y = -0.27 acc.z= 0.95
- gyro.x = -10.67 gyro.y = 0.37 gyro.z= 2.01
- mag.x = 28.27 mag.y = 13.61 mag.z = 7.10
- Temp = 41.36
- acc.x = -0.14 acc.y = -0.01 acc.z= 0.96
- gyro.x = 12.87 gyro.y = 4.21 gyro.z= -43.35
- mag.x = 16.76 mag.y = 20.48 mag.z = 9.08
- Temp = 41.31
- acc.x = -0.18 acc.y = 0.04 acc.z= 0.97
- gyro.x = 1.59 gyro.y = -0.43 gyro.z= -22.87
- mag.x = 15.01 mag.y = 21.99 mag.z = 8.73
- Temp = 41.31
复制代码
|
|