YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
imuBosch_BNO055.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-License-Identifier: LGPL-2.1-or-later
4 */
5
6#ifndef BOSCH_IMU_DEVICE
7#define BOSCH_IMU_DEVICE
8
9#include <atomic>
10#include <yarp/sig/Vector.h>
12#include <yarp/dev/PolyDriver.h>
18#include <mutex>
19
21
22/* Serial protocol description
23 *
24 * Write operation on a register:
25 * | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | ... | Byte (n+4) |
26 * | Start | Write | Reg Addr| Length | Data 1 | ... | Data n |
27 * | 0xAA | 0x00 | <...> | <...> | <...> | ... | <...> |
28 *
29 * Response to write command:
30 * | 0xEE | <code> |
31 * 0x01: Write_success
32 * all other values are errors ... TODO: improve doc
33 *
34 * Read operation on a register:
35 * | Byte 1 | Byte 2 | Byte 3 | Byte 4 |
36 * | Start | Read | Reg Addr| Length |
37 * | 0xAA | 0x01 | <...> | <...> |
38 *
39 * Response to a successful read command:
40 * | Byte 1 | Byte 2 | Byte 3 | ... | Byte (n+2) |
41 * | Resp | Length | Data 1 | ... | Data n |
42 * | 0xBB | <...> | <...> | ... | <...> |
43 *
44 * Response to a failed read command:
45 * | Byte 1 | Byte 2 |
46 * | Resp | Status |
47 * | 0xEE | <...> |
48 *
49 * Read error code: TODO
50 */
51
52constexpr int MAX_MSG_LENGTH = 128;
53
54// Commands
55#define START_BYTE 0xAA
56#define WRITE_CMD 0x00
57#define READ_CMD 0x01
58
59// Responses
60#define REPLY_HEAD 0xBB
61#define ERROR_HEAD 0xEE
62#define WRITE_SUCC 0x01
63#define READ_FAIL 0x02
64#define WRITE_FAIL 0x03
65
66// Error code
67#define REGISTER_NOT_READY 0x07
68
69// Registers
70// Page 0 // Device has 2 pages of registers
71#define REG_CHIP_ID 0x00
72#define REG_SW_VERSION 0x04 // 2 software revision bytes
73#define REG_BOOTLOADER 0x06 // 1 byte bootloader version
74#define REG_PAGE_ID 0x07 // page ID number
75
76#define REG_ACC_DATA 0x08 // 3*2 bytes: LSB first (LSB 0x08, MSB 0x09) for X
77#define REG_MAGN_DATA 0x0E // 3*2 bytes: LSB first
78#define REG_GYRO_DATA 0x14 // 3*2 bytes: LSB first
79#define REG_RPY_DATA 0x1A // 3*2 bytes: LSB first (raw order is Yaw, Roll, Pitch)
80#define REG_QUATERN_DATA 0x20 // 4*2 bytes: LSB first (raw order is w, x, y, z)
81#define REG_GRAVITY 0x2E // Gravity Vector data
82#define REG_CALIB_STATUS 0x35 // Check if sensors are calibrated, 2 bits each. SYS - GYRO - ACC - MAG. 3 means calibrated, 0 not calbrated
83#define REG_SYS_CLK_STATUS 0x38 // only 1 last LSB
84#define REG_SYS_STATUS 0x39
85#define REG_SYS_ERR 0x3A
86#define REG_UNIT_SEL 0x3B
87#define REG_OP_MODE 0x3D
88#define REG_POWER_MODE 0x3E
89#define REG_SYS_TRIGGER 0x3F
90
91// Values
92#define CONFIG_MODE 0x00
93#define AMG_MODE 0x07
94#define IMU_MODE 0x08
95#define M4G_MODE 0x0A
96#define NDOF_MODE 0x0C
97
98// Sys trigger values (in OR if more than one is to be activated)
99#define TRIG_EXT_CLK_SEL 0x80 // 1 for external clock (if available), 0 for internal clock
100#define TRIG_RESET_INT 0x40 // reset interrupts
101#define TRIG_RESET_SYSTEM 0x20 // reset system
102#define TRIG_SELF_TEST 0x01 // Start self test
103
104#define BNO055_ID 0xA0
105
106#define RESP_HEADER_SIZE 2
107// Time to wait while switching to and from config_mode & any operation_mode
108#define SWITCHING_TIME 0.020 // 20ms
109#define TIME_REPORT_INTERVAL 30
110//number of attempts of sending config command
111#define ATTEMPTS_NUM_OF_SEND_CONFIG_CMD 3
112
113
114
136{
137protected:
138 bool verbose;
139 short status;
145 double m_timeStamp;
147 mutable std::mutex mutex;
148 bool m_i2c_flag=false;
149
151
152 int fd;
155
156 using ReadFuncPtr = bool (BoschIMU::*)(unsigned char, int, unsigned char*, std::string);
158
159 unsigned char command[MAX_MSG_LENGTH];
160 unsigned char response[MAX_MSG_LENGTH];
161
162
163 bool checkWriteResponse(unsigned char *response);
164 bool checkReadResponse(unsigned char *response);
165
166 void printBuffer(unsigned char *buffer, int length);
167 int readBytes(unsigned char *buffer, int bytes);
168 void dropGarbage();
169
173
174 void readSysError();
175 // Serial
176 bool sendReadCommandSer(unsigned char register_add, int len, unsigned char* buf, std::string comment = "");
177 bool sendWriteCommandSer(unsigned char register_add, int len, unsigned char* cmd, std::string comment = "");
178 bool sendAndVerifyCommandSer(unsigned char register_add, int len, unsigned char* cmd, std::string comment);
179
180 // i2c
181 bool sendReadCommandI2c(unsigned char register_add, int len, unsigned char* buf, std::string comment = "");
182
183 int errs;
184 std::atomic<bool> dataIsValid;
185
186public:
187 BoschIMU();
188
190
196 bool open(yarp::os::Searchable& config) override;
197
202 bool close() override;
203
209 bool read(yarp::sig::Vector &out) override;
210
216 bool getChannels(int *nc) override;
217
224 bool calibrate(int ch, double v) override;
225
226 /* IThreeAxisGyroscopes methods */
231 size_t getNrOfThreeAxisGyroscopes() const override;
232
238 yarp::dev::MAS_status getThreeAxisGyroscopeStatus(size_t sens_index) const override;
239
246 bool getThreeAxisGyroscopeName(size_t sens_index, std::string &name) const override;
247
254 bool getThreeAxisGyroscopeFrameName(size_t sens_index, std::string &frameName) const override;
255
263 bool getThreeAxisGyroscopeMeasure(size_t sens_index, yarp::sig::Vector& out, double& timestamp) const override;
264
265 /* IThreeAxisLinearAccelerometers methods */
270 size_t getNrOfThreeAxisLinearAccelerometers() const override;
271
277 yarp::dev::MAS_status getThreeAxisLinearAccelerometerStatus(size_t sens_index) const override;
278
285 bool getThreeAxisLinearAccelerometerName(size_t sens_index, std::string &name) const override;
286
293 bool getThreeAxisLinearAccelerometerFrameName(size_t sens_index, std::string &frameName) const override;
294
302 bool getThreeAxisLinearAccelerometerMeasure(size_t sens_index, yarp::sig::Vector& out, double& timestamp) const override;
303
304 /* IThreeAxisMagnetometers methods */
309 size_t getNrOfThreeAxisMagnetometers() const override;
310
316 yarp::dev::MAS_status getThreeAxisMagnetometerStatus(size_t sens_index) const override;
317
324 bool getThreeAxisMagnetometerName(size_t sens_index, std::string &name) const override;
325
332 bool getThreeAxisMagnetometerFrameName(size_t sens_index, std::string &frameName) const override;
333
341 bool getThreeAxisMagnetometerMeasure(size_t sens_index, yarp::sig::Vector& out, double& timestamp) const override;
342
343 /* IOrientationSensors methods */
348 size_t getNrOfOrientationSensors() const override;
349
355 yarp::dev::MAS_status getOrientationSensorStatus(size_t sens_index) const override;
356
363 bool getOrientationSensorName(size_t sens_index, std::string &name) const override;
364
371 bool getOrientationSensorFrameName(size_t sens_index, std::string &frameName) const override;
372
380 bool getOrientationSensorMeasureAsRollPitchYaw(size_t sens_index, yarp::sig::Vector& rpy, double& timestamp) const override;
381
386 bool threadInit() override;
387
388
392 void threadRelease() override;
393
397 void run() override;
398
399private:
400 yarp::dev::MAS_status genericGetStatus(size_t sens_index) const;
401 bool genericGetSensorName(size_t sens_index, std::string &name) const;
402 bool genericGetFrameName(size_t sens_index, std::string &frameName) const;
403
404};
405
406
407#endif // BOSCH_IMU_DEVICE
contains the definition of a Vector type
This class is the parameters parser for class BoschIMU.
imuBosch_BNO055: This device will connect to the proper analogServer and read the data broadcasted ma...
void threadRelease() override
Terminate communication with the device and release the thread.
yarp::sig::Vector errorReading
unsigned char command[MAX_MSG_LENGTH]
packet to be written to the device
bool getThreeAxisGyroscopeMeasure(size_t sens_index, yarp::sig::Vector &out, double &timestamp) const override
Get three axis gyroscope measurements.
bool sendReadCommandSer(unsigned char register_add, int len, unsigned char *buf, std::string comment="")
std::atomic< bool > dataIsValid
std::mutex mutex
mutex to avoid resource clash
short status
device status - UNUSED
size_t responseOffset
bool checkReadResponse(unsigned char *response)
ReadFuncPtr readFunc
Functor object.
yarp::math::Quaternion quaternion_tmp
orientation in quaternion representation
size_t getNrOfThreeAxisMagnetometers() const override
Get the number of three axis magnetometers in the device.
void printBuffer(unsigned char *buffer, int length)
bool checkError
flag to check read error of sensor data
yarp::sig::Vector data
sensor data buffer
yarp::os::ResourceFinder rf
resource finder object to load config parameters
bool getChannels(int *nc) override
Get the number of channels of the sensor.
bool sendReadCommandI2c(unsigned char register_add, int len, unsigned char *buf, std::string comment="")
bool getThreeAxisLinearAccelerometerFrameName(size_t sens_index, std::string &frameName) const override
Get the name of the frame in which three axis linear accelerometer measurements are expressed.
bool getThreeAxisGyroscopeFrameName(size_t sens_index, std::string &frameName) const override
Get the name of the frame in which three axis gyroscope measurements are expressed.
bool close() override
Close the device.
double m_timeStamp
device timestamp
unsigned char response[MAX_MSG_LENGTH]
packet to be read from the device
bool getOrientationSensorFrameName(size_t sens_index, std::string &frameName) const override
Get the name of the frame in which orientation sensor measurements are expressed.
bool threadInit() override
Initialize process with desired device configurations.
long int totMessagesRead
bool verbose
Flag to get verbose output.
bool sendAndVerifyCommandSer(unsigned char register_add, int len, unsigned char *cmd, std::string comment)
bool getThreeAxisGyroscopeName(size_t sens_index, std::string &name) const override
Get the name of three axis gyroscope.
bool getOrientationSensorMeasureAsRollPitchYaw(size_t sens_index, yarp::sig::Vector &rpy, double &timestamp) const override
Get orientation sensor measurements.
bool checkWriteResponse(unsigned char *response)
bool calibrate(int ch, double v) override
Calibrate the sensor, single channel.
yarp::sig::Vector errorCounter
bool getThreeAxisMagnetometerFrameName(size_t sens_index, std::string &frameName) const override
Get the name of the frame in which three axis magnetometer measurements are expressed.
yarp::dev::MAS_status getOrientationSensorStatus(size_t sens_index) const override
Get the status of orientation sensor.
bool getThreeAxisLinearAccelerometerName(size_t sens_index, std::string &name) const override
Get the name of three axis linear accelerometer.
bool read(yarp::sig::Vector &out) override
Read a vector from the sensor.
bool getOrientationSensorName(size_t sens_index, std::string &name) const override
Get the name of orientation sensor.
void readSysError()
yarp::dev::MAS_status getThreeAxisGyroscopeStatus(size_t sens_index) const override
Get the status of three axis gyroscope.
bool getThreeAxisMagnetometerName(size_t sens_index, std::string &name) const override
Get the name of three axis magnetometer.
yarp::math::Quaternion quaternion
orientation in quaternion representation
bool sendWriteCommandSer(unsigned char register_add, int len, unsigned char *cmd, std::string comment="")
yarp::dev::MAS_status getThreeAxisMagnetometerStatus(size_t sens_index) const override
Get the status of three axis magnetometer.
double timeLastReport
timestamp of last reported data
int readBytes(unsigned char *buffer, int bytes)
size_t getNrOfThreeAxisGyroscopes() const override
Get the number of three axis gyroscopes in the device.
int fd
file descriptor to open device at system level
size_t getNrOfThreeAxisLinearAccelerometers() const override
Get the number of three axis linear accelerometers in the device.
bool m_i2c_flag
flag to check if device connected through i2c commununication
bool open(yarp::os::Searchable &config) override
Open the device and set up parameters/communication.
yarp::sig::Vector data_tmp
sensor data temporary buffer
size_t getNrOfOrientationSensors() const override
Get the number of orientation sensors in the device.
bool getThreeAxisLinearAccelerometerMeasure(size_t sens_index, yarp::sig::Vector &out, double &timestamp) const override
Get three axis linear accelerometer measurements.
yarp::sig::Vector RPY_angle
orientation in Euler angle representation
bool(BoschIMU::*)(unsigned char, int, unsigned char *, std::string) ReadFuncPtr
Functor to choose between i2c or serial comm.
yarp::dev::MAS_status getThreeAxisLinearAccelerometerStatus(size_t sens_index) const override
Get the status of three axis linear accelerometer.
bool getThreeAxisMagnetometerMeasure(size_t sens_index, yarp::sig::Vector &out, double &timestamp) const override
Get three axis magnetometer measurements.
void run() override
Update loop where measurements are read from the device.
Interface implemented by all device drivers.
A generic interface to sensors – gyro, a/d converters etc.
Device interface to one or multiple orientation sensors, such as IMUs with on board estimation algori...
Device interface to one or multiple three axis gyroscopes.
Device interface to one or multiple three axis linear accelerometers.
Device interface to one or multiple three axis magnetometers.
An abstraction for a periodic thread.
Helper class for finding config files and other external resources.
A base class for nested structures that can be searched.
Definition Searchable.h:31
constexpr int MAX_MSG_LENGTH
STL namespace.
MAS_status
Status of a given analog sensor exposed by a multiple analog sensors interface.