forked from xiaozhi/xiaozhi-esp32
* otto v1.4.0 MCP 1.使用MCP协议控制机器人 2.gif继承lcdDisplay,避免修改lcdDisplay * otto v1.4.1 gif as components gif as components * electronBot v1.1.0 mcp 1.增加electronBot支持 2.mcp协议 3.gif 作为组件 4.display子类 * 规范代码 1.规范代码 2.修复切换主题死机bug
89 lines
2.5 KiB
C++
89 lines
2.5 KiB
C++
#ifndef __MOVEMENTS_H__
|
|
#define __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 BOTH 0
|
|
#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 RIGHT_PITCH 0
|
|
#define RIGHT_ROLL 1
|
|
#define LEFT_PITCH 2
|
|
#define LEFT_ROLL 3
|
|
#define BODY 4
|
|
#define HEAD 5
|
|
#define SERVO_COUNT 6
|
|
|
|
class Otto {
|
|
public:
|
|
Otto();
|
|
~Otto();
|
|
|
|
//-- Otto initialization
|
|
void Init(int right_pitch, int right_roll, int left_pitch, int left_roll, int body, int head);
|
|
//-- Attach & detach functions
|
|
void AttachServos();
|
|
void DetachServos();
|
|
|
|
//-- Oscillator Trims
|
|
void SetTrims(int right_pitch, int right_roll, int left_pitch, int left_roll, int body,
|
|
int head);
|
|
|
|
//-- 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 = Otto at rest position
|
|
void Home(bool hands_down = true);
|
|
bool GetRestState();
|
|
void SetRestState(bool state);
|
|
|
|
// -- 手部动作
|
|
void HandAction(int action, int times = 1, int amount = 30, int period = 1000);
|
|
// action: 1=举左手, 2=举右手, 3=举双手, 4=放左手, 5=放右手, 6=放双手, 7=挥左手, 8=挥右手,
|
|
// 9=挥双手, 10=拍打左手, 11=拍打右手, 12=拍打双手
|
|
|
|
//-- 身体动作
|
|
void BodyAction(int action, int times = 1, int amount = 30, int period = 1000);
|
|
// action: 1=左转, 2=右转
|
|
|
|
//-- 头部动作
|
|
void HeadAction(int action, int times = 1, int amount = 10, int period = 500);
|
|
// action: 1=抬头, 2=低头, 3=点头, 4=回中心, 5=连续点头
|
|
|
|
private:
|
|
Oscillator servo_[SERVO_COUNT];
|
|
|
|
int servo_pins_[SERVO_COUNT];
|
|
int servo_trim_[SERVO_COUNT];
|
|
int servo_initial_[SERVO_COUNT] = {180, 180, 0, 0, 90, 90};
|
|
|
|
unsigned long final_time_;
|
|
unsigned long partial_time_;
|
|
float increment_[SERVO_COUNT];
|
|
|
|
bool is_otto_resting_;
|
|
|
|
void Execute(int amplitude[SERVO_COUNT], int offset[SERVO_COUNT], int period,
|
|
double phase_diff[SERVO_COUNT], float steps);
|
|
};
|
|
|
|
#endif // __MOVEMENTS_H__
|