logo资料库

WAVEGO 教程三、API文档(教程-03_WAVEGO_API文档).pdf

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
WAVEGO API文档
1. 下位机程序
1.1 软件结构介绍
ESP32下位机中的程序
控制/步态生成方法
1.2 例程实验方法
1.3 与机器人结构相关的参数介绍
1.4 函数介绍
步态相关函数
单一腿控制
2. 传感器
2.1 INA219 电压电流检测
2.2 ICM20948 9轴运动跟踪计
2.3 OLED显示屏
2.4 RGB LED
2.5 蜂鸣器
WAVEGO API文档 1. 下位机程序 1.1 软件结构介绍 ESP32下位机中的程序 控制/步态生成方法 1.2 例程实验方法 1.3 与机器人结构相关的参数介绍 1.4 函数介绍 步态相关函数 单一腿控制 2. 传感器 2.1 INA219 电压电流检测 2.2 ICM20948 9轴运动跟踪计 2.3 OLED显示屏 2.4 RGB LED 2.5 蜂鸣器 WAVEGO API文档 1. 下位机程序 下位机程序是WAVEGO的基础程序,负责机器人的所有运动控制和传感器信息处理,运行于ESP32中, 可使用Arduino IDE进行开发。 1.1 软件结构介绍 ESP32下位机中的程序 WAVEGO.ino 主程序,用来初始化各个模块和执行命令。 InitConfig.h 各个模块初始化的具体函数,包括IO口设置。 app_httpd.cpp 设置WIFI SSID和密码,包括WEB应用和摄像头相关的函数。 WebPage.h WEB应用的界面。 ServoCtrl.h 舵机控制和数学相关的函数,包含了底层的舵机角度控制、连杆逆解和步态生成相关的函 数。 PreferencesConfig.h 用于保存舵机矫正位置,永久保存后该数据不会由于重新上传程序而丢失,你也 可以基于这个来二次开发,用来保存其它需要永久保存的数据,但是需要注意的是,Flash的一个地址读 写次数是有寿命限制的,大概100,000次,所以不要用它来保存常变的变量。 控制/步态生成方法 本章节介绍控制/步态的函数结构,后续章节会有每个函数的具体介绍。 循环调用 robotCtrl()。 robotCtrl(); 通过更改下面这两个变量来控制机器人基础移动动作。更具体的方法可以参考后续章节步态相关函数中 对于每个函数的具体介绍。
extern int moveFB = 0; extern int moveLR = 0; 下面这个变量用于设置机器人的功能模式,当你有了一个自定义的功能或动作,可以通过更改这一变量 来让机器人运行于指定的模式。 extern int funcMode  = 0; //                     0 as not in any function mode. Robot can be controled to move around. //                     1 as in steady mode. keep balancing. //                     2 as stayLow action. //                     3 as handshake action. //                     4 as jump action. //                     5, 6 and 7 as ActionA, ActionB and ActionC. //                     8 as servos moving to initPos, initPos is the middle angle for servos. //                     9 as servos moving to middlePos, middlePos is the middle angle for program. 在 robotCtrl() 内对指令进行判断,本章节着重讲解基础移动的步态生成部分。 robotCtrl() 内用于选择步态的函数: void gaitTypeCtrl(float GlobalStepInput, float directionCmd, int turnCmd) gaitTypeCtrl() 内用于生成对角步态(simpleGait)的函数: void simpleGait(float GlobalInput, float directionAngle, int turnCmd) simpleGait() 内用于控制单独某一条腿的步态周期(通过步态周期参数来控制单独腿的动作): void singleGaitCtrl(uint8_t LegNum, uint8_t statusInput, float cycleInput, float directionInput, double extendedX, double extendedZ) singleGaitCtrl() 内用于通过坐标点参数控制某一条腿的动作的函数: (上一个函数使用步态周期来控制某条腿,这个函数使用坐标点来控制腿;上一个函数通过步态周期参数 来计算出坐标点位置传递给singleLegCtrl()。) void singleLegCtrl(uint8_t LegNum, double xPos, double yPos, double zPos) singleLegCtrl() 内用于解算出舵机角度的三个函数。 void wigglePlaneIK(double LA, double aIn, double bIn, uint8_t outputAlpha, uint8_t outputLen) void simpleLinkageIK(double LA, double LB, double aIn, double bIn, uint8_t outputAlpha, uint8_t outputBeta, uint8_t outputDelta) void singleLegPlaneIK(double LS, double LA, double LC, double LD, double LE, double xIn, double yIn, uint8_t outputBeta, uint8_t outputX, uint8_t outputY) 由此解算出每条腿的三个舵机的角度,从而实现控制舵机摆动到指定位置来驱动机器人。
更多有关以上函数的具体信息可参阅后续的函数介绍章节。   1.2 例程实验方法 本章节用于介绍如何实验或测试后续的函数,你也可以使用此方式测试你自己的二次开发函数或功能。 你可以更改WAVEGO.ino内的 loop() 函数,本产品的主程序运行于此。 默认的 loop() 如下: // main loop. void loop() {  robotCtrl();  allDataUpdate();  wireDebugDetect(); } 你可以把那三个函数全部注释掉,换成你自己需要测试的函数,例如以下的例程可以让机器人的1号腿在 一个步态周期内循环摆动。 // main loop. void loop() {  // robotCtrl();  // allDataUpdate();  // wireDebugDetect();  while(1){      for(i=0; i<=1; i+=0.01){          singleGaitCtrl(1, 1, i, 0, WALK_EXTENDED_X, WALK_EXTENDED_Z);          delay(STEP_DELAY);     } } } 后续的函数介绍中对于个别函数会使用到这种方式来介绍例程,此方法将不再重复介绍。   1.3 与机器人结构相关的参数介绍 每条腿在程序中所对应的编号。
每条腿的三维坐标原点和正值方向。 连杆逆解所需要用到的参数。
  1.4 函数介绍 步态相关函数 void robotCtrl(); 循环调用这一函数,机器人会根据 moveFB 和 moveLR 这两个变量的数值来执行相应的动作。 当特殊动作的指令被下达后,也会在这一个函数内被执行。   向前走 向后走 向左前方走 向右前方走 向右后方走 向左后方走 原地左转 原地右转 moveFB moveLR function 1 -1 1 1 -1 -1 0 0 0 0 -1 1 1 -1 -1 1 gaitTypeCtrl(GLOBAL_STEP, 0, 0) gaitTypeCtrl(GLOBAL_STEP, 180, 0) gaitTypeCtrl(GLOBAL_STEP, 30, 0) gaitTypeCtrl(GLOBAL_STEP, -30, 0) gaitTypeCtrl(GLOBAL_STEP, -120, 0) gaitTypeCtrl(GLOBAL_STEP, 120, 0) gaitTypeCtrl(GLOBAL_STEP, 0, -1) gaitTypeCtrl(GLOBAL_STEP, 0, 1) 函数 robotCtrl() 的作用是将指令转换为参数传递给步态选择函数 gaitTypeCtrl(StepInput, AngleInput, TurningCmd)
