My first response would be: all of those, good suggestions (perhaps maybe the first two).
But thinking about it a bit more I would like to see:
maintain deterministic execution in everything (ie: hard real-time capability, not as a requirement (so keep components capable of running in deterministic environments, but don’t require it: see executors below))
support chaining controllers natively (probably using topics for input/output?), no subclassing
support mimo setups (should be doable if the previous item lands)
support industry-standard trajectory generators (almost off-topic, but you asked about joint_trajectory_controller, so: trapezoidal / s-curve profiles / higher-order interpolation / jerk-limited, etc)
Cartesian controllers (would probably require a Cartesian msg set as well …)
fully support managed nodes:
distribution and scheduling of controllers and other infrastructure with executors
full component life-cycle (error states, recovery mechanisms, etc) and management
full support for composite nodes (components?) with the associated benefits (zero-copy msg passing, node spin scheduling (pipelines fi), etc)
usability: more clearly document controller hierarchy ("position_controllers/JointPositionController ignores my PID parameters?")
usability: don’t call everything a “controller” (joint_state_controller)
C++11/14/17/20?
controllers in languages other than C++ (integration with ML/AI frameworks?)
And I’m sure I’m missing some things I’ve though of over the years. Others will post those probably.
ros-controls/ros_control#174 has some previous discussion on using a message/port based framework underneath ros_control (ie: OROCOS).
MachineKit devs have done a bit of work with ros_control and MachineKit integration, perhaps @zultron and @machinekoder have some inputs.
We achieved this with a custom Hardware Interface package that would allow controllers to “share” the control over a single interface (like Position PID + Gravity compensation), and sum their component efforts to achieve the desired command without needing to worry about Gravity-related forces.
The code is all there on github, but I never took the time to figure out how to contribute the useful bits back to ros_controls. I’d be interested in helping make this part of the ROS2 ros_controls Hardware Interface.
For me hard realtime would be a requirement I think. Also it would be nice to maybe start leaning on orocos for some of the desired capabilities like controllers spinning at diff rates
I am missing following features in the current ros_control implementation:
“My research needs interconnected controllers, the output of one is the input of the other.”
Cascade Control (e.g.) - This can be currently done, but it is not nice. i am doing it with inheritance.
maybe I do not understand something here, but I found my solution as not nice, but it works
“We need a more extendable framework (flexible hardware_interfaces) while maintaining the realtime-safe qualities.”
Clear separation of RobotHW on sensors and actuators. This would enable easier integration of external sensors, e.g. FTS on an industrial robot
for this we started implementing an extension called combined robot_sensor_hw because currently one has to extend RobotHW directly and then robot package has new dependencies… an example of this can be found here.
this would mean to have HWInterface as base with SensorHW and ActuatorHW extending it. Then the RobotHW has list of SensorHWs and ActuatorHWs so one could simply add new sensors to it. Everything can be solved nicely over Pluginlib to avoid unnecessary dependencies.
IMHO this would be more control-theory approach
“I need all the controllers.”
Thanks for asking this. If you need any help with first two topics I could provide some input and implementation effort since we have kind of non-standard solution.
Thanks! I would be very interested to see how much of this could be integrated into the current ros_control codebase (switches to dodgy whisper perhaps even for melodic).
How would you propose to do this?
Doesn’t the switch interface cover this already?
Most components that support modes at the hardware level require at least one update cycle (sending out CAN/ETHERCAT messages) to change the mode, that’s partly why we have such a rigid system. Very similar to lifecycles of OROCOS components if you are familiar with that.
I’m not very familiar with OROCOS. I think I caused some confusion by saying “instantaneous switching”. What I really want is to avoid switching controllers, period.
Why not a single velocity controller that accepts both trajectory commands and instantaneous velocity commands? While following a trajectory, if a new, instantaneous jog command comes in, the robot halts (as quickly as possible) then begins to follow the instantaneous velocity command. This PR does that: https://github.com/ros-controls/ros_controllers/pull/393 Instantaneous velocity commands always preempt trajectories.
Thus, no controller switching is needed.
The next level would be to blend the velocities so it’s not necessary to halt at a transition.
It would also be possible to blend position commands, but I didn’t have a need to take it that far.