Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Mote

A low cost and high confidence mobile robot for hands on robotics education.

Highlights

  • High rate LiDAR, IMU, and actuator position data
  • Polished interfaces for ROS, ROS2, Python and Rust
  • Wide cross platform support
  • Completely open source, forever
  • Assemble for just ~$100

Mote is supported by Cornell University’s EmPRISE Lab.

Get Started

Want to build your own Mote? Check out the hardware sourcing guide.

Have a Mote? Get started by assembling your kit.

Kit Assembly

Configuration

Hello World

Methods of Acquiring a Mote

Mote uses a custom circuit board that must be manufactured and assembled at a factory. While PCBA has become remarkably affordable in recent years, setup fees make the cost per unit high for low scale runs (1 - 10 units).

If you would like to order a small number of robots please take a look on the issue tracker and see if a group buy is being coordinated. If you don’t see a group buy posted, reach out to a member of the Mote team and we can help you start one.

If you would like to build many Motes you can start your own manufacturing run. Checkout Ordering Circuit Boards for a step by step guide on the process. It’s much easier than it sounds.

All other (non-3D printed) parts are commercially available through standard channels. See the Bill of Materials page for details.

The rest of the robot is 3D printed. The 3D Printed Parts page provides guidance for producing these parts.

Bill of Materials

Ordering Circuit Boards

3D Printed Parts

Contributing

Mote is an open-source project hosted by Cornell University’s EmPRISE Lab. Thoughful contributions are welcome and appreciated.

First time contributors are recommended to read through the documentation, then check out the open issues.

Project Structure

mote-core contains the core libraries required for Mote to function. It includes the following components:

  • mote-firmware
    • Embedded firmware for the RP2354 MCU
  • mote-api
    • Defines message types and serialization protocols for communicating with Mote
  • mote-ffi
    • Foreign Function Interface (FFI)
    • Wraps mote-api in Python, C++, and Typescript libraries, allowing popular application languages to communicate with Mote
  • mote-configuration
    • Webpage used to configure / debug Mote
    • Uses the mote-ffi Typescript library to read / write configuration values, connect the robot to the network, and display errors
  • mote-hardware
    • KiCAD circuit board design files
  • mote-book
    • You’re reading it!
    • Documentation and tutorials

Extension repositories use libraries from mote-ffi to implement bridges to other frameworks. mote-ros, for example, wraps mote-ffi’s C++ library to implement a Robot Operating System (ROS) node for the robot.

Development Environment

DevContainer

DevContainer support coming in #13. DevContainers do not support USB passthrough (outside of Linux), so you’ll need to follow the local install directions if you wish to develop firmware.

Local Install

Linux and MacOS are officially supported development platforms. See the Windows section for tips on attempting to develop using Windows.

Install the following tools:

ToolPurposeInstallation Method
rustcargo (package manager), rustc (compiler), rust-analyzer (language server)https://rustup.rs/
justtask runnerhttps://just.systems/man/en/introduction.html
uvpython package and project managerhttps://docs.astral.sh/uv/getting-started/installation/
nodebuild / run configuration webpage via typescript, vite, and sveltehttps://nodejs.org/en/download
probe-rsflash and debug embedded systemshttps://probe.rs/docs/getting-started/installation/
wasm-packused for TS - rust interopcargo install wasm-pack
md-bookdocumentation generatorhttps://rust-lang.github.io/mdBook/guide/installation.html

Windows

The easiest way to develop on Windows is to install a Linux partition and dual boot. Check out of one the many guides online.

You can develop without dual booting using WSL2. WSL2 cannot directly communicate with USB devices, so check out this guide for a work around.

Building, Testing, Running, and Releasing

Setup

Follow the instructions in Development Environment to setup the required tools.

Make a clone of the repository:

git clone git@github.com:empriselab/mote-core.git

or

git clone https://github.com/empriselab/mote-core.git

Build

Compile source and generate executable artifacts.

# Build Mote's firmware
just firmware::build 
# Build the configuration webpage
just config::build 
# Build the book
just book::build 

Test

Run unit tests.

# Run api test cases
just api::test
# Run ffi test cases
just ffi::test
# Test code examples in the book
just book::test

Run

Run a target.

Running firmware requires connecting to Mote using a SWD debug probe.

# Deploy firmware to Mote (first time doing so)
just firmware::provision
# Deploy firmware to Mote (any time after)
just firmware::deploy
# Serve the configuration page
just config::run-dev
# Serve / open the book
just book::open

Release

Release artifacts are built and uploaded automatically via continuous integration.

  • mote-firmware
    • Released on any tag to mote-cote matching the pattern mote-firmware-vX.X.X, where vX.X.X matches the semantic version of the mote-firmware crate.
    • Automated via this GitHub Action.
  • mote-ffi
    • Released on any tag to mote-cote matching the pattern mote-ffi-vX.X.X, where vX.X.X matches the semantic version of the mote-firmware crate.
    • C++ library released via the GitHub Action
    • Python library released via the GitHub Action
  • mote-book and mote-configuration

Contributing to mote-hardware

mote-hardware contains the KiCAD v9.0 project files for the Mote circuit board.

Hardware changes are tested on pull request in CI. Manufacturing files are released on any tag to mote-core matching the pattern mote-hardware-vX.X.X.

ECAD files are difficult to source control. If you would like to make a contribution to mote-hardware please annouce your intention and timeline via the issue tracker. This helps prevent simultaneous branches that are impossible to merge.