使用参数 GAIT_TYPE 来选择步态种类,默认程序中只有代号为 0 的对角步态可以使用,代号为 1 的步态是三角步态作为步态开发例子,对调试要求较高不建议使用,有关步态的调试方法和接口可 以参考步态调试章节。 对焦步态的函数为 simpleGait(float GlobalInput, float directionAngle, int turnCmd) 。 float StepInput (>=0 & <=1),对应一个步态周期,步态生成函数通过这一变量来控制机器人各个 关节运动到步态周期内的某一个形态。 float AngleInput (>= -180 & <=180),用于控制机器人的行进方向,例如当此参数为30时,机器人 会向左前方30°方向走,头部指向不变。 int turnCmd (-1,0,1),用于控制机器人转向,当此参数为-1时原地左转,当此参数为1时原 地右转。   单一腿控制 void singleGaitCtrl(uint8_t LegNum, uint8_t statusInput, float cycleInput, float directionInput, double extendedX, double extendedZ); 机器人整体有一个步态周期,在步态相关函数中介绍过,对应到每一条腿也有相应的 腿部运动周期 ,一 个完整的 腿部运动周期 包括了一个摆动副和一个支撑副。 uint8_t LegNum 用于选择需要控制的腿,左前腿为1,左后腿为2,右前腿为3,右后腿为4。 uint8_t statusInput 用于控制腿部的摆动幅度的系数,实际幅度 = WALK_RANGE * statusInput。 float cycleInput 用于控制腿部运动到摆动周期中某一时刻,当cycleInput从0-1变化时,会控制一 条腿运行一个完整的周期。 float directionInput 用于控制前进方向,180=向后走,0=向前走,90向坐走,-90向右走。 double extendedX 用于控制着地点位置在前后方向上向远端的延申距离。
double extendedZ 用于控制着地点位置在左右方向上向远端的延申距离。 例程如下: // main loop. void loop() {  // robotCtrl();  // allDataUpdate();  // wireDebugDetect();  while(1){      for(i=0; i<=1; i+=0.01){          singleGaitCtrl(1, 1, i, 0, WALK_EXTENDED_X, WALK_EXTENDED_Z);          delay(STEP_DELAY);     } } } 上传该例程后,机器人的左前腿将会在一个摆动周期内往复运动。 2. 传感器 为了避免重复性的开发,我们产品中所使用到的库都是流行度比较高的开源库,由Arduino IDE自带的库 管理器 2.1 INA219 电压电流检测 InitINA219() 用于初始化INA219()传感器。 调用 InaDataUpdata() 来从传感器中读取数据。 读取的数据包括以下内容: float shuntVoltage_mV = 0.0;  // 分流电压 float loadVoltage_V = 0.0;    // 负载电压 float busVoltage_V = 0.0;     // 总线电压 float current_mA = 0.0;       // 当前电流 float power_mW = 0.0;         // 当前功率 更多有关INA219传感器的使用可参考该Github链接。 2.2 ICM20948 9轴运动跟踪计 InitICM20948() 用于初始化ICM20948。 调用 accXYZUpdate() 来从传感器中读取数据。 读取的数据包括以下内容: float ACC_X;  // X轴姿态 float ACC_Y;  // Y轴姿态 float ACC_Z;  // Z轴姿态 你也可以参考ICM20948的例程来读取更多其它数据,更多内容可参阅该Github链接。 2.3 OLED显示屏
InitScreen() 用于初始化SSD1306 OLED显示屏。 显示屏的控制如下:  display.clearDisplay();  // 显示屏清空  display.setTextSize(1);  // 设置文字大小  display.setTextColor(SSD1306_WHITE);  // 设置文字颜色  display.setCursor(0,0);  // 设置光标位置  display.print(F("TEXT"));  // 写文字  display.println(F("TEXT"));  // 写文字后换行    display.display();  // 显示新的内容 你也可以参考SSD1306的例程来控制屏幕显示其它内容 。 2.4 RGB LED InitRGB() 用于初始化RGB LED。 板载的两颗LED的编号分别为0和1,你可以使用2*5P多功能扩展接口的LED引脚来扩展更多的LED灯 (型号为WS2812),格外扩展的RGB LED编号由3开始。 RGB LED的控制例程如下: // LED_NUM: 灯珠的编号 // R: 红色通道数值,范围为0<=R<=255,数值越大代表这个通道的亮度越高。 // G: 绿色通道数值,范围为0<=G<=255,数值越大代表这个通道的亮度越高。 // B: 蓝色通道数值,范围为0<=B<=255,数值越大代表这个通道的亮度越高。 setSingleLED(LED_NUM, matrix.Color(R, G, B)); 当三个颜色通道的数值全部为0时,灯会熄灭。 setSingleLED(0, matrix.Color(0, 0, 0));  // 控制0号灯熄灭。 setSingleLED(1, matrix.Color(0, 0, 0));  // 控制1号灯熄灭。 当三个颜色通道的数值全部为1时,灯会变为白色亮光。 setSingleLED(0, matrix.Color(255, 255, 255));  // 控制0号灯为最大亮度的白光。 setSingleLED(1, matrix.Color(255, 255, 255));  // 控制1号灯为最大亮度的白光。 2.5 蜂鸣器 InitBuzzer() 用于初始化蜂鸣器。 蜂鸣器的控制例程如下: digitalWrite(BUZZER, HIGH); // 蜂鸣器不发声。 digitalWrite(BUZZER, LOW); // 蜂鸣器发声。  
分享到:
收藏