Skip to content

Commit 7d7ac97

Browse files
committed
chore: update docs
1 parent a54cfd4 commit 7d7ac97

2 files changed

Lines changed: 42 additions & 2 deletions

File tree

docs/getting_started_controller_details.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,47 @@ The nullspace position can be set with `robot.set_target_joint(...)` when using
6969
It will publish a target joint position which is interpreted as the nullspace target.
7070

7171

72+
## Variable Stiffness
73+
74+
Both the joint and Cartesian controllers support **variable stiffness**, where the proportional gains $\mathbf{K}_p$ can be dynamically adjusted at runtime via a dedicated ROS2 topic. This enables adaptive compliance — for example, lowering stiffness during contact-rich phases and increasing it for precise positioning. The variable stiffness range is bounded by configurable minimum and maximum values.
75+
76+
## Admittance Control
77+
78+
The admittance controller adds a force-reactive layer on top of the Cartesian impedance controller, enabling compliant interaction with the environment using an external force/torque sensor.
79+
80+
The controller has two cascaded loops:
81+
82+
### Inner Loop: Admittance (Virtual Mass-Spring-Damper)
83+
84+
The admittance layer maintains an internal pose state $x_{inner}$ that evolves as a virtual mass-spring-damper driven by external forces:
85+
86+
$$M_{adm} \ddot{x} + D_{adm} \dot{x} + K_{adm} (x_{inner} - x_{desired}) = F_{ext}$$
87+
88+
where:
89+
90+
- $M_{adm}$ — virtual inertia matrix ($6 \times 6$ diagonal), controls how quickly the system responds
91+
- $D_{adm}$ — virtual damping matrix ($6 \times 6$ diagonal), controls oscillation suppression
92+
- $K_{adm}$ — virtual stiffness matrix ($6 \times 6$ diagonal), controls how strongly the system returns to $x_{desired}$
93+
- $F_{ext}$ — external wrench from the F/T sensor topic, transformed from the sensor measurement frame to world-aligned frame using Pinocchio's `changeReferenceFrame`
94+
- $x_{desired}$ — the commanded target pose (from `target_pose` topic)
95+
96+
!!! note
97+
This requires an **external F/T sensor** (or the robot's built-in external wrench estimation, e.g. as provided by Franka manipulators). The URDF must include a separate frame for the F/T sensor measurement — the controller transforms the measured force from the local sensor frame to the world-aligned Pinocchio frame.
98+
99+
**Integration** uses semi-implicit Euler on the SE(3) manifold at each control cycle:
100+
101+
$$\ddot{x} = M_{adm}^{-1} \left( F_{ext} - D_{adm} \dot{x}_{inner} - K_{adm} \cdot \text{Error}(x_{inner}, x_{desired}) \right)$$
102+
103+
$$\dot{x}_{inner} \leftarrow \dot{x}_{inner} + \ddot{x} \cdot \Delta t$$
104+
105+
$$x_{inner} \leftarrow \exp_6(\dot{x}_{inner} \cdot \Delta t) \cdot x_{inner}$$
106+
107+
The pose error $\text{Error}(x_{inner}, x_{desired})$ is computed using separate $\mathbb{R}^3$ translational and $SO(3)$ rotational errors (rather than a full $SE(3)$ logarithmic map) to avoid unnatural screw motions.
108+
109+
### Outer Loop: Impedance
110+
111+
The resulting pose $x_{inner}$ from the admittance layer is used as the target for an outer Cartesian impedance controller, which computes the required joint torques (identical to the [Cartesian control](#cartesian-control) described above).
112+
72113
## Safety and extras
73114

74115
The actual torque commands sent to the robot are clamped to the allowed torque limits and torque rate limits defined in the config.

docs/index.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,7 @@ Grippers tested in real hardware:
171171
<!---->
172172

173173
Many thanks community contributions:
174-
175-
- Lev Kozlov [@lvjonok](https://github.com/lvjonok) for testing and providing interfaces for the Panda/FER and UR with pixi.
174+
- Ivan Domrachev [@domrachev03](https://github.com/domrachev03) and Lev Kozlov [@lvjonok](https://github.com/lvjonok) for implementing the variable stiffness and admittance controllers, and also for testing and providing interfaces for the Panda/FER and UR with pixi.
176175
- Vincenzo Orlando [@VinsOrl09](https://github.com/lvjonok) for testing and providing interfaces for the UR robots in docker containers.
177176
- Linus Schwarz [@Linus-Schwarz](https://github.com/Linus-Schwarz) for testing and providing interfaces for the BOTA force-torque sensors.
178177
- Niklas Schlueter [@niklasschlueter](https://github.com/niklasschlueter) for testing and providing interfaces for the DynaArm robot.

0 commit comments

Comments
 (0)