stub — This page will be curated before publishing. Content below reflects the current implementation.
When to use it
EnableJointControllerMixin (use_joint_controller=True) when MQTT joint/update teleop targets should be smoothed before reaching hardware — instead of applying every target instantly.
Arm commands (ee_move, grip, …) from ArmCapabilityMixin use the same controller path when both mixins are composed.
Full mixin composition: Driver mixins and capabilities.
Default: trapezoidal motion
With no override,joint_controller_motion() returns trapezoidal_motion. The controller:
- Reads current positions from
_current_joint_positions()(often viaRos2JointFeedbackMixin) - Builds a time-parameterized waypoint stream from velocity limits
- Calls
joint_controller_after_process()for each waypoint (typicallysubmit_joint_targets→tick()→ hardware)
Passthrough mode
ReturnNone from joint_controller_motion() to forward a single waypoint per target with no SDK shaping:
JointState command topics). The Agilex Piper driver follows this pattern: MQTT targets queue immediately; Piper-specific templates live in the ROS publish path.
Custom generators
Implement aMotionGenerator callable and return it from joint_controller_motion() for alternate profiles (minimum-jerk, s-curve, etc.). See cyberwave.driver.control.motion in the Python SDK.
Required seams
Do not register your own
joint/update listener when use_joint_controller=True — the mixin owns teleop ingress.
Related
- Driver mixins — MRO,
JointCommandBufferMixin, bidirectionaljoint/update - BaseROS2Driver —
from_rosfeedback vs teleop listener