Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
humble

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version humble
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version jazzy
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
kilted

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version rolling
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
lyrical

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version rolling
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
rolling

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version rolling
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

No version for distro ardent showing humble. Known supported distros are highlighted in the buttons above.
Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
humble

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version humble
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

No version for distro bouncy showing humble. Known supported distros are highlighted in the buttons above.
Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
humble

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version humble
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

No version for distro crystal showing humble. Known supported distros are highlighted in the buttons above.
Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
humble

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version humble
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

No version for distro eloquent showing humble. Known supported distros are highlighted in the buttons above.
Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
humble

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version humble
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

No version for distro dashing showing humble. Known supported distros are highlighted in the buttons above.
Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
humble

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version humble
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

No version for distro galactic showing humble. Known supported distros are highlighted in the buttons above.
Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
humble

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version humble
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version foxy
Last Updated 2022-12-12
Dev Status END-OF-LIFE
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

README

dynamixel_control

The ros2_control implementation for any kind of ROBOTIS Dynamixel robots.

  • dynamixel_hardware: the SystemInterface implementation for the multiple ROBOTIS Dynamixel servos.
  • open_manipulator_x_description: the reference implementation of the ros2_control robot using ROBOTIS OpenManipulator-X.

The dynamixel_hardware package is hopefully compatible any configuration of ROBOTIS Dynamixel servos thanks to the ros2_control’s flexible architecture.

Set up

First install ROS 2 Foxy on Ubuntu 20.04. Then follow the instruction below.

$ source /opt/ros/foxy/setup.bash
$ mkdir -p ~/ros/foxy && cd ~/ros/foxy
$ git clone https://github.com/youtalk/dynamixel_control.git src
$ vcs import src < src/dynamixel_control.repos
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Demo with real ROBOTIS OpenManipulator-X

Configure Dynamixel motor parameters

Update the usb_port, baud_rate, and joint_ids parameters on open_manipulator_x_description/urdf/open_manipulator_x.ros2_control.xacro to correctly communicate with Dynamixel motors. The use_dummy parameter is required if you don’t have a real OpenManipulator-X.

Note that joint_ids parameters must be splited by ,.

<hardware>
  <plugin>dynamixel_hardware/DynamixelHardware</plugin>
  <param name="usb_port">/dev/ttyUSB0</param>
  <param name="baud_rate">1000000</param>
  <!-- <param name="use_dummy">true</param> -->
</hardware>

  • Terminal 1

Launch the ros2_control manager for the OpenManipulator-X.

$ ros2 launch open_manipulator_x_description open_manipulator_x.launch.py

  • Terminal 2

Start the joint_trajectory_controller and send a /joint_trajectory_controller/follow_joint_trajectory goal to move the OpenManipulator-X.

$ ros2 control switch_controllers --start joint_state_broadcaster --start joint_trajectory_controller --stop velocity_controller
$ ros2 action send_goal /joint_trajectory_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory -f "{
  trajectory: {
    joint_names: [joint1, joint2, joint3, joint4, gripper],
    points: [
      { positions: [0.1, 0.1, 0.1, 0.1, 0], time_from_start: { sec: 2 } },
      { positions: [-0.1, -0.1, -0.1, -0.1, 0], time_from_start: { sec: 4 } },
      { positions: [0, 0, 0, 0, 0], time_from_start: { sec: 6 } }
    ]
  }
}"

If you would like to use the velocity control instead, switch to the velocity_controller and publish a /velocity_controller/commands message to move the OpenManipulator-X.

$ ros2 control switch_controllers --start joint_state_broadcaster --stop joint_trajectory_controller --start velocity_controller
$ ros2 topic pub /velocity_controller/commands std_msgs/msg/Float64MultiArray "data: [0.1, 0.1, 0.1, 0.1, 0]"

dynamixel_control: the ros2_control implementation for any kind of ROBOTIS Dynamixel robots

Demo with dummy ROBOTIS OpenManipulator-X

The use_dummy parameter is required if you use the dummy OpenManipulator-X.

diff --git a/open_manipulator_x_description/urdf/open_manipulator_x.ros2_control.xacro b/open_manipulator_x_description/urdf/open_manipulator_x.ros2_control.xacro
index c6cdb74..111846d 100644
--- a/open_manipulator_x_description/urdf/open_manipulator_x.ros2_control.xacro
+++ b/open_manipulator_x_description/urdf/open_manipulator_x.ros2_control.xacro
@@ -9,7 +9,7 @@
         <param name="usb_port">/dev/ttyUSB0</param>
         <param name="baud_rate">1000000</param>
-        <!-- <param name="use_dummy">true</param> -->
+        <param name="use_dummy">true</param>
       </hardware>
       <joint name="joint1">
         <param name="id">11</param>

Then follow the same instruction of the real robot one.

Note that the dummy implementation has no interpolation so far. If you sent a joint message, the robot would move directly to the joints without interpolation.

Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
iron

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version iron
Last Updated 2024-04-24
Dev Status END-OF-LIFE
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.4.0

README

dynamixel_hardware

The ros2_control implementation for any kind of ROBOTIS Dynamixel robots.

