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>
37 lines
1.2 KiB
C++
37 lines
1.2 KiB
C++
#pragma once
|
|
// Internal interface between the hardware stand-ins (shim/, SimHardware.cpp)
|
|
// and the exported API (HexapodSimApi.cpp). Not visible to robot/ code.
|
|
#include <stdint.h>
|
|
|
|
namespace simhw {
|
|
|
|
// ---- Clock ----
|
|
void advanceMicros(uint32_t us);
|
|
uint64_t nowMicros();
|
|
|
|
// ---- Serial ----
|
|
void serialFeed(const char* bytes, int len); // Unity -> robot Serial.read()
|
|
int serialDrain(char* out, int cap); // robot Serial.print() -> Unity
|
|
|
|
// ---- Servos (indexed by pin) ----
|
|
constexpr int MAX_PINS = 64;
|
|
struct ServoPin {
|
|
bool attached = false;
|
|
int us = 1500; // Teensy Servo's default pulse after attach()
|
|
uint32_t writes = 0; // writeMicroseconds() calls since start
|
|
};
|
|
const ServoPin& servoPin(int pin);
|
|
|
|
// ---- MPU6050 ----
|
|
void imuSetPresent(bool present);
|
|
// Body-frame values as the chip would measure them: accel in g (reads +1 g
|
|
// on the axis pointing up when at rest), gyro in deg/s.
|
|
void imuSet(float ax, float ay, float az, float gx, float gy, float gz);
|
|
|
|
// ---- Radio ----
|
|
void radioSetPresent(bool present);
|
|
// Puts one packet "on air" using the protocol's channel/address/data rate.
|
|
void radioSend(const uint8_t* bytes, int len);
|
|
|
|
} // namespace simhw
|