Files
xiaozhi-esp32/main/boards/lceda-course-examples/eda-robot-pro/eda_dog_movements.h
2026-04-26 21:35:04 +08:00

92 lines
2.7 KiB
C++

#ifndef __EDA_DOG_MOVEMENTS_H__
#define __EDA_DOG_MOVEMENTS_H__
#include "driver/gpio.h"
#include "esp_log.h"
#include "esp_timer.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "oscillator.h"
//-- Constants
#define FORWARD 1
#define BACKWARD -1
#define LEFT 1
#define RIGHT -1
#define SMALL 5
#define MEDIUM 15
#define BIG 30
// -- Servo delta limit default. degree / sec
#define SERVO_LIMIT_DEFAULT 240
// -- Servo indexes for easy access
#define LEFT_FRONT_LEG 0
#define LEFT_REAR_LEG 1
#define RIGHT_FRONT_LEG 2
#define RIGHT_REAR_LEG 3
#define SERVO_COUNT 4
class EDARobotDog {
public:
EDARobotDog();
~EDARobotDog();
//-- EDA Dog initialization
void Init(int left_front_leg, int left_rear_leg, int right_front_leg, int right_rear_leg);
//-- Attach & detach functions
void AttachServos();
void DetachServos();
//-- Oscillator Trims
void SetTrims(int left_front_leg, int left_rear_leg, int right_front_leg, int right_rear_leg);
//-- Predetermined Motion Functions
void MoveServos(int time, int servo_target[]);
void MoveSingle(int position, int servo_number);
void OscillateServos(int amplitude[SERVO_COUNT], int offset[SERVO_COUNT], int period,
double phase_diff[SERVO_COUNT], float cycle);
//-- HOME = Dog at rest position
void Home();
bool GetRestState();
void SetRestState(bool state);
//-- Basic leg movements
void LiftLeftFrontLeg(int period = 1000, int height = 45); // 抬起左前腿
void LiftLeftRearLeg(int period = 1000, int height = 45); // 抬起左后腿
void LiftRightFrontLeg(int period = 1000, int height = 45); // 抬起右前腿
void LiftRightRearLeg(int period = 1000, int height = 45); // 抬起右后腿
//-- Dog gait movements
void GetCurrentPositions(int pos[SERVO_COUNT]);
void Walk(float steps = 4, int period = 1000, int dir = FORWARD);
void Turn(float steps = 4, int period = 2000, int dir = LEFT);
void Sit(int period = 1500);
void Stand(int period = 1500);
void Stretch(int period = 2000);
void Shake(int period = 1000);
void Sleep(); // 睡觉动作
// -- Servo limiter
void EnableServoLimit(int speed_limit_degree_per_sec = SERVO_LIMIT_DEFAULT);
void DisableServoLimit();
private:
Oscillator servo_[SERVO_COUNT];
int servo_pins_[SERVO_COUNT];
int servo_trim_[SERVO_COUNT];
unsigned long final_time_;
unsigned long partial_time_;
float increment_[SERVO_COUNT];
bool is_dog_resting_;
void Execute(int amplitude[SERVO_COUNT], int offset[SERVO_COUNT], int period,
double phase_diff[SERVO_COUNT], float steps);
};
#endif // __EDA_DOG_MOVEMENTS_H__