https://github.com/bruk/prometheus/assets/
This repository contains a Gazebo and Isaac Sim simulation for a differential drive robot, equipped with an IMU, a depth camera, stereo camera and a 2D LiDAR. The primary contriution of this project is to support multiple ROS and Gazebo distros. Currently, the project supports the following versions -
Each of the following sections describes depedencies, build and run instructions for each of the above combinations
sudo apt-get install ros-humble-ros-gzharmonic# From the root directory of the workspace. This will install everything mentioned in package.xml
rosdep install --from-paths src/prometheus --ignore-src -r -ycolcon build --packages-select prometheusTo launch the robot in Gazebo,
ros2 launch prometheus gz.launch.pyTo view in rviz,
ros2 launch prometheus rviz.launch.pyThe launch file accepts multiple launch arguments,
ros2 launch prometheus gz.launch.py \
arm_enabled:=True \
camera_enabled:=True \
stereo_camera_enabled:=False \
two_d_lidar_enabled:=True \
position_x:=0.0 \
position_y:=0.0 \
orientation_yaw:=0.0 \
odometry_source:=world \
world_file:=small_warehouse.sdfSLAM Toolbox is an open-source package designed to map the environment using laser scans and odometry, generating a map for autonomous navigation.
NOTE: The command to run mapping is common between all versions of gazebo.
To start mapping:
ros2 launch prometheus mapping.launch.pyUse the teleop twist keyboard to control the robot and map the area:
ros2 run teleop_twist_keyboard teleop_twist_keyboard cmd_vel:=/prometheus/cmd_velTo save the map:
cd src/prometheus/config
ros2 run nav2_map_server map_saver_cli -f mapNav2 is an open-source navigation package that enables a robot to navigate through an environment easily. It takes laser scan and odometry data, along with the map of the environment, as inputs.
NOTE: The command to run navigation is common between all versions of gazebo and Isaac sim.
To run Nav2 on prometheus:
ros2 launch prometheus nav2.launch.pyThe SO-100 5-DOF arm is controlled via a unified ROS2 interface using Pink (Pinocchio-based IK). The pink_ik_node exposes action servers and services for arm movement, state queries, and gripper control.
The arm uses ros2_control with the following controllers (loaded automatically by the launch file):
| Controller | Type | Purpose |
|---|---|---|
joint_state_broadcaster |
JointStateBroadcaster | Publishes joint states |
joint_trajectory_controller |
JointTrajectoryController | Position control for 5 arm joints |
gripper_controller |
GripperActionController | Gripper open/close |
Arm joints: Shoulder_Rotation, Shoulder_Pitch, Elbow, Wrist_Pitch, Wrist_Roll
pip install pin-pink quadprog "numpy<2"Note:
numpy<2is required because the ROS Jazzy system Pinocchio is compiled against NumPy 1.x. Thepin-pinkpackage pulls NumPy 2.x by default, which causes a crash.
# Terminal 1: Launch simulation
ros2 launch prometheus gz.launch.py
# Terminal 2: Launch arm control node (loads controllers automatically)
ros2 launch prometheus pink_ik.launch.pyUnified arm movement with 5 modes:
| Mode | Description | Required Fields |
|---|---|---|
cartesian |
Move EE to absolute Cartesian pose | target_pose |
relative |
Move EE by offset from current position | offset (dx, dy, dz) |
named |
Move to a named joint configuration | pose_name (home, ready, tucked) |
home |
Return to home position | none |
joints |
Move to direct joint angles | joint_positions (5 floats, radians) |
Feedback provides progress (0-1), position_error (meters), and phase (solving/executing).
Example:
# Cartesian goal
ros2 action send_goal /arm/move_to_pose prometheus/action/MoveArm \
"{mode: 'cartesian', target_pose: {header: {frame_id: 'base_footprint'}, pose: {position: {x: 0.3, y: 0.0, z: 0.3}, orientation: {w: 1.0}}}}"
# Relative move (10cm down)
ros2 action send_goal /arm/move_to_pose prometheus/action/MoveArm \
"{mode: 'relative', offset: {z: -0.1}}"
# Named pose
ros2 action send_goal /arm/move_to_pose prometheus/action/MoveArm \
"{mode: 'named', pose_name: 'home'}"
# Home
ros2 action send_goal /arm/move_to_pose prometheus/action/MoveArm "{mode: 'home'}"Standard ROS2 gripper action. Position 0.0 (closed) to 1.57 (open).
ros2 action send_goal /gripper_controller/gripper_cmd control_msgs/action/GripperCommand \
"{command: {position: 0.0, max_effort: 100.0}}"| Topic | Type | Description |
|---|---|---|
pink_ik/current_ee_pose |
geometry_msgs/PoseStamped |
Current FK end-effector pose at 10 Hz |
pink_ik/status |
std_msgs/String |
Solver status: idle, solving, executing, reached, failed |
prometheus/joint_states |
sensor_msgs/JointState |
All joint positions (arm + gripper) |
IK parameters are in config/pink_ik_params.yaml:
position_cost/orientation_cost— task weights (position prioritized for 5-DOF arm)max_iterations/dt— differential IK loop settingsposition_threshold— convergence criterion (meters)trajectory_duration/num_waypoints— trajectory execution timingnamed_poses— dict of named joint configurations (home, ready, tucked)
this project is heavily based on the follwing repos



