外观
软件开发
BSP 模块
本项目采用 BSP(Board Support Package)板级适配架构,基于 xiaozhi-esp32 框架, 专门为EDA-Robot Pro硬件平台定制,实现了AI语音控制的四足机器狗功能。
- eda_robot_pro.cc: 主板支持包,硬件抽象层实现
- eda_dog_controller.cc: 机器狗MCP控制器,实现动作队列和工具注册
- eda_dog_movements_clean.cc: 步态运动算法实现
- eda_dog_movements.h: 步态运动类定义和接口声明
- oscillator.cc / .h: 舵机振荡器实现,提供平滑运动控制
- config.h: 硬件引脚定义和系统参数配置
- config.json: ESP-IDF构建配置,定义目标平台和编译选项
核心模块
eda_robot_pro.cc
EDARobotPro 硬件抽象层
硬件抽象层,负责硬件初始化和设备管理,包括I2C总线、OLED显示屏、按键、音频编解码器及机器狗控制器。
class EDARobotPro {
private:
i2c_master_bus_handle_t display_i2c_bus_; // I2C总线句柄
Display* display_; // 显示屏实例
Button boot_button_; // Boot按键
void InitializeDisplayI2c(); // 初始化显示I2C
void InitializeSsd1306Display(); // 初始化SSD1306显示屏
void InitializeButtons(); // 初始化按键
void InitializeEDARobotDogController(); // 初始化机器狗控制器
public:
virtual Led* GetLed() override; // 获取LED(此板无LED)
virtual AudioCodec* GetAudioCodec() override; // 获取音频编解码器
virtual Display* GetDisplay() override; // 获取显示屏
};
eda_dog_movements_clean.cc
EDARobotDog 动作控制
机器狗动作控制模块,实现各种运动模式和动作序列,包括行走、转向、坐下、站立等基本动作。
class EDARobotDog {
private:
Oscillator servo_[SERVO_COUNT];
int servo_pins_[SERVO_COUNT];
int servo_trim_[SERVO_COUNT];
bool is_dog_resting_;
public:
void Init(int left_front_leg, int left_rear_leg, int right_front_leg, int right_rear_leg);
void Home();
void SetTrims(int left_front_leg, int left_rear_leg, int right_front_leg, int right_rear_leg);
void Walk(float steps, int period, int dir);
void Turn(float steps, int period, int dir);
void Sit(int period);
void Stand(int period);
void Sleep();
void Stretch(int period);
void Shake(int period);
void LiftLeftFrontLeg(int period, int height);
void LiftLeftRearLeg(int period, int height);
void LiftRightFrontLeg(int period, int height);
void LiftRightRearLeg(int period, int height);
};
oscillator.h
Oscillator 振荡控制器
舵机振荡控制器,提供平滑的舵机运动控制,实现各种动作的精确执行。
class Oscillator {
private:
int pos_;
int amplitude_;
int offset_;
double phase_;
double phase0_;
int trim_;
public:
void SetA(unsigned int amplitude);
void SetO(int offset);
void SetPh(double Ph);
void SetTrim(int trim);
void Refresh();
int GetPosition();
};
config.json
config.json 配置文件
项目构建配置文件,定义目标平台、分区表和编译选项。
{
"target": "esp32s3",
"builds": [
{
"name": "EDA-robot-pro",
"sdkconfig_append": [
"CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/16m.csv\"",
"CONFIG_OLED_SSD1306_128X64=y"
]
}
]
}
实现原理
硬件抽象层架构
EDARobotPro 板级支持包
基于 xiaozhi-esp32 框架的 BSP 架构,实现硬件抽象层,统一管理 I2C 总线、OLED 显示、音频编解码器等外设。
class EDARobotPro : public WifiBoard {
private:
i2c_master_bus_handle_t display_i2c_bus_;
esp_lcd_panel_handle_t panel_ = nullptr;
Display* display_ = nullptr;
Button boot_button_;
Button touch_button_;
void InitializeDisplayI2c(); // 初始化I2C总线
void InitializeSsd1306Display(); // 初始化SSD1306显示屏
void InitializeEDARobotDogController(); // 初始化机器狗控制器
void InitializeButtons(); // 初始化按键
public:
virtual AudioCodec* GetAudioCodec() override;
virtual Display* GetDisplay() override;
};
舵机振荡控制系统
Oscillator 振荡器实现
基于 LEDC PWM 的舵机控制器,通过正弦波振荡实现平滑的舵机运动,支持幅度、偏移、相位和周期控制。
void Oscillator::Refresh() {
if (NextSample()) {
if (!stop_) {
// 正弦波振荡计算
int pos = std::round(amplitude_ * std::sin(phase_ + phase0_) + offset_);
if (rev_) pos = -pos;
Write(pos + 90); // 写入舵机位置
}
phase_ = phase_ + inc_; // 更新相位
}
}
void Oscillator::Write(int position) {
int angle = pos* + trim*; // 应用微调
angle = std::min(std::max(angle, 0), 180); // 限制角度范围
// 转换为LEDC占空比
uint32_t duty = (uint32_t)(((angle / 180.0) * 2.0 + 0.5) * 8191 / 20.0);
ESP_ERROR_CHECK(ledc_set_duty(ledc_speed_mode_, ledc_channel_, duty));
ESP_ERROR_CHECK(ledc_update_duty(ledc_speed_mode_, ledc_channel_));
}
步态运动算法
Walk 行走算法实现
采用分步式步态控制,通过精确的舵机位置序列实现四足机器狗的前进和后退运动。
void EDARobotDog::Walk(float steps, int period, int dir) {
for (int step = 0; step < (int)steps; step++) {
if (dir == FORWARD) {
// 前进步态序列
int current_pos[SERVO_COUNT];
// 第1步:左前腿和右后腿抬起
current_pos[LEFT_FRONT_LEG] = 110;
current_pos[RIGHT_REAR_LEG] = 70;
current_pos[LEFT_REAR_LEG] = 90;
current_pos[RIGHT_FRONT_LEG] = 90;
MoveServos(100, current_pos);
// 第2步:对角线腿组协调运动
current_pos[LEFT_REAR_LEG] = 70;
current_pos[RIGHT_FRONT_LEG] = 110;
MoveServos(100, current_pos);
// 第3步:回到中性位置
current_pos[LEFT_FRONT_LEG] = 90;
current_pos[RIGHT_REAR_LEG] = 90;
MoveServos(100, current_pos);
// 继续其他步态序列...
}
}
}
MCP 协议集成
MCP 工具注册机制
通过 MCP 协议向 AI 大语言模型暴露机器狗控制接口,支持参数验证和回调函数执行。
void EDARobotDogController::RegisterMcpTools() {
auto &mcp_server = McpServer::GetInstance();
// 注册行走工具
mcp_server.AddTool(
"self.dog.walk",
"行走。steps: 行走步数(1-100); speed: 行走速度(500-2000); direction: 方向(-1=后退, 1=前进)",
PropertyList({
Property("steps", kPropertyTypeInteger, 4, 1, 100),
Property("speed", kPropertyTypeInteger, 1000, 500, 2000),
Property("direction", kPropertyTypeInteger, 1, -1, 1)
}),
[this](const PropertyList &properties) -> ReturnValue {
int steps = properties["steps"].value();
int speed = properties["speed"].value();
int direction = properties["direction"].value();
QueueAction(ACTION_WALK, steps, speed, direction, 0);
return true;
}
);
}
FreeRTOS 任务调度
异步动作执行系统
基于 FreeRTOS 队列的异步任务调度,确保动作执行不阻塞 AI 对话和其他系统功能。
static void ActionTask(void *arg) {
EDARobotDogController *controller = static_cast(arg);
DogActionParams params;
controller->dog_.AttachServos(); // 初始化舵机
while (true) {
// 从队列接收动作指令
if (xQueueReceive(controller->action_queue_, ¶ms, pdMS_TO_TICKS(1000)) == pdTRUE) {
controller->is_action_in_progress_ = true;
// 根据动作类型执行相应动作
switch (params.action_type) {
case ACTION_WALK:
controller->dog_.Walk(params.steps, params.speed, params.direction);
break;
case ACTION_TURN:
controller->dog_.Turn(params.steps, params.speed, params.direction);
break;
case ACTION_SIT:
controller->dog_.Sit(params.speed);
break;
}
// 动作完成后回到初始位置
if (params.action_type != ACTION_HOME && params.action_type != ACTION_SIT) {
controller->dog_.Home();
}
controller->is_action_in_progress_ = false;
}
}
}