Inverse Kinematics and Controls

Anvil's inverse kinematics engine and real-time control system provide smooth, responsive, and sensitive robot control and teleoperation, enabling Anvil robots to perform contact-rich and dexterous tasks, effortlessly.

Anvil's Inverse Kinematics Engine:

  • Graceful Handling of Singularities: All robot arms have degenerate configurations, called singularities, where the current joint configuration makes it challenging to move in a specific direction. Anvil’s IK engine relies on a SDLSarrow-up-right (Selectively Damped Least Squares) approach, that ensures stable solution convergence (e.g. no oscillation), even when approaching singularities or in a singularity.

  • Joint-Specific Velocity Limits: In some situations, the only way to reach a specific robot pose is to rapidly move the entire robot through a large movement. When these cases are detected, the IK engine automatically caps the overall robot speed to ensure smooth, natural movements.

  • Intuitive Nullspace Control The OpenARM uses 7 joints to control a 6 degree-of-freedom gripper pose. This results in 1 "free" degree-of-freedom, meaning that there are an infinite number of robot configurations to reach a specific desired pose. Anvil actively controls this kinematic "nullspace" to ensure that the elbows stay "pointed out" whenever possible, leading to a more intuitive control experience.

Anvil's Real-time Control Stack:

  • Gravity Compensation + Compliant Control Many robot control systems require very high control gains, to effectively hold up the weight of the entire robot. This unfortunately also leads to very stiff control, making it challenging to perform contact-rich tasks. Anvil's whole body controller includes gravity compensation via a feed-forward torque, allowing the robot to naturally hold itself up, and use significantly lower gains. This means the robot can more gracefully handle contact or collisions with the environment.

  • Synchronized whole body control over multiple CAN busses Bandwidth and latency can become bottlenecks for any performant real-time control system. Every Anvil arm uses its own dedicated CAN bus, to ensure collision-free packet communication and responsive 500 Hz control (e.g. a single Anvil OpenARM uses 2 CAN buses; one for the left arm and one for the right arm). All 4 CAN buses are then routed to a single real-time control loop to ensure synchronized, whole body control.

  • Unified control stack, across Anvil's Robot Fleet Anvil's IK engine and whole body controllers are modular in design, and can operate across the Anvil hardware fleet. All that's needed is a different robot configuration (e.g. kinematics definitions, masses, and gains). Whether you're using the Anvil OpenARM, OpenYAM, or future to-be-released Anvil robots, the same controllers and codepaths will be used.

Anvil's Kinematics and Control System Overview

Anvil's ROS2 Control Integration

Anvil's control stack is tightly integrated into ros2_control , thus making it easy to integrate with external ROS2 control systems.

Below are the key topics and integration points:

Robot Outputs:

  • /joint_states - Contains the current position, velocity, and torque of all the robot's joints.

Robot Inputs:

  • /follower_l_forward_position_controller/commands and /follower_r_forward_position_controller/commands Publishing via these topics will command the robot to try to reach the specified joint positions. Note that these commands are ignored when leader-follower teleoperation is enabled.

The full list of ROS2 topics can always be found by running ros2 topic list in your own ROS2 environment connected to the robot.

Last updated