The dynamixel_hardware package is the SystemInterface implementation for the multiple ROBOTIS Dynamixel servos.

It is hopefully compatible any configuration of ROBOTIS Dynamixel servos thanks to the ros2_control’s flexible architecture.

Set up

First install ROS 2 Rolling on Ubuntu 22.04. Then follow the instruction below.

$ source /opt/ros/rolling/setup.bash
$ mkdir -p ~/ros/rolling && cd ~/ros/rolling/src
$ git clone https://github.com/youtalk/dynamixel_hardware.git
$ git clone https://github.com/youtalk/dynamixel_hardware_examples.git
$ cd -
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Demo with real ROBOTIS OpenManipulator-X

Configure Dynamixel motor parameters

Update the usb_port, baud_rate, and joint_ids parameters on open_manipulator_x_description/urdf/open_manipulator_x.ros2_control.xacro to correctly communicate with Dynamixel motors. The use_dummy parameter is required if you don’t have a real OpenManipulator-X.

Note that joint_ids parameters must be splited by ,.

<hardware>
  <plugin>dynamixel_hardware/DynamixelHardware</plugin>
  <param name="usb_port">/dev/ttyUSB0</param>
  <param name="baud_rate">1000000</param>
  <!-- <param name="use_dummy">true</param> -->
</hardware>

  • Terminal 1

Launch the ros2_control manager for the OpenManipulator-X.

$ ros2 launch open_manipulator_x_description open_manipulator_x.launch.py

  • Terminal 2

Start the joint_trajectory_controller and send a /joint_trajectory_controller/follow_joint_trajectory goal to move the OpenManipulator-X.

$ ros2 control switch_controllers --activate joint_state_broadcaster --activate joint_trajectory_controller --deactivate velocity_controller
$ ros2 action send_goal /joint_trajectory_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory -f "{
  trajectory: {
    joint_names: [joint1, joint2, joint3, joint4, gripper],
    points: [
      { positions: [0.1, 0.1, 0.1, 0.1, 0], time_from_start: { sec: 2 } },
      { positions: [-0.1, -0.1, -0.1, -0.1, 0], time_from_start: { sec: 4 } },
      { positions: [0, 0, 0, 0, 0], time_from_start: { sec: 6 } }
    ]
  }
}"

If you would like to use the velocity control instead, switch to the velocity_controller and publish a /velocity_controller/commands message to move the OpenManipulator-X.

$ ros2 control switch_controllers --activate joint_state_broadcaster --deactivate joint_trajectory_controller --activate velocity_controller
$ ros2 topic pub /velocity_controller/commands std_msgs/msg/Float64MultiArray "data: [0.1, 0.1, 0.1, 0.1, 0]"

dynamixel_control: the ros2_control implementation for any kind of ROBOTIS Dynamixel robots

Demo with dummy ROBOTIS OpenManipulator-X

The use_dummy parameter is required if you use the dummy OpenManipulator-X.

diff --git a/open_manipulator_x_description/urdf/open_manipulator_x.ros2_control.xacro b/open_manipulator_x_description/urdf/open_manipulator_x.ros2_control.xacro
index c6cdb74..111846d 100644
--- a/open_manipulator_x_description/urdf/open_manipulator_x.ros2_control.xacro
+++ b/open_manipulator_x_description/urdf/open_manipulator_x.ros2_control.xacro
@@ -9,7 +9,7 @@
         <param name="usb_port">/dev/ttyUSB0</param>
         <param name="baud_rate">1000000</param>
-        <!-- <param name="use_dummy">true</param> -->
+        <param name="use_dummy">true</param>
       </hardware>
       <joint name="joint1">
         <param name="id">11</param>

Then follow the same instruction of the real robot one.

Note that the dummy implementation has no interpolation so far. If you sent a joint message, the robot would move directly to the joints without interpolation.

No version for distro lunar showing humble. Known supported distros are highlighted in the buttons above.
Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
humble

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version humble
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

No version for distro jade showing humble. Known supported distros are highlighted in the buttons above.
Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
humble

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version humble
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

No version for distro indigo showing humble. Known supported distros are highlighted in the buttons above.
Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
humble

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version humble
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

No version for distro hydro showing humble. Known supported distros are highlighted in the buttons above.
Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
humble

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version humble
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

No version for distro kinetic showing humble. Known supported distros are highlighted in the buttons above.
Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
humble

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version humble
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

No version for distro melodic showing humble. Known supported distros are highlighted in the buttons above.
Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
humble

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version humble
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file

No version for distro noetic showing humble. Known supported distros are highlighted in the buttons above.
Repo symbol

dynamixel_hardware repository

dynamixel_hardware

ROS Distro
humble

Repository Summary

Checkout URI https://github.com/dynamixel-community/dynamixel_hardware.git
VCS Type git
VCS Version humble
Last Updated 2026-07-26
Dev Status END-OF-LIFE
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
dynamixel_hardware 0.6.1

README

dynamixel_hardware

Build and Test (rolling) Build and Test (lyrical) Build and Test (jazzy) Build and Test (humble)

⚠️ This package is deprecated

