Announcement: Beta Release of Rust for V5 Runtime

Hello VEX world,

Queen’s VEX U Robotics Team (QUEEN) is happy to announce the beta release of our Rust for V5 runtime, which allows you to write code for the V5 brain in the Rust programming language. This is a project which VP (Technical) Tim Morland and I have been working on for a few months now, and which our team is committed to using in the future as our primary means of writing code for the V5.

Before I delve into the technical part, you can take a look at the code on our team GitLab, and view the generated API docs on Docs.RS.

What?

Rust is a general-purpose programming language which was originally developed by Mozilla Research, and now features a range of community and corporate backers, from Mozilla to Amazon and Google. It is used in a variety of projects, from Firefox’s CSS engine to parts of the Discord backend. Recently, it has steadily been expanding into the world of embedded systems, through better support for running “baremetal” (i.e., without a proper operating system).

Our project provides a means for compiling Rust code into a program which can be uploaded to the V5 and a comprehensive Rust API for interacting with hardware and building robust programs, all built on top of PROS. Currently, this includes full support for the controller inputs and smart motors, as well as a large multitasking support library and support for smart ports in generic serial mode; we will be adding support for the ADI and smart sensors over the course of the beta, with the goal of having a fully-capable version 1.0 release by April-ish.

Why?

Rust’s features give it a significant edge over C++ for almost any use-case, including robotics control systems. Like C++, it compiles to efficient machine code; unlike C++, and thanks to the fact that it’s not trying to maintain backwards-compatibility with code from the 1970s, it has a robust method of memory safety which prevents the programmer from making many common mistakes to do with object lifetimes and data races, preventing a whole class of bugs. If you never use the unsafe keyword in your code (which you should never need to as you are not writing code to interact with the underlying hardware), you will never get a “data abort exception” or any other result of incorrect memory management. Code that crashes—or doesn’t crash, but gets in some unpredictable state—can ruin your ability to compete; Rust is designed to prevent exactly this problem.

How?

The runtime works behind the scenes by calling into the PROS C API. Everything from motor outputs to spawning tasks is done this way. In this way, we are building on top of an established, trusted framework.

Note: we currently only run on Linux and Mac OS X. Windows support is Coming Soon™; you can try yourself, but your mileage may vary. The following instructions also assume you have some comfort using the command line.

Installing the Toolchain

Our entire system is built on top of PROS, so you will need all the development tools that you would need to work with PROS code (the PROS editor is not required). See the PROS getting started docs here if you don’t already have those set up.

Next, you’ll need the Rust toolchain. This can be installed from rustup.rs. This will add a command-line utility rustup to manage the Rust toolchain, as well as cargo, Rust’s package manager. Run the following command to add a Cargo utility, cargo-generate, which helps with generating Rust projects from templates:

cargo install cargo-generate

Finally, you’ll need a couple extra packages, namely libclang-dev and llvm-config (or whatever these may be called on your system). On Ubuntu, for example, you can install those with apt-get install -yqq libclang-dev llvm-config.

(If you’re interested, we also have a Docker container, used to run our CI, which includes all of these).

Writing Code

We recommend Visual Studio Code as the editor to use for Rust projects. If you use our template (see below) using VS Code, it should prompt you to install some extensions which will provide all the integrations that you’d expect from a modern development enviornment.

We’ve provided a template project to get started. To make a new project, run the following command after setting up the toolchain:

cargo generate --git https://gitlab.com/qvex/vex-rt-template.git

Once your project is created, open it in VS Code. It should prompt you to install the recommended extensions and download the latest rust-analyzer, which is the tool it uses to show you errors and warnings in your code. You can then open a terminal in it and run cargo build to compile your code, or cargo run to compile and upload. (This internally runs prosv5 ut after generating the required files.) The README.md file contains more info on that.

Contributing

If you’re interested in contributing to this project, feel free to do so via issues and merge requests on GitLab. Contact me if you have any questions about this.

Cheers,

Nick

37 Likes

In the meantime, Windows users can use WSL 2 to set up a rust environment. Popular tools for writing rust code like VS Code and CLion allow you to connect to your WSL 2 instance. You can even call out to your windows install of the PROS CLI by specifying the extension (.exe).

14 Likes

image

8 Likes

I just learned what this is today, and I’ve already had it come up twice. Quite odd.

1 Like

oh wow this looks a whole lot better looking than that mistake of a “rust support” I made a couple years ago. I may have to give this a try.

2 Likes

If you are using this on a fresh install of ubuntu, normal or WSL, you may need to run

sudo apt-get install build-essential

before installing cargo-generate. Also I needed to install libssl-dev and pkg-config

2 Likes

Update: version 0.3.0 is released! In addition to some minor changes, thanks to contributions from @geometrically1, we now have support for 3-wire encoders. See an example on using them here; we’d love any feedback on the API.

6 Likes