You're reading the documentation for an older, but still supported, version of ROS 2. For information on the latest version, please have a look at Kilted.
topic_based_hardware_interfaces
Joint State Topic Based System
The Joint State Topic Based System implements a ros2_control hardware_interface::SystemInterface supporting command and state interfaces through the ROS topic communication layer.
ros2_control urdf tag
The joint_state_topic_hardware_interface has a few ros2_control urdf tags to customize its behavior.
Parameters
joint_commands_topic: (default: “/robot_joint_command”). Example:
<param name="joint_commands_topic">/my_topic_joint_commands</param>.joint_states_topic: (default: “/robot_joint_states”). Example:
<param name="joint_states_topic">/my_topic_joint_states</param>.trigger_joint_command_threshold: (default: 1e-5). Used to avoid spamming the joint command topic when the difference between the current joint state and the joint command is smaller than this value, set to -1 to always send the joint command. Example:
<param name="trigger_joint_command_threshold">0.001</param>.sum_wrapped_joint_states: (default: “false”). Used to track the total rotation for joint states the values reported on the
joint_commands_topicwrap from 2pi to -2pi when rotating in the positive direction. (Isaac Sim only reports joint states from 2pi to -2pi) Example:<param name="sum_wrapped_joint_states">true</param>.
Per-joint Parameters
mimic: Defined name of the joint to mimic. This is often used concept with parallel grippers. Example:
<param name="mimic">joint1</param>.multiplier: Multiplier of values for mimicking joint defined in mimic parameter. Example:
<param name="multiplier">-2</param>.
Modifying the urdf ros2_control tag for new robots
If your robot description support mock_components you simply add an if-else statement to switch between it and <plugin>joint_state_topic_hardware_interface/JointStateTopicSystem</plugin>, make sure to add the joint_commands_topic and joint_states_topic to point to the correct topics.
<ros2_control name="name" type="system">
<hardware>
<xacro:if value="${mock_hardware}">
<plugin>mock_components/GenericSystem</plugin>
<param name="fake_sensor_commands">false</param>
<param name="state_following_offset">0.0</param>
<param name="calculate_dynamics">true</param>
</xacro:if>
<xacro:unless value="${mock_hardware}">
<plugin>joint_state_topic_hardware_interface/JointStateTopicSystem</plugin>
<param name="joint_commands_topic">/topic_based_joint_commands</param>
<param name="joint_states_topic">/topic_based_joint_states</param>
<param name="sum_wrapped_joint_states">true</param>
</xacro:if>
</hardware>
<joint name="joint_1">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">0.0</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
...
<joint name="joint_n">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">0.0</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
...
<joint name="mimic_joint_1">
<param name="mimic">joint_k</param>
<param name="multiplier">1</param>
<command_interface name="position" />
<state_interface name="position">
<param name="initial_value">0.0</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
...
<joint name="mimic_joint_n">
<param name="mimic">joint_kn</param>
<param name="multiplier">1</param>
<command_interface name="position" />
<state_interface name="position">
<param name="initial_value">0.0</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
</ros2_control>
cm_topic_hardware_component
The controller_manager topic System implements a ros2_control hardware_interface::SystemInterface that subscribes
to topics of type pal_statistics_msgs::msg::StatisticsNames and pal_statistics_msgs::msg::StatisticsValues,
and sets its state interface to the received values (if present).
Per default, the ros2_control controller manager publishes these topics to /controller_manager/introspection_data/names
and /controller_manager/introspection_data/values.
This component serves as a possibility to replay ROS bags and inject the states from a hardware component into the ros2_control stack.
For example, use ros2bag CLI to extract these two topics via
ros2 bag play <bag_file> \
--topics /controller_manager/introspection_data/names /controller_manager/introspection_data/values \
--remap /controller_manager/introspection_data/names:=/<hardware_component_name>/names\
/controller_manager/introspection_data/values:=/<hardware_component_name>/values
Note that with this setup the current time of your OS is used and not published from the ROS bag. If you want to control the speed of playback, run
your ros2_control_node with
--ros-args -p --use_sim_time:=trueand the
--rateand--clockoptions, for exampleros2 bag play <bag_file> --rate 2.0 --clock 100 \ --topics /controller_manager/introspection_data/names /controller_manager/introspection_data/values \ --remap /controller_manager/introspection_data/names:=/<hardware_component_name>/names\ /controller_manager/introspection_data/values:=/<hardware_component_name>/values
ROS subscribers
/<hardware_component_name>/names:
pal_statistics_msgs::msg::StatisticsNames/<hardware_component_name>/values:
pal_statistics_msgs::msg::StatisticsValues
ros2_control section in URDF
<ros2_control name="hardware_component_name" type="system">
<hardware>
<plugin>cm_topic_hardware_component/CMTopicSystem</plugin>
</hardware>
<joint name="joint_1">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">0.2</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
<joint name="joint_2">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">0.3</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
<joint name="joint_3">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">0.1</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
</ros2_control>