IMU-seless at ROS

I have the “safe imu for ROS on GoPiGo3” interface running now. Just need to:

  • learn how to package python so anyone can “sudo pip3 install imu4ros-gopigo3”
  • build ROS2 IMU node without tf publisher
  • learn how to use robot_localization
  • back port it to ROS
2 Likes

Wow. That was fast.
/K

1 Like

oh, yeah… of course… simply that and every ROS doc … I’m totally with you.

2 Likes

An interesting observation - the IMU acceleration values are quite small with the LIDAR not spinning. When the LIDAR is running, my readIMU program reports the bot has moved - and it is definitely “moving”, just not going anywhere. Having the LIDAR on the third level is “rocking the bo[a]t”.

1 Like

Ugh. I was worried about that (even moreso with Finmark because the IMU is closer). Definite downsides to having something so compact. When I go back to the IMU I may also need to fiddle with a mount. The current friction mount is convenient, but I had to fiddle a bit to get the board level so that I wasn’t getting acceleration in the X and Y directions when the robot was at rest. No doubt vibration will disturb that - so I may work on something more fixed (and adjustable).
/K

2 Likes

Sorry, but I couldn’t resist:

:wink:

2 Likes

You mean like my “velcro” mounting?

Really? I was assuming that was from lsb flopping in the math.

(I have seen the 9.8m/s of gravity appear as 10.0-10.1 without the LIDAR spinning)

I’m pretty sure ROS will be averaging all accelerations. In one person’s code for a 9250 IMU I saw filtered_value = (95% of the average value + new_value)/2 being used.

$ ./startIMU

Start DI IMU (BNO055 chip)
Using mutex-protected, exception-tolerant SW I2C
on GoPiGo3 port AD1 in NDOF mode

IMU READING AFTER RESET:
Euler Heading: 359.9 Roll:  -1.3 Pitch:  -0.4 | Linear Acc XYZ:  0.0  0.0  0.1 | Mag XYZ:  -22.1    9.0  -24.9 | Gyro XYZ:    0.0    0.1    0.1 | Accel XYZ:   -0.2   -0.1   10.0 | Temp: 23.0C

Exiting startIMU
pi@ROSbot:~/rosbot-on-gopigo3/imu4gopigo3ros$ ./readIMU

Reading the Dexter Industries IMU Sensor
Using mutex-protected, exception-tolerant SW I2C on GoPiGo3 port AD1

Expand the window till this line fits
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
SafeIMUSensor INSTANTIATING ON PORT AD1 OR BUS GPG3_AD1 WITH MUTEX True INIT False (no mode change)
InertialMeasurementUnit INSTANTIATING ON BUS GPG3_AD1 INIT False (no mode change)
BNO055 Instantiating on BUS GPG3_AD1 with ADDRESS 40 using UNITS 0 HW INIT False
Set _mode to: 12
BNO055 Instantiation Complete
InertialMeasurementUnit Instantiation Complete
SafeIMUSensor Instantiation Complete


2021-09-19 13:29:05.916174: Exception Count: 0
Euler Heading: 359.9 Roll:  -1.3 Pitch:  -0.4 | Linear Acc XYZ: -0.0  0.0  0.2 | Mag XYZ:  -21.4   10.5  -24.6 | Gyro XYZ:   -0.2   -0.1   -0.1 | Accel XYZ:   -0.2   -0.0    9.9 | Temp: 24.0C

Euler Heading: 359.9 Roll:  -1.3 Pitch:  -0.4 | Linear Acc XYZ: -0.0  0.0  0.2 | Mag XYZ:  -20.2   10.1  -24.6 | Gyro XYZ:    0.1    0.1    0.0 | Accel XYZ:   -0.2   -0.1   10.0 | Temp: 24.0C

Euler Heading: 359.9 Roll:  -1.3 Pitch:  -0.4 | Linear Acc XYZ: -0.0  0.0  0.2 | Mag XYZ:  -21.0    9.8  -25.4 | Gyro XYZ:    0.1   -0.1    0.1 | Accel XYZ:   -0.2   -0.1   10.1 | Temp: 24.0C

Euler Heading: 359.9 Roll:  -1.3 Pitch:  -0.4 | Linear Acc XYZ: -0.0  0.0  0.2 | Mag XYZ:  -21.4    9.1  -25.4 | Gyro XYZ:    0.0   -0.2    0.1 | Accel XYZ:   -0.2   -0.1   10.0 | Temp: 24.0C

Euler Heading: 359.9 Roll:  -1.3 Pitch:  -0.4 | Linear Acc XYZ:  0.0  0.0  0.2 | Mag XYZ:  -21.0    9.8  -25.0 | Gyro XYZ:    0.0    0.0   -0.1 | Accel XYZ:   -0.2   -0.1    9.8 | Temp: 25.0C

and without mags (IMUPLUS mode)

$ ./startIMU -i

Start DI IMU (BNO055 chip)
Using mutex-protected, exception-tolerant SW I2C
on GoPiGo3 port AD1 in IMUPLUS mode

IMU READING AFTER RESET:
Euler Heading: 359.9 Roll:  -1.3 Pitch:  -0.4 | Linear Acc XYZ:  0.0 -0.0  0.3 | Mag XYZ:    0.0    0.0    0.0 | Gyro XYZ:    0.1    0.2    0.0 | Accel XYZ:   -0.2   -0.1   10.1 | Temp: 25.0C

Exiting startIMU
pi@ROSbot:~/rosbot-on-gopigo3/imu4gopigo3ros$ ./readIMU -h

Reading the Dexter Industries IMU Sensor
Using mutex-protected, exception-tolerant SW I2C on GoPiGo3 port AD1

Expand the window till this line fits
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
SafeIMUSensor INSTANTIATING ON PORT AD1 OR BUS GPG3_AD1 WITH MUTEX True INIT False (no mode change)
InertialMeasurementUnit INSTANTIATING ON BUS GPG3_AD1 INIT False (no mode change)
BNO055 Instantiating on BUS GPG3_AD1 with ADDRESS 40 using UNITS 0 HW INIT False
Set _mode to: 8
BNO055 Instantiation Complete
InertialMeasurementUnit Instantiation Complete
SafeIMUSensor Instantiation Complete


2021-09-19 13:36:50.627147: Exception Count: 0
Euler Heading: 359.9 Roll:  -1.3 Pitch:  -0.4 | Linear Acc XYZ:  0.0 -0.0  0.3 | Mag XYZ:    0.0    0.0    0.0 | Gyro XYZ:    0.1    0.1    0.0 | Accel XYZ:   -0.2   -0.1   10.1 | Temp: 25.0C

X and Y linear accelerations seem to be stable - but I don’t actually think ROS uses them. That Z acceleration makes it look like Dave is constantly climbing the walls (or maybe he is surfing the gravity waves).

2 Likes

Exactly. Love it - college days memory.

2 Likes

Correct me if I am wrong, but isn’t something like 90% of your problem because Dave is too tall?

A 'bot that tall with respect to its wheel-base would scare me.

At the very grave risk of insulting both you and your robot paradigm, I would seriously consider a “scaled down” version of the 'bot without the handles, character, and anything else that is not absolutely necessary for a working robot. Especially things that raise the center of gravity.

Once you get the 'bot working, you can then worry about all the bells, whistles, flashing lights and dancing bears. (At least that’s how I see it, IMHO.)

I would also consider placing the LIDAR on the bottom layer since the lever moment of the LIDAR’s weight and vibration will be mimized the lower you place it.

Things like the Pi itself, the GoPiGo board and associated sensors can be placed on top of that.

What say ye?

Just thought of something.

You’ll probably need to extend the GoPiGo motor wires. Of course, for an old hand at surface mount rework like you, that should be a cinch!

2 Likes

There may come a time for optimization, but at this point all I need from Dave is:

  1. A sensor mounted somewhere
  2. A URDF that accurately describes the position relative to the center of the wheels, and orientation
  3. A node that publishes sensor data with some periodicity without crashing
  4. A Rviz2 configuration that displays the data

so I can move on to learning about localization, mapping, and navigation.

If you are referring to platform vibrations reflected in the IMU output, I don’t even know if that is a problem. At this point it is an observation.

2 Likes

I can accept that.

Might the same be said for the concerns about the IMU and the LIDAR/wheel motor magnets?

But I remember something about vibration affecting the LIDAR - or, maybe I really am as confused as my wife thinks I am, 'eh?

2 Likes

I didn’t think a handle was that necessary either, but Carl has nearly ripped his scalp off from me lifting him by his safety goggle over the last three years.

I use Dave’s handle several times a day turning him around, putting him up on my desk so I can get at his “guts”, and posing him for the selfies he seems to want every time he gets a new toy.

And the character, well that is necessary … I’m sure - I’m just old enough to have forgotten why.

2 Likes

Always good to have minions at your beck and call
/K

2 Likes