Magni Motor Control Under Different Payload


We are using the Magni and have an additional payload of 15kg. We are experiencing issues when navigating and believe the motor control is improperly tuned for this load.

Is there existing guidance or calibration available for us to use with this new payload?


Would it be possible to post a video with a naration of the behavior your seeing? Also perhaps the .ROS log file if there are any warnings or errors.

Is the behavior different, does it get worse at 25kg?

Is there anything unusual about the floor surface that might make the robot lose traction?

Is the weight distribution even?

Ideally, we would like to duplicate your setup in our lab, and attempt to see the same behavior, and then figure out if it occurs in all systems.

We have tended to leave PID tuning as an internal document but because you have these issues perhaps this may be of help for your tuning. Pid tuning is indeed dependent on loading (inertal mass effects) so we get that. It is a tricky problem because we cannot determine the loading as that hardware is not on Magni at this time.

I was unable to attach this doc so I supply a link to my own share. Please get this soon as I don’t know how long this link will be valid


To answer some questions, the floor surface is regular hardwood. We have also been running another magni with no additional weight smoothly on this surface.

The weight distribution is not even, but after some tests it is more likely that it is due to the increase in mass and less due to the weight distribution.

I will also take a look at the document Mark sent as well as provide a video with the magni under 20kg and 25kg payload.

I am not sure if I understood. Both Magni are ok at no load. Do both same the same erratic behavior under load?

Yes, at no load on the same surface the robots behave well.

Looking at rqt plot, the default values provided seem to not be tuned to be used under the load that we have (Robot driving forward at 0.3m/s):

Do you have the process gain, process time constant, and dead time at our specific load level in order for us to tune the PID using a first order plus dead time dynamic model?



Just wanted to check up on the last question to see if there was any data you could provide that would allow us to not have to manually tune the PID for a new payload


Well more recently we have started to turn down the I term as it leads to oscillations. Back that I term down to perhaps 2. The other thing I noticed from above is you have max_pwm rather low, try that at a higher value. We by default set it to 250 or so these days. We also back D term down to -20 these days. This for you is a compromise due to I expect your weight varies if you take something off or on the robot? OR is your robot weight going to remain constant? I want to point out something that is hard for us to manage well. When you bring up the dynamic parameter gui like you show it has it’s OWN set of values it loads. The real values in use for when you are not tuning are in /opt/ros/kinetic/share/magni_bringup/param/base.yaml and when you find a good set of ‘tradeoff’ values that is where they will reside. The base.yaml file gets over-written for any ‘sudo apt upgrade’ so be careful to save any custom base.yaml file off to the side or better yet off of the robot so you don’t loose your ‘formula’.