Simulation - sim/: the unchanged robot firmware compiled into hexapod_sim.dll against PC stand-ins (Arduino, Servo, Wire + register-level MPU6050, RF24 with matching-config radio), a kinematic body model (support plane + planted-foot odometry) that also drives the simulated IMU, and a headless smoke test (sim_smoke). build.ps1 builds and tests. - Hexapod_Simulation_Unity/ folded in (history kept in a bundle outside the repo). Assets/HexapodSim loads the DLL, drives the existing leg rig, and offers joystick / keyboard / robot-serial input plus a test panel. Robot (all found or confirmed in the simulation) - Config.h geometry taken from the Unity model. - IK femur elevation sign, gait stance direction, body pose rotation direction, yaw lever arm. - Stance feet integrated from the current command; gait restarts at mid-stance; heading integrates the applied turn rate, only while walking. - Leg clearance and reach checks (Limits::feetFeasible); walk command and body pose scaled as a whole, pose scale rate-limited, planted feet guarded so the body never snaps or legs collide. - Robot-gyro self-leveling as an integrator. - Heading mode: steering relative to the body; S walks backward. - Standing height from the remote (STANCE_HEIGHT_RANGE_MM). Protocol v3 (reflash both boards) - CmdPacket gains body_height (22 bytes). Remote - Height slider (Nextion hHeight/nHeight, serial [ ]). - Fixed unspecified I2C read order in RemoteIMU. LEGACY/: owner's old Nextion HMI and remote hardware assets. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
50 lines
1.7 KiB
C
50 lines
1.7 KiB
C
#pragma once
|
|
#include <Arduino.h>
|
|
|
|
// Operator commands. Produced by the Nextion touchscreen (NextionUI) and by
|
|
// the USB serial console (SerialConsole) through the same path, so the
|
|
// remote can be fully exercised on the bench without the display attached.
|
|
enum class UiCmd : uint8_t {
|
|
None = 0,
|
|
ToggleArm,
|
|
Disarm, // unconditional - the big red button
|
|
ToggleStand,
|
|
ToggleGait, // tripod <-> wave
|
|
ToggleWalkMode, // direct (A) <-> heading-hold (B)
|
|
ToggleRStickXlate, // right stick: rotation <-> translation
|
|
ToggleRemoteGyro,
|
|
ToggleRobotGyro,
|
|
SetSpeed, // value = 0..255
|
|
SpeedUp, // serial console only
|
|
SpeedDown, // serial console only
|
|
SetHeight, // value = 0..200, 100 = default standing height
|
|
HeightUp, // serial console only
|
|
HeightDown, // serial console only
|
|
ZeroGyro, // capture the handset's current attitude as "level"
|
|
CalStartSave, // start sweep calibration, or save it if running
|
|
CalCancel,
|
|
};
|
|
|
|
struct UiEvent {
|
|
UiCmd cmd = UiCmd::None;
|
|
uint8_t value = 0;
|
|
};
|
|
|
|
// Everything the display shows. The remote is authoritative: the Nextion
|
|
// only sends requests, and always renders what's in here.
|
|
struct UiView {
|
|
bool armed = false;
|
|
bool stand = false;
|
|
bool gait_wave = false;
|
|
bool mode_b = false;
|
|
bool rstick_xlate = false;
|
|
bool remote_gyro = false;
|
|
bool robot_gyro = false;
|
|
bool calibrating = false;
|
|
uint8_t speed_target = 0;
|
|
int16_t height = 0; // -1000..1000, 0 = default
|
|
bool link_ok = false;
|
|
uint8_t link_pct = 0;
|
|
const char* message = ""; // always a string literal - NextionUI diffs it by pointer
|
|
};
|