industrial_arm_ros2 is a production-oriented reference workspace for a generic, six-axis industrial manipulator. It combines one robot description and joint-limit source with Gazebo Harmonic, ros2_control, MoveIt 2, numerical kinematics, guarded motion actions, diagnostics, perception adapters, tests, Docker, and CI.
Safety: This is a research/development reference implementation. It is not a certified industrial safety controller and must not replace safety-rated drives, hardwired emergency stops, guarding, risk assessment, or applicable standards.
| Component | Baseline |
|---|---|
| OS | Ubuntu 24.04 (Noble) |
| ROS | ROS 2 Jazzy Jalisco |
| Simulator | Gazebo Harmonic through ros_gz_sim |
| Control | ros2_control, gz_ros2_control |
| Planning | MoveIt 2 / OMPL |
| Languages | C++17, Python 3.12 |
The included scripts/detect_environment.sh reports the locally installed versions. The project deliberately uses modern Gazebo, not Gazebo Classic.
flowchart TD
A["User API / CLI"] --> B["Motion action server"]
B --> C["MoveIt planning"]
B --> D["Trajectory safety validator"]
P["Perception adapter"] --> C
C --> D
D --> E["ros2_control"]
E --> F["Gazebo adapter"]
E --> G["Mock hardware"]
E --> H["Real-hardware safe stub"]
K["Kinematics services"] --> B
S["Safety supervisor"] --> D
E --> O["Diagnostics"]
The application layer only talks to ROS interfaces. Selecting simulation, mock, or physical hardware changes the ros2_control adapter, not planning or application code.
enterprise_arm_interfaces— messages, services, and actions.enterprise_arm_description— modular Xacro, canonical limits, TF and RViz.enterprise_arm_kinematics— Eigen FK, geometric Jacobian, DLS IK, singularity metrics, ROS services.enterprise_arm_control— trajectory validation, safety state machine and lifecycle supervisor.enterprise_arm_hardware— protocol-neutral transport abstraction and fail-closed real-hardware plugin.enterprise_arm_motion— high-level actions and PythonArmClient.enterprise_arm_moveit_config— SRDF, OMPL, kinematics, controllers andmove_grouplaunch.enterprise_arm_gazebo— Gazebo Harmonic workcell and simulated controllers.enterprise_arm_perception— generic detected-object adapter.enterprise_arm_diagnostics— health and stale-state monitoring.enterprise_arm_tools— executable FK, IK, joint, pose, stop, collision and pick/place examples.enterprise_arm_bringup— composition and one-command startup.enterprise_arm_tests— repository, launch, and simulation smoke tests.
sudo apt update
sudo apt install ros-jazzy-desktop ros-jazzy-moveit \
ros-jazzy-ros2-control ros-jazzy-ros2-controllers \
ros-jazzy-gz-ros2-control ros-jazzy-ros-gz
source /opt/ros/jazzy/setup.bash
rosdep install --from-paths src --ignore-src -r -y
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=RelWithDebInfo
source install/setup.bashStart the complete simulation:
ros2 launch enterprise_arm_bringup full_system.launch.py \
hardware_mode:=simulation moveit:=true rviz:=trueHeadless simulation:
ros2 launch enterprise_arm_gazebo simulation.launch.py gui:=falseMock-hardware development:
ros2 launch enterprise_arm_bringup full_system.launch.py \
hardware_mode:=mock moveit:=true rviz:=truehardware_mode:=real is fail-closed. The provided adapter will not activate until a vendor transport is implemented and explicitly enabled.
ros2 run enterprise_arm_tools arm-fk 0.0 -0.6 1.1 0.0 0.7 0.0
ros2 run enterprise_arm_tools arm-ik 0.65 0.0 0.55 0.0 1.5708 0.0The service APIs are also available:
ros2 service call /arm/compute_fk enterprise_arm_interfaces/srv/ComputeFK \
"{joint_positions: [0.0, -0.6, 1.1, 0.0, 0.7, 0.0]}"ros2 run enterprise_arm_tools arm-home
ros2 run enterprise_arm_tools arm-joints 0.2 -0.5 1.0 0.0 0.6 0.0 --duration 4.0
ros2 run enterprise_arm_tools arm-pose 0.55 0.10 0.50 0.0 1.5708 0.0
ros2 run enterprise_arm_tools demo-pick-place
ros2 run enterprise_arm_tools arm-stopAll joint trajectories pass through finite-value, joint-name, timestamp, position, velocity, acceleration, freshness, state, and E-stop checks before dispatch. Collision checks remain MoveIt's responsibility; the validator requires MoveIt acceptance for planned trajectories.
ros2 launch enterprise_arm_moveit_config moveit.launch.py use_sim_time:=trueIn RViz select the arm planning group, choose a target, Plan, then Execute. The controller mapping targets /arm_controller/follow_joint_trajectory. The SRDF includes a fixed base virtual joint, the six-joint chain, tool end effector, and conservative adjacent-link collision exemptions.
Without ROS installed, run the deterministic repository audit and math tests:
python3 scripts/validate_repository.py
python3 -m unittest discover -s test -vIn a Jazzy environment:
colcon test --event-handlers console_direct+
colcon test-result --verbose
ros2 launch enterprise_arm_tests graph_smoke.launch.pyFor a repeatable container build:
docker compose -f docker/docker-compose.yml build
docker compose -f docker/docker-compose.yml run --rm arm bash -lc \
'colcon build && colcon test && colcon test-result --verbose'| Kind | Names |
|---|---|
| Nodes | robot_state_publisher, controller_manager, move_group, arm_kinematics, arm_motion_server, arm_safety_supervisor, arm_diagnostics |
| Topics | /joint_states, /tf, /tf_static, /diagnostics, /arm/state, /arm/safety_status, /planning_scene |
| Services | /arm/compute_fk, /arm/compute_ik, /arm/validate_trajectory, /arm/clear_fault, /arm/set_control_mode |
| Actions | /arm/move_to_joint_state, /arm/move_to_pose, /arm/execute_trajectory, /arm_controller/follow_joint_trajectory |
The canonical robot limits are in src/enterprise_arm_description/config/joint_limits.yaml. Xacro, validation, MoveIt launch, and test code consume that file. Runtime parameters live with their owning packages; root config/ contains convenient links to the canonical files.
Run make detect, make audit, make build, or make test. See docs/ for architecture, mathematics, hardware integration, operations, security, rosbag replay and troubleshooting.
- No vendor hardware protocol is invented; the real adapter intentionally refuses activation.
- The generic parallel tool is a rigid flange visualization, not an actuated gripper.
- The lightweight perception node adapts simulated detections; object detection and pose-estimation models are external integrations.
- Software checks are non-certified and non-hard-real-time.
- The control-mode service validates intent; actual controller switching uses the standard
ros2 control switch_controllersoperation. - This archive was statically verified in a runtime without ROS; CI/Docker are the authoritative ROS Jazzy build and simulation environments.
Apache-2.0. See LICENSE.