{"id":22111371,"url":"https://github.com/hebirobotics/hebi_ros2_examples","last_synced_at":"2025-07-25T07:31:37.663Z","repository":{"id":198008895,"uuid":"648661535","full_name":"HebiRobotics/hebi_ros2_examples","owner":"HebiRobotics","description":"Examples of using HEBI components through ROS 2","archived":false,"fork":false,"pushed_at":"2025-06-26T15:55:04.000Z","size":312,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-06-26T16:46:44.851Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HebiRobotics.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-06-02T13:48:28.000Z","updated_at":"2025-06-26T15:55:04.000Z","dependencies_parsed_at":null,"dependency_job_id":"7b2540bb-99a0-44ff-9c56-fa04b0896d45","html_url":"https://github.com/HebiRobotics/hebi_ros2_examples","commit_stats":null,"previous_names":["hebirobotics/hebi_ros2_examples"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/HebiRobotics/hebi_ros2_examples","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HebiRobotics%2Fhebi_ros2_examples","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HebiRobotics%2Fhebi_ros2_examples/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HebiRobotics%2Fhebi_ros2_examples/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HebiRobotics%2Fhebi_ros2_examples/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HebiRobotics","download_url":"https://codeload.github.com/HebiRobotics/hebi_ros2_examples/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HebiRobotics%2Fhebi_ros2_examples/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266972891,"owners_count":24014596,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-25T02:00:09.625Z","response_time":70,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-01T10:40:05.598Z","updated_at":"2025-07-25T07:31:37.647Z","avatar_url":"https://github.com/HebiRobotics.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# HEBI ROS 2 Examples\n\nHEBI Arms can be controlled using ROS 2 in three methods:\n- Standalone HEBI API\n- ROS 2 Control\n- MoveIt\n\nEach method offers unique advantages for different use cases and levels of integration with the ROS 2 ecosystem. The Standalone HEBI API provides direct control with HEBI C++ API, ROS 2 Control offers standardized interfaces, and MoveIt enables advanced motion planning capabilities.\n\nFor assistance or inquiries about implementing these control methods, please contact HEBI Robotics support at support@hebirobotics.com.\n\n## Setting up your Workspace\n\nRun the following commands to set up and download the HEBI ROS 2 packages:\n```bash\n# Create the workspace directory\nmkdir -p ~/hebi_ws/src\ncd ~/hebi_ws/src\n\n# Install HEBI C++ ROS API package\n# Option 1: Install the pre-built HEBI C++ API package\nsudo apt-get install ros-$ROS_DISTRO-hebi-cpp-api\n# Option 2: Clone the HEBI C++ API from source (if you prefer to build it yourself)\ngit clone https://github.com/HebiRobotics/hebi_cpp_api_ros.git\n\n# Clone the HEBI description package (replace $ROS_DISTRO with 'humble', 'iron', or 'jazzy')\ngit clone -b ros2/$ROS_DISTRO https://github.com/HebiRobotics/hebi_description.git # ROS_DISTRO can be either humble, iron, or jazzy\n\n# Clone the HEBI messages package\ngit clone https://github.com/HebiRobotics/hebi_msgs.git\n\n# Clone this examples repository\ngit clone https://github.com/HebiRobotics/hebi_ros2_examples.git\n```\n\nInstall the necessary dependencies using `rosdep`:\n\n```bash\nrosdep update\nrosdep install --from-paths src --ignore-src -r -y\n```\n\n**NOTE:** If your ROS distribution is End-of-Life (EOL), you might need to include EOL distributions in your rosdep commands:\n```bash\nrosdep update --include-eol-distros\nrosdep install --from-paths src --ignore-src -r -y --include-eol-distros\n```\n\nFinally, build the workspace and source it:\n```bash\ncd ~/hebi_ws\ncolcon build --symlink-install\nsource install/setup.bash\n```\n\n## Robot Description\n\nFor standalone control using the HEBI ROS 2 API, only an HRDF (HEBI Robot Description Format) file is required. See the [HEBI Documentation](https://docs.hebi.us/tools.html#robot-description-format) for a detailed explanation of the HRDF format.\n\nHowever, for controlling using ROS 2 control, integrating with MoveIt, or simulating in environments such as Gazebo, a URDF file is necessary.\n\nThe `hebi_description` package provides both HRDFs and URDFs for the standard HEBI arm kits.\n\n### Non-standard Kits\n\nIf you are using a non-standard HEBI kit:\n1. **HRDF Creation:** Creating an HRDF file is relatively straightforward. Examine the standard HEBI kit HRDFs in the `config/arms/hrdf` directory of the `hebi_description` package for reference.\n2. **URDF Generation:** A conversion script is available in the `hebi_description` repository to convert HRDF to URDF. Refer to the documentation provided in `hebi_description` for usage instructions.\n\n### Important Note\nWhile only HRDF is necessary when using the standalone ROS API, RViz visualization requires a URDF. The launch files include a `generate_urdf` argument (enabled by default) that automatically converts the HRDF to a URDF using the provided script, so you do not need to generate a URDF manually. See the [URDF Generation](#urdf-generation) section for more details.\n\n## Standalone HEBI ROS 2 API\n\n### HEBI Config File\n\nAlong with the robot description files, you need a HEBI configuration file (YAML) that specifies the parameters for connecting to the arm and defining its behavior. See the [HEBI Documentation](https://docs.hebi.us/tools.html#robot-config-format) for details on the config format.\n\nThe config files for standard HEBI kits are provided in the `hebi_description` package in the `config/arms` directory. \n\nFor custom setups, you can create a new config file. Here's an example configuration for the A-2580-06G arm:\n```\n# T-Series 6-DoF Arm with Gripper\nversion: 1.0\nfamilies: [\"Arm\"]\nnames: [\"J1_base\", \"J2_shoulder\", \"J3_elbow\", \"J4_wrist1\", \"J5_wrist2\", \"J6_wrist3\"]\nhrdf: \"hrdf/A-2580-06G.hrdf\"\n\ngains:\n  default: \"gains/A-2580-06.xml\"\n  gripper: \"gains/A-2080-01.xml\"\n\nuser_data:\n  # Default seed positions for doing inverse kinematics\n  ik_seed_pos: [0.01, 1.0, 2.5, 1.5, -1.5, 0.01]\n  home_position: [0.0, 2.09, 2.09, 0.0, 1.57, 0.0]\n\n  # Gripper specific settings\n  has_gripper: true\n  gripper_open_effort: 1\n  gripper_close_effort: -5\n\nplugins:\n  - type: GravityCompensationEffort\n    name: gravComp\n    enabled: true\n    ramp_time: 5\n\n  - type: DynamicsCompensationEffort\n    name: dynamicsComp\n    enabled: true\n    ramp_time: 5\n\n  # Kits with a gas spring need to add a shoulder compensation torque.\n  # It should be around -7 Nm for most kits, but it may need to be tuned\n  # for your specific setup.\n  - name: 'gasSpringCompensation'\n    type: EffortOffset\n    enabled: false\n    ramp_time: 5\n    offset: [0, -7, 0, 0, 0, 0]\n```\n\nHere are some key points to note:\n- The HEBI configuration files follow this naming convention: `\u003cyour_robot_name\u003e.cfg.yaml` and placed in the `config/arms` directory within the `hebi_description` package\n- `names` and `families` of your modules can be found and changed using [HEBI Scope](https://docs.hebi.us/tools.html#scope-gui)\n- Ensure HRDF and gains file paths are relative to the config file\n- You can add `home_position` to `user_data` field for homing the arm on startup\n\n### Arm Node\n\nThe HEBI C++ API is wrapped in ROS 2 within the `arm_node` (`src/kits/arms/arm_node.cpp`). This node, utilizing the HEBI Arm API, provides various topics, services, and actions for arm control:\n\n**Subscribers**\n- */SE3_jog [hebi_msgs/msg/SE3Jog]*: Command end effector jog in SE3 space (cartesian and rotation)\n- */cartesian_jog [hebi_msgs/msg/SE3Jog]*: Command end effector jog in cartesian space (x, y, z). Any angular displacement values set in the message are ignored.\n- */cartesian_trajectory [trajectory_msgs/msg/JointTrajectory]*: Command a trajectory for the end effector in cartesian space\n- */joint_jog [control_msgs/msg/JointJog]*: Command jog in joint angles\n- */joint_trajectory [trajectory_msgs/msg/JointTrajectory]*: Command a trajectory in joint angles\n- */cmd_ee_wrench [geometry_msgs/msg/Wrench]*: Command end effector wrench (force and torque) in the base frame\n\n**Publishers**\n- */ee_pose [geometry_msgs/msg/PoseStamped]*: End effector pose in SE3 space\n- */joint_states [sensor_msgs/msg/JointState]*: Joint angles of the arm\n- */inertia [geometry_msgs/msg/Inertia]*: Inertia of the arm\n- */ee_wrench [geometry_msgs/msg/WrenchStamped]*: End effector wrench (force and torque) feedback in the base frame, calculated from torque errors\n\n**Action Servers**\n- */arm_motion [hebi_msgs/action/ArmMotion]*: Command an arm trajectory in either joint space or SE3 space\n\n**Services**\n- */home [std_srvs/srv/Trigger]*: Home the arm\n- */stop [std_srvs/srv/Trigger]*: Stop arm motion (cannot stop action execution; cancel the action instead)\n\n**Parameters**\n- *config_package*: ROS package containing the config file\n- *config_file*: Config file path relative to `config_package`\n- *prefix*: Namespace for topics and prefix for joint names in `/joint_states`\n- *compliant_mode*: When true, disables arm goals and sets joint efforts to zero for manual movement\n- *ik_seed*: Sets the IK seed for inverse kinematic calculations\n\n**NOTE:** The `config_package`, `config_file` and `prefix` parameters are set during launch and should not be changed during runtime. On the other hand, `compliant_mode` and `ik_seed` are dynamic parameters.\n\n### Launching the Arm Node\n\nTo launch the arm node, use:\n```bash\nros2 launch hebi_ros2_examples arm.launch.py hebi_arm:=\u003cyour_robot_name\u003e\n```\n**NOTE:** Do not forget to build your workspace and source your setup before running the above command.\n\n#### Launch Arguments\n\n| Argument | Default | Description |\n|----------|---------|-------------|\n| `hebi_arm` | (required) | Name of the robot to use |\n| `config_package` | `hebi_description` | ROS package containing the config file |\n| `config_file` | `\u003cyour_robot_name\u003e.cfg.yaml` | Config file path relative to `config_package` |\n| `prefix` | `\"\"` | Namespace for topics and prefix for joint names |\n| `use_rviz` | `true` | Whether to start RViz |\n| `generate_urdf` | `true` | Generate URDF from HRDF or use pre-existing one |\n\n#### URDF Generation\n\nBoth `arm.launch.py` and `arm_joystick_teleop.launch.py` include a parameter to control URDF generation:\n\n- When `generate_urdf:=true` (default): The launch file will automatically generate a URDF from the HRDF file specified in your config, and save it in a cache directory (`~/.cache/hebi/hebi_arm.urdf.xacro`).\n- When `generate_urdf:=false`: The launch file will use a pre-existing URDF from the description package located at `\u003cdescription_package\u003e/urdf/kits/\u003cyour_robot_name\u003e.urdf.xacro`.\n\n### Examples\n\nTo get you started, we have provided several example scripts that use the `arm_node`:\n\n1. `move_arm.cpp`: A C++ example that publishes a predefined trajectory using the `arm_motion` action\n2. `ex_publish_trajectory.py`: A Python example that publishes a predefined trajectory to the `/joint_trajectory` topic\n3. `ex_teach_repeat_mobileio.py`: Uses HEBI Mobile IO to record and play trajectories, or go to saved waypoints\n4. `ex_teleop_mobileio.py`: Uses HEBI Mobile IO to send jog commands to control the arm in real-time\n5. `ex_haptic_teleop_node.py`: Uses a 3D Systems Touch X haptic device to control the arm in real-time with haptic feedback by sending jog commands while receiving force feedback from the `ee_wrench` topic\n\n## ROS2 Control\n\n### Additional Required Packages\n\nTo control HEBI arms using `ros2_control`, you need additional packages that aren't included in the basic setup:\n\n```bash\n# Clone required repositories\ngit clone https://github.com/HebiRobotics/hebi_hardware.git\ngit clone -b $ROS_DISTRO https://github.com/HebiRobotics/hebi_bringup.git # ROS_DISTRO can be humble, iron, or jazzy\n\n# Install ROS2 Control dependencies\nsudo apt install ros-$ROS_DISTRO-ros2-control ros-$ROS_DISTRO-ros2-controllers -y\n```\n\n### Required Configuration Files\n\nFor ROS 2 control integration, you'll need the following three types of files:\n\n1. **ROS2 Control Macro File** - Defines hardware interfaces\n2. **Combined URDF File** - Combines the macro with the existing URDF\n3. **Controller Parameter File** - Configures controllers\n\nFor standard HEBI kits, these files are already provided in the `hebi_bringup` and `hebi_description` packages.\n\n### ROS 2 Control Macro File\n\nThis file defines hardware interfaces and plugins for your robot. The template below shows the structure for a HEBI Arm ROS2 Control Macro file:\n```\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003crobot xmlns:xacro=\"http://wiki.ros.org/xacro\"\u003e\n\n  \u003cxacro:macro name=\"\u003cyour_robot_name\u003e_ros2_control\" params=\"\n                name\n                prefix\n                use_mock_hardware:=^|false\n                mock_sensor_commands:=^|false\n                sim_gazebo_classic:=^|false     \u003c!-- Not applicable in ROS 2 Jazzy --\u003e\n                sim_gazebo:=^|false\n                families\n                config_pkg\n                config_file\"\n               \u003e\n\n    \u003cros2_control name=\"${name}\" type=\"system\"\u003e\n\n      \u003chardware\u003e\n        \u003cxacro:if value=\"${use_mock_hardware}\"\u003e\n          \u003cplugin\u003emock_components/GenericSystem\u003c/plugin\u003e\n          \u003cparam name=\"mock_sensor_commands\"\u003e${mock_sensor_commands}\u003c/param\u003e\n        \u003c/xacro:if\u003e\n        \u003cxacro:if value=\"${sim_gazebo_classic}\"\u003e    \u003c!-- Not applicable in ROS 2 Jazzy --\u003e\n          \u003cplugin\u003egazebo_ros2_control/GazeboSystem\u003c/plugin\u003e\n        \u003c/xacro:if\u003e\n        \u003cxacro:if value=\"${sim_gazebo}\"\u003e\n          \u003cplugin\u003eign_ros2_control/IgnitionSystem\u003c/plugin\u003e    \u003c!-- For ROS 2 Humble --\u003e\n          \u003cplugin\u003egz_ros2_control/GazeboSimSystem\u003c/plugin\u003e    \u003c!-- For ROS 2 Iron/Jazzy --\u003e\n        \u003c/xacro:if\u003e\n        \u003cxacro:unless value=\"${use_mock_hardware or sim_gazebo_classic or sim_gazebo}\"\u003e     \u003c!-- sim_gazebo_classic not applicable in ROS 2 Jazzy --\u003e\n          \u003cparam name=\"config_pkg\"\u003e${config_pkg}\u003c/param\u003e\n          \u003cparam name=\"config_file\"\u003e${config_file}\u003c/param\u003e\n          \u003cplugin\u003ehebi_hardware/HEBIHardwareInterface\u003c/plugin\u003e\n        \u003c/xacro:unless\u003e\n      \u003c/hardware\u003e\n      \u003cjoint name=\"joint_1\"\u003e\n        \u003ccommand_interface name=\"position\" /\u003e\n        \u003cstate_interface name=\"position\"\u003e\n          \u003cparam name=\"initial_value\"\u003e0.0\u003c/param\u003e\n        \u003c/state_interface\u003e\n        \u003cstate_interface name=\"velocity\" /\u003e\n      \u003c/joint\u003e\n      \u003cjoint name=\"${prefix}\u003cJ1_name\u003e\"\u003e\n        \u003ccommand_interface name=\"position\" /\u003e\n        \u003ccommand_interface name=\"velocity\" /\u003e\n        \u003cstate_interface name=\"position\"\u003e\n          \u003cparam name=\"initial_value\"\u003e0.0\u003c/param\u003e\n        \u003c/state_interface\u003e\n        \u003cstate_interface name=\"velocity\"\u003e\n          \u003cparam name=\"initial_value\"\u003e0.0\u003c/param\u003e\n        \u003c/state_interface\u003e\n      \u003c/joint\u003e\n      ...\n      ...\n      ...\n      \u003cjoint name=\"${prefix}\u003cJ1_name\u003e\"\u003e\n        \u003ccommand_interface name=\"position\" /\u003e\n        \u003ccommand_interface name=\"velocity\" /\u003e\n        \u003cstate_interface name=\"position\"\u003e\n          \u003cparam name=\"initial_value\"\u003e0.0\u003c/param\u003e\n        \u003c/state_interface\u003e\n        \u003cstate_interface name=\"velocity\"\u003e\n          \u003cparam name=\"initial_value\"\u003e0.0\u003c/param\u003e\n        \u003c/state_interface\u003e\n      \u003c/joint\u003e\n      \u003cjoint name=\"${prefix}\u003cend_effector_name\u003e\"\u003e \u003c!-- If you have a gripper --\u003e\n        \u003ccommand_interface name=\"position\" /\u003e\n        \u003ccommand_interface name=\"velocity\" /\u003e\n        \u003cstate_interface name=\"position\"\u003e\n          \u003cparam name=\"initial_value\"\u003e0.0\u003c/param\u003e\n        \u003c/state_interface\u003e\n        \u003cstate_interface name=\"velocity\"\u003e\n          \u003cparam name=\"initial_value\"\u003e0.0\u003c/param\u003e\n        \u003c/state_interface\u003e\n      \u003c/joint\u003e\n\n    \u003c/ros2_control\u003e\n\n    \u003c!-- Gazebo Classic plugins --\u003e\n    ...\n\n    \u003c!-- Gazebo plugins --\u003e\n    ...\n\n  \u003c/xacro:macro\u003e\n\u003c/robot\u003e\n```\n**NOTE**: The gazebo classic and ignition plugins sections differ with each ROS version. Please refer to example files provided.\n\nAccording to conventions, this file should be named as `\u003cyour_robot_name\u003e.ros2_control.xacro` and placed in `urdf/kits/ros2_control` folder of the `hebi_decription` package.\n\n### ROS 2 Control URDF \n\nThis file combines the ROS2 control macro with the main robot URDF. Here's a template:\n```\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003crobot xmlns:xacro=\"http://wiki.ros.org/xacro\" name=\"\u003cyour_robot_name\u003e\"\u003e\n\n  \u003cxacro:arg name=\"config_pkg\" default=\"\" /\u003e\n  \u003cxacro:arg name=\"config_file\" default=\"\" /\u003e\n  \u003cxacro:arg name=\"prefix\" default=\"\" /\u003e\n\n  \u003cxacro:arg name=\"use_mock_hardware\" default=\"false\" /\u003e\n  \u003cxacro:arg name=\"mock_sensor_commands\" default=\"false\" /\u003e\n  \u003cxacro:arg name=\"sim_gazebo_classic\" default=\"false\" /\u003e    \u003c!-- Not applicable in ROS 2 Jazzy --\u003e\n  \u003cxacro:arg name=\"sim_gazebo\" default=\"false\" /\u003e\n\n  \u003cxacro:include filename=\"/path/to/ros2_control_macro_file\"/\u003e\n\n  \u003c!-- create link fixed to the \"world\" --\u003e\n  \u003clink name=\"world\" /\u003e\n\n  \u003cjoint name=\"world_to_base_joint\" type=\"fixed\"\u003e\n    \u003corigin xyz=\"0 0 0\" rpy=\"0 0 0\" /\u003e\n    \u003cparent link=\"world\" /\u003e\n    \u003cchild link=\"base_link\" /\u003e\n  \u003c/joint\u003e\n\n  \u003cxacro:include filename=\"/path/to/original/URDF_file\"/\u003e\n  \n  \u003cxacro:\u003cyour_robot_name\u003e_ros2_control\n    name=\"\u003cyour_robot_name\u003e\"\n    use_mock_hardware=\"$(arg use_mock_hardware)\"\n    mock_sensor_commands=\"$(arg mock_sensor_commands)\"\n    sim_gazebo_classic=\"$(arg sim_gazebo_classic)\"\n    sim_gazebo=\"$(arg sim_gazebo)\"\n    config_pkg=\"$(arg config_pkg)\"\n    config_file=\"$(arg config_file)\"\n    prefix=\"$(arg prefix)\" /\u003e\n\n\u003c/robot\u003e\n```\n\nAccording to conventions, this file should be named as `\u003cyour_robot_name\u003e.urdf.xacro` and placed in `urdf/kits/ros2_control` folder of the `hebi_decription` package.\n\n### ROS2 Control Parameter File\n\nThis YAML file configures the controllers used with your robot. Refer to the [ROS2 Controllers Documentation](https://control.ros.org/rolling/doc/ros2_controllers/doc/controllers_index.html#controllers-for-manipulators-and-other-robots) for detailed information.\n\nHere's an example parameter file for the A-2580-06 arm:\n```\ncontroller_manager:\n  ros__parameters:\n    update_rate: 100  # Hz\n\n    joint_state_broadcaster:\n      type: joint_state_broadcaster/JointStateBroadcaster\n\n    hebi_arm_controller:\n      type: joint_trajectory_controller/JointTrajectoryController\n\nhebi_arm_controller:\n  ros__parameters:\n    joints:\n      - J1_base\n      - J2_shoulder\n      - J3_elbow\n      - J4_wrist1\n      - J5_wrist2\n      - J6_wrist3\n    \n    command_interfaces:\n      - position\n      - velocity\n    \n    state_interfaces:\n      - position\n      - velocity\n\n    state_publish_rate: 50.0 # Defaults to 50\n    action_monitor_rate: 20.0 # Defaults to 20\n\n    allow_partial_joints_goal: false # Defaults to false\n    constraints:\n      stopped_velocity_tolerance: 0.01 # Defaults to 0.01\n      goal_time: 0.0 # Defaults to 0.0 (start immediately)\n```\n\n### Launching HEBI Arm with ROS 2 Control\n\n#### Hardware Execution\n\nTo launch the ROS 2 Control node with real hardware:\n\n```bash\nros2 launch hebi_bringup bringup_arm.launch.py hebi_arm:=\u003cyour_robot_name\u003e use_mock_hardware:=false\n```\n\n#### Simulated Execution\n\nFor testing without hardware (mock mode):\n\n```bash\nros2 launch hebi_bringup bringup_arm.launch.py hebi_arm:=\u003cyour_robot_name\u003e\n```\n\n#### Launch Parameters\n\n| Parameter | Default | Description |\n|-----------|---------|-------------|\n| `hebi_arm` | (required) | Name of the robot to use |\n| `use_mock_hardware` | `true` | Use mock hardware interface instead of real hardware |\n| `config_pkg` | `hebi_description` | Package containing the config file |\n| `config_file_path` | `config/\u003chebi_arm\u003e.cfg.yaml` | Path to config file relative to config_pkg |\n| `use_rviz` | `true` | Launch RViz for visualization |\n\nHere's an example to launch A-2580-06 arm with mock hardware:\n```bash\nros2 launch hebi_bringup bringup_arm.launch.py hebi_arm:=A-2580-06\n```\n\n### Gazebo Classic Simulation\n\nTo launch your HEBI arm in Gazebo Classic simulation:\n\n```bash\nros2 launch hebi_bringup bringup_arm_gazebo_classic.launch.py hebi_arm:=\u003cyour_robot_name\u003e\n```\n**NOTE:** Do not forget to build your workspace and source your setup before running the above commands.\n\n**Prerequisites:** Ensure you have Gazebo (`gazebo_ros`) and Gazebo ROS 2 Control (`gazebo_ros2_control`) installed. To install these packages, run:\n```bash\nsudo apt install ros-$ROS_DISTRO-gazebo-ros ros-$ROS_DISTRO-gazebo-ros2-control\n```\n\n### Testing Controllers\n\nAfter launching your arm in hardware or simulation, you can test the controllers:\n\n```bash\nros2 launch hebi_bringup test_joint_trajectory_controller.launch.py config_file:=\u003ctest_config_file_path\u003e\n```\n\nThis launch file executes a trajectory controller test node, and uses the specified test configuration to define joint trajectories.\n\n**Important Configuration:**\n- The `config_file` parameter must reference a file in the `hebi_bringup/config` directory\n- Default configuration (`test_goal_publishers_config.yaml`) is set for a 6-DoF arm\n- For different arm configurations, edit the file to match your specific joint setup\n\nWhen executed correctly, your robot arm will move through the joint positions defined in the config file.\n\n### Gazebo (Ignition) Simulation\n\nFor the newer Gazebo (formerly Ignition) simulation:\n\n```bash\nros2 launch hebi_bringup bringup_arm_gazebo.launch.py hebi_arm:=\u003cyour_robot_name\u003e\n```\n**NOTE:** Do not forget to build your workspace and source your setup before running the above commands.\n\n**Prerequisites:**\nEnsure you have Gazebo (`ros_gz`) and Gazebo ROS 2 Control (`ign_ros2_control` / `gz_ros2_control`) installed. To install these packages, run:\n- `sudo apt install ros-humble-ros-gz ros-humble-ign-ros2-control` for ROS 2 Humble\n- `sudo apt install ros-$ROS_DISTRO-ros-gz ros-$ROS_DISTRO-gz-ros2-control` for ROS 2 Iron/Jazzy\n\nTo test the controller in Gazebo, use the same approach as with Gazebo Classic:\n\n```bash\nros2 launch hebi_bringup test_joint_trajectory_controller.launch.py config_file:=\u003ctest_config_file_path\u003e\n```\n\n## MoveIt\n\n### Getting MoveIt Configurations\n\nMoveIt requires additional configuration files (SRDF, controllers, kinematics, etc.) beyond what we've covered so far. For standard HEBI arm kits, these configurations are already available:\n\n```bash\ncd ~/hebi_ws/src\ngit clone https://github.com/HebiRobotics/hebi_moveit_configs.git\n```\n\nThis repository contains ready-to-use MoveIt configurations for all standard HEBI arm kits. After cloning, do not forget to rebuild your workspace and source your setup.\n\n### Custom Arm Configurations\n\nFor custom HEBI arm setups, you'll need to create your own MoveIt configuration package:\n\n1. Use the MoveIt Setup Assistant to generate configuration files\n2. Follow the detailed instructions in the [hebi_moveit_configs](https://github.com/HebiRobotics/hebi_moveit_configs) repository\n\nThe setup process involves defining planning groups, robot poses, and end-effectors for your specific arm configuration.\n\n### Launching MoveIt with Hardware or Gazebo\n\nThe URDF files in the MoveIt config directory do not have access to HEBI Hardware plugin or Gazebo plugins defined during ROS2 control URDF setup. To simplify the process of modifying URDF, SRDF, and launch files, we provide `move_group.launch.py` in the `hebi_bringup` package.\n\nWe use this launch file in parallel with `bringup_arm.launch.py` to launch MoveIt.\n\n#### Step 1: Launch Robot Control\n\nChoose ONE of the following options:\n\n**Option A: Real Hardware**\n```bash\nros2 launch hebi_bringup bringup_arm.launch.py \\\n  hebi_arm:=\u003cyour_robot_name\u003e \\\n  use_mock_hardware:=false \\\n  use_rviz:=false\n```\n\n**Option B: Gazebo Classic Simulation**\n```bash\nros2 launch hebi_bringup bringup_arm_gazebo_classic.launch.py \\\n  hebi_arm:=\u003cyour_robot_name\u003e \\\n  use_rviz:=false\n```\n\n**Option C: Gazebo (Ignition) Simulation**\n```bash\nros2 launch hebi_bringup bringup_arm_gazebo.launch.py \\\n  hebi_arm:=\u003cyour_robot_name\u003e \\\n  use_rviz:=false\n```\n\n#### Step 2: Launch MoveIt\n\nAfter the robot control system is running, launch MoveIt:\n\n```bash\nros2 launch hebi_bringup move_group.launch.py \\\n  hebi_arm:=\u003cyour_robot_name\u003e \\\n  use_sim_time:=true/false\n```\n\nSet `use_sim_time:=true` when using simulation, and `use_sim_time:=false` with real hardware.\n\n**Note:** We set `use_rviz:=false` in the first step to avoid duplicate RViz windows. The MoveIt launch file will open RViz with the MoveIt configuration loaded.\n\n## Additional Resources\n\n- [HEBI Documentation](https://docs.hebi.us) - Comprehensive documentation on HEBI modules and APIs\n- [HEBI Forums](https://forum.hebi.us) - Community support and discussions\n- [ROS 2 Control Documentation](https://control.ros.org) - Detailed information about ROS 2 control\n- [MoveIt Documentation](https://moveit.ros.org) - Resources for using MoveIt\n\nFor further assistance, contact HEBI Robotics support at support@hebirobotics.com.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhebirobotics%2Fhebi_ros2_examples","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhebirobotics%2Fhebi_ros2_examples","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhebirobotics%2Fhebi_ros2_examples/lists"}