【兔子机器人】实现从初始状态到站立

一、遥想星空up主的方法

由于我有卡位结构,无法做到劈腿,而且底盘也不一样,无法使用此方法
但是其代码思想是可以借鉴的。

参考视频:
【【开源啦!】无刷轮腿平衡机器人】 【精准空降到 01:16】 https://www.bilibili.com/video/BV1bP411k75b/?share_source=copy_web&vd_source=77e36f24add8dc77c362748ffb980148&t=76

在这里插入图片描述

在这里插入图片描述

Motor_SetTorque(&leftJoint[0], 0.2f);  //将0.2Nm扭矩添加到左边0号关节电机

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这部分代码更新腿部姿态
在这里插入图片描述

vTaskDelay(5); // 延时,直到腿部角度转到一定位置

在这里插入图片描述
设置standupState初始值为StandupState_None
在这里插入图片描述
StandupState_None的引用:
在这里插入图片描述
StandupState_Standup的引用:
在这里插入图片描述
lsk兔子的站立代码:
在这里插入图片描述

电机力矩求解函数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
每次循环都解算关节电机
在这里插入图片描述
在这里插入图片描述

#define PROTECT_CONDITION (leftTheta < -M_PI_4 || leftTheta > M_PI_4 || \rightTheta < -M_PI_4 || rightTheta > M_PI_4 || \imuData.pitch > M_PI_4 || imuData.pitch < -M_PI_4) //腿部角度超限保护条件
if(PROTECT_CONDITION) //当前达到保护条件
{if(standupState == StandupState_None) //未处于起立过程中{//关闭所有电机Motor_SetTorque(&leftWheel, 0);Motor_SetTorque(&rightWheel, 0);Motor_SetTorque(&leftJoint[0], 0);Motor_SetTorque(&leftJoint[1], 0);Motor_SetTorque(&rightJoint[0], 0);Motor_SetTorque(&rightJoint[1], 0);//阻塞等待腿部角度回到安全范围,再等待4s后恢复控制(若中途触发了起立则在起立准备完成后直接跳出)while(PROTECT_CONDITION && standupState == StandupState_None){leftTheta = leftLegPos.angle - imuData.pitch - M_PI_2;rightTheta = rightLegPos.angle - imuData.pitch - M_PI_2;vTaskDelay(100);}if(standupState == StandupState_None)vTaskDelay(4000);//退出保护后设定目标位置和yaw角度为当前值target.position = (leftWheel.angle + rightWheel.angle) / 2 * wheelRadius;target.yawAngle = imuData.yaw;continue;}if(standupState == StandupState_Standup && (leftTheta < -M_PI_4 || rightTheta > M_PI_4))standupState = StandupState_None;
}
else
{if(standupState == StandupState_Standup) //未达到保护条件且处于起立过程中,说明起立完成,退出起立过程standupState = StandupState_None;
}//设定关节电机输出扭矩
Motor_SetTorque(&leftJoint[0], -leftJointTorque[0]);
Motor_SetTorque(&leftJoint[1], -leftJointTorque[1]);
Motor_SetTorque(&rightJoint[0], -rightJointTorque[0]);
Motor_SetTorque(&rightJoint[1], -rightJointTorque[1]);vTaskDelayUntil(&xLastWakeTime, 4); //4ms控制周期

二、吴方法

核心思想:
在这里插入图片描述
实操:
在这里插入图片描述
在这里插入图片描述

由于车轮电机给了机体一个扭矩,那么一定要抵消这个扭矩,怎么抵消扭矩?关节电机是不可能的,所以还是**车轮电机重新提供一个反方向的扭矩!**而自己在调试过程中,以为lsk的平衡控制算法会帮我抵消扭矩,其实不会,因为他是根据陀螺仪实时测量俯仰角pitch来进行平衡控制的,并没有检测扭矩的传感器。

在这里插入图片描述

三、自己的控制规划

四腿贴紧卡位,然后解算出陀螺仪的pitch俯仰角,来判断是前倒还是后倒。然后车轮瞬间给一个大力距,将兔子立起来。

后仰角度:
在这里插入图片描述
前倾角度:
在这里插入图片描述
要将站立写在一个线程里面,或者main.c里面,因为线程在来回切换,会有可能影响条件语句判断导致出错,而且代码看起来很乱。目前的错是,轮毂电机的力不受控制,一直都大。

如果不设为切换状态时的位置会产生急停,力矩还在,车体直接翻倒:
在这里插入图片描述
在这里插入图片描述

四、控制代码debug

直接将以下代码放在control.h中,会出现下面的报错,因为.h只能声明,而不能初始化赋值。
在这里插入图片描述
在这里插入图片描述

正确处理方式:

在.h里面声明,在.c里面初始化赋值:
在这里插入图片描述
在这里插入图片描述

外部文件想使用其变量(变成外部变量),在自己的.h文件利用extern声明变量,但不要赋值,这样子就可以在.c文件直接引用了。

站立过程状态含义:

//站立过程状态枚举量
enum StandupState
{StandupState_None_Front,StandupState_None_Back,//当pitch角度在一定倾斜角度时,赋值StandupState_None,//如果是前倾--Front,如果是后倾--BackStandupState_Prepare,//虚拟腿收缩最短,则赋值StandupState_PrepareStandupState_Standup//准备工作完成,则赋值StandupState_Standup,开始站立
};

