← All work

A 6-DOF arm, sim to real

6-DOF cobot ROS 2 · MoveIt KDL inverse kinematics Joint · Cartesian · waypoint Sim → real

My first internship, at NextUp Robotics (2024). The arm was supplied; my job was to make it move on command — bring it up in ROS 2, plan motion through MoveIt, and get the same trajectories running in simulation and on the real hardware.

On the real arm

The arm running a MoveIt-planned sequence on real hardware — the same interfaces that drove it in simulation, pointed at the physical robot.

Getting here honestly is most of the work: a wrong sign in a transform or a joint limit off by a few degrees is harmless in sim and swings a real arm the wrong way. You check everything twice before you power the motors.

What I built

  • Stood up the arm's URDF in ROS 2 — robot model, joint definitions, and collision geometry — so MoveIt and the simulator had a correct description to plan against.
  • Wrote three motion interfaces on top of the MoveGroup API: joint-space targets, Cartesian-pose goals, and waypoint trajectories that string poses together.
  • Configured KDL inverse kinematics so a pose in space resolves to the six joint angles that reach it, with planning and collision checking through MoveIt.
  • Validated each interface in simulation first, then ran the same commands on the real arm — PC-driven, over the ROS 2 graph.

In simulation

The same arm in a physics simulator — its real URDF and link meshes loaded into PyBullet, running the reach through the joint chain before any of it touches real hardware. Checking motion in sim first is how you catch a bad sign or a joint limit while it's still harmless.

Where it sits

This was the groundwork. The teleoperation and dexterous-hand work I did later at Nferent AI is the same idea taken further — a human driving the arm live through a controller instead of planned trajectories from a keyboard. This is where I learned the pipeline that the rest of it is built on.

What broke, honestly

Reserved for the failure log: what fought back on this build and how it got fixed. Write-up in progress.