arduino环境下利用ESP32控制舵狗(前进步态的编写)

舵狗的步态有许多种 ,我用的是比较常用的对角步态,及对角的足的动作一致不断交替运动完成行走的一种步态。代码的实现方面是利用运动学的逆解计算出各角度值,然后与初始值进行比较,通过比较后的结果对舵机进行控制,就完成了舵狗的运动控制,其中需要注意的是延迟函数的使用,如果延迟过小会造成舵机来不及反应而只维持一个动作,如果延迟过大,会造成动作的不稳定。//逆运动学测试,初始坐标(0,135.36)#include <Arduino.h>#include <WiFi.h>#defin
摘要由CSDN通过智能技术生成

舵狗的步态有许多种 ,我用的是比较常用的对角步态,及对角的足的动作一致不断交替运动完成行走的一种步态。
代码的实现方面是利用运动学的逆解计算出各角度值,然后与初始值进行比较,通过比较后的结果对舵机进行控制,就完成了舵狗的运动控制,其中需要注意的是延迟函数的使用,如果延迟过小会造成舵机来不及反应而只维持一个动作,如果延迟过大,会造成动作的不稳定。

#include <Arduino.h>
#include <WiFi.h>

#define DJ0_PWM 13
#define DJ1_PWM 12
#define DJ2_PWM 14

#define DJ3_PWM 27
#define DJ4_PWM 25
#define DJ5_PWM 26

#define DJ6_PWM 33
#define DJ7_PWM 32
#define DJ8_PWM 21

#define DJ9_PWM 19
#define DJ10_PWM 22
#define DJ11_PWM 23

double x,z,BD,xB,zB,L1 = 57,L2 = 50,L3 = 61;

double duty0,duty1,duty2,duty3,duty4,duty5,duty6,duty7,duty8,duty9,duty10,duty11;  // 占空比变量

double dutyCycle0,dutyCycle1,dutyCycle2,dutyCycle3,dutyCycle4,dutyCycle5,dutyCycle6,dutyCycle7,dutyCycle8,dutyCycle9,dutyCycle10,dutyCycle11;  // 设置占空比

double Initial_Alpha0,Initial_Beta0,
       Initial_Alpha1,Initial_Beta1,
       Initial_Alpha2,Initial_Beta2,
       Initial_Alpha3,Initial_Beta3;  //设置角度

int freq = 50;

int freq0 = freq;    // 频率
int channel0 = 0;    // 通道0,共16个通道,0~15
int resolution0 = 10;   // 分辨率,取值0~20,duty最大取值为2^resolution-1

int freq1 = freq;    // 频率
int channel1 = 1;    // 通道1,共16个通道,0~15
int resolution1 = 10;   // 分辨率,取值0~20,duty最大取值为2^resolution-1

int freq2 = freq;    // 频率
int channel2 = 2;    // 通道0,共16个通道,0~15
int resolution2 = 10;   // 分辨率,取值0~20,duty最大取值为2^resolution-1

int freq3 = freq;    // 频率
int channel3 = 3;    // 通道0,共16个通道,0~15
int resolution3 = 10;   // 分辨率,取值0~20,duty最大取值为2^resolution-1

int freq4 = freq;    // 频率
int channel4 = 4;    // 通道0,共16个通道,0~15
int resolution4 = 10;   // 分辨率,取值0~20,duty最大取值为2^resolution-1

int freq5 = freq;    // 频率
int channel5 = 5;    // 通道0,共16个通道,0~15
int resolution5 = 10;   // 分辨率,取值0~20,duty最大取值为2^resolution-1

int freq6 = freq;    // 频率
int channel6 = 6;    // 通道0,共16个通道,0~15
int resolution6 = 10;   // 分辨率,取值0~20,duty最大取值为2^resolution-1

int freq7 = freq;    // 频率
int channel7 = 7;    // 通道0,共16个通道,0~15
int resolution7 = 10;   // 分辨率,取值0~20,duty最大取值为2^resolution-1

int freq8 = freq;    // 频率
int channel8 = 8;    // 通道0,共16个通道,0~15
int resolution8 = 10;   // 分辨率,取值0~20,duty最大取值为2^resolution-1

int freq9 = freq;    // 频率
int channel9 = 9;    // 通道0,共16个通道,0~15
int resolution9 = 10;   // 分辨率,取值0~20,duty最大取值为2^resolution-1

int freq10 = freq;    // 频率
int channel10 = 10;    // 通道0,共16个通道,0~15
int resolution10 = 10;   // 分辨率,取值0~20,duty最大取值为2^resolution-1

int freq11 = freq;    // 频率
int channel11 = 11;    // 通道0,共16个通道,0~15
int resolution11 = 10;   // 分辨率,取值0~20,duty最大取值为2^resolution-1

struct ForwardKinematics  //建立一个结构体用来存储计算后的角度值
{
   
  double Alpha;  //角度α
  double Beta;   //角度β
}h;

void Inverse_kinematics(double x,double z)  //逆运动学计算公式
{
   
  xB = 0;
  zB = 1.732/2*L1;
  if(x<0)
  {
   
    x = -x;
    BD = sqrt(x*x+(z-zB)*(z-zB));
    h.Alpha = 60+acos((x*x+BD*BD-(z-zB)*(z-zB))/(2*x*BD)
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值