We made an open source imu sensor for ros, that utilizes FXOS8700 and FXAS21002 sensors from NXP semiconductors, coupled with a Texas Instruments TM4C123GH6PM Arm Cortex based MCU.
The set of sensors from the NXP semiconductors is said to have 100 times better noise characteristics, then what is available on the market.
We have ported ROS’s imu_complementary_filter code to run on the TM4C123GH6PM platform, to achieve:
- Up to 400Hz read of acceletometer, magnetometer and gyro sensors
- Up to 400Hz update of the complementary filter
- Output is published at /imu/data and /imu/mag as sensor_msgs/Imu and sensor_msg/MagneticField message types, and output rate is determined by output_rate_divider parameter
- Hard iron and soft iron correction
- Everything is configurable by rosparams, from hard iron soft iron calibration to sensor_read rate, output_rate_divider, to gyro and accel sensor parameters, and all the parameters in imu_complementary_filter. (with the exception of tf) See: fximu_params.yaml
- Green led is on when at steady state
- It requires no serial driver, and uses no serial ftdi, but rather emulates a virtual serial port as a usb hid device, provided with the TM4C123
- It has an expansion port that can be used as serial, or analog input, or gpio. PA0 to PA7 on TM4C123GH6PM
- It costs 20USD to build in components, and is open source.
Since the complementary filter is running at an embedded level, there is nearly no latency. It attaches directly and powered by USB port.
Calibration is done by putting the unit in calibration mode using the params file, and running a set of scripts provided, the ros publisher is turned into normal serial data forwareded to another virtual serial port using the program socat. So once the values are forwarded to virtual serial port in ASCII format, one can use off the shelf calibration utilities, such as Paul Stoffregen’s MotionCal. Basically you can calibrate your sensor, without taking it off from the robot, or updating firmware,
We are working on a V2 of the board, that includes cosmetic and ergonomic changes, and the addition of a i2c port.
It runs extremely well, and has more space for development. I built it for a robot I was building, then noticed it could be useful to others, so decided to develop this as a seperate project. Because the filter is fed at 400hz after being read from i2c, it offers nearly zero latency.
I have worked with various IMUs (I will not name them here.), including ones that include on-board digital motion processors, and the results we are getting are much better than what is available on the market that is the same class of device.
Souirce code available at https://github.com/altineller/fximu2
All are welcome to parrallel develop this project, and I provide circuit boards for people who can solder SMD components, along with montage diagrams and BOM. Right now github does not contain schematics nor gerbers, but just because I am building a new version with slight improvements.
We are also asking for the help of ROS community to further develop and maybe fund this project so we can have them produced in SeedStudio or allike manufacturing house.
People who like to replicate results are also welcome and will be helped.