rt_usb_9axisimu.hpp
Go to the documentation of this file.
1 /*
2  * rt_usb_9axisimu.hpp
3  *
4  * License: BSD-3-Clause
5  *
6  * Copyright (c) 2015-2020 RT Corporation <support@rt-net.jp>
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright notice,
13  * this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  * notice, this list of conditions and the following disclaimer in the
16  * documentation and/or other materials provided with the distribution.
17  * 3. Neither the name of RT Corporation nor the names of its
18  * contributors may be used to endorse or promote products derived from
19  * this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #ifndef RT_USB_9AXISIMU_H_
35 #define RT_USB_9AXISIMU_H_
36 
37 #include <fcntl.h>
38 #include <stdlib.h>
39 #include <sys/ioctl.h>
40 #include <sys/stat.h>
41 #include <sys/types.h>
42 #include <termios.h>
43 #include <unistd.h>
44 
45 #include <cmath>
46 #include <sstream>
47 
48 /**********************************************************************************************************
49  *
50  * Constants
51  *
52  **********************************************************************************************************/
53 
54 namespace rt_usb_9axisimu
55 {
56 class Consts
57 {
58 public:
60  {
63  IMU_BIN_HEADER_R = 2,
64  IMU_BIN_HEADER_T = 3,
69  IMU_BIN_ACC_X_L = 8,
70  IMU_BIN_ACC_X_H = 9,
71  IMU_BIN_ACC_Y_L = 10,
72  IMU_BIN_ACC_Y_H = 11,
90  };
91 
93  {
106  };
107 
108  // Convertor
109  const double CONVERTOR_RAW2G;
110  const double CONVERTOR_RAW2DPS;
114  const double CONVERTOR_G2A;
115  const double CONVERTOR_D2R;
116  const double CONVERTOR_UT2T;
120 
122  : CONVERTOR_RAW2G(2048) // for linear_acceleration (raw data to [g])
123  , CONVERTOR_RAW2DPS(16.4) // for angular_velocity (raw data to [degree/s])
124  , CONVERTOR_RAW2UT(0.3) // for magnetic_field (raw data to [uT])
125  , CONVERTOR_RAW2C_1(340) // for temperature (raw data to celsius)
126  , CONVERTOR_RAW2C_2(35) // for temperature (raw data to celsius)
127  , CONVERTOR_G2A(9.80665) // for linear_acceleration (g to m/s^2)
128  , CONVERTOR_D2R(M_PI / 180.0) // for angular_velocity (degree to radian)
129  , CONVERTOR_UT2T(1000000) // for magnetic_field (uT to Tesla)
130  , DEFAULT_LINEAR_ACCELERATION_STDDEV(0.023145) // Default of square root of the
131  // linear_acceleration_covariance diagonal elements in
132  // m/s^2.
133  , DEFAULT_ANGULAR_VELOCITY_STDDEV(0.0010621) // Default of square root of the
134  // angular_velocity_covariance diagonal elements in
135  // rad/s.
136  , DEFAULT_MAGNETIC_FIELD_STDDEV(0.00000080786) // Default of square root of the
137  // magnetic_field_covariance diagonal elements in
138  // Tesla.
139  {
140  }
141 
142  ~Consts()
143  {
144  }
145 
146  // Method to adjust convertors to firmware version
147  void ChangeConvertor(const int firmware_ver)
148  {
149  if (firmware_ver == 5)
150  {
151  CONVERTOR_RAW2UT = 0.3;
152  CONVERTOR_RAW2C_1 = 340;
153  CONVERTOR_RAW2C_2 = 35;
154  }
155  else if (firmware_ver >= 6)
156  {
157  CONVERTOR_RAW2UT = 0.15;
158  CONVERTOR_RAW2C_1 = 333.87;
159  CONVERTOR_RAW2C_2 = 21;
160  }
161  }
162 };
163 
164 /**********************************************************************************************************
165  *
166  * Serial port abstraction
167  *
168  **********************************************************************************************************/
169 
170 class SerialPort
171 {
172 private:
173  std::string port_name_; // ex) "/dev/ttyACM0"
174  struct termios old_settings_;
175  int port_fd_;
176 
177 public:
178  SerialPort(const char* port = "") : port_name_(port), port_fd_(-1)
179  {
180  }
181 
183  {
184  closeSerialPort();
185  }
186 
187  bool openPort(const char* port)
188  {
189  port_name_ = port;
190  return openSerialPort();
191  }
192 
193  bool openSerialPort()
194  {
195  int fd = 0;
196 
197  if (port_fd_ > 0)
198  {
199  return true;
200  }
201 
202  fd = open(port_name_.c_str(), O_RDWR | O_NOCTTY); // Open serial port
203  if (fd < 0)
204  {
205  return false; // Port open error
206  }
207 
208  struct termios settings;
209 
210  tcgetattr(fd, &old_settings_);
211 
212  cfsetispeed(&settings, B57600);
213  cfmakeraw(&settings);
214 
215  tcsetattr(fd, TCSANOW, &settings);
216 
217  port_fd_ = fd;
218 
219  return (fd > 0);
220  }
221 
222  void closeSerialPort()
223  {
224  if (port_fd_ > 0)
225  {
226  tcsetattr(port_fd_, TCSANOW, &old_settings_);
227  close(port_fd_); // Close serial port
228  port_fd_ = -1;
229  }
230  }
231 
232  int readFromDevice(unsigned char* buf, unsigned int buf_len)
233  {
234  if (port_fd_ < 0)
235  {
236  return -1;
237  }
238 
239  return read(port_fd_, buf, buf_len);
240  }
241 
242  int writeToDevice(unsigned char* data, unsigned int data_len)
243  {
244  if (port_fd_ < 0)
245  {
246  return -1;
247  }
248 
249  return write(port_fd_, data, data_len);
250  }
251 };
252 
253 /**************************************************************************
254  *
255  * IMU
256  *
257  **************************************************************************/
258 
259 // Class to store either raw integer imu data or converted physical quantity
260 template <typename Type>
261 class ImuData
262 {
263 public:
264  int firmware_ver;
266  Type ax, ay, az, gx, gy, gz, mx, my, mz, temperature;
267 
268  ImuData()
269  {
270  reset();
271  }
272 
274  {
275  }
276 
277  inline void reset()
278  {
279  firmware_ver = 5;
280  timestamp = -1;
281  ax = ay = az = gx = gy = gz = mx = my = mz = temperature = 0;
282  }
283 };
284 
286 {
287 private:
290  Consts consts_;
291 
292 public:
294  {
295  reset();
296  }
297 
298  ~SensorData()
299  {
300  }
301 
302  void reset()
303  {
305  imu_.reset();
306  }
307 
309  {
310  imu_raw_data_ = i;
311  }
312 
313  void setImuData(ImuData<double>& i)
314  {
315  imu_ = i;
316  }
317 
318  // Method to convert raw integer imu_ data to physical quantity
319  void convertRawDataUnit()
320  {
321  // Adjust convertors to firmware version
323 
326 
327  // Convert raw data to [g]
331 
332  // Convert raw data to [degree/s]
336 
337  // Convert raw data to [uT]
341 
342  // Convert raw data to celsius
344  }
345 
347  {
348  return imu_;
349  }
350 };
351 }; // namespace rt_usb_9axisimu
352 
353 #endif
rt_usb_9axisimu::ImuData< int16_t >
rt_usb_9axisimu::ImuData::my
Type my
Definition: rt_usb_9axisimu.hpp:274
rt_usb_9axisimu::ImuData::reset
void reset()
Definition: rt_usb_9axisimu.hpp:285
rt_usb_9axisimu::Consts::IMU_BIN_ACC_X_H
@ IMU_BIN_ACC_X_H
Definition: rt_usb_9axisimu.hpp:82
rt_usb_9axisimu::Consts::IMU_BIN_TEMP_H
@ IMU_BIN_TEMP_H
Definition: rt_usb_9axisimu.hpp:88
rt_usb_9axisimu::Consts::CONVERTOR_RAW2C_2
double CONVERTOR_RAW2C_2
Definition: rt_usb_9axisimu.hpp:121
rt_usb_9axisimu::Consts::CONVERTOR_D2R
const double CONVERTOR_D2R
Definition: rt_usb_9axisimu.hpp:123
rt_usb_9axisimu::SensorData::setImuRawData
void setImuRawData(ImuData< int16_t > &i)
Definition: rt_usb_9axisimu.hpp:312
rt_usb_9axisimu::Consts::IMU_BIN_ACC_X_L
@ IMU_BIN_ACC_X_L
Definition: rt_usb_9axisimu.hpp:81
rt_usb_9axisimu::SensorData::imu_raw_data_
ImuData< int16_t > imu_raw_data_
Definition: rt_usb_9axisimu.hpp:292
rt_usb_9axisimu::Consts::IMU_BIN_MAG_X_H
@ IMU_BIN_MAG_X_H
Definition: rt_usb_9axisimu.hpp:96
rt_usb_9axisimu::Consts::IMU_BIN_MAG_Z_L
@ IMU_BIN_MAG_Z_L
Definition: rt_usb_9axisimu.hpp:99
rt_usb_9axisimu::Consts::IMU_ASCII_ACC_Y
@ IMU_ASCII_ACC_Y
Definition: rt_usb_9axisimu.hpp:107
rt_usb_9axisimu::SerialPort::port_fd_
int port_fd_
Definition: rt_usb_9axisimu.hpp:183
rt_usb_9axisimu::Consts::IMU_BIN_GYRO_Y_L
@ IMU_BIN_GYRO_Y_L
Definition: rt_usb_9axisimu.hpp:91
rt_usb_9axisimu::Consts::IMU_ASCII_GYRO_Z
@ IMU_ASCII_GYRO_Z
Definition: rt_usb_9axisimu.hpp:105
rt_usb_9axisimu::Consts::IMU_ASCII_MAG_Y
@ IMU_ASCII_MAG_Y
Definition: rt_usb_9axisimu.hpp:110
rt_usb_9axisimu::Consts::IMU_ASCII_MAG_Z
@ IMU_ASCII_MAG_Z
Definition: rt_usb_9axisimu.hpp:111
rt_usb_9axisimu::Consts::IMU_BIN_ACC_Z_L
@ IMU_BIN_ACC_Z_L
Definition: rt_usb_9axisimu.hpp:85
rt_usb_9axisimu::Consts
Definition: rt_usb_9axisimu.hpp:60
rt_usb_9axisimu::SensorData::setImuData
void setImuData(ImuData< double > &i)
Definition: rt_usb_9axisimu.hpp:317
rt_usb_9axisimu::Consts::CONVERTOR_G2A
const double CONVERTOR_G2A
Definition: rt_usb_9axisimu.hpp:122
rt_usb_9axisimu::Consts::~Consts
~Consts()
Definition: rt_usb_9axisimu.hpp:150
rt_usb_9axisimu::ImuData::gy
Type gy
Definition: rt_usb_9axisimu.hpp:274
rt_usb_9axisimu::SerialPort::port_name_
std::string port_name_
Definition: rt_usb_9axisimu.hpp:181
rt_usb_9axisimu::ImuData::temperature
Type temperature
Definition: rt_usb_9axisimu.hpp:274
rt_usb_9axisimu::Consts::IMU_BIN_GYRO_Y_H
@ IMU_BIN_GYRO_Y_H
Definition: rt_usb_9axisimu.hpp:92
rt_usb_9axisimu::Consts::IMU_BIN_DATA_SIZE
@ IMU_BIN_DATA_SIZE
Definition: rt_usb_9axisimu.hpp:101
rt_usb_9axisimu::Consts::IMU_BIN_ACC_Z_H
@ IMU_BIN_ACC_Z_H
Definition: rt_usb_9axisimu.hpp:86
rt_usb_9axisimu::Consts::IMU_BIN_HEADER_ID1
@ IMU_BIN_HEADER_ID1
Definition: rt_usb_9axisimu.hpp:78
rt_usb_9axisimu::ImuData::ax
Type ax
Definition: rt_usb_9axisimu.hpp:274
rt_usb_9axisimu::Consts::IMU_BIN_GYRO_X_H
@ IMU_BIN_GYRO_X_H
Definition: rt_usb_9axisimu.hpp:90
rt_usb_9axisimu::SensorData::~SensorData
~SensorData()
Definition: rt_usb_9axisimu.hpp:302
rt_usb_9axisimu::Consts::IMU_ASCII_GYRO_Y
@ IMU_ASCII_GYRO_Y
Definition: rt_usb_9axisimu.hpp:104
rt_usb_9axisimu::SerialPort::readFromDevice
int readFromDevice(unsigned char *buf, unsigned int buf_len)
Definition: rt_usb_9axisimu.hpp:240
rt_usb_9axisimu::ImuData::gz
Type gz
Definition: rt_usb_9axisimu.hpp:274
rt_usb_9axisimu::ImuData::ay
Type ay
Definition: rt_usb_9axisimu.hpp:274
rt_usb_9axisimu::Consts::IMU_ASCII_GYRO_X
@ IMU_ASCII_GYRO_X
Definition: rt_usb_9axisimu.hpp:103
rt_usb_9axisimu::Consts::IMU_BIN_GYRO_Z_L
@ IMU_BIN_GYRO_Z_L
Definition: rt_usb_9axisimu.hpp:93
rt_usb_9axisimu::Consts::Consts
Consts()
Definition: rt_usb_9axisimu.hpp:129
rt_usb_9axisimu::Consts::CONVERTOR_RAW2DPS
const double CONVERTOR_RAW2DPS
Definition: rt_usb_9axisimu.hpp:118
rt_usb_9axisimu::ImuData::~ImuData
~ImuData()
Definition: rt_usb_9axisimu.hpp:281
rt_usb_9axisimu::SerialPort::openSerialPort
bool openSerialPort()
Definition: rt_usb_9axisimu.hpp:201
rt_usb_9axisimu::Consts::CONVERTOR_RAW2G
const double CONVERTOR_RAW2G
Definition: rt_usb_9axisimu.hpp:117
rt_usb_9axisimu::ImuData::mx
Type mx
Definition: rt_usb_9axisimu.hpp:274
rt_usb_9axisimu::Consts::IMU_ASCII_ACC_X
@ IMU_ASCII_ACC_X
Definition: rt_usb_9axisimu.hpp:106
rt_usb_9axisimu::Consts::IMU_ASCII_TIMESTAMP
@ IMU_ASCII_TIMESTAMP
Definition: rt_usb_9axisimu.hpp:102
rt_usb_9axisimu::ImuData::firmware_ver
int firmware_ver
Definition: rt_usb_9axisimu.hpp:272
rt_usb_9axisimu::Consts::IMU_ASCII_TEMP
@ IMU_ASCII_TEMP
Definition: rt_usb_9axisimu.hpp:112
rt_usb_9axisimu::Consts::IMU_BINARY_DATA_TABLE
IMU_BINARY_DATA_TABLE
Definition: rt_usb_9axisimu.hpp:67
rt_usb_9axisimu::SerialPort::closeSerialPort
void closeSerialPort()
Definition: rt_usb_9axisimu.hpp:230
rt_usb_9axisimu::SensorData
Definition: rt_usb_9axisimu.hpp:289
rt_usb_9axisimu::SensorData::imu_
ImuData< double > imu_
Definition: rt_usb_9axisimu.hpp:293
rt_usb_9axisimu::Consts::DEFAULT_MAGNETIC_FIELD_STDDEV
const double DEFAULT_MAGNETIC_FIELD_STDDEV
Definition: rt_usb_9axisimu.hpp:127
rt_usb_9axisimu::Consts::IMU_BIN_MAG_Y_H
@ IMU_BIN_MAG_Y_H
Definition: rt_usb_9axisimu.hpp:98
rt_usb_9axisimu::SensorData::getImuData
ImuData< double > getImuData()
Definition: rt_usb_9axisimu.hpp:350
rt_usb_9axisimu::Consts::IMU_BIN_HEADER_R
@ IMU_BIN_HEADER_R
Definition: rt_usb_9axisimu.hpp:75
rt_usb_9axisimu::Consts::IMU_ASCII_MAG_X
@ IMU_ASCII_MAG_X
Definition: rt_usb_9axisimu.hpp:109
rt_usb_9axisimu::SensorData::consts_
Consts consts_
Definition: rt_usb_9axisimu.hpp:294
rt_usb_9axisimu::ImuData::gx
Type gx
Definition: rt_usb_9axisimu.hpp:274
rt_usb_9axisimu::Consts::IMU_BIN_MAG_Y_L
@ IMU_BIN_MAG_Y_L
Definition: rt_usb_9axisimu.hpp:97
rt_usb_9axisimu::Consts::IMU_BIN_GYRO_Z_H
@ IMU_BIN_GYRO_Z_H
Definition: rt_usb_9axisimu.hpp:94
rt_usb_9axisimu::Consts::IMU_BIN_GYRO_X_L
@ IMU_BIN_GYRO_X_L
Definition: rt_usb_9axisimu.hpp:89
rt_usb_9axisimu::Consts::IMU_BIN_TIMESTAMP
@ IMU_BIN_TIMESTAMP
Definition: rt_usb_9axisimu.hpp:80
rt_usb_9axisimu::Consts::DEFAULT_ANGULAR_VELOCITY_STDDEV
const double DEFAULT_ANGULAR_VELOCITY_STDDEV
Definition: rt_usb_9axisimu.hpp:126
rt_usb_9axisimu
Definition: rt_usb_9axisimu.hpp:54
rt_usb_9axisimu::Consts::IMU_BIN_MAG_X_L
@ IMU_BIN_MAG_X_L
Definition: rt_usb_9axisimu.hpp:95
rt_usb_9axisimu::Consts::IMU_ASCII_DATA_TABLE
IMU_ASCII_DATA_TABLE
Definition: rt_usb_9axisimu.hpp:100
rt_usb_9axisimu::Consts::ChangeConvertor
void ChangeConvertor(const int firmware_ver)
Definition: rt_usb_9axisimu.hpp:155
rt_usb_9axisimu::Consts::IMU_ASCII_ACC_Z
@ IMU_ASCII_ACC_Z
Definition: rt_usb_9axisimu.hpp:108
rt_usb_9axisimu::SerialPort::SerialPort
SerialPort(const char *port="")
Definition: rt_usb_9axisimu.hpp:186
rt_usb_9axisimu::Consts::IMU_BIN_HEADER_FF0
@ IMU_BIN_HEADER_FF0
Definition: rt_usb_9axisimu.hpp:73
rt_usb_9axisimu::SerialPort::openPort
bool openPort(const char *port)
Definition: rt_usb_9axisimu.hpp:195
rt_usb_9axisimu::Consts::IMU_BIN_HEADER_ID0
@ IMU_BIN_HEADER_ID0
Definition: rt_usb_9axisimu.hpp:77
rt_usb_9axisimu::Consts::IMU_BIN_ACC_Y_H
@ IMU_BIN_ACC_Y_H
Definition: rt_usb_9axisimu.hpp:84
rt_usb_9axisimu::ImuData::ImuData
ImuData()
Definition: rt_usb_9axisimu.hpp:276
rt_usb_9axisimu::Consts::CONVERTOR_RAW2UT
double CONVERTOR_RAW2UT
Definition: rt_usb_9axisimu.hpp:119
rt_usb_9axisimu::Consts::IMU_BIN_TEMP_L
@ IMU_BIN_TEMP_L
Definition: rt_usb_9axisimu.hpp:87
rt_usb_9axisimu::SensorData::convertRawDataUnit
void convertRawDataUnit()
Definition: rt_usb_9axisimu.hpp:323
rt_usb_9axisimu::Consts::IMU_BIN_HEADER_T
@ IMU_BIN_HEADER_T
Definition: rt_usb_9axisimu.hpp:76
rt_usb_9axisimu::Consts::CONVERTOR_UT2T
const double CONVERTOR_UT2T
Definition: rt_usb_9axisimu.hpp:124
rt_usb_9axisimu::SerialPort::old_settings_
struct termios old_settings_
Definition: rt_usb_9axisimu.hpp:182
rt_usb_9axisimu::SensorData::SensorData
SensorData()
Definition: rt_usb_9axisimu.hpp:297
rt_usb_9axisimu::SerialPort::writeToDevice
int writeToDevice(unsigned char *data, unsigned int data_len)
Definition: rt_usb_9axisimu.hpp:250
rt_usb_9axisimu::ImuData::az
Type az
Definition: rt_usb_9axisimu.hpp:274
rt_usb_9axisimu::Consts::IMU_ASCII_DATA_SIZE
@ IMU_ASCII_DATA_SIZE
Definition: rt_usb_9axisimu.hpp:113
rt_usb_9axisimu::ImuData::timestamp
int timestamp
Definition: rt_usb_9axisimu.hpp:273
rt_usb_9axisimu::ImuData::mz
Type mz
Definition: rt_usb_9axisimu.hpp:274
rt_usb_9axisimu::Consts::DEFAULT_LINEAR_ACCELERATION_STDDEV
const double DEFAULT_LINEAR_ACCELERATION_STDDEV
Definition: rt_usb_9axisimu.hpp:125
rt_usb_9axisimu::Consts::IMU_BIN_HEADER_FF1
@ IMU_BIN_HEADER_FF1
Definition: rt_usb_9axisimu.hpp:74
rt_usb_9axisimu::SerialPort::~SerialPort
~SerialPort()
Definition: rt_usb_9axisimu.hpp:190
rt_usb_9axisimu::Consts::CONVERTOR_RAW2C_1
double CONVERTOR_RAW2C_1
Definition: rt_usb_9axisimu.hpp:120
rt_usb_9axisimu::SensorData::reset
void reset()
Definition: rt_usb_9axisimu.hpp:306
rt_usb_9axisimu::Consts::IMU_BIN_ACC_Y_L
@ IMU_BIN_ACC_Y_L
Definition: rt_usb_9axisimu.hpp:83
rt_usb_9axisimu::Consts::IMU_BIN_FIRMWARE
@ IMU_BIN_FIRMWARE
Definition: rt_usb_9axisimu.hpp:79
rt_usb_9axisimu::Consts::IMU_BIN_MAG_Z_H
@ IMU_BIN_MAG_Z_H
Definition: rt_usb_9axisimu.hpp:100


rt_usb_9axisimu_driver
Author(s): RT Corporation
autogenerated on Wed Mar 2 2022 00:59:46