Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
63c0fa3
Updated starter project
KellM65536 May 11, 2026
bfbc556
Took out a note
KellM65536 May 11, 2026
34e9386
Minor touch-ups
KellM65536 May 11, 2026
e51db1f
Made docs and starter code match
KellM65536 May 11, 2026
f552803
Fixed some mistakes
KellM65536 May 11, 2026
31df73c
Consistency
KellM65536 May 11, 2026
eb1bcfc
Fixed misspelling
KellM65536 May 11, 2026
3ce78a8
Added recieving message
KellM65536 May 12, 2026
8e9db2e
Minor inconsistency fixed
KellM65536 May 12, 2026
5d1caf9
Added 2026s
KellM65536 May 12, 2026
5143d8f
Reformat important sections
KellM65536 May 13, 2026
0336f3b
Change title formatting
KellM65536 May 13, 2026
25451a4
Some more websocket work
KellM65536 Jun 23, 2026
0d2aa91
download_offline_maps.py's location was changed
KellM65536 Jun 26, 2026
cc39d15
Change git checkout to git switch
KellM65536 Jun 26, 2026
8fcb7c1
Added teleop directory structure explanation
KellM65536 Jun 27, 2026
ae82cb4
Updated Vue introduction
KellM65536 Jun 27, 2026
e24422f
Updated Tailwind Introduction
KellM65536 Jun 27, 2026
78e2124
Reordered teleop sidebar
KellM65536 Jun 28, 2026
3f901d7
Slight update to organization
KellM65536 Jul 5, 2026
d7062bd
Added 2 new pages
KellM65536 Jul 5, 2026
6aede92
Edited camera client doc
KellM65536 Jul 5, 2026
abab4f6
Moved teleop starter project up in sidebar
KellM65536 Jul 6, 2026
a5baea6
Grouped teleop sidebar elements
KellM65536 Jul 6, 2026
847a03d
Added teleop projects page
KellM65536 Jul 6, 2026
fd52874
Added to teleop FAQ
KellM65536 Jul 6, 2026
b7b8424
Modified teleop overview and addded sqllite introduction
KellM65536 Jul 6, 2026
4504796
Added to sqlite introduction
KellM65536 Jul 6, 2026
891d658
Merge branch 'docs-2026' into km/teleop-updated
KellM65536 Jul 6, 2026
72883ea
Updated starter project (again)
KellM65536 Jul 6, 2026
8324a60
Moved and updated teleop projects page
KellM65536 Jul 10, 2026
d17d23c
Added tip to GUI style checking
KellM65536 Jul 10, 2026
37e9fa2
Fixed links in starter project
KellM65536 Jul 10, 2026
237ecdb
Feature requests
KellM65536 Jul 25, 2026
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
45 changes: 33 additions & 12 deletions astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -176,18 +176,39 @@ export default defineConfig({
{
label: 'Teleop',
collapsed: true,
items: [
{ label: 'Teleop Overview', slug: 'teleop/overview' },
{ label: 'Downloading Offline Map', slug: 'teleop/downloading-offline-map' },
{ label: 'GUI Style Checking', slug: 'teleop/gui-style-checking' },
{ label: 'Sample Vue Component', slug: 'teleop/sample-vue-component' },
{ label: 'Tailwind Introduction', slug: 'teleop/tailwind-introduction' },
{ label: 'Teleop Codebase Organization', slug: 'teleop/organization' },
{ label: 'Teleop FAQ', slug: 'teleop/faq' },
{ label: 'Teleop Quickstart', slug: 'teleop/quickstart' },
{ label: 'Teleop Starter Project', slug: 'teleop/starter-project' },
{ label: 'Vue Introduction', slug: 'teleop/vue-introduction' },
{ label: 'WebSocket Handlers Lookup', slug: 'teleop/consumers-lookup' }
items: [{
label: 'Getting Started',
collapsed: true,
items: [
{ label: 'Teleop Overview', slug: 'teleop/overview' },
{ label: 'Teleop Quickstart', slug: 'teleop/quickstart' },
{ label: 'Teleop Starter Project', slug: 'teleop/starter-project' }
]},
{
label: 'Guides',
collapsed: true,
items: [
{ label: 'Vue Introduction', slug: 'teleop/vue-introduction' },
{ label: 'Sample Vue Component', slug: 'teleop/sample-vue-component' },
{ label: 'Tailwind Introduction', slug: 'teleop/tailwind-introduction' },
{ label: 'Websockets Introduction', slug: 'teleop/websockets-introduction'},
{ label: 'SQLite Introduction', slug: 'teleop/sqlite-introduction'}
]
},
{
label: 'Teleop Organization and Tools',
collapsed: true,
items: [
{ label: 'Teleop Codebase Organization', slug: 'teleop/organization' },
{ label: 'GUI Style Checking', slug: 'teleop/gui-style-checking' },
{ label: 'Camera Client', slug: 'teleop/camera-client' },
{ label: 'Downloading Offline Map', slug: 'teleop/downloading-offline-map' },
{ label: 'WebSocket Handlers Lookup', slug: 'teleop/consumers-lookup' }
]
},
{ label: 'Teleop Projects', slug: 'teleop/projects' },
{ label: 'Feature Request', slug: 'teleop/feature-request' },
{ label: 'Teleop FAQ', slug: 'teleop/faq' }
]
},
{
Expand Down
7 changes: 7 additions & 0 deletions src/content/docs/teleop/camera-client.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
title: "Camera Client"
---

## Overview

The camera client is a hub for viewing the rover's various camera feeds. It's opened by all launch files that include "```camera_client```". Controls for cameras appear on the left (including adding new cameras and changing configuration), while the actual displays are on the right. The camera client does not work with the simulator.
2 changes: 1 addition & 1 deletion src/content/docs/teleop/downloading-offline-map.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Python script to download offline maps directly into `teleoperation/basestation_
Run with

```
python3 teleoperation/download_offline_maps.py --location=<loc>
python3 scripts/download_offline_maps.py --location=<loc>
```

Loc can be:
Expand Down
26 changes: 23 additions & 3 deletions src/content/docs/teleop/faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Enter `mrover` before trying to run the basestation.
You have not entered the Python virtual environment. To enter the python venv, enter `mrover` in the shell. This macro runs:

```bash
$ cd ~/ros2_ws/src/mrover && source ~/ros2_ws/src/mrover/venv/bin/activate
cd ~/ros2_ws/src/mrover && source ~/ros2_ws/src/mrover/venv/bin/activate
```

which opens the python virtual environment and allows you to run the basestation.
Expand All @@ -27,7 +27,7 @@ which opens the python virtual environment and allows you to run the basestation

## CMake

### Output
### Output 1

From your `./build.sh` output:

Expand All @@ -36,10 +36,30 @@ ZED not found
science_hw_bridge missing
```

### Solution
### Solution 1

Some files that CMake expects are missing. You could try and remove the `#Perception` and `#Embedded` sections in `CMakeLists`, and reach out to your team lead for help.

### Output 2

`./build.sh` output gives many missing file errors.

### Solution 2

Try updating or deinitializing and then reinitializing git submodules.

``` bash
git submodule update <submodule>
# or
git submodule deinit <submodule>
git submodule init <submodule>
```

Submodules include;
- deps/dawn
- deps/manif
- esw/fw

---

## Frontend not loading
Expand Down
7 changes: 7 additions & 0 deletions src/content/docs/teleop/feature-request.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
title: "Teleop Feature Request"
---

## Feature Request

Fill out [this form](https://docs.google.com/forms/d/e/1FAIpQLSd-sDdytRO2hFJAeUFrdFSiaeeOY1nzcbLjtVUYSmkCp70zNw/viewform?usp=sharing&ouid=104464537546922765205) to request a feature.
12 changes: 12 additions & 0 deletions src/content/docs/teleop/gui-style-checking.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,18 @@ bun run stylelint

- This runs **Stylelint**, which checks CSS ordering and conventions in `.vue` and `.css` files.

:::tip
You can use

```zsh
bun run stylelint "**/*.css"
# or
bun run stylelint "**/*.vue"
```

in zsh *(type of terminal shell; what you are probably already using)* to run stylelint on every css or vue file in the current directory/folder.
:::

Additionally, the **Prettier** plugin should take care of the more mundane tasks like spacing and indentation in your code when you save (Ctrl-S).

---
75 changes: 73 additions & 2 deletions src/content/docs/teleop/organization.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,77 @@
title: "Teleop Codebase Organization"
---

### Lockfile Tracking
## Directory Structure

Teleop does not track bun.lock. Lockfile conflicts are frequent acorss branches, and package.json should contain critical information regarding dependency and version control. Further granulated control of dependencies are not needed, and therefore the lockfile should not be tracked.
### Summary

*note: not all directories included below*

```
teleoperation
├── basestation_gui
│   ├── backend
| | ├── managers
| | ├── routes
| | └── ws
│   └── frontend
| ├── public
| | └── urdf
| └── src
| ├── components
| | ├── ControllerDataTable
| | └── three
| ├── composables
| ├── router
| ├── stores
| ├── types
| ├── utils
| └── views
└── camera_client
├── include
└── src
```

---

### Basestation GUI

```basestation_gui``` contains all the code for the Base Station.

#### Backend

Contains code for the server.

```managers``` contains classes that handle functionality requiring a consistent state.

```routes``` contains functions that handle HTTP requests.

```ws``` contains WebSocket definitions.

#### Frontend

Contains code for the frontend.

```public``` contains graphical assets for the frontend. ```urdf``` contains .urdf and .glb models.

```src``` contains all the code for the frontend.
* ```components``` contains Vue components.
* ```three``` contains 3D rover display code.
* ```composables``` contains reusable logic.
* ```router``` manages paths to views.
* ```stores``` contains code that handles Pinia stores.
* ```types``` contains custom variable types.
* ```utils``` contains various APIs.
* ```views``` contains main pages.

---

### Camera Client

Contains code for the camera client. Split into header (```include```) and source (```src```) files.

---

## Lockfile Tracking

Teleop does not track bun.lock. Lockfile conflicts are frequent across branches, and package.json should contain critical information regarding dependency and version control. Further granulated control of dependencies are not needed, and therefore the lockfile should not be tracked.
18 changes: 10 additions & 8 deletions src/content/docs/teleop/overview.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
---
title: "Teleop Overview"
---
# What is the role of the Teleoperations team?
## What is the role of the Teleoperations team?

The Teleoperations (Teleop) team ensures the rover's physical systems are easily controllable by a human operator. We build and maintain key systems that allow operators to command the rover and receive feedback in real time.

## Base Station GUI

The Base Station GUI is a Vue.js web app that serves as the main interface for operating the rover. It:
The Base Station GUI is a [Vue.js](/teleop/vue-introduction) web app that serves as the main interface for operating the rover. It:

- Captures controller inputs (Xbox, Thrustmaster joystick)
- Displays GPS, camera, and sensor data
Expand All @@ -18,26 +18,26 @@ and more...

## FastAPI Backend

To support the frontend, we have a Python FastAPI backend that bridges the GUI to ROS2. It:
To support the frontend GUI, we have a Python FastAPI backend that bridges it to Robot Operating Software 2 [(ROS2)](/general-resources/ros/intro-to-ros/). It:

- Maintains WebSocket connections per subsystem (arm, drive, nav, science, etc.)
- Maintains [WebSocket](/teleop/websockets-introduction) connections per subsystem (arm, drive, nav, science, etc.)
- Forwards ROS2 topics to the frontend via msgpack-serialized WebSocket messages
- Publishes controller inputs from the frontend to ROS2 topics
- Stores persistent data like GPS waypoints in SQLite
- Stores persistent data like GPS waypoints in [SQLite](/teleop/sqlite-introduction)
- Computes robotic arm commands (throttle, IK position, IK velocity)

## Tech Stack

| Layer | Technology |
|-------|-----------|
| Frontend | Vue 3, TypeScript, Vite, Pinia, Tailwind CSS |
| 3D / Maps | Three.js, Leaflet |
| Complex Visuals | Three.js (3D), Leaflet (Maps) |
| Backend | Python, FastAPI, uvicorn |
| Communication | WebSocket + msgpack binary serialization |
| Data | SQLite |
| Runtime | Bun (JS), ROS2 rclpy (Python) |

# Resources
## Resources

[Teleop Quickstart](/teleop/quickstart)

Expand All @@ -53,4 +53,6 @@ To support the frontend, we have a Python FastAPI backend that bridges the GUI t

[Teleop Starter Project](/teleop/starter-project)

[Sample Vue Component](/teleop/sample-vue-component)
---

Have a suggestion for features? Put it [here](https://docs.google.com/forms/d/e/1FAIpQLSd-sDdytRO2hFJAeUFrdFSiaeeOY1nzcbLjtVUYSmkCp70zNw/viewform?usp=sharing&ouid=104464537546922765205)!
7 changes: 7 additions & 0 deletions src/content/docs/teleop/projects.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
title: "Teleop Projects"
---

## 2026 - 2027 Projects

Projects should be accessible for members at [this spreadsheet](https://docs.google.com/spreadsheets/d/1YPRy4b-1OhNhXep2DHNy43zICfC72mdERJBsUHw-v0s/edit?gid=0#gid=0).
4 changes: 2 additions & 2 deletions src/content/docs/teleop/quickstart.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ title: "Teleop Quickstart"
Once you have completed the installation from the [Install ROS](/general-resources/ros/install-ros/install-ros) page, make sure you are on the `main` branch:

```bash
git checkout main
git switch main
git pull
```

Features are developed on branches checked out from `main` and merged back via pull request. In the mrover home directory, run the following commands:
Features are developed on branches switched to from `main` and merged back via pull request. In the mrover home directory, run the following commands:

```bash
./build.sh
Expand Down
14 changes: 14 additions & 0 deletions src/content/docs/teleop/sqlite-introduction.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
title: "SQLite Introduction"
---

## Overview

We use SQLite databases to store information that has to last when the page unloads. This includes recordings, waypoints, etc. These databases are typically accessed through python backend code.

## Using Databases

Use ```get_db_connection()``` to interface the databases. It's best to assign the return value to a variable.
Use ```get_db_connection().execute("SQL query string").fetchall()``` to query the databases.

[SQL Cheat Sheet](https://www.sqlitetutorial.net/sqlite-cheat-sheet/)
Loading