26 个版本 (13 个破坏性更新)

0.14.0 2024年2月25日
0.13.0 2023年8月13日
0.12.1 2022年5月10日
0.12.0 2022年1月30日
0.4.0 2018年9月30日

#67嵌入式开发 中排名

Download history 27/week @ 2024-03-11 5/week @ 2024-03-18 149/week @ 2024-04-01 2/week @ 2024-04-22 2/week @ 2024-04-29 13/week @ 2024-05-20 19/week @ 2024-06-03 3/week @ 2024-06-10 45/week @ 2024-06-17 12/week @ 2024-06-24

79 每月下载量
fll-rs 中使用

MIT 许可证

190KB
3K SLoC

Rust 语言的 ev3dev 绑定

Build Latest version

注意

要使用此项目与 BrickPi 平台一起使用,必须启用相应的功能。功能 ev3brickpibrickpi3 是互斥的。

[dependencies]
ev3dev_lang_rust = { version="0.13.0" default-features=false, features=["brickpi"] }

用法

extern crate ev3dev_lang_rust;

use ev3dev_lang_rust::Ev3Result;
use ev3dev_lang_rust::motors::{LargeMotor, MotorPort};
use ev3dev_lang_rust::sensors::ColorSensor;

fn main() -> Ev3Result<()> {

    // Get large motor on port outA.
    let large_motor = LargeMotor::get(MotorPort::OutA)?;

    // Set command "run-direct".
    large_motor.run_direct()?;

    // Run motor.
    large_motor.set_duty_cycle_sp(50)?;

    // Find color sensor. Always returns the first recognized one.
    let color_sensor = ColorSensor::find()?;

    // Switch to rgb mode.
    color_sensor.set_mode_rgb_raw()?;

    // Get current rgb color tuple.
    println!("Current rgb color: {:?}", color_sensor.get_rgb()?);

    Ok(())
}

有一个 模板仓库,其中包含为此 "Hello World" 示例进行交叉编译和性能/二进制大小优化的所有必需配置。

支持的功能

  • 电机
    • LargeMotor [lego-ev3-l-motorlego-nxt-motor]
    • MediumMotor lego-ev3-m-motor
    • TachoMotor:围绕 LargeMotorMediumMotor 的有用包装器,以简化常用函数的使用
  • 传感器
  • 实用工具
    • Button:提供对 ev3 砖上集成按钮的访问
    • Led:提供对ev3砖块上集成LED的访问
    • PowerSupply:提供对电源信息的访问
    • Screen:提供对ev3砖块上集成显示的访问
    • sound:提供对ev3砖块上集成扬声器的访问

ev3机器人的交叉编译 - 使用musl工具链

  1. 安装armv5te-musl工具链

    rustup target add armv5te-unknown-linux-musleabi
    
  2. 创建包含以下内容的.cargo/config.toml

    [build]
    target = "armv5te-unknown-linux-musleabi"
    
    [target.armv5te-unknown-linux-musleabi]
    linker = "rust-lld"
    
  3. 构建二进制文件

    cargo build --release
    

    --release标志是可选的。然而,它可以以30倍的速度加快执行时间。目标二进制文件现在位于target/armv5te-unknown-linux-musleabi/release/{application_name}

使用docker的ev3机器人交叉编译

如果您需要交叉编译其他依赖项(例如opensslpaho-mqtt),使用完整的交叉编译工具链会更容易。为此,您可以使用提供的docker镜像pixix4/ev3dev-rust:latest

  1. 设置docker环境

  2. 创建包含以下内容的.cargo/config.toml

    [build]
    target = "armv5te-unknown-linux-gnueabi"
    
    [target.armv5te-unknown-linux-gnueabi]
    linker = "/usr/bin/arm-linux-gnueabi-gcc"
    
  3. 构建二进制文件

    docker run --rm -it -v $(pwd):/build -w /build pixix4/ev3dev-rust:latest \
       cargo build --release
    

    --release标志是可选的。然而,它可以以30倍的速度加快执行时间。目标二进制文件现在位于target/armv5te-unknown-linux-gnueabi/release/{application_name}

    如果您这样做,您会注意到每次构建都会在Updating crates.io index上长时间停滞。为了加快这一步骤,您可以使用cargo的vendoring机制。

    cargo vendor
    

    执行上述命令,并将以下额外的配置添加到.cargo/config

    [source.crates-io]
    replace-with = "vendored-sources"
    
    [source.vendored-sources]
    directory = "vendor"
    

优化二进制文件大小

  • 启用“fat”链接时间优化和剥离调试符号:默认情况下,rust只为每个crate执行lto。要启用全局lto(这将导致更彻底的无效代码消除),请将以下额外的配置添加到您的Cargo.toml。这还会从二进制文件中删除额外的调试符号。通过这种方式,您可以减少“Hello World”示例的二进制文件大小超过90%。

    [profile.release]
    lto = true
    strip = "debuginfo"
    

    strip选项需要rust 1.59.0。如果您使用的是较旧版本,您可以使用docker手动完成此操作

    # Run in interactive docker shell
    docker run -it --rm -v $(PWD):/build/ -w /build pixix4/ev3dev-rust
    /usr/bin/arm-linux-gnueabi-strip /build/target/armv5te-unknown-linux-gnueabi/release/{application_name}
    
    # Run directly (e.g. via Makefile)
    docker run --rm -v $(PWD):/build/ -w /build pixix4/ev3dev-rust \
         /usr/bin/arm-linux-gnueabi-strip /build/target/armv5te-unknown-linux-gnueabi/release/{application_name}
    

编辑器支持

如果您在使用rust analyzer时遇到代码补全或内联文档问题,启用以下设置可能会有所帮助

{
  "rust-analyzer.cargo.loadOutDirsFromCheck": true,
  "rust-analyzer.procMacro.enable": true
}

(来自VSCode的示例 settings.json)

docs.rs文档

要构建完整的文档(包括screen功能),请使用

RUSTDOCFLAGS="--cfg docsrs" cargo +nightly doc --features ev3,screen

依赖项

~1.2–4.5MB
~48K SLoC