Skip to content

Releases: frankarobotics/franka_ros2

franka_ros2 v3.5.2

Choose a tag to compare

@github-actions github-actions released this 17 Aug 08:36

Requires libfranka >= 0.20.4 and franka_description >= 2.9.0 requires ROS 2 Jazzy

  • fix: updated franka_description to 2.9.0

franka_ros2 v3.5.1

Choose a tag to compare

@github-actions github-actions released this 14 Aug 15:14
  • fix: accelerometers data is float in libfranka 0.20.5

franka_ros2 v3.5.0

Choose a tag to compare

@github-actions github-actions released this 14 Aug 13:24
  • feat: add TMR battery ROS 2 support in franka_mobile (sensor_msgs/BatteryState
    topic at 1 Hz and std_srvs/Trigger services for wireless charging), with an
    internal franka_desk_api HTTPS helper used by the spine and battery clients.

  • fix: franka_hardware tests now run in isolated ROS domains to avoid possible collisions.

  • fix: fixed franka_hardware stop motion test to check for stopping_joint_positions matching the last
    commanded target instead of zero positions.

  • fix: tune mobile teleop velocity/acceleration limits to stay within the RCU
    2-norm bounds. Raise swerve translational limits to 0.35 m/s / 0.4 m/s^2 and
    rotational to 0.5 rad/s / 0.3 rad/s^2 in controllers.yaml, rescale the xbox
    normal/turbo axes in xbox.config.yaml to match max_velocity, and reduce
    the joystick deadzone (0.1) with a higher autorepeat rate (50 Hz) in
    mobile_teleop.launch.py for smoother teleop.

  • fix: the description extension entry points and the mobile fr3 duo moveit config no longer
    hardcode the franka hand's tcp offset, so a cobot pump mounted on them is placed at its own
    0 0 0.105 instead of the hand's 0 0 0.1034. Requires franka_description with the resolved
    tcp_xyz default. MIGRATION: pass tcp_xyz explicitly to keep the previous value; the franka
    hand is unaffected.

  • fix: BREAKING CHANGE thread-safe access to robot state interface (changed from RealtimeBuffer to RealtimeThreadSafeBox).
    This fixes possible race conditions that could happen when running the broadcaster and the
    cartesian impedance example controller (e.g. via the franka_semantic_components::FrankaRobotModel) with async=true.
    Users of the franka_semantic_components::FrankaRobotState should be not impacted, only direct state interface users claiming the hardware interface.

  • fix: default thread priority for franka_hardware interface threads is now 98 (was 50) to
    ensure RT stability.

  • fix: recover from a franka::ControlException without restarting
    ros2_control_node. franka_robot_state_broadcaster and
    joint_state_broadcaster stay lifecycle-active. One update cycle may
    publish the pre-fault / frozen sample after read() latches, then the
    controller-manager update thread blocks for the approximately two-second
    braking stop and topic publication pauses; after the block, inactive-state
    reads resume and publish live reflex state. After clearing the robot error,
    only the command controller needs reactivation.

  • docu: add an umbrella guide for the relocated description extensions,
    including composition layers, mounting points, prefix rules, and external
    gripper attachment.

  • docs: comprehensive documentation audit and fixes across 12 packages — corrected
    inaccurate launch arguments, removed references to non-existent files, fixed API method
    names, updated parameter names to match code, added undocumented launch args, improved
    grammar and user experience. Fixed tuple default bug in
    franka_vision_and_manipulation_kit launch file.

  • fix: align MoveIt gripper controller name with actual gripper node name.
    fr3_controllers.yaml and moveit.launch.py referenced fr3_gripper
    but the node is launched as franka_gripper, breaking gripper action commands
    and joint state aggregation in MoveIt. (GitHub PR #206)

  • test: comprehensive no-hardware test suite

    • Add controller load test covering all 16 example controllers (one GTest case each)
    • Add launch file parsing validation for 19 first-party launch files
    • Add fake-hardware integration tests (controller spawn, activate, verify)
    • Add fake-hardware test config files
      (test_fake_hardware_{fr3,fr3_duo,mobile_fr3_duo,tmr}.config.yaml)
    • Register test_gripper_topic_consistency.py in franka_fr3_moveit_config
  • ci: improve Jenkins pipeline test coverage

    • Fix package regex to include mobile_fr3_duo_trajectory_controller and
      franka_bringup structural tests (previously silently dropped)
    • Isolate Gazebo tests into separate optional stage
    • Add executeGazeboTests parameter (default: false)
  • fix: add missing dependencies in package.xml for isolated builds
    (rclcpp_components in franka_hardware; rclcpp_lifecycle, urdf, eigen,
    controller_interface in franka_semantic_components). Fixes rosdep-based
    fresh-environment builds. (community contribution: GitHub PRs #96, #169)

  • refactor: decoupled simulation backend selection from the franka_hardware ros2_control
    macros and removed all Gazebo-specific content from franka_description. The hardware
    <plugin> block (real / mock / gazebo) and the gz_ros2_control <gazebo> system
    element are now injected by the owning package (franka_bringup for real/mock, franka_gazebo
    for gazebo) instead of being selected by xacro:if inside franka_hardware. Mode and
    interface selection moved up to the entry-point URDFs as implementation-agnostic capability
    flags (effort command, finger joint, passive base, self-collision geometry), replacing the
    former gazebo / gazebo_effort semantic flags. franka_description no longer contains
    any Gazebo tags, macros, or arguments — the Gazebo SDF/transmission machinery, the world
    anchor, and self-collision suppression now live in franka_gazebo, making franka_description
    simulator-agnostic. All robot × mode URDF expansions remain byte-identical to before the
    refactor.

franka_ros2 v2.7.0

Choose a tag to compare

@github-actions github-actions released this 14 Aug 12:43
  • feat: add TMR battery ROS 2 support in franka_mobile (sensor_msgs/BatteryState
    topic at 1 Hz and std_srvs/Trigger services for wireless charging), with an
    internal franka_desk_api HTTPS helper used by the spine and battery clients.
  • fix: franka_hardware tests now run in isolated ROS domains to avoid possible collisions.
  • fix: fixed franka_hardware stop motion test to check for stopping_joint_positions matching the last
    commanded target instead of zero positions.

franka_ros2 v2.6.0

Choose a tag to compare

@github-actions github-actions released this 10 Aug 08:50

Requires libfranka >= 0.20.4 and franka_description >= 2.8.1 requires ROS 2 Humble

  • fix: tune mobile teleop velocity/acceleration limits to stay within the RCU
    2-norm bounds. Raise swerve translational limits to 0.35 m/s / 0.4 m/s^2 and
    rotational to 0.5 rad/s / 0.3 rad/s^2 in controllers.yaml, rescale the xbox
    normal/turbo axes in xbox.config.yaml to match max_velocity, and reduce
    the joystick deadzone (0.1) with a higher autorepeat rate (50 Hz) in
    mobile_teleop.launch.py for smoother teleop.
  • test: add a no-hardware integration test suite: a fake-hardware FR3
    controller-lifecycle test, a Joy→cmd_vel teleop test, a launch-file parsing test,
    a MoveIt planning smoke test with a gripper name-consistency check, and a single
    GTest that loads every example controller. moveit.launch.py gains a
    use_rviz argument so the smoke test can run headless. The CI test stage
    now selects franka_bringup, which the package filter had excluded, so its
    tests are executed rather than only built.
  • fix: align MoveIt gripper controller name with actual gripper node name.
    fr3_controllers.yaml and moveit.launch.py referenced fr3_gripper
    but the node is launched as franka_gripper, breaking gripper action commands
    and joint state aggregation in MoveIt. (GitHub PR #206)
  • fix: add missing dependencies in package.xml for isolated builds
    (rclcpp_components in franka_hardware; rclcpp_lifecycle, urdf,
    eigen in franka_semantic_components). Fixes rosdep-based fresh-environment
    builds. (community contribution: GitHub PRs #96, #169)
  • refactor: BREAKING CHANGE decouple the simulation backend (real/mock/gazebo) from the
    franka_hardware ros2_control macros (franka_arm and tmrv0_2). The hardware
    <plugin> block and the gz_ros2_control <gazebo> system element are now
    injected by the owning package (franka_bringup for real/mock,
    franka_gazebo_bringup for gazebo) instead of being selected by xacro:if
    inside franka_hardware. Mode/interface selection moved to the entry-point URDFs as
    capability flags (include_effort_command, include_finger_joint,
    include_passive_base), replacing the former gazebo / gazebo_effort
    flags. URDF expansions remain behavior-equivalent.
  • fix: collapse five duplicate top-level /**: keys in franka_gazebo_bringup's
    franka_gazebo_controllers.yaml into one. YAML last-key-wins was silently
    dropping the controller_manager type declarations, blocking the tmr gazebo launch.

franka_ros2 v3.4.1

Choose a tag to compare

@github-actions github-actions released this 07 Jul 16:05

Requires libfranka >= 0.20.4 and franka_description >= 2.8.0 requires ROS 2 Jazzy

  • feat: add tmr launch file in franka bringup and use it for the mobile teleop launch file

franka_ros2 v2.5.1

Choose a tag to compare

@github-actions github-actions released this 07 Jul 16:02

Requires libfranka >= 0.20.4 and franka_description >= 2.8.0 requires ROS 2 Humble

  • feat: add tmr launch file in franka bringup and use it for the mobile teleop launch file

franka_ros2 v3.4.0

Choose a tag to compare

@github-actions github-actions released this 23 Jun 12:46

Requires libfranka >= 0.20.4 and franka_description >= 2.8.0 requires ROS 2 Jazzy

  • feat: expose K_F_ext_hat_K as ForceTorqueSensor state interfaces (force.x/y/z,
    torque.x/y/z) on the <arm_prefix><robot_type>_tcp sensor, enabling direct wrench
    consumption at control frequency without a topic bridge.

  • fix(franka_mobile): enable jerk limiting on the swerve_drive_controller velocity
    limiter (linear x/y, angular z) so the commanded base velocity ramps with a bounded
    acceleration onset, preventing the firmware cartesian_motion_generator_velocity_discontinuity
    reflex from aborting base motion when switching between whole-body and base-only control.
    The rate-limiter timestep is fixed at the nominal 1 kHz control period.

  • BREAKING CHANGE: collision_detected topic now uses best_effort QoS (SensorDataQoS);
    thread-safe atomics for collision state in example controllers.
    Subscribers using the default reliable QoS will no longer receive messages.
    To migrate, set the subscriber QoS to best_effort (SensorDataQoS):

    .. code-block:: cpp

    // Before (default reliable QoS — no longer receives messages):
    auto sub = node->create_subscription<std_msgs::msg::Bool>(
    "collision_detected", 1, callback);

    // After (best_effort QoS):
    auto sub = node->create_subscription<std_msgs::msg::Bool>(
    "collision_detected", rclcpp::SensorDataQoS(), callback);

  • refactor: Removed the robot_description from launch files - controller_manager gets it natively via topic

  • docu: Added documentation for error recovery after an FCI error.

  • fix: Pinocchios collision detection component dropped the 'fcl/hpp' namespace and only supports now the coal namespace

  • feat: added a model-based gravity-compensation system plugin
    (franka_gazebo_hardware::GazeboGravityCompensationSystem) for gz_ros2_control that
    injects pinocchio-computed gravity torque on the effort-controlled arm joints, so the
    zero-torque example controllers behave in Gazebo as on the real robot (where the master
    controller performs gravity compensation) instead of collapsing under gravity.

  • chore: restructured the Gazebo support into two packages under the franka_gazebo/
    grouping folder: franka_gazebo_bringup (launch/world/urdf/config assets) and
    franka_gazebo_hardware (the gz system plugin). The public launch command
    ros2 launch franka_gazebo_bringup <file> is unchanged; the plugin is now referenced as
    franka_gazebo_hardware/GazeboGravityCompensationSystem.

  • chore: removed the per-link <gravity>false</gravity> xacro overrides; gravity is now
    enabled globally in the Gazebo world. This is engine-independent (the previous approach
    relied on a gz-fortress gravity-disable behavior that is not forwarded by some physics
    engines). Simulation-only behavior change; no impact on real-robot users.

  • feat: hold the mobile platform (mobile_fr3_duo_v0_2) prismatic
    franka_spine_vertical_joint against gravity with a spine_joint_trajectory_controller
    (JointTrajectoryController on a position command interface) that holds the column at its
    initial height.

franka_ros2 v2.5.0

Choose a tag to compare

@github-actions github-actions released this 23 Jun 12:59

Requires libfranka >= 0.20.4 and franka_description >= 2.8.0 requires ROS 2 Humble

  • chore: split the gazebo sources into two packages, franka_gazebo_bringup
    (launch files, worlds, robot descriptions, controller configs) and
    franka_gazebo_hardware (the gz_ros2_control gravity-compensation system plugin,
    franka_gazebo_hardware/GazeboGravityCompensationSystem). The public
    ros2 launch franka_gazebo_bringup ... command is unchanged.

  • fix: franka_gazebo_bringup: fix launch file for gazebo (use world without gravity by default for example controllers)
    Requires libfranka >= 0.20.4 and franka_description >= 2.7.0 requires ROS 2 Humble
    Requires libfranka >= 0.20.4 and franka_description >= 2.8.0(?) requires ROS 2 Jazzy

  • feat: expose K_F_ext_hat_K as ForceTorqueSensor state interfaces (force.x/y/z,
    torque.x/y/z) on the <arm_prefix><robot_type>_tcp sensor, enabling direct wrench
    consumption at control frequency without a topic bridge.

  • BREAKING CHANGE: collision_detected topic now uses best_effort QoS (SensorDataQoS);
    thread-safe atomics for collision state in example controllers.
    Subscribers using the default reliable QoS will no longer receive messages.
    To migrate, set the subscriber QoS to best_effort (SensorDataQoS):

  • feat: Added franka_spine packages (franka_spine_msgs, franka_spine_server, franka_spine_examples) — ROS 2 action/service server for controlling the Franka Spine module

  • docu: Added documentation for error recovery after an FCI error.

  • refactor: Removed the dead auto_declare<std::string>("robot_description", "") parameter from the joint position/velocity example controllers - the URDF is obtained from robot_state_publisher via the parameters client, so the declaration was unused.

  • chore: devcontainer container name now derives from the workspace folder basename (<folder>_humble) so variant clones no longer collide on a fixed container name.

franka_ros2 v3.3.0

Choose a tag to compare

@github-actions github-actions released this 04 May 10:34

Requires libfranka >= 0.20.4 and franka_description >= 2.7.0 requires ROS 2 Jazzy

  • feat: Added the spline action server and examples for the Franka Spine

  • chore: refactored gazebo launch files, added integration tests

  • chore: refactored mFR3duo example controller to be gazebo independent by chaining swerve_ik_controller

  • chore: removed vendored controller_manager

  • feat: Added franka_mobile package with swerve_drive_controller (tf and odom support) and swerve_ik_controller for gazebo sim.

  • docu: Maintenance work on documentation

  • feat: add franka_vision_and_manipulation_kit package with urdf descriptions and launch files for the Franka Vision and Manipulation Kit

  • refactor: replace blocking mutex in franka_robot_state_broadcaster with lock-free AsyncBuffer

  • BREAKING CHANGE: franka_robot_state_broadcaster convenience topics are published with best_effort QoS

  • chore: Added a CI job to try backporting jazzy to humble

  • BREAKING CHANGE: franka_robot_state_broadcaster convenience topics are published with best_effort QoS.
    Topics affected: current_pose, stiffness_frame_wrench, and all other convenience topics
    from the broadcaster. Subscribers using the default reliable QoS will no longer receive
    messages. To migrate, set the subscriber QoS to best_effort:

    C++ (rclcpp)

    .. code-block:: cpp

    // Before (default reliable QoS — no longer receives messages):
    auto sub = node->create_subscription<geometry_msgs::msg::PoseStamped>(
    "current_pose", 10, callback);

    // After (best_effort QoS):
    rclcpp::QoS qos(10);
    qos.best_effort();
    auto sub = node->create_subscription<geometry_msgs::msg::PoseStamped>(
    "current_pose", qos, callback);

    Python (rclpy)

    .. code-block:: python

    Before (default reliable QoS — no longer receives messages):

    self.create_subscription(PoseStamped, 'current_pose', callback, 10)

    After (best_effort QoS):

    from rclpy.qos import QoSProfile, ReliabilityPolicy
    qos = QoSProfile(depth=10, reliability=ReliabilityPolicy.BEST_EFFORT)
    self.create_subscription(PoseStamped, 'current_pose', callback, qos)

  • feat: franka_vision_and_manipulation_kit package used in Gazebo to display the sensors of the kit

  • fix: clang-tidy test duration reduced by applying a filter

  • feat: added a gazebo example for fr3 duo using the franka vision and manipulation kit

  • fix: teleop node is publishing correctly if there is no namespace

  • feat: Added moveit support for mobile fr3 duo

  • feat: Updated franka_selfcollision package to support mobile_fr3_duo in addition to fr3_duo

  • fix: resolve segfault caused by ABI mismatch between hardware_interface and controller_manager C++ (rclcpp)

  • chore: Unify ros2_control (Jazzy) sources to avoid ABI mismatches (add ros2_control to dependency.repos so hardware_interface/controller_manager build from the same ABI;
    remove the standalone hardware_interface fork; keep manage_overruns for async hardware components via a small patch auto-applied in franka_entrypoint.sh).
    BREAKING: existing workspaces must be cleaned before rebuilding: rm -rf build/ install/ && colcon build

  • fix: Removed the franka_robot_state_broadcaster while using the TMR

  • fix: With async control, it could happen that the robot_state is teared while publishing. This fix provides a
    lock-free intermediate buffer to allow mutual exclusive robot_state buffer data access.

  • fix: improved integration test reliability

  • chore: Removed the explicit self collision example and added it by default to the fr3 duo and mobile fr3 duo examples

  • fix: make FrankaHardwareInterface error recoverable

  • refactor: FrankaHardwareInterface to use enums for the control mode

  • fix: ActionServers crashing when exception is not caught

  • fix: re-enable franka_gazebo_bringup launch tests with robust gz sim cleanup between tests