Releases: frankarobotics/franka_ros2
Release list
franka_ros2 v3.5.2
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
- fix: accelerometers data is float in libfranka 0.20.5
franka_ros2 v3.5.0
-
feat: add TMR battery ROS 2 support in
franka_mobile(sensor_msgs/BatteryState
topic at 1 Hz andstd_srvs/Triggerservices for wireless charging), with an
internalfranka_desk_apiHTTPS 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 incontrollers.yaml, rescale the xbox
normal/turbo axes inxbox.config.yamlto matchmax_velocity, and reduce
the joystick deadzone (0.1) with a higher autorepeat rate (50 Hz) in
mobile_teleop.launch.pyfor 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.105instead of the hand's0 0 0.1034. Requires franka_description with the resolved
tcp_xyzdefault. MIGRATION: passtcp_xyzexplicitly 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 thefranka_semantic_components::FrankaRobotModel) with async=true.
Users of thefranka_semantic_components::FrankaRobotStateshould 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::ControlExceptionwithout restarting
ros2_control_node.franka_robot_state_broadcasterand
joint_state_broadcasterstay lifecycle-active. One update cycle may
publish the pre-fault / frozen sample afterread()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.yamlandmoveit.launch.pyreferencedfr3_gripper
but the node is launched asfranka_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.pyin franka_fr3_moveit_config
-
ci: improve Jenkins pipeline test coverage
- Fix package regex to include
mobile_fr3_duo_trajectory_controllerand
franka_bringupstructural tests (previously silently dropped) - Isolate Gazebo tests into separate optional stage
- Add
executeGazeboTestsparameter (default: false)
- Fix package regex to include
-
fix: add missing dependencies in package.xml for isolated builds
(rclcpp_componentsin franka_hardware;rclcpp_lifecycle,urdf,eigen,
controller_interfacein 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 byxacro:ifinside 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
formergazebo/gazebo_effortsemantic 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
- feat: add TMR battery ROS 2 support in
franka_mobile(sensor_msgs/BatteryState
topic at 1 Hz andstd_srvs/Triggerservices for wireless charging), with an
internalfranka_desk_apiHTTPS 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
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 incontrollers.yaml, rescale the xbox
normal/turbo axes inxbox.config.yamlto matchmax_velocity, and reduce
the joystick deadzone (0.1) with a higher autorepeat rate (50 Hz) in
mobile_teleop.launch.pyfor 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.pygains a
use_rvizargument so the smoke test can run headless. The CI test stage
now selectsfranka_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.yamlandmoveit.launch.pyreferencedfr3_gripper
but the node is launched asfranka_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_componentsin franka_hardware;rclcpp_lifecycle,urdf,
eigenin 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_armandtmrv0_2). The hardware
<plugin>block and the gz_ros2_control<gazebo>system element are now
injected by the owning package (franka_bringupfor real/mock,
franka_gazebo_bringupfor gazebo) instead of being selected byxacro: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 formergazebo/gazebo_effort
flags. URDF expansions remain behavior-equivalent. - fix: collapse five duplicate top-level
/**:keys in franka_gazebo_bringup's
franka_gazebo_controllers.yamlinto one. YAML last-key-wins was silently
dropping the controller_manager type declarations, blocking the tmr gazebo launch.
franka_ros2 v3.4.1
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
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
Requires libfranka >= 0.20.4 and franka_description >= 2.8.0 requires ROS 2 Jazzy
-
feat: expose
K_F_ext_hat_KasForceTorqueSensorstate interfaces (force.x/y/z,
torque.x/y/z) on the<arm_prefix><robot_type>_tcpsensor, 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 firmwarecartesian_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 defaultreliableQoS will no longer receive messages.
To migrate, set the subscriber QoS tobest_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_jointagainst gravity with aspine_joint_trajectory_controller
(JointTrajectoryController on a position command interface) that holds the column at its
initial height.
franka_ros2 v2.5.0
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_KasForceTorqueSensorstate interfaces (force.x/y/z,
torque.x/y/z) on the<arm_prefix><robot_type>_tcpsensor, 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 defaultreliableQoS will no longer receive messages.
To migrate, set the subscriber QoS tobest_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
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_mobilepackage withswerve_drive_controller(tf and odom support) andswerve_ik_controllerfor 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 defaultreliableQoS will no longer receive
messages. To migrate, set the subscriber QoS tobest_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_broadcasterwhile 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