Advice for quadruped controller using ROS2 tools

Hello all, this is my first time posting out to the ROS community so please let me know if I miss any forum etiquette or anything like that.

I’m looking for advice and opinions on the implementation of a quadrupedal robot controller purely for my own learning. That is, I’ve already completed a quadruped robot as my capstone project during undergrad and there are things I wish I would’ve done (better) differently. I will link the archived GitHub repository just for reference in this topic.

Anyways, my previous approach was very simple, but not very reliable.

Footpath generator (not necessarily a trajectory generator!) → inverse kinematics node → serial communication node to an Arduino for hardware control. In my case, each “->” would represent a topic where data moved down the chain of command (see repo for more context).

I’ve been looking into ways I could’ve improved on this robot, and one idea I’ve considered is using the joint_trajectory_controller for the ros2_control stack. One approach would be using a chained controller in which the high level controller would take the job of my “footpath generator node” and the “inverse kinematics node”, and create trajectories for each of the four leg’s controllers to use in the joint space. The four joint trajectory controllers would ideally be synchronized, as a quadrupedal robot needs for proper balance, because they are all controlled by the footpath generator. Another, possibly simpler approach, would be to use a chainable controller, but instead of a joint trajectory controller for each leg there would be one footpath generator and one joint trajectory controller to synchronize all 12 degrees of freedom in the same trajectory.

Since the joint trajectory controller can use both actions and topics to receive “JointTrajectory” messages, which might be the better approach? Since the footpaths (in a simple, naive approach for gait control that doesn’t change over time or adapt) are cyclic in nature, would a topic interface make more sense here than an action interface? Furthermore, is the approach with a joint trajectory controller a good choice for this type of robot, and if not, why? What might you do if you were making a quadruped controller? Whats tools have I overlooked in ros2 that may be applicable here?

Again, I’m purely asking for advice to improve my skills in ROS for future projects, I am not working on a quadruped robot anymore. I may try to work on implementing a new controller just to see how it compares to my original system, but it is not intended for any project or industry projects as of right now.

I welcome any advice, feedback, (constructive) criticism in my previous approach OR in the idea of using a joint trajectory controller. Thank you in advance if you were willing to read through all of this and I hope to have a great conversation on the topic, as I’m sure you all think quadruped robots are cool as well :).

P.S. if this conversation turns into implementation talks, I would love to be a part of it. I’m not comfortable running a community project due to lack of experience, but I would like to contribute (I’m new to open source contributions as a whole).

Kevin