![]() |
so_100_arm package from so-100-arm reposo_100_arm |
Package Summary
Tags | No category tags. |
Version | 0.3.0 |
License | Apache |
Build type | AMENT_CMAKE |
Use | RECOMMENDED |
Repository Summary
Checkout URI | https://github.com/brukg/so-100-arm.git |
VCS Type | git |
VCS Version | main |
Last Updated | 2025-04-02 |
Dev Status | UNMAINTAINED |
CI status | No Continuous Integration |
Released | UNRELEASED |
Tags | No category tags. |
Contributing |
Help Wanted (0)
Good First Issues (0) Pull Requests to Review (0) |
Package Description
Additional Links
Maintainers
- Bruk Gebregziabher
Authors
- Bruk Gebregziabher
SO-100 Robot Arm ROS2 Package
This package provides ROS2 support for the SO-100 robot arm, available in 5-DOF configuration. It is based on the open-source 3D printable SO-ARM100 project by The Robot Studio. This implementation includes URDF models, Gazebo simulation support, and MoveIt2 integration.
The original ROS1 implementation can be found at: https://github.com/TheRobotStudio/SO-ARM100
Features
- Robot arm URDF models
- 5-DOF configuration with gripper
- Gazebo Harmonic simulation support
- ROS2 Control integration
- Joint trajectory controller
- Gripper action controller
- MoveIt2 motion planning capabilities (In Progress)
- Basic configuration generated
- Integration with Gazebo pending
- Motion planning testing pending
Prerequisites
ROS2 and Dependencies
- ROS2 Humble
- Gazebo Garden
- MoveIt2
- ros2_control
- gz_ros2_control
Hardware Requirements
For using the physical robot:
- SO-ARM-100 robot arm (5-DOF)
- Feetech SMS/STS series servos
- USB-to-Serial converter (CH340 chip)
- so_arm_100_hardware package installed:
cd ~/ros2_ws/src
git clone git@github.com:brukg/so_arm_100_hardware.git
cd ~/ros2_ws
colcon build --packages-select so_arm_100_hardware
source install/setup.bash
Installation
Create a ROS2 workspace (if you don’t have one)
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
Clone the repository
git clone git@github.com:brukg/SO-100-arm.git
Install dependencies
cd ~/ros2_ws
rosdep install --from-paths src --ignore-src -r -y
Build the package
colcon build --packages-select so_100_arm
source install/setup.bash
Usage
Launch the Hardware Interface
## Launch the hardware interface
ros2 launch so_100_arm hardware.launch.py
Test Servo Communication
To verify servo connections and read their status:
# Build the test program
cd ~/ros2_ws
colcon build --packages-select so_arm_100_hardware
source install/setup.bash
# Set USB permissions
sudo chmod 666 /dev/ttyUSB0
# Run the servo test
ros2 run so_arm_100_hardware test_servo
This will:
- Test communication with each servo (ID 1-6)
- Read current position, voltage, temperature
- Verify position control mode
- Show any communication errors
Example output for working servos:
Testing servo 1...
Servo 1 responded to ping
Set to position control mode
Position: 1963
Voltage: 7.4V
Temperature: 29°C
Load: -24
Test Hardware Interface
Send a test trajectory to move the physical arm:
ros2 action send_goal /so_100_arm_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory "{
trajectory: {
joint_names: [Shoulder_Rotation, Shoulder_Pitch, Elbow, Wrist_Pitch, Wrist_Roll],
points: [
{
positions: [-0.5, -1.0, 0.5, 0.0, 0.0],
velocities: [0.0, 0.0, 0.0, 0.0, 0.0],
time_from_start: {sec: 2, nanosec: 0}
},
{
positions: [-0.5, 0.50, 0.0, 0.0, 0.0],
velocities: [0.0, 0.0, 0.0, 0.0, 0.0],
time_from_start: {sec: 4, nanosec: 0}
}
]
}
}"
This will move the arm through two positions:
- First point (2 sec): Shoulder down with elbow bent
- Second point (4 sec): Shoulder up with arm extended
Note: Ensure the arm has clear space to move before sending commands.
Launch the robot in Gazebo
ros2 launch so_100_arm gz.launch.py dof:5
Launch the robot in RVIZ
ros2 launch so_100_arm rviz.launch.py
Launch MoveIt2 Demo
ros2 launch so_100_arm demo.launch.py
Test Joint Movement
Send a test position command for 5dof arm
ros2 topic pub /joint_trajectory_controller/joint_trajectory trajectory_msgs/msg/JointTrajectory '{joint_names: ["Shoulder_Rotation", "Shoulder_Pitch", "Elbow", "Wrist_Roll", "Wrist_Pitch"], points: [{positions: [1.0, 1.0, 1.0, 1.0, 1.0], velocities: [], accelerations: [], effort: [], time_from_start: {sec: 1, nanosec: 0}}]}'
Test Gripper Control
The gripper can be controlled using ROS2 actions:
# Open gripper (full open position)
ros2 action send_goal /gripper_controller/gripper_cmd control_msgs/action/GripperCommand "{command: {position: 1.57, max_effort: 50.0}}"
# Close gripper
ros2 action send_goal /gripper_controller/gripper_cmd control_msgs/action/GripperCommand "{command: {position: 0.0, max_effort: 50.0}}"
# Half-open position
ros2 action send_goal /gripper_controller/gripper_cmd control_msgs/action/GripperCommand "{command: {position: 0.5, max_effort: 50.0}}"
Monitor gripper state:
ros2 topic echo /gripper_controller/state
Note: The gripper position ranges from 0.0 (closed) to 0.085 (fully open). The max_effort parameter controls the gripping force.
Demonstrations
Gazebo Simulation
The video above shows the SO-100 robot arm in Gazebo Harmonic simulation:
- Joint trajectory execution
- Position control
- Dynamic simulation with gravity
Package Structure
so_100_arm/
├── CMakeLists.txt # Build system configuration
├── config/
│ ├── controllers_5dof.yaml # 5DOF joint controller configuration
│ ├── initial_positions.yaml # Default joint positions
│ ├── joint_limits.yaml # Joint velocity and position limits
│ ├── kinematics.yaml # MoveIt kinematics configuration
│ ├── moveit_controllers.yaml # MoveIt controller settings
│ ├── moveit.rviz # RViz configuration for MoveIt
│ ├── pilz_cartesian_limits.yaml # Cartesian planning limits
│ ├── ros2_controllers.yaml # ROS2 controller settings
│ ├── sensors_3d.yaml # Sensor configuration
│ ├── so_100_arm.ros2_control.xacro # ROS2 Control macro
│ ├── so_100_arm.srdf # Semantic robot description
│ ├── so_100_arm.urdf.xacro # Main robot description macro
│ └── urdf.rviz # RViz configuration for URDF
├── launch/
│ ├── demo.launch.py # MoveIt demo with RViz
│ ├── gz.launch.py # Gazebo simulation launch
│ ├── move_group.launch.py # MoveIt move_group launch
│ ├── moveit_rviz.launch.py # RViz with MoveIt plugin
│ ├── rsp.launch.py # Robot state publisher
│ ├── rviz.launch.py # Basic RViz visualization
│ ├── setup_assistant.launch.py # MoveIt Setup Assistant
│ ├── spawn_controllers.launch.py # Controller spawning
│ ├── static_virtual_joint_tfs.launch.py
│ └── warehouse_db.launch.py # MoveIt warehouse database
├── LICENSE
├── models/
│ ├── so_100_arm_5dof/ # 5DOF robot assets
│ │ ├── meshes/ # STL files for visualization
│ │ └── model.config # Model metadata
├── package.xml # Package metadata and dependencies
├── README.md # This documentation
└── urdf/
├── so_100_arm_5dof.csv # Joint configuration data
├── so_100_arm_5dof.urdf # 5DOF robot description
Joint Configuration
5-DOF Configuration
- Shoulder Rotation (-3.14 to 3.14 rad)
- Shoulder Pitch (-3.14 to 3.14 rad)
- Elbow (-3.14 to 3.14 rad)
- Wrist Pitch (-3.14 to 3.14 rad)
- Wrist Roll (-3.14 to 3.14 rad)
Note: The 5-DOF configuration uses continuous rotation joints with full range of motion (±π radians).
Known Issues
- The MoveIt2 configuration is still in development
- Some joint limits may need fine-tuning
- Collision checking needs optimization
Contributing
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
License
This project is licensed under the Apache License - see the LICENSE file for details
Authors
Bruk G.
Acknowledgments
- Based on the SO-ARM100 project by The Robot Studio