kcan 0.1.4

CAN controller primitives for actuator and motor control.
Documentation

kcan

CAN controller primitives and CLI tools for actuator and motor control.

Status

Published by Trevor Knott, Knott Dynamics.

Keywords: KCAN, CubeMars, RobStride, Scrin, Aisling, Trevor Knott, Knott Dynamics.

Features

  • MIT force-control frame packing for supported CubeMars AK actuators.
  • CubeMars direct servo command builders.
  • Feedback decoding, tuned specs for primary AK models, conservative defaults for other AK names, unit conversions, and safe velocity clamping.
  • Generic CanBus trait for tests, embedded adapters, or Linux SocketCAN.
  • Optional serde feature for serializable actuator configs, snapshots, commands, and feedback.
  • Optional socketcan feature for direct Linux SocketCAN usage.
  • Optional tui feature for a Scrin/Scrin Widgets actuator dashboard, wide actuator pane wall, read-only telemetry analytics, and safe control-intent model.
  • Cross-family actuator snapshots with derived health labels and protocol-specific dashboard metrics.
  • CAN monitor utilities for rolling frame logs, trace CSV export/replay, basic protocol classification, data formatting, and Scrin/Aisling TUI viewing.
  • Display and FromStr support for CubeMars and RobStride model names.
  • kcan command for model listing and frame generation.

Quick Use

For a beginner cheat sheet, see docs.md.

Build a RobStride status query frame in Rust:

use kcan::{RobStrideModel, robstride_status_query_frame};

let model: RobStrideModel = "rs01".parse()?;
let frame = robstride_status_query_frame(0x01)?;

assert_eq!(model.to_string(), "RS-01");
assert_eq!(frame.id().raw(), 0x501);
# Ok::<(), kcan::Error>(())

Build a CubeMars MIT neutral frame in Rust:

use kcan::{MitCommand, MotorModel, mit_command_frame};

let frame = mit_command_frame(MotorModel::Ak60_6, 0x03, MitCommand::neutral())?;

assert_eq!(frame.id().raw(), 0x0803);
assert_eq!(frame.len(), 8);
# Ok::<(), kcan::Error>(())

Run the CLI help:

cargo run --bin kcan -- help

List supported models:

cargo run --bin kcan -- models

Build a CubeMars direct velocity frame:

cargo run --bin kcan -- cubemars direct 0x03 velocity 1000

Build a RobStride status query frame:

cargo run --bin kcan -- robstride status rs01 0x01

Enable SocketCAN support with:

kcan = { version = "0.1", features = ["socketcan"] }

Run the sample TUI dashboard with:

cargo run --example tui_dashboard --features tui

List supported CubeMars models and generated frame IDs with:

cargo run --example cubemars_models

Print hardware-free CubeMars direct frames:

cargo run --example cubemars_direct_frames

Print hardware-free RobStride frames:

cargo run --example robstride_frames

Run a simulated CAN monitor with:

cargo run --example can_monitor_demo --features tui

Run a live SocketCAN monitor with:

cargo run --example socketcan_monitor --features socketcan,tui -- can0

Run a live read-only actuator dashboard with CubeMars and RobStride targets:

cargo run --example socketcan_dashboard --features socketcan,tui -- can0 cubemars:ak60-6:0x03 robstride:rs01:0x01