GO电机参数
在这里插入图片描述
在这里插入图片描述
代码
在这里插入图片描述
需要发送到电机,CAN线可以同时发到好几个电机。Go电机是用RS485通信,只能一个一个包的发,一个包包含一个GO电机。
在这里插入图片描述
group为0时,只能控制ID:0~3的电机
在这里插入图片描述
得在CUbemx里面开线程:
在这里插入图片描述

M1502D_Actively_Report_Get_Feedback(uint32_t std_id, uint8_t *data_p)

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/542419.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙操作系统 HarmonyOS 3.2 API 9 Stage模型通过ArkTS接入高德地图

用鸿蒙ArkTS语言开发地图APP应用时&#xff0c;很多地图厂商只接入了鸿蒙Java&#xff0c;ArkTS版本陆续接入中&#xff0c;等一段时间才能面世&#xff0c;当前使用地图只能通过鸿蒙的Web组件&#xff0c;将HTML页面嵌入到鸿蒙APP中。具体方法如下&#xff1a;编写HTML <!…

Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)

目录 Redis的短信登录实战解析1. 短信登录-基于session实现短信登录的流程2. 短信登录-实现发送短信验证码功能3. 短信登录-实现短信验证码登录和注册功能4. 短信登录-实现登录校验拦截器5. 短信登录-隐藏用户敏感信息6. 短信登录-session共享的问题分析7. 短信登录-Redis代替s…

大疆Action3视频导出卡顿原理及解决方案分析

前言 最近调休出去游玩了一下&#xff0c;用 大疆的Action3 做了一些游玩记录。晚上回来高高兴兴准备导出视频开始剪辑了&#xff0c;结果…出幺蛾子&#xff0c;导出到手机上的的二十多个素材全部都是以慢动作的方式回放的&#xff0c;但是在Action3 中观看是正常的。所以立马…

软件无线电系列——带通信号采样定理

本节目录 一、带通信号采样定理 1、带通信号采样定理的定义 2、带通信号采样定理的证明本节内容 一、带通信号采样定理 1、带通信号采样定理的定义 Nyquist采样定理是对频谱分布在(0,fH)上的基带信号的采样分析的&#xff0c;如果信号的频谱分布在某一限定的频带(fL,fH)上&…

修改/etc/resolve.conf重启NetworkManager之后自动还原

我ping 百度报错&#xff1a; [rootk8snode1 ~]# ping baidu.com ping: baidu.com: Name or service not known很明显&#xff0c;这是DNS解析问题。 于是我修改 /etc/resolv.conf 文件后&#xff0c;执行完sudo systemctl restart NetworkManager&#xff0c;/etc/resolv.con…

课堂:Apriori + 关联规则

一&#xff0e;小结 本小节主要是学习关联规则&#xff0c;但是学习这个之前&#xff0c;我们要学习Apriori算法求的频繁集。 二&#xff0e;实操演示 &#xff08;1&#xff09;处理数据集 导入数据 #导入数据 import pandas as pd path C:\\Users\\chxy\\Desktop\\dat…

AndroidLinux GPIO控制方法

目录 1 GPIO整体架构 2 user space 层 gpio使用方法 2.1 sysfs控制方法 2.1.1 kernel版本区别 2.1.2 /sys/class/gpio 2.1.3 /sys/bug/gpio/devices 2.2 chardev控制方法 2.2.1 chardev 示例代码 2.2.2 示例代码主要步骤描述 2.2.3 include/linux/gpio.h 全部代码 2.3…

海格里斯HEGERLS托盘搬运机器人四向车引领三维空间集群设备柔性运维

随着市场的不断迅猛发展变化&#xff0c;在物流仓储中&#xff0c;无论是国内还是海外&#xff0c;都对托盘式解决方案需求量很大。顾名思义&#xff0c;托盘式解决方案简单理解就是将产品放置在托盘上进行存储、搬运和拣选。 面对托盘式方案需求&#xff0c;行业中常见的方案是…

【Unity】进度条和血条的三种做法

前言 在使用Unity开发的时候&#xff0c;进度条和血条是必不可少的&#xff0c;本篇文章将简单介绍一下几种血条的制作方法。 1.使用Slider Slider组件由两部分组成&#xff1a;滑动区域和滑块。滑动区域用于显示滑动条的背景&#xff0c;而滑块则表示当前的数值位置。用户可…

Java面试——SQL 语句题

优质博文&#xff1a;IT-BLOG-CN 一、行转列问题 现有表格A&#xff0c;按照以下格式排列&#xff1b; 姓名收入类型收入金额Tom年奖金5wTom月工资10kJack年奖金8wJack月工资12k 先需要将表格转化为&#xff1a; 姓名月工资年奖金Tom10k50kJack12k80k 方法一&#xff1a;…

力扣111---二叉树的最小深度(简单题,Java,递归+非递归)

目录 题目描述&#xff1a; &#xff08;递归&#xff09;代码&#xff1a; &#xff08;非递归、层次遍历&#xff09;代码&#xff1a; 题目描述&#xff1a; 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说…

C语言-strstr(字符串里查找字符串)

strstr&#xff08;字符串里查找字符串&#xff09; 语法格式 库函数实现的逻辑 1&#xff0c;返回一个指向str2在str1中第一次出现的位置&#xff0c;如果str2不是p&#xff0c;则返回一个空指针&#xff0c;函数返回字符串str2在字符串str1中第一次出现的位置) 2&#xf…