netft_driver is a native ROS driver for ATI Ethernet Net F/T and Ethernet
Axia force/torque sensors. It supports a standalone ROS 1 or ROS 2 node and a
ROS 2 ros2_control sensor hardware plugin.
- Publishes calibrated
geometry_msgs/WrenchStampeddata in N and Nm. - Reports connection, sequence, receive-rate, and device-status diagnostics.
- Provides an explicit software-bias service.
- Integrates with the standard ROS 2 force-torque sensor broadcaster.
- Carries a reviewed private snapshot of the
netft-cppacquisition core.
| ROS distribution | Standalone driver | ros2_control plugin |
Support policy |
|---|---|---|---|
| ROS 2 Lyrical | Yes | Yes | Supported |
| ROS 2 Kilted | Yes | Yes | Supported |
| ROS 2 Jazzy | Yes | Yes | Supported |
| ROS 2 Humble | Yes | Yes | Compatibility |
| ROS 2 Rolling | Yes | Yes | Development |
| ROS 1 Noetic* | Yes | N/A | Legacy source support |
* ROS 1 Noetic is end-of-life and supported from source only.
Replace lyrical with another supported ROS 2 distribution when required.
source /opt/ros/lyrical/setup.bash
mkdir -p ~/netft_ws/src
git clone https://github.com/netft/ros-netft.git ~/netft_ws/src/netft_driver
cd ~/netft_ws
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select netft_driver
source install/setup.bashsource /opt/ros/noetic/setup.bash
mkdir -p ~/netft_ws/src
git clone https://github.com/netft/ros-netft.git ~/netft_ws/src/netft_driver
cd ~/netft_ws
rosdep update --include-eol-distros
rosdep install --from-paths src --ignore-src -r -y
catkin_make
source devel/setup.bashSee the installation guide for prerequisites and package availability.
ATI RDT permits one UDP client. Stop other RDT clients before starting the
driver. The examples use 192.168.1.1, ATI's factory-default static address;
replace it with the address assigned to your sensor.
ROS 2:
ros2 launch netft_driver netft.launch.py sensor_ip:=192.168.1.1
ros2 topic echo --once /netft/wrenchROS 1:
roslaunch netft_driver netft.launch sensor_ip:=192.168.1.1
rostopic echo -n 1 /netft/wrenchThe default bias service is /netft/bias. Bias changes the measurement zero;
call it only when the sensor and connected mechanism are in a safe state.
The plugin class is netft_driver/NetFTHardwareInterface. Include the installed
Xacro macro in the robot description managed by your controller manager:
<xacro:include filename="$(find netft_driver)/urdf/netft.ros2_control.xacro"/>
<xacro:netft_ros2_control
name="wrist_netft_hardware"
sensor_name="wrist_ft"
sensor_ip="192.168.1.1"
sensor_port="49152"
receive_timeout="0.1"
activation_timeout="2.0"/>Configure and spawn force_torque_sensor_broadcaster through the robot's
existing controller manager. The repository also installs
netft_ros2_control.launch.py as a minimal single-sensor example.
- Standalone ROS driver tutorial
ros2_controltutorial- Standalone interface reference
ros2_controlreference- Diagnostics and lifecycle
- Security and safety
Automatic sensor configuration is enabled by default. Validate the discovered calibration, units, status, freshness, and finite values before using wrench data for control. This driver is not a safety-rated control path.
See CONTRIBUTING.md for development environments, tests, hardware authorization, and native-core synchronization. Report security issues through SECURITY.md.
The repository is licensed under Apache-2.0. The private
netft-cpp snapshot retains its upstream license at
src/core/LICENSE.
Version 0.4.0 adds allow_bias for both standalone nodes and the
ros2_control hardware parameters. It defaults to true to preserve existing
service availability; set it to false for a read-only deployment. A disabled
adapter does not create the bias service. ROS 2 standalone example:
ros2 run netft_driver netft_node --ros-args -p allow_bias:=falseFor ros2_control use <param name="allow_bias">false</param> in the hardware
block, or allow_bias="false" on the supplied xacro macro. ROS 1 uses the private
~allow_bias parameter. Restart/reconfigure for parameter changes; the toggle
is not a dynamic authorization mechanism. Bias is a device command, and callers
must own permission to alter the measurement reference.
docs/bias-policy.example.xml illustrates separate SROS2 driver, reader and
operator identities: readers cannot request bias, operators can. Customize node,
namespace, topic and service names and add lifecycle permissions if needed.
The example includes logging, parameter-event publication/subscription and each node's own
parameter-service replies; it does not grant clients parameter-service requests.
It is a policy for adaptation, not an installed keystore. Enforce signed permissions with
ROS_SECURITY_ENABLE=true, ROS_SECURITY_STRATEGY=Enforce and your provisioned
ROS_SECURITY_KEYSTORE; test denied and allowed calls against a loopback sensor.
The bounded test/integration/ros2_sros2_smoke.py --node-executable <installed-node>
checks secure sample delivery, a denied reader bias endpoint and an allowed
operator call, including the fake device's command count. Run it in an isolated
container/CI host with SROS2 and Fast DDS installed; it creates temporary keys for
the selected ROS_DOMAIN_ID and deletes them on exit. Jazzy CI runs it once with
the graph smoke's installed node and leased domain, without an extra build.
See the official access-control policy design
and SROS2 sample policy.
ROS 1 deployments must isolate the master, nodes and device network and disable
bias for readers; a ROS_DOMAIN_ID or service name alone does not authorize users.
Wrench header stamps are ROS publication time. received_at, SDK age and control
freshness use the host steady clock, so a paused or jumping simulated ROS clock
does not make stale force data fresh. Diagnostics use wall timers; ros2_control
read ignores its ROS-time argument for freshness. Callback SI overflow is
rejected, and auxiliary executor failure latches a control fault and invalidates
state interfaces. Release 0.4.0 passed the standalone checks on Noetic, Humble,
Jazzy, Kilted, Lyrical and Rolling, and ros2_control checks on the supported ROS 2
distributions. Focused controller checks also cover SI overflow, disabled bias and
executor failure. SROS2 Enforce-mode acceptance on Jazzy and
Kilted verified sample delivery, denial of reader bias requests and one allowed
operator bias command against a loopback sensor. These results cover the tested
policies and middleware; validate any adapted deployment policy separately.
The existing CI contract classifies Jazzy and Lyrical as primary, Humble as compatibility, Kilted as active short-lived, Rolling as development, and Noetic as legacy/EOL source-only. Keep per-distribution results with each release; a configured matrix alone does not establish that a later release passed it.