 <h1 align="center">🤖 ESP32 Robot Motion</h1> <p align="center"> RobotMotion是一个让ESP32轻松控制多舵机运动的组件<br/> 支持单舵机和多舵机并行控制<br/> 提供平滑的运动曲线和动作序列功能 </p> <p align="center"> <a href="./README_EN.md">English</a> · 简体中文 · <a href="https://github.com/NingZiXi/robot_motion/releases">更新日志</a> · <a href="https://github.com/NingZiXi/robot_motion/issues">反馈问题</a> </p> <p align="center"> <a href="LICENSE"> <img alt="License" src="https://img.shields.io/badge/License-MIT-blue.svg" /> </a> <a href="https://docs.espressif.com/projects/esp-idf/"> <img alt="ESP-IDF" src="https://img.shields.io/badge/ESP32-ESP32S3-77216F?logo=espressif" /> </a> <a href="https://docs.espressif.com/projects/esp-idf/"> <img alt="ESP-IDF" src="https://img.shields.io/badge/ESP--IDF-v5.3+-orange.svg" /> </a> <a href="https://www.espressif.com/"> <img alt="ESP32" src="https://img.shields.io/badge/Platform-ESP32-green.svg" /> </a> <a href=""> <img alt="Version" src="https://img.shields.io/badge/Version-v1.0.0-brightgreen.svg" /> </a> <a href="https://github.com/NingZiXi/robot_motion/stargazers"> <img alt="GitHub Stars" src="https://img.shields.io/github/stars/NingZiXi/robot_motion.svg?style=social&label=Stars" /> </a> </p> --- ## 🚀 简介 **RobotMotion** 是一个专为ESP32设计的轻量级多舵机运动控制库✨,通过简洁的API接口实现单舵机和多舵机的平滑运动控制。支持**动作序列编程**和**JSON配置**,可轻松与Coze等大模型平台集成,通过 **Function Calling(函数调用)** 实现智能体直接控制舵机运动,非常适用于智能玩具🧸、机器人🤖等AIoT应用场景。 ## 🛠️ 快速开始 ## 📥 克隆项目 要将组件添加到项目中请在IDF终端执行下方命令: ```bash idf.py add-dependency "ningzixi/robot_motion^1.0.0" ``` 或者直接克隆本仓库到项目`components`目录下: ```bash git clone https://github.com/NingZiXi/robot_motion ``` ## 💻 基本用法 ## 1️⃣初始化配置 ```c #include "iot_servo.h" #include "robot_motion.h" // 舵机初始化 servo_config_t servo_cfg = { .max_angle = 180, .min_width_us = 500, .max_width_us = 2500, .freq = 50, .timer_number = LEDC_TIMER_0, .channels = { .servo_pin = { GPIO_NUM_18, GPIO_NUM_19, GPIO_NUM_21, GPIO_NUM_22, }, .ch = { LEDC_CHANNEL_0, LEDC_CHANNEL_1, LEDC_CHANNEL_2, LEDC_CHANNEL_3, }, }, .channel_number = 4, }; ESP_ERROR_CHECK(iot_servo_init(LEDC_LOW_SPEED_MODE, &servo_cfg_ls)); // 运动控制器初始化 motion_ctrl_t controller; motion_init(&controller); ``` ## 2️⃣基本运动控制 ```c // 单舵机运动 (通道0转到90度,耗时1秒) motion_add_single(&controller, 0, 90.0f, 1000); // 多舵机并行运动 (3个舵机同时运动) uint8_t channels[] = {0,1,2}; float angles[] = {45.0f, 60.0f, 30.0f}; motion_add_parallel(&controller, 3, channels, angles, 1500); ``` ## 3️⃣高级功能 ### 🎭动作序列执行 ```c // 预设动作序列 motion_sequence_t sequence_demo[] = { {1, {0,1,2,3}, {30,150,30,150}, 4, 1000, 300}, {1, {0,1,2,3}, {150,30,150,30}, 4, 1000, 300}, {1, {0,1,2,3}, {90,90,90,90}, 4, 800, 500}, {1, {0,1,2,3}, {10,170,170,10}, 4, 1200, 0} }; motion_exec_sequence(&controller, sequence_demo, sizeof(sequence_demo) / sizeof(sequence_demo[0])); ``` 每一个motion_sequence_t类型的元素代表一个动作,其中: - `type`: 动作类型,0为单舵机,1为多舵机 - `channels`: 舵机通道数组 - `target_angles`: 目标角度数组 - `duration_ms`: 动作持续时间 - `delay_after`: 动作后延迟时间 使用`motion_exec_sequence`会自动按照顺序执行动作序列,直到所有动作执行完毕。 ### 📋执行JSON动作序列 #### 默认JSON格式 (详细字段名) ```c { "motions": [ { "type": "parallel", // 动作类型: parallel(并行)或single(单舵机) "channels": [0,1,2,3], // 舵机通道数组 "target_angles": [90,90,90,90], // 目标角度数组 "duration_ms": 1000, // 动作持续时间(毫秒) "delay_after": 500 // 动作完成后的延迟时间(毫秒) }, { "type": "single", "channel": 0, // 单舵机通道号 "target_angle": 45, // 单舵机目标角度 "duration_ms": 800, "delay_after": 200 } ] } ``` #### 简化版JSON格式 (短字段名) ```c { "m": [ { "t": "p", // 类型: p(并行)或s(单舵机) "cs": [0,1,2,3], // 通道数组 "as": [90,90,90,90], // 角度数组 "d": 1000, // 持续时间 "w": 500 // 等待时间 }, { "t": "s", "c": 0, // 单通道 "a": 45, // 单角度 "d": 800, "w": 200 } ] } ``` #### 字段对照表 | 原版字段名 | 简化字段名 | 说明 | |------------------|------------|-------------------------------| | motions | m | 动作序列数组 | | type | t | 动作类型(parallel/p, single/s)| | channels | cs | 舵机通道数组 | | target_angles | as | 目标角度数组 | | duration_ms | d | 动作持续时间(毫秒) | | delay_after | w | 动作后延迟时间(毫秒) | | channel | c | 单舵机通道号 | | target_angle | a | 单舵机目标角度 | 关于json文本到C/C++ 字符串的转换,可以使用在线工具,如 [tomeko](https://tomeko.net/online_tools/cpp_text_escape.php)。 #### 🧪示例 ```c // 使用原版JSON const char* full_json = "..."; // 原版JSON字符串 motion_exec_json(&controller, full_json); // 使用简化版JSON const char* compact_json = "..."; // 简化版JSON字符串 motion_exec_json(&controller, compact_json); ``` 注意:两种格式可以混用,解析器会自动识别字段名。 更多API接口请查看[robot_motion.h](include/robot_motion.h) ## 🤝 贡献 本项目采用 MIT 许可证📜,详情请参阅 [LICENSE](LICENSE) 文件。 <p align="center"> 感谢您使用 ESP32 Robot Motion!🎉<br/> 如果觉得项目不错,请给个 ⭐ Star 支持一下! </p>
idf.py add-dependency "ningzixi/robot_motion^1.0.0"