ROS2 Setup

Integrate Mini-Arm with ROS2 for advanced robotics applications.

Prerequisites

  • ROS2 Humble or later

  • MoveIt2 (for motion planning)

  • Ubuntu 22.04 (recommended)

Installation

The Mini-Arm ROS2 packages include the Python client library, so everything builds together with colcon.

  1. Create a ROS2 workspace:

mkdir -p ~/miniarm_ws/src
cd ~/miniarm_ws/src
  1. Clone the Mini-Arm repository and symlink packages:

git clone https://github.com/Jshulgach/Mini-Arm.git
ln -s Mini-Arm/ros2/* .
  1. Install ROS dependencies:

cd ~/miniarm_ws
rosdep install --from-paths src --ignore-src -r -y
  1. Build all packages:

colcon build --symlink-install
source install/setup.bash

This builds all Mini-Arm packages:

  • miniarm_core - Python client library (MiniArmClient)

  • miniarm_description - URDF and meshes

  • miniarm_moveit_config - MoveIt2 configuration

  • miniarm_servo - Real-time servo control

Alternative: vcstool

For teams or CI/CD, create a miniarm.repos file:

repositories:
  Mini-Arm:
    type: git
    url: https://github.com/Jshulgach/Mini-Arm.git
    version: v0.4.0

Then:

cd ~/miniarm_ws/src
vcs import < miniarm.repos
ln -s Mini-Arm/ros2/* .
cd ~/miniarm_ws
colcon build

Package Structure

ros2/
├── miniarm_core/            # Python client (ament_python)
│   └── miniarm_core/
│       ├── client.py        # MiniArmClient class
│       └── __main__.py      # CLI
├── miniarm_description/     # URDF, meshes
├── miniarm_moveit_config/   # MoveIt2 configuration
└── miniarm_servo/           # Real-time control

Using miniarm_core in ROS2 Nodes

After building, you can import the client in your ROS2 Python nodes:

from miniarm_core import MiniArmClient

client = MiniArmClient(port='/dev/ttyACM0')
client.home()
client.set_pose(0.135, 0.0, 0.22)

Launching

View robot in RViz:

ros2 launch miniarm_servo show_robot.launch.py

Topics

Published:

  • /joint_states (sensor_msgs/JointState) - Current joint positions

  • /miniarm/end_effector_pose (geometry_msgs/PoseStamped) - TCP pose

Subscribed:

  • /miniarm/joint_command (std_msgs/Float64MultiArray) - Joint position commands

  • /miniarm/gripper_command (std_msgs/Float64) - Gripper position (0-1)

Services

  • /miniarm/home - Move to home position

  • /miniarm/enable - Enable servos

  • /miniarm/disable - Disable servos (freedrive)

Parameters

Configure via miniarm_bringup/config/miniarm_params.yaml:

miniarm:
  ros__parameters:
    serial_port: "/dev/ttyACM0"
    baudrate: 115200
    publish_rate: 50.0
    joint_limits:
      - [-180.0, 180.0]  # base
      - [-90.0, 90.0]    # shoulder
      - [-135.0, 135.0]  # elbow
      - [-180.0, 180.0]  # wrist_1
      - [-90.0, 90.0]    # wrist_2
      - [-180.0, 180.0]  # wrist_3

Example: ROS2 Control

import rclpy
from rclpy.node import Node
from std_msgs.msg import Float64MultiArray

class MiniArmController(Node):
    def __init__(self):
        super().__init__('miniarm_controller')
        self.publisher = self.create_publisher(
            Float64MultiArray,
            '/miniarm/joint_command',
            10
        )

    def send_joints(self, angles):
        msg = Float64MultiArray()
        msg.data = angles
        self.publisher.publish(msg)

def main():
    rclpy.init()
    controller = MiniArmController()

    # Move to position
    controller.send_joints([0.0, -0.5, 1.0, 0.0, 0.5, 0.0])

    rclpy.spin(controller)
    rclpy.shutdown()

Next Steps