Workspace for Lucy/InMoov:
- thais_urdf (URDF + combo launches) — package name
thais_urdf - lucy_ros_packages (e.g.
lucy_ros2_control,lucy_bringup,camera_ros)
This tree holds workspace layout and tooling; src/ is populated by the install script.
One-time:
chmod +x install.sh launch_lucy.shIf you need to clone the repositories over SSH, copy .env.example to .env and set DEV=true before running install.sh (HTTPS clones work without that).
Docker pulls linux/amd64 images — correct for these hosts.
Install
./install.shQuick launch (interactive shell; GUI / X11 if available)
./launch_lucy.shDocker Desktop often defaults to linux/amd64 ROS images and runs them under emulation, which produces platform warnings and unreliable apt / rosdep. Use --arm on install once (or every install you want as ARM64); --arm can be combined with --build-only, --repair, etc. The image osrf/ros:humble-desktop on Docker Hub is amd64-only; --arm builds from ros:humble-ros-base-jammy and installs ros-humble-desktop so a real linux/arm64 base exists.
Install
./install.sh --armQuick launch (same as on Linux — launch_lucy.sh reads .lucy-docker-platform)
./launch_lucy.shlaunch_lucy.sh builds the Docker image if needed, mounts the workspace, sources the built ROS overlay, and starts a shell (GUI by default). Run install.sh first so install/setup.bash exists.
An interactive run starts the control panel (Vite) in the background (log /tmp/lucy-control-panel-vite.log). Start Gazebo or RViz yourself so rosbridge is running before using the panel.
Control panel URL: launch_lucy.sh reads src/lucy_control_panel/.env for VITE_PORT and publishes that host port into the container (defaults 5000 if VITE_PORT is missing). Override with PORT_CONTROL_PANEL / PORT_CONTROL_PANEL_CONTAINER if needed.
Inside the container:
| What you want | Command |
|---|---|
| Gazebo + RViz + Control Panel | ros2 launch thais_urdf gazebo.launch.py |
| RViz + Control Panel | ros2 launch thais_urdf rviz.launch.py |
| Real robot, control only | ros2 launch lucy_ros2_control control.launch.py |
./launch_lucy.sh --headless # shell without GUI / X11
./launch_lucy.sh <command> # one command; no background control panel
./launch_lucy.sh --headless ros2 doctor # example non-interactive checkAfter ./install.sh --arm, headless checks use the same ./launch_lucy.sh flags (e.g. ./launch_lucy.sh --headless ros2 doctor --report).
- thais_urdf — InMoov URDF, RViz config,
rviz.launch.py,gazebo.launch.py - lucy_ros_packages — bringup,
lucy_ros2_control,camera_ros, etc.
See each repository’s README for details.
If repos are already cloned, a normal ./install.sh run pulls each repo to the branch in config/repos.json (fast-forward only), then rebuilds in Docker.
./install.sh --update # same behavior (explicit “update”)
./install.sh updateForce re-clone everything listed in repos.json (removes src/<repo>, then clone + Docker build):
./install.sh --repairRebuild only (no git; Docker rosdep / colcon / yarn only):
./install.sh --build-onlyOn Apple Silicon, add --arm to any of the above install.sh invocations (e.g. ./install.sh --arm --build-only).