Week 3 — Setting up the Palletizing World

GSoC 2026 · Week 3 · Coding period

Week 3: Setting up the Palletizing World

This week I set up a Palletizing Harmonic universe inside RoboticsAcademy. Most of the work is reused from Pick & Place — same arm (UR5 + Robotiq 85), same MoveIt config, same controllers. What’s new is the scene: six boxes on a conveyor belt and a pallet platform to stack them on.

The changes are on my fork for now.


What changed

Four files in RoboticsInfrastructure, one SQL row in RoboticsAcademy.

The world file

Industrial/robotiq_description/world/palletizing_arm_harmonic.world — 317 lines. Most of it is copied from warehouse_arm_harmonic.world. The only new part is the six pickable boxes laid out in a 2×3 grid on the conveyor at z = 1.04.

The arm, conveyor, and table positions are unchanged so all the MoveIt frames and controller config from Pick & Place carry over as-is.

The world_file patch

spawn_robot_warehouse.launch.py had the world path hardcoded. I turned it into a launch argument with the original world as the default:

DeclareLaunchArgument(
    "world_file",
    default_value=default_world_file,
    description="Absolute path to the .world file to load in gz sim",
)

Pick & Place is unaffected. Palletizing passes its own path. 13 lines changed.

The launchers

Launchers/palletizing_harmonic.launch.py — sets GZ_SIM_RESOURCE_PATH and includes spawn_robot_warehouse.launch.py with world_file overridden and launch_rviz=false (RAM starts RViz separately).

Launchers/rviz/palletizing_harmonic.launch.py — a near copy of the Pick & Place RViz launcher. Same arm xacro, same MoveIt config, same RViz layout.

The SQL row

One row in database/exercises/db.sql:

71	17	68	False

Exercise 17 (Pick & Place), universe 68 (Palletizing Harmonic), not the default. This makes the new universe show up in the dropdown without any frontend changes.

There’s still a row needed in the database branch of RoboticsInfrastructure (universes.sql) to wire RAM to the launcher path — that’s the remaining piece.


Demo

Palletizing universe — Gazebo Harmonic with the UR5, gripper, and six boxes:

Conveyor belt:

The conveyor in the existing Pick & Place world is a static mesh — it looks like a belt but doesn’t move. For palletizing, boxes need to actually travel to the arm’s pickup point, so I wired up Gazebo Harmonic’s native TrackController plugin on the same model. It moves the contact surface velocity of the belt link. Combined with high anisotropic friction (mu2=800, fdir1 along the travel direction), boxes get dragged along rather than sliding. The belt speed is controlled by publishing a gz.msgs.Double to the plugin’s command topic.

On top of that I wrote a feeder script that spawns boxes one at a time from behind the belt, waits for each one to reach the arm pickup point, then spawns the next.

The arm doesn’t move yet — there’s no motion plan. The scene is just set up at this point.


What’s next

  • Get push access to the main repos and submit upstream PRs.
  • Add the universes.sql row to the database branch.
  • Start working on the palletizing motion plan — pick a box, place it on the pallet, repeat for all six.



Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • Week 12 — One workcell, many palletizing patterns
  • Week 11 — A slower week and more SKU planning
  • Week 10 — Starting SKU-based palletizing
  • Week 9 — Syncing the palletizing exercise with upstream
  • Week 8 — Polishing on mentors' feedback