bno055 IMU 校准
bno055 IMU Calibration
我正在尝试从 IMU BNO055 中获取一些读数,下面是 ADA Fruit 的实现。
https://cdn-learn.adafruit.com/downloads/pdf/adafruit-bno055-absolute-orientation-sensor.pdf
我好像无法通过校准步骤。
BNO055 手册如下:
https://cdn-shop.adafruit.com/datasheets/BST_BNO055_DS000_12.pdf
我没有使用库,而是直接使用 I2C 进行通信并从设备寄存器读取和写入。
我做的配置如下:
// The opening of the device and so on, works, so the line below is not a problem.
if (ioctl(data_exchange->file_imu_sensor, I2C_SLAVE, data_exchange->imu_addr) < 0) {
printf("Impossible to communicate with the IMU in the i2c. Make sure that the address you have is correct!\n");
exit(1);
}
// Here is where I start with the configuration. First I reset the device.
//SYS_TRIGGER Register. ADD 3F
//CLK_SEL (0 internal oscillator) REST_INT(reset interrumptions)RST_SYS(1 to reset) x x x x Self_TEST(1 to make a self test.)
// 00xxxx0
buf[0] = 0x3F;
buf[1] = 0x20; //00100000
write_buf(data_exchange,buf,3);
printf("IMU WAS COMMANDED TO RESET");
sleep(1); //It needs some time to reset. With one sec should be sufficient.
// Here I start with the real configuration.
// G range 2G xxxxxx00
// BW 7.81Hz xxx000xx
// Op mod normal 000xxxxx
//So I will write a 0 to the register ACC_condfi
buf[0] = 0x0D;
buf[1] = 0x00;
write_buf(data_exchange,buf,3);
// Now unit selection.UNIT_SEL Page 30.
//Accelaration m/s2 xxxxxxx0b
// Magnetic field in micro Teslas (always)
// Angular rate defrees ps xxxxxx0xb
// Euler angles Degress> xxxxxxxb
// Quaternion in Quaernion units always.
//Temperatyre deg xxx0xxxxb
// NPI The data output format can be selected by writing to the UNIT_SEL register, this allows user to switch between the orientation definition described by Windows and Android operating systems
// Windows> 0xxxxxxxb
// Android> 1xxxxxxxb. Page 30.
// Bits 5 and 6 are reserved. So it does not matter. So we write a 0.
buf[0] = 0x03;
buf[1] = 0x00;
write_buf(data_exchange,buf,3);
//We now need to set the operation mode:
//Register OPR_MODE Page 21.
//Fusion mode NDOF. xxxx1100b
buf[0] = 0x1C;
buf[1] = 0x0C; //00001100
write_buf(data_exchange,buf,3);
// GYR_Config_0
buf[0] = 0x0B;
buf[1] = 0x00; //00001100
write_buf(data_exchange,buf,3);
// PWR_MODE. Normal mode is xxxxxx00b
buf[0] = 0x3E;
buf[1] = 0x00; //00000000
write_buf(data_exchange,buf,3);
现在,我应该等待对芯片进行内部校准。但它似乎并没有完成它。
我正在通过检查寄存器 0x35 来检查它,如果校准完成,它应该 >0。
char buf[10];
int status=0;
read_buf(dataset_pointer,0x35,3,buf);
status=buf[0];
if(status>0){
//Here is where I perform all the reading and so on.
}
我是不是在配置中遗漏了什么?我在互联网上查了一下,发现了一些关于用设备在空中制作一个 8 符号的建议(也根据 IMU 手册),我照做了,但是校准还没有完成。
我认为这不是电源问题(我在 Bosh 论坛上找到了一些相关参考资料),因为我将 VIN 连接到 5.0V,3VO 连接到 3.3V,GND 连接到 GND。
对此的任何评论都会有很大帮助。我配置设备错误吗?我缺少任何寄存器吗?
谢谢!
我跟进了 ADAFruit 网页中的讨论。
参见:
https://forums.adafruit.com/viewtopic.php?f=19&t=164389&p=808106#p808106
总而言之,方法是:
- 进入配置模式(OP_MODE(0x3D)设置为0x00)
- 我们选择 Register 映射 0。(PAGE_ID (0x37) 设置为 0x00 )
- 我们重置设备(SYS_TRIGGER (0x3F) 设置为 0x20)
- 电源模式到正常模式(POWER_MODE(0x3E)设置为0x00)
- 在 SYS_TRIGGER 中选取的内部时钟(SYS_TRIGGER (0x3F) 设置为 0x00)
- OP_MODE设置为NDOF(因为我想)(OP_MODE(0x3D)设置为0x0B)
可选,根据 Gammaburst ADA Fruit 论坛的建议:
- //AXIS_MAP_CONFIG 0x41 注册到 0x21.
- //AXIS_MAP_SIGN 0x42 注册到 0x02;
.
buf[0] = 0X3D; //OP_MODE;
buf[1] = 0x00; // Config mode
write_buf(data_exchange,buf,3);
buf[0] = 0x07; // BNO055_PAGE_ID_ADDR
buf[1] = 0x00; // We want to access the Register Map 0. See page 51 of the Manual https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bno055-ds000.pdf
write_buf(data_exchange,buf,3);
buf[0] = 0x3F; //(SYS_TRIGGER)
buf[1] = 0x20; //00100000 Reset!
write_buf(data_exchange,buf,3);
printf("IMU WAS COMMANDED TO RESET");
sleep(0.65); //It needs some time to reset. With one sec should be sufficient.
buf[0] = 0x3E; //(POWER_MODE)
buf[1] = 0x00; //00000000 Normal mode
write_buf(data_exchange,buf,3);
buf[0] = 0x3F; // SYS_TRIGGER
buf[1] = 0x00; //00000000 Iternal clock
write_buf(data_exchange,buf,3);
buf[0] = 0X3D; //OP_MODE;
buf[1] = 0x0B; //NDOF
write_buf(data_exchange,buf,3);
//These two are optional as per suggestion from gammaburst user in ADAFruit forums
//AXIS_MAP_CONFIG
buf[0] = 0x41;
buf[1] = 0x21;
write_buf(data_exchange,buf,3);
// AXIS_MAP_SIGN
buf[0] = 0x42;
buf[1] = 0x02;
write_buf(data_exchange,buf,3);
我正在尝试从 IMU BNO055 中获取一些读数,下面是 ADA Fruit 的实现。
https://cdn-learn.adafruit.com/downloads/pdf/adafruit-bno055-absolute-orientation-sensor.pdf
我好像无法通过校准步骤。
BNO055 手册如下: https://cdn-shop.adafruit.com/datasheets/BST_BNO055_DS000_12.pdf
我没有使用库,而是直接使用 I2C 进行通信并从设备寄存器读取和写入。
我做的配置如下:
// The opening of the device and so on, works, so the line below is not a problem.
if (ioctl(data_exchange->file_imu_sensor, I2C_SLAVE, data_exchange->imu_addr) < 0) {
printf("Impossible to communicate with the IMU in the i2c. Make sure that the address you have is correct!\n");
exit(1);
}
// Here is where I start with the configuration. First I reset the device.
//SYS_TRIGGER Register. ADD 3F
//CLK_SEL (0 internal oscillator) REST_INT(reset interrumptions)RST_SYS(1 to reset) x x x x Self_TEST(1 to make a self test.)
// 00xxxx0
buf[0] = 0x3F;
buf[1] = 0x20; //00100000
write_buf(data_exchange,buf,3);
printf("IMU WAS COMMANDED TO RESET");
sleep(1); //It needs some time to reset. With one sec should be sufficient.
// Here I start with the real configuration.
// G range 2G xxxxxx00
// BW 7.81Hz xxx000xx
// Op mod normal 000xxxxx
//So I will write a 0 to the register ACC_condfi
buf[0] = 0x0D;
buf[1] = 0x00;
write_buf(data_exchange,buf,3);
// Now unit selection.UNIT_SEL Page 30.
//Accelaration m/s2 xxxxxxx0b
// Magnetic field in micro Teslas (always)
// Angular rate defrees ps xxxxxx0xb
// Euler angles Degress> xxxxxxxb
// Quaternion in Quaernion units always.
//Temperatyre deg xxx0xxxxb
// NPI The data output format can be selected by writing to the UNIT_SEL register, this allows user to switch between the orientation definition described by Windows and Android operating systems
// Windows> 0xxxxxxxb
// Android> 1xxxxxxxb. Page 30.
// Bits 5 and 6 are reserved. So it does not matter. So we write a 0.
buf[0] = 0x03;
buf[1] = 0x00;
write_buf(data_exchange,buf,3);
//We now need to set the operation mode:
//Register OPR_MODE Page 21.
//Fusion mode NDOF. xxxx1100b
buf[0] = 0x1C;
buf[1] = 0x0C; //00001100
write_buf(data_exchange,buf,3);
// GYR_Config_0
buf[0] = 0x0B;
buf[1] = 0x00; //00001100
write_buf(data_exchange,buf,3);
// PWR_MODE. Normal mode is xxxxxx00b
buf[0] = 0x3E;
buf[1] = 0x00; //00000000
write_buf(data_exchange,buf,3);
现在,我应该等待对芯片进行内部校准。但它似乎并没有完成它。
我正在通过检查寄存器 0x35 来检查它,如果校准完成,它应该 >0。
char buf[10];
int status=0;
read_buf(dataset_pointer,0x35,3,buf);
status=buf[0];
if(status>0){
//Here is where I perform all the reading and so on.
}
我是不是在配置中遗漏了什么?我在互联网上查了一下,发现了一些关于用设备在空中制作一个 8 符号的建议(也根据 IMU 手册),我照做了,但是校准还没有完成。
我认为这不是电源问题(我在 Bosh 论坛上找到了一些相关参考资料),因为我将 VIN 连接到 5.0V,3VO 连接到 3.3V,GND 连接到 GND。
对此的任何评论都会有很大帮助。我配置设备错误吗?我缺少任何寄存器吗?
谢谢!
我跟进了 ADAFruit 网页中的讨论。
参见:
https://forums.adafruit.com/viewtopic.php?f=19&t=164389&p=808106#p808106
总而言之,方法是:
- 进入配置模式(OP_MODE(0x3D)设置为0x00)
- 我们选择 Register 映射 0。(PAGE_ID (0x37) 设置为 0x00 )
- 我们重置设备(SYS_TRIGGER (0x3F) 设置为 0x20)
- 电源模式到正常模式(POWER_MODE(0x3E)设置为0x00)
- 在 SYS_TRIGGER 中选取的内部时钟(SYS_TRIGGER (0x3F) 设置为 0x00)
- OP_MODE设置为NDOF(因为我想)(OP_MODE(0x3D)设置为0x0B)
可选,根据 Gammaburst ADA Fruit 论坛的建议:
- //AXIS_MAP_CONFIG 0x41 注册到 0x21.
- //AXIS_MAP_SIGN 0x42 注册到 0x02;
.
buf[0] = 0X3D; //OP_MODE;
buf[1] = 0x00; // Config mode
write_buf(data_exchange,buf,3);
buf[0] = 0x07; // BNO055_PAGE_ID_ADDR
buf[1] = 0x00; // We want to access the Register Map 0. See page 51 of the Manual https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bno055-ds000.pdf
write_buf(data_exchange,buf,3);
buf[0] = 0x3F; //(SYS_TRIGGER)
buf[1] = 0x20; //00100000 Reset!
write_buf(data_exchange,buf,3);
printf("IMU WAS COMMANDED TO RESET");
sleep(0.65); //It needs some time to reset. With one sec should be sufficient.
buf[0] = 0x3E; //(POWER_MODE)
buf[1] = 0x00; //00000000 Normal mode
write_buf(data_exchange,buf,3);
buf[0] = 0x3F; // SYS_TRIGGER
buf[1] = 0x00; //00000000 Iternal clock
write_buf(data_exchange,buf,3);
buf[0] = 0X3D; //OP_MODE;
buf[1] = 0x0B; //NDOF
write_buf(data_exchange,buf,3);
//These two are optional as per suggestion from gammaburst user in ADAFruit forums
//AXIS_MAP_CONFIG
buf[0] = 0x41;
buf[1] = 0x21;
write_buf(data_exchange,buf,3);
// AXIS_MAP_SIGN
buf[0] = 0x42;
buf[1] = 0x02;
write_buf(data_exchange,buf,3);