Skip to content

feat(iiwa): add an iiwa14 config - #83

Open
lvjonok wants to merge 3 commits into
learnsyslab:mainfrom
lvjonok:feat-kuka-iiwa14-config
Open

feat(iiwa): add an iiwa14 config#83
lvjonok wants to merge 3 commits into
learnsyslab:mainfrom
lvjonok:feat-kuka-iiwa14-config

Conversation

@lvjonok

@lvjonok lvjonok commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Hello there!

I have recently had a chance to work with KUKA and tested the setup for it through crisp_controllers and crisp_py. The hardware repo is here: https://github.com/lvjonok/pixi_kuka_ros2

There might be some inaccuracies or problems, but so far it looks like it works! This PR is quite small, it actually just brings the tested config for KUKA! Let's work to bring this safely to main, so more robots get support!

iiwa_crisp_example_720p.mov

IiwaConfig.home_config was the Franka pose shared by the other configurations
in this module. It puts A4 at -135 degrees, outside the +/-120 degree A4 limit
of every iiwa in the range, so robot.home() commanded a pose the arm cannot
reach.

Replace it with [0, 30, 0, -75, 0, 75, 0] degrees, validated on an iiwa14
R820: every joint at least 45 degrees from its limit, manipulability
sqrt(det(J J^T)) of 0.126 against 0.044 for the Franka pose and exactly 0 for
the all-zeros candle pose, which is fully singular and a poor place to start a
Cartesian impedance controller.

base_frame was "world". lbr_fri_ros2_stack publishes lbr_link_0 as the root of
the arm and no "world" frame, so a target pose expressed in "world" has no
transform available.
Ready-made profile for the arm driven through lbr_fri_ros2_stack at its
default robot_name of "lbr", so Robot.from_yaml("iiwa14_r820") works without
hand-assembling a RobotConfig.

time_to_home is 10 s rather than the 5 s default: these are slow commissioning
moves made under an enabling switch.
The robot-specific examples are where arm-specific behaviour belongs, so this
replaces the circle in example_with_iiwa.py rather than adapting a numbered
example; 01_figure_eight.py stays generic and keeps defaulting to fr3.

Uses make_robot("iiwa14_r820") instead of assembling an IiwaConfig by hand.

Drops the parameter overrides. They set a task stiffness of 2500 N/m, which is
an order of magnitude above what this arm can render: the torque overlay acts
through the cabinet's own joint impedance, and asking for a stiffer impedance
than that coupling cannot be followed no matter the damping.

Homing goes through a local helper. robot.home() switches through the stock
switcher, which deactivates every active controller not ending in
"broadcaster" and offers no way to exempt one. Command interface values
persist, and lbr_ros2_control NaNs its command interfaces only once when the
hardware component activates, so deactivating the Cartesian controller leaves
its final torques applied for the whole homing move rather than invalidating
them. zero_effort_controller is held active to keep writing a real zero, and
fri_position_passthrough_controller is held across the Cartesian switch for
the same reason on the position side.

The figure is centred on the pose homing actually reached and keeps that
orientation, so the arm does not traverse the workspace to start and the first
move is not a large rotation. Tracking is plotted against the target, and
robot.target_pose is used rather than the private attribute.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant