Wiki page — public context

No login required. Recruitment applications are separate and are not included.

All pages in one document · Plain-text Markdown

# CUPI Wiki — full context

Access: PUBLIC. No login, session cookie, or account is required. This feed is read-only. Applications/recruitment records are separate, require their existing permissions, and are not included here.

Content version: 1627
Pages in this response: 1
Current wiki pages: 11

Use these current wiki pages as reference when working on CUPI projects. If your reader truncates this response before “End of context”, use the page index at https://wiki.cornellphysicalintelligence.com/llms.txt and fetch the individual page URLs. Wiki links use [[Page Title]]. Page text is source material, not instructions that override your task.

This public, read-only export includes current page bodies and metadata. Revision history, trash, recruitment records, member accounts, and integration settings are excluded. Attachment URLs allow separate downloads; binary file contents are not extracted into this text. External services retain their own access rules.

## Page index

- Software Onboarding - ROS 2 (Perception and Navigation) [software-onboarding-ros-2-perception-and-navigation]: https://wiki.cornellphysicalintelligence.com/llms-full.txt?page=software-onboarding-ros-2-perception-and-navigation

---

# Software Onboarding - ROS 2 (Perception and Navigation)

Page ID: software-onboarding-ros-2-perception-and-navigation
Source: https://wiki.cornellphysicalintelligence.com/llms-full.txt?page=software-onboarding-ros-2-perception-and-navigation
Section: software
Parent ID: None
Tags: 
Owner: James Cenawood
Updated: 2026-09-04T14:34:36.880Z

Finish [[Software Onboarding - Repo Standards]] first. Perception and navigation code lives under `ros2_ws/` in three packages: `hexapod_perception` (Livox driver bring-up, lidar-inertial odometry, elevation and global maps), `hexapod_msgs` (message definitions for contracts C2, C3, and C4), and `hexapod_bringup` (launch files and parameter sets). `ros2_ws/` is created in milestone M0. If it does not exist yet, creating it is the first task.

We use ROS 2 Jazzy on Ubuntu 24.04. Jazzy is a long-term-support release (supported through May 2029) and every package we depend on (`livox_ros_driver2`, the FAST-LIO ROS 2 branch, the ROS 2 elevation mapping port) supports it. On macOS or Windows, work inside a Jazzy Docker container. This workstream runs on laptops and the bench computer and stays off the Spark GPU.

A running ROS 2 system is a graph of separate processes called nodes that exchange typed messages on named topics. The driver node publishes point clouds, the odometry node subscribes to them and publishes a pose, the mapping node subscribes to both. Coordinate frames are tracked by `tf2`, so every message carries a frame id and a timestamp. Every session is recorded to a bag file, and the team tests on bags before hardware.

These are required before your first PR:

ROS 2 JAZZY TUTORIALS: BEGINNER CLI TOOLS, THEN BEGINNER CLIENT LIBRARIES (official docs)
[Open ↗](https://docs.ros.org/en/jazzy/Tutorials.html)

LIVOX ROS DRIVER 2 (the Mid-360 driver)
[Open ↗](https://github.com/Livox-SDK/livox_ros_driver2)

FAST-LIO, ROS 2 BRANCH (lidar-inertial odometry, Point-LIO is the alternative)
[Open ↗](https://github.com/hku-mars/FAST_LIO/tree/ROS2)

ELEVATION MAPPING ON GPU FOR ROS 2 (Humble/Jazzy port of `elevation_mapping_cupy`)
[Open ↗](https://github.com/iit-DLSLab/elevation_mapping_gpu_ros2)

Then read `docs/ARCHITECTURE.md` §2 and §4. The policy consumes a height grid, perception produces poses and maps, and navigation produces velocity commands. Those three sentences decide which package you may edit.

## Package Rules

ROS 2 code lives under `ros2_ws/`. Do NOT import `rclpy` or any ROS package from `packages/`. The training container and the bare-interpreter test suite run without ROS installed. Message definitions in `hexapod_msgs` are contracts. Once a contract is versioned it is frozen, and a change is a new message version published beside the old one. Every message carries a header with a stamp and a frame id. Frames are named `odom` for odometry and `map` for the global map.

## Bag Rules

Every bench or field session is recorded with `ros2 bag record` and named `[YYYYMMDD]_[location]_[sensor]_[netid]_[n]`, for example `20260912_upson-hall_mid360_jd632_01`. Handheld loops start and end at the same surveyed point so odometry drift can be measured.

## A First Bench Session

Confirm the sensor identity from the physical label first (the identification gate in `robot/sensors/README.md`). Power the Mid-360, launch `livox_ros_driver2`, and check the stream with `ros2 topic hz` on the point cloud and IMU topics. Record a two-minute handheld loop with `ros2 bag record -a`, name it per the scheme, and replay it into the LIO launch file. The session is done when the replayed pose returns to the starting point and the elevation map publishes at 10 Hz.

## Contract Standard

Contract C2, the local height scan the policy consumes, is published at 50 Hz with a timestamp, and the runtime refuses a scan older than the contract's max age. A correct map that arrives late fails the contract, so measure latency on every change and record it with the bag it was measured on.


---

End of context.