Control mode to use for executing a series of points with specified velocity?

Looking for recommendations/suggestions as to how to configure my ODrives/what control mode to use for my project:

I’ve got a trajectory of joint angle goals and velocities for each waypoint for a quadruped that I want to execute on my ODrives, but I’m having a hard time understanding which control mode would best be suited for this. Raw position control is too jerky due to always executing a joint state goal as quickly as possible. Filtered position control and trapezoidal trajectory control are closer to what I’m looking for, but they stop at each waypoint in the trajectory such that the full motion has a bunch of intermediate stops. Velocity control satisfies the ability to keep continuous motion throughout the execution of the trajectory, but there’s no guarantee of reaching the desired joint angle which I check for to trigger setting the next velocity value in the sequence.

The trapezoidal trajectory controller seems to fit the closest to what I’m looking for but as I mentioned it stops at each waypoint. Is there a way to configure the controller for continuous motion through the intermediate points? Alternatively, is there an implementation of a look-ahead buffer that supplements the trajectory controller to enable smooth continuous motion?

We don’t have waypoint control, sorry. You should get a Raspberry Pi with ROS and control the ODrive that way.

How would you do it with a Raspi and ROS? That’s the setup I’m using plus an Arduino between the ODrives and Raspi.

I would ditch the arduino and get a USB-CAN or SPI-CAN adapter for the Rapberry Pi.
A few people here have written simple Python ROS nodes which use the CAN interface.

I’ve tried using the CAN interface before with different hardware without much success but maybe it’s worth a revisit. That doesn’t solve the problem though of how to configure the ODrive or what data to send the ODrive to enable smooth motion between waypoints

For smooth motion, I’d suggest to use controller.input_mode=INPUT_MODE_POS_FILTER and adjust controller.config.pos_filter_bandwidth. Then you can update the position as fast as you like with the CAN position commands, and it will smooth out the differences between setpoints.

For configuration, you can use USB and save the config to the ODrive.

Can controller.config.pos_filter_bandwidth be updated and applied while in motion or between setpoints?

Yes, it can be updated at each time step (8kHz)

I’m not sure why you’d need or want to though. The idea is that you set the pos_filter bandwidth according to how fast you are able to update the position from your application.

Also, to set this from CAN, would require you to add a new message to the protocol. This isn’t difficult but it would need a custom firmware build.