当前位置: 首页 > wzjs >正文

做企业的网站都要准备什么东西惠州网站建设(推荐乐云践新)

做企业的网站都要准备什么东西,惠州网站建设(推荐乐云践新),天眼查公司查询官网,湖北省建设厅行政审批网站0 前言 该部分作为开发过程中的学习记录,可能有错误及不足欢迎小伙伴们一起讨论~ 注:该部分是根据灯哥开源的代码来进行学习,具体数学计算部分不做过多叙述,bilibili的教学视频中已经非常清晰了,本节只对…

0 前言

该部分作为开发过程中的学习记录,可能有错误及不足欢迎小伙伴们一起讨论~

注:该部分是根据灯哥开源的代码来进行学习,具体数学计算部分不做过多叙述,bilibili的教学视频中已经非常清晰了,本节只对个人学习过程中的代码做对应和解释。

1 腿高控制代码

首先,在上一章中我们已经了解了标准Arduino代码由setup()loop()两个函数组成。

void setup() {// put your setup code here, to run once:// 在这里加入你的setup代码,它只会运行一次:
}void loop() {// put your main code here, to run repeatedly://  在这里加入你的loop代码,它会不断重复运行:
}

本章我们首先来看setup()loop()两个函数

通过loop()主函数我们可以得到整个流程:

  • 获取控制器数据(可以理解为每个通道都对应一个按钮,每个按钮不同位置对应不同的数字,比如说下面代码中用到的2通道实际上对应了给定的手柄左边的摇杆,摇杆从下推到上的值从200到1800)
  • 将手柄数据范围映射到腿高数据范围(手柄推动高低即我们期望的腿高低,也就是所谓的腿高期望值。摇杆从下推到上的值从200到1800,腿高是70到130,这个映射的数学公式也很简单假设我们现在控制器数据为 x x x则映射后的腿高为 70 + x − 200 1800 − 200 ⋅ ( 130 − 70 ) 70+\frac{x-200}{1800-200}\cdot(130-70) 70+1800200x200(13070)
  • 根据腿高计算舵机角度值
  • 控制舵机运动到相应的角度
void setup() {Serial.begin(921600);// 初始化串口通信,用于调试输出,波特率921600Wire.begin(1,2,400000UL);// 初始化I2C总线(SDA=GPIO1, SCL=GPIO2),时钟频率400kHzservos.init();// 初始化舵机控制器servos.setAngleRange(0,300);// 设置舵机角度范围(0-300度)servos.setPluseRange(500,2500);// 设置舵机PWM脉宽范围(500-2500μs)sbusRx.Begin(SBUSPIN,-1);// 初始化SBUS接收机(指定信号引脚,无反向)
}void loop() {getRCValue();// 读取遥控器通道数据/* 高度控制逻辑:* 将遥控器通道3的值映射到高度范围[lowest, highest]* RCCHANNEL3_MIN/MAX: 遥控器通道3的原始最小/最大值* Y_demand: 目标高度需求值*/Y_demand = ((int)map(RCValue[2], RCCHANNEL3_MIN, RCCHANNEL3_MAX, lowest, highest));// 调试输出:原始通道值 -> 映射后高度Serial.printf("%d\n",RCValue[2]);Serial.printf("%f\n",Y_demand);// 位置控制参数X = 0;// 水平位置保持0(中心位置)/* 高度平滑过渡:* 使用一阶惯性环节 Y = Y + Kp*(Y_demand - Y)* Kp_Y=0.1 为比例系数,数值越大响应越快但可能振荡*/Y = Y + Kp_Y * (Y_demand - Y);// 设置逆运动学参数(左右腿对称)IKParam.XLeft = X; // 左腿X坐标IKParam.XRight = X;// 右腿X坐标 IKParam.YLeft = Y;// 左腿Y坐标(高度)IKParam.YRight = Y;// 右腿Y坐标Serial.printf("%f,%f,%f\n",X,Y,Y_demand);// 执行逆运动学计算并驱动舵机inverseKinematics();
}

接下来再看实际逆运动学求解部分,该图片来自灯哥教学。
在这里插入图片描述

void inverseKinematics(){float alpha1,alpha2,beta1,beta2;uint16_t servoLeftFront,servoLeftRear,servoRightFront,servoRightRear;/*------------------------ 左腿计算 ------------------------*/// 可以对应上面的图片来看基本一致(左腿参数)float aLeft = 2 * IKParam.XLeft * L1;float bLeft = 2 * IKParam.YLeft * L1;float cLeft = IKParam.XLeft * IKParam.XLeft + IKParam.YLeft * IKParam.YLeft + L1 * L1 - L2 * L2;float dLeft = 2 * L4 * (IKParam.XLeft - L5);float eLeft = 2 * L4 * IKParam.YLeft;float fLeft = ((IKParam.XLeft - L5) * (IKParam.XLeft - L5) + L4 * L4 + IKParam.YLeft * IKParam.YLeft - L3 * L3);// 解二次方程得到大腿关节角度 alpha 和 beta(两个可能解)alpha1 = 2 * atan((bLeft + sqrt((aLeft * aLeft) + (bLeft * bLeft) - (cLeft * cLeft))) / (aLeft + cLeft));alpha2 = 2 * atan((bLeft - sqrt((aLeft * aLeft) + (bLeft * bLeft) - (cLeft * cLeft))) / (aLeft + cLeft));beta1 = 2 * atan((eLeft + sqrt((dLeft * dLeft) + eLeft * eLeft - (fLeft * fLeft))) / (dLeft + fLeft));beta2 = 2 * atan((eLeft - sqrt((dLeft * dLeft) + eLeft * eLeft - (fLeft * fLeft))) / (dLeft + fLeft));// 角度规范化(确保在0-2π范围内)alpha1 = (alpha1 >= 0)?alpha1:(alpha1 + 2 * PI);alpha2 = (alpha2 >= 0)?alpha2:(alpha2 + 2 * PI);/* 解的选择策略:* 左后腿选择大于π/4(45度)的解* 左前选择0~π/4范围内的解*/if(alpha1 >= PI/4) IKParam.alphaLeft = alpha1;else IKParam.alphaLeft = alpha2;if(beta1 >= 0 && beta1 <= PI/4) IKParam.betaLeft = beta1;else IKParam.betaLeft = beta2;/*------------------------ 右腿计算 ------------------------*/// 可以对应上面的图片来看基本一致(右腿参数)float aRight = 2 * IKParam.XRight * L1;float bRight = 2 * IKParam.YRight * L1;float cRight = IKParam.XRight * IKParam.XRight + IKParam.YRight * IKParam.YRight + L1 * L1 - L2 * L2;float dRight = 2 * L4 * (IKParam.XRight - L5);float eRight = 2 * L4 * IKParam.YRight;float fRight = ((IKParam.XRight - L5) * (IKParam.XRight - L5) + L4 * L4 + IKParam.YRight * IKParam.YRight - L3 * L3);IKParam.alphaRight = 2 * atan((bRight + sqrt((aRight * aRight) + (bRight * bRight) - (cRight * cRight))) / (aRight + cRight));IKParam.betaRight = 2 * atan((eRight - sqrt((dRight * dRight) + eRight * eRight - (fRight * fRight))) / (dRight + fRight));// 解二次方程得到大腿关节角度 alpha 和 beta(两个可能解)alpha1 = 2 * atan((bRight + sqrt((aRight * aRight) + (bRight * bRight) - (cRight * cRight))) / (aRight + cRight));alpha2 = 2 * atan((bRight - sqrt((aRight * aRight) + (bRight * bRight) - (cRight * cRight))) / (aRight + cRight));beta1 = 2 * atan((eRight + sqrt((dRight * dRight) + eRight * eRight - (fRight * fRight))) / (dRight + fRight));beta2 = 2 * atan((eRight - sqrt((dRight * dRight) + eRight * eRight - (fRight * fRight))) / (dRight + fRight));// 角度规范化(确保在0-2π范围内)alpha1 = (alpha1 >= 0)?alpha1:(alpha1 + 2 * PI);alpha2 = (alpha2 >= 0)?alpha2:(alpha2 + 2 * PI);/* 解的选择策略:* 右后腿选择大于π/4(45度)的解* 右前选择0~π/4范围内的解*/if(alpha1 >= PI/4) IKParam.alphaRight = alpha1;else IKParam.alphaRight = alpha2;if(beta1 >= 0 && beta1 <= PI/4) IKParam.betaRight = beta1;else IKParam.betaRight = beta2;// 弧度转角度alphaLeftToAngle = (int)((IKParam.alphaLeft / 6.28) * 360);betaLeftToAngle = (int)((IKParam.betaLeft / 6.28) * 360);alphaRightToAngle = (int)((IKParam.alphaRight / 6.28) * 360);betaRightToAngle = (int)((IKParam.betaRight / 6.28) * 360);// 角度矫正servoLeftFront = 90 + betaLeftToAngle;servoLeftRear = 90 + alphaLeftToAngle;servoRightFront = 270 - betaRightToAngle;servoRightRear = 270 - alphaRightToAngle;setServoAngle(servoLeftFront,servoLeftRear,servoRightFront,servoRightRear);
}

以左腿为例,查看串口输出
在这里插入图片描述反计算角度修正
左前: β = 120 − 90 = 30 \beta=120-90=30 β=12090=30
左后: α = 280 − 90 = 190 \alpha=280-90=190 α=28090=190
在这里插入图片描述


文章转载自:

http://6nZ0Vpe6.bwnsp.cn
http://jgPLupkT.bwnsp.cn
http://1wNqhkhQ.bwnsp.cn
http://mF0H5jFR.bwnsp.cn
http://FqxXEoA8.bwnsp.cn
http://KnzMNUnS.bwnsp.cn
http://NuGHsXD8.bwnsp.cn
http://kyRPMcyv.bwnsp.cn
http://kppJSYCw.bwnsp.cn
http://iA2MzICv.bwnsp.cn
http://2QX8hNVL.bwnsp.cn
http://0Lk9qwCc.bwnsp.cn
http://2kd5So6U.bwnsp.cn
http://wsWfU80G.bwnsp.cn
http://Y9dt8nEL.bwnsp.cn
http://dsKlbkV4.bwnsp.cn
http://xd6dMqfI.bwnsp.cn
http://5WJRNRfx.bwnsp.cn
http://5DM2vgvx.bwnsp.cn
http://lLc7JBDg.bwnsp.cn
http://TTIjo2uY.bwnsp.cn
http://SFBuO4w4.bwnsp.cn
http://z97BHqPs.bwnsp.cn
http://paUk1ctY.bwnsp.cn
http://PtWUQbQl.bwnsp.cn
http://dK7SwgdW.bwnsp.cn
http://X1hOf2dN.bwnsp.cn
http://SafxKYrt.bwnsp.cn
http://hAwrbsnk.bwnsp.cn
http://t7lqu7H8.bwnsp.cn
http://www.dtcms.com/wzjs/613167.html

相关文章:

  • 无锡网站排名优化公司重庆建设行业信息网站
  • h5彩票网站怎么做梁山网站建设哪家便宜
  • 网站优化步骤泰安网络宣传
  • 怎么样建立网站方案html5网站建设中
  • 苏州专业网站建设设计永久免费不收费的软件app
  • 普通高等学校健康驿站建设指引ai怎么做网页
  • 网站建设工作 方案宁波网页设计多少钱
  • 做游戏本测评的网站wordpress 图书插件
  • 网站建设行业怎么样泉州网页网站制作
  • 口碑营销理论福田做网站优化乐云seo
  • 商城顺德网站建设wordpress 导出
  • 帝国cms做英文网站小程序开发文档api
  • 山东华邦建设网站首页张家港安监站网址
  • 网站建设制作收费wordpress主题里面的各个文件
  • 网站运营工作的基本内容菠菜网站做首存
  • 珠海网站优化培训自建木屋教程
  • 新网站建设 英文翻译手机html编辑器
  • wordpress主题幻灯片长春关键词优化公司
  • wordpress 整站加密做交易网站需要用到的软件有哪些
  • 网站主要盈利模式私募网站建设服务
  • 新网站怎么做seo优化免费网站优化
  • 肥乡网站建设西安工装装修公司排名
  • 黄埔免费网站建设金华市建设技工学校教育培训网站
  • 桐乡市建设局网站大通酩悦最好的网站模板
  • 网站如何优化流程wordpress a5
  • php毕业设计代做网站建筑工程网格化管理方案
  • 家禽养殖公司网站怎么做免费素材视频软件app
  • 建站网站关键词大全靖江网站建设制作
  • 做网站图片ps用哪种字体如何为wordpress添加音乐播放器
  • 长春建站模板搭建南宁网站建设 南宁联达亿