ROS 2 Jazzy — 3‑DoF Manipulator (URDF → Gazebo → ros2_control → MoveIt 2)
A compact teaching project that goes end‑to‑end: CAD → URDF/Xacro → TF/visualization → simulation in Gazebo → controllers with ros2_control → motion planning with MoveIt 2 → basic kinematics (FK/Jacobian) and analytic inverse kinematics (IK) for a 3‑DoF arm.
Workspace root: arduinobot_ws
Packages: arduinobot_description, arduinobot_moveit, arduinobot_controller, arduinobot_cpp_examples, arduinobot_py_examples
Robot: 3‑DoF revolute arm + simple gripper (R‑P‑P style pitch joints; adjust to your design)
OS/Stack: Ubuntu 24.04 · ROS 2 Jazzy · Gazebo Sim · RViz · MoveIt 2 · ros2_control/ros2_controllers
Languages: C++ & Python (nodes), URDF/Xacro (description)
Use‑cases: Intro to manipulators, planning demos, HRI toys, and teaching FK/IK
Goal: clean description with proper frames, inertias, and collisions.
Meshes: export STL/DAE from CAD; keep consistent scale (meters) and origin at joint axis.
Links: base_link, link_1, link_2, link_3, gripper_link (plus fingers if needed).
Joints: joint_1 (revolute about Z yaw), joint_2 (revolute about Y pitch), joint_3 (revolute about Y pitch), optional gripper_joint (prismatic or mimic).
Inertias: approximate via CAD mass props or simple boxes/cylinders. Include <collision> meshes simpler than <visual>.
Goal: drive joints in Gazebo and via MoveIt.
Planning group: arm → joints [joint_1, joint_2, joint_3]
Kinematics solver: kdl_kinematics_plugin/KDLKinematicsPlugin (or TracIK if installed)
Planning pipeline: OMPL (RRTConnect as default)
Start RViz:
ros2 launch arduinobot_moveit moveit_rviz.launch.py
Use Plan and Plan & Execute. In the background, MoveIt sends a FollowJointTrajectory goal to arm_controller.
RViz: URDF visual + joint_state_publisher_gui sliders for quick testing.
Gazebo Sim: controllers active; model responds to JointTrajectory and gripper commands.
MoveIt 2: planning/execution via OMPL; collision checking enabled; planning time 1–3 s for simple poses on CPU.
Verify joint axes (pitch vs yaw). A wrong axis is the #1 cause of bizarre motion.
Use simplified collision meshes; heavy visuals slow planning.
Tune gains in ros2_control (especially if using gazebo_ros2_control PID).
Set reasonable joint limits to avoid self‑collision.
For precise IK with orientation, add a 4th joint (wrist pitch) or use numerical IK via KDL/TracIK with orientation weights.
Add the TracIK plugin and compare against KDL (success rate, speed).
Implement a damped least‑squares IK node using the analytic Jacobian.
Publish a MoveIt task (pick/place) with grasp generation.
Export a URCap‑like interface for external apps via ROS actions/services.
Authored by Md. Maruf. CAD and meshes by the author. Built on the ROS 2 and Gazebo ecosystems.