Motion Stack
From modular robots with distributed computation, to a simple robotic arm, the motion stack provides control for (multi-)limbed systems. The goal of the project is maximum flexibility reflecting the flexibility of modular robotics, while abstracting away the complexity of such systems.
Table of Contents:
Features
Modular – any limb anywhere on the robot.
Distributed – any process anywhere on the network (ROS2 interface).
Runtime hardware agnosticism – adapts in real-time to robot characteristics.
Separation of concerns – team-member implementations and robot specificities, minimally impacts the other systems.
Inverse Kinematics – 3Dof and above.
Multi-limb synchronization
TUI included – control your robot through a Terminal User Interface.
Customizable interfaces – Use the API and override the source-code for your robot and team.
URDF parser
Flexible launch system
Documented example of Moonbot Zero

Motion-Stack API synchronizing 3 different robots over the network, totaling 6 end-effectors.
Upcomming Features
Deprecation of lvl 3, 4 Level 3 and 4 have been replaced by the much safer and versatile high level API.
Ros2 Structure Overview
The current basic structure can be interpreted as the following tree:
| levels
| 00 | 01 | 02 | 03 | 04 | 05 |
| Motor X -- Joint 0 -- |
| Motor X -- Joint 1 -- +- IK 0 -- Leg 0 -- |
| Motor X -- Joint 2 -- | |
| |
| Motor X -- Joint 0 -- | |
| Motor X -- Joint 1 -- +- IK 1 -- Leg 1 -- +- Mover -- Gait
| Motor X -- Joint 2 -- | |
| |
| ... -- |
The power of this structure lies in its modularity. Packages responsible for a level can be swapped in/out for other packages responsible for the same level.
For example: - When using the real robot, dynamixel_hotplug_ros2_python is used. - When testing without the robot, rviz_basic is used.
| levels
| 00 | 01 | 02 | 03 | 04 | 05 |
| ---------------------packages----------------------------
| | motion stack
| ---------------------------------------------------------
| rviz basic |
| ---------------------------------------------------------
| dynamixel... |
| ---------------------------------------------------------
| Maxon motr... |
All robots are different. You can easily override relevant parts of the code and use it like an API in which you inject your custom code. Examples and tools are provided for this purpose. This way, you do not need to create a new, complex ROS2 node to adapt to the quirks of your robot—just change what you need directly.
| levels
| 00 | 01 | 02 | 03 | 04 | 05 |
| ---------------------packages----------------------------
| | motion stack
| ---------------------------------------------------------
| Overrides for my robot | | Robot-Agnostic API
| ---------------------------------------------------------
Operator TUI:
Deprecated Code:
- easy_robot_control package
- Subpackages
- Submodules
- easy_robot_control.EliaNode module
- easy_robot_control.gait_key_dev module
- easy_robot_control.gait_node module
- easy_robot_control.ik_heavy_node module
- easy_robot_control.joint_state_interface module
- easy_robot_control.lazy_joint_state_publisher module
- easy_robot_control.leg_api module
- easy_robot_control.leg_node module
- easy_robot_control.mover_node module