Use ROBOTIS’s officially maintained dynamixel_hardware_interface instead. It fills the same role, is released for humble, jazzy, kilted, lyrical, and rolling, and has capabilities this package never had.

Read the migration guide. It maps every parameter and interface, and is honest about the four things you lose — runtime control-mode switching, use_dummy, Protocol 1.0 servos, and lifecycle-based reconnection — with a workaround for each.

No further releases will be made; the last one was 0.6.1. This repository will be archived (read-only) once the end-of-life status lands in ros/rosdistro. Published binaries stay published and keep working. If you cannot migrate, pin this package.

The ros2_control hardware interface for any kind of ROBOTIS Dynamixel robot.

The package builds one pluginlib plugin, dynamixel_hardware/DynamixelHardware: a SystemInterface implementation that drives any number of ROBOTIS Dynamixel servos sharing a single serial bus. It is hopefully compatible with any configuration of Dynamixel servos, thanks to ros2_control’s flexible architecture.

Features

  • All eight Dynamixel operating modesposition, extended_position, multi_turn, current_based_position, velocity, current, torque and pwm – selected per joint with the control_mode parameter.
  • Per-joint mode switching at runtime: the mode a joint runs in follows the command interfaces the active controller claims, so a position-controlled arm and a velocity-controlled wheel can share one bus and one control cycle.
  • A pwm command interface next to position, velocity and effort, for direct duty-ratio control.
  • Joint-side units: per-joint gear_ratio, offset and torque_constant convert between the servo and the joint, so controllers command joint radians and Nm rather than motor revolutions and milliamps.
  • Hardware-free operation: use_dummy swaps the serial driver for a built-in dummy that emulates every operating mode through the same plugin logic, so a robot description can be brought up with no servos attached.
  • Bounded error handling: write() sends nothing until the first successful read() after activation, and each direction of the bus tolerates a configurable burst of consecutive failures before it reports an error to the controller manager.
  • Protocol 1.0 and 2.0 servos, through automatic control-table name fallbacks (Goal_Velocity to Moving_Speed, Present_Velocity to Present_Speed, Present_Current to Present_Load).
  • One codebase for every supported distro: the version differences live in compat.hpp and a single CMake standard check, not in diverging branches.

Supported distros

ROS 2 distro Branch Support
rolling rolling Development branch; all pull requests target it
lyrical lyrical Supported, by label-driven backport
jazzy jazzy Supported, by label-driven backport
humble humble Supported until its upstream EOL in May 2027 (via the compat.hpp shim)

Each distro branch is built and tested by its own workflow, and a nightly matrix rebuilds all four plus the examples repository downstream. The older branches (foxy, galactic, iron) are frozen and unsupported.

Kilted is not part of this line: it has no branch here and receives no backports. Kilted users stay on the released ros-kilted-dynamixel-hardware 0.6.0 binary, which predates everything documented below.

Installation

Binary packages are published for jazzy, kilted, lyrical and rolling, and carry the older 0.5.x/0.6.x line:

$ sudo apt install ros-$ROS_DISTRO-dynamixel-hardware

There is no humble binary – dynamixel_hardware has never been released into humble – so humble users build from source, as does anyone who wants what this README documents:

$ export ROS_DISTRO=rolling  # humble, jazzy, lyrical or rolling
$ source /opt/ros/$ROS_DISTRO/setup.bash
$ mkdir -p ~/ws/src && cd ~/ws/src
$ git clone https://github.com/dynamixel-community/dynamixel_hardware.git
$ git clone https://github.com/dynamixel-community/dynamixel_hardware_examples.git
$ cd ~/ws
$ rosdep install --from-paths src --ignore-src -r -y
$ colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
$ . install/setup.bash

Clone the default rolling branch whichever distro you build against. It is the only branch that carries what this README describes, and the same codebase builds on humble, jazzy, lyrical and rolling – that is what the compat.hpp shim is for. The distro branches receive this content by backport once 1.0.0 is released; until then -b humble and -b jazzy would give you the 0.6.x line instead, and -b lyrical would fail, because that branch is cut as part of the 1.0.0 release.

The examples repository is optional; it is what the walkthrough further down uses.

Configuration

A minimal <ros2_control> section:

<ros2_control name="DynamixelHardware" type="system">
  <hardware>
    <plugin>dynamixel_hardware/DynamixelHardware</plugin>
    <param name="port_name">/dev/ttyUSB0</param>
    <param name="baud_rate">1000000</param>
    <!-- <param name="use_dummy">true</param> -->
  </hardware>
  <joint name="joint1">
    <param name="id">1</param>
    <command_interface name="position"/>
    <state_interface name="position"/>
    <state_interface name="velocity"/>
    <state_interface name="effort"/>
  </joint>
</ros2_control>

Every parameter below is a <param> element inside that tag. These tables are the reference; the OpenManipulator-X walkthrough further down shows the same parameters in context.

Hardware parameters

Parameters of the <hardware> tag:

Parameter Default Description
port_name required Serial port, e.g. /dev/ttyUSB0. The old name usb_port is still accepted but deprecated and logs a warning at startup. Only optional under use_dummy.

File truncated at 100 lines see the full file