Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .github/workflows/install-and-launch.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
# Pixi + RoboStack workspace install (clone + colcon + yarn) and a headless launch
# smoke test on Linux, macOS, and Windows GitHub-hosted runners.
#
# - DEV=false -> install.sh uses url_https from config/repos.json.
# - ./install.sh --skip-build clones sub-repos; colcon build runs via pixi run build.

Expand Down
86 changes: 19 additions & 67 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,26 @@ export PATH="$HOME/.pixi/bin:$PATH" # if needed
./install.sh
```

**NixOS:** enable [nix-ld](https://github.com/nix-community/nix-ld) so Pixi/RoboStack conda binaries can load the host dynamic linker (required before `./install.sh`):

```nix
programs.nix-ld.enable = true;
```

For Gazebo/RViz GL, also see the [NixOS notes](docs/developer_lucy_packages.md#platform-setup) in the developer guide.

### Windows

Install [Pixi](https://pixi.prefix.dev/latest/installation/) **≥ 0.78** first, then close and reopen your terminal so `PATH` is updated.

**PowerShell (recommended):**

```powershell
powershell -ExecutionPolicy Bypass -c "irm -useb https://pixi.sh/install.ps1 | iex"
```

Alternatives from the [Pixi installation guide](https://pixi.prefix.dev/latest/installation/): `winget install prefix-dev.pixi`, Scoop, or the MSI from GitHub Releases.

**End users:** download **`Lucy-Setup.exe`** from [GitHub Releases](https://github.com/Sentience-Robotics/lucy_ws/releases). It installs Lucy, clones sub-repos, runs `pixi install`, and builds the workspace. See the [Windows README](windows/README.md).

**Developers (from source):**
Expand Down Expand Up @@ -103,75 +121,9 @@ On Windows, the Control Center runs without tmux (one process tree). Gazebo, RVi

## Developer setup

<<<<<<< HEAD
### Managing tmux windows
Comment thread
Arcod7 marked this conversation as resolved.

Tools (the console, CLI, viewers…) run in background windows, so a few `tmux` basics help you move between them:

- **`Ctrl+B` then `W`** — menu of all running windows; arrow to one and press Enter to switch.
- **`Ctrl+B` then `N`** — next window.
- **`Ctrl+B` then `P`** — previous window.

### Developer mode

The manager includes a **Developer Mode** toggle. When ON:
- repositories are pulled over SSH instead of HTTPS
- Core & the control panel aren't launched automatically
- the launch menu also shows **Headless mode** for Gazebo (no GUI / X11)

This setting is stored in a `.env` file.

## GUI: RViz and Gazebo

RViz, Gazebo and rqt are native OpenGL apps. The container can show them two ways:

- **Native X11** — Linux/amd64 hosts with a working GPU. Needs `xhost` on the host for display forwarding.
- **VNC virtual desktop** — a self-contained desktop inside the container: `Xvfb` rendered by
Mesa `llvmpipe` (software OpenGL), a small window manager, and VNC + noVNC servers (see
[`docker/gui_desktop.sh`](docker/gui_desktop.sh)). It is the default on Apple Silicon (arm64),
where the container gets no native GL context, and can be enabled on any host on demand.

### Choosing VNC vs native X11 (`LUCY_FORCE_VNC`)

By default the mode is picked from your architecture. Set `LUCY_FORCE_VNC` in a root `.env`
(or the environment) to override — e.g. an amd64 Linux box can opt into the VNC desktop:

| `LUCY_FORCE_VNC` | Behaviour |
| :-- | :-- |
| unset *(default)* | Auto: VNC on arm64, native X11 on amd64 |
| `1` / `yes` / `true` | Force the VNC desktop on any architecture (e.g. an amd64 host without working GLX) |
| `0` / `no` / `false` | Force VNC off even on arm64 (fall back to native X11 / headless) |

### Connecting to the VNC desktop

Enable **noVNC** (browser) or the **VNC Server** (native clients) from the launcher, then open
the address it shows. Defaults:

| How | Address | Password |
| :-- | :-- | :-- |
| **Browser** (noVNC) | http://localhost:6080/vnc.html | (none) |
| **RealVNC Viewer** etc. | `localhost:5901` | `lucy` |
| macOS **Screen Sharing** | `open vnc://localhost:5901` | `lucy` |

- The launcher prints the real URL/port for each viewer once it's running; if a default port is
already taken it automatically moves to the next free one.
- RealVNC Viewer warns the connection is unencrypted — expected over localhost; click through it.
- Override defaults with `LUCY_GUI_VNC_PORT` / `LUCY_GUI_NOVNC_PORT` (ports) and
`LUCY_GUI_VNC_PASSWORD` (max 8 chars) in a root `.env`.

> **Software-rendered:** the VNC desktop has no GPU passthrough, so Gazebo runs but is CPU-slow.
> For heavy simulation prefer a native-X11 Linux host, or run headless
> (`./launch_lucy.sh --headless`) and visualize through the control panel.

### macOS notes

- On Apple Silicon, XQuartz can't give the container an OpenGL context, so the VNC desktop is
used by default — no setup required.
For developer mode, Pixi component tasks (`pixi run core`, `sim-headless`, …), debug shell, SSH clones, local repo overrides, ports, and advanced launch options, see the **[developer guide](docs/developer_lucy_packages.md)**.

## More

