Incremental Movement in position mode


#1

Im using a bdcm with halls feedback in position mode. My application needs to issue incremental positions (i.e. every position command must rotate the motor cw or ccw a specific amount from the last movement). Since this is a ground vehicle, it could move miles in any direction which would overflow the position since its stored as a float.

So I created a ‘reset position’ command (i designated it ‘t’) in the acsii_protocol.cpp. In text function I created for the ‘t’ command, I call a function in axis.cpp that first sets encoder_.pos_estimate_ = 0, then calls controller_.reset(). The result is just moving the motor back to position 0, not what I need. I want it to set its current position to 0 again w/o moving the motor to 0.

Thanks!


#2

You can’t directly write to pos_estimate, it is being controlled by the encoder module. Use the function encoder.set_linear_count(0).

If this works well, can you please make a PR? I think this is a feature others would also have good use of.


#4

It works, but its not a very clean solution. I first must issue a position command, then figure out when the motor has stopped moving (I do this by reading the pll_velocity), then issue my ‘t’ command. The best solution would be an ‘incremental position mode’. Im going to try to implement it…some guidance would be appreciated (like which update loop should I be sticking this into?).


#5

We have an incremental mode coming soon, but in that particular implementation it won’t handle rotating “forever”.

I think a better solution is to extend your t command to include an offset parameter to shift the reference by. You can call like t 0 -100000 to shift back the reference by that much, and also shift the reference on the host at the same time. Then you don’t have to stop: because you are shifting the same amount on both sides you never lost any counts.

The implementation is probably as easy as:

set_linear_count(shadow_count_ + delta);

where delta is the new parameter of your t command.


#6

I see how that could work better, but im worried about the position eventually overflowing since the motors could be moving for hours. The guidance system sends a new position every 10 seconds. If the new position requires the ugv to turn, then the controlling software waits for the motors to stop (from the last position move), then skid steers to a new heading and the process starts again. Otherwise, if it’s moving straight, a new position must be sent w/o stopping. Since the position and reset commands are separate, everything is working ok.