- [`docs/developer_lucy_packages.md`](docs/developer_lucy_packages.md) — developer guide: per-repo docs, all `install.sh` / `launch_lucy.sh` flags, dev mode, ports, environment overrides, packages overview.
- [`docs/launcher_packages.md`](docs/launcher_packages.md) — launcher guide: how to add new packages to the launcher UI and understand the configuration fields.
=======
For developer mode, Pixi component tasks (`pixi run core`, `sim-headless`, …), debug shell, SSH clones, local repo overrides, ports, and advanced launch options, see the **[developer guide](docs/developer_lucy_packages.md)**.
>>>>>>> 41e84e8 (evol(windows,docs): update Windows support and documentation)
35 changes: 35 additions & 0 deletions config/repos.json.local.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"repos": [
{
"name": "inmoov_urdf",
"branch": "cma/feat-pixi-gpu-support",
"url_https": "https://github.com/Sentience-Robotics/inmoov_urdf.git",
"url_ssh": "git@github.com:Sentience-Robotics/inmoov_urdf.git"
},
{
"name": "lucy_ros_packages",
"branch": "cma/fix-skip-backward-ros-on-macOS",
"url_https": "https://github.com/Sentience-Robotics/lucy_ros_packages.git",
"url_ssh": "git@github.com:Sentience-Robotics/lucy_ros_packages.git"
},
{
"name": "lucy_control_panel",
"branch": "cma/fix-commit-lock-file",
"url_https": "https://github.com/Sentience-Robotics/lucy_control_panel.git",
"url_ssh": "git@github.com:Sentience-Robotics/lucy_control_panel.git"
},
{
"name": "micro_ros_agent",
"branch": "jazzy",
"optional": true,
"url_https": "https://github.com/micro-ROS/micro-ROS-Agent.git",
"url_ssh": "git@github.com:micro-ROS/micro-ROS-Agent.git"
},
{
"name": "thais_urdf",
"branch": "dev",
"url_https": "https://github.com/Sentience-Robotics/thais_urdf.git",
"url_ssh": "git@github.com:Sentience-Robotics/thais_urdf.git"
}
]
}
2 changes: 1 addition & 1 deletion docs/developer_lucy_packages.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ Pixi installs RoboStack Jazzy; `colcon build --symlink-install` builds `src/`; `
| **inmoov_urdf** | URDF, Gazebo/RViz launches |
| **lucy_ros_packages** | `lucy_bringup`, ros2_control, cameras |
| **lucy_control_panel** | Web UI |
| **micro_ros_agent**, **audio_common** | Optional (`optional: true` in repos.json) |
| **micro_ros_agent** | Optional (`optional: true` in repos.json) |

## Launch

Expand Down
4 changes: 2 additions & 2 deletions docs/pixi_release.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ This document outlines the **deferred** end-user release path. The PoC branch ke
Full-stack artifact (not `lucy_bringup` alone):

- All `lucy_ros_packages/*`, `inmoov_urdf`, optional `thais_urdf`
- External clones built in CI (`micro_ros_agent`, `audio_common`)
- External clones built in CI (`micro_ros_agent`)
- Launcher assets + control panel packaging strategy
- Release CI manifest with `preview = ["pixi-build"]` only in the release workflow

Expand All @@ -16,7 +16,7 @@ Full-stack artifact (not `lucy_bringup` alone):
| Option | Best for |
|--------|----------|
| Private conda channel (prefix.dev) | Networked workstations |
| Pixi Pack bundles | Jetson / air-gapped |
| Pixi Pack bundles | Jetson |

## Suggested follow-up commits

Expand Down
11 changes: 1 addition & 10 deletions docs/pixi_setup.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ When adding or changing workspace packages:
1. Read `package.xml` / `CMakeLists.txt` for new `depend` / `find_package` entries.
2. Check whether RoboStack provides `ros-jazzy-<name>` on [prefix.dev/robostack-jazzy](https://prefix.dev/robostack-jazzy).
3. If available, add to `pixi.toml` under `[feature.ros.dependencies]`.
4. If not available (e.g. `micro_ros_agent`, `audio_common`), add a clone entry to `config/repos.json` (use `"optional": true` when the stack works without it).
4. If not available (e.g. `micro_ros_agent`), add a clone entry to `config/repos.json` (use `"optional": true` when the stack works without it).
5. Regenerate the lock and install:

```bash
Expand All @@ -29,15 +29,6 @@ pixi install # updates pixi.lock for every platform in pixi.toml

**Pixi ≥ 0.78** is recommended for multi-platform lock resolution (`curl -fsSL https://pixi.sh/install.sh | bash`).

## RoboStack vs source clones

| Approach | When to use |
|----------|-------------|
| **Pixi / RoboStack** | Standard ROS Jazzy packages (`ros-jazzy-desktop`, `ros-jazzy-ros-gz`, controllers, rosbridge, etc.) |
| **Clone to `src/`** | Packages not on RoboStack, forks, or workspace-specific repos (`lucy_ros_packages`, `inmoov_urdf`) |
| **Optional `src/` clones** | `micro_ros_agent`, `audio_common` — not on RoboStack; cloned by default for release/CI parity but **not required** for core bringup or the control panel. Entries carry `"optional": true` in `repos.json`; omit from `repos.json.local` if you do not need them |
| **Local build** | RealSense — not in Pixi; run `./scripts/build_local_realsense.sh` **after** a normal `pixi run build` (or `LUCY_BUILD_REALSENSE=1 ./install.sh` at end of install) |

### Mutex pin

`ros2-distro-mutex = "0.15.*"` in `pixi.toml` keeps all RoboStack packages on the same rebuild cycle ([RoboStack #125](https://github.com/RoboStack/ros-jazzy/issues/125)).
Expand Down
1 change: 0 additions & 1 deletion tests/test_repos_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,4 +150,3 @@ def test_optional_flag_preserved_in_json():
data = json.loads(cfg.read_text())
optional = [r["name"] for r in data["repos"] if r.get("optional")]
assert "micro_ros_agent" in optional
assert "audio_common" in optional