机器人制作开源方案 | Delta型腿机器狗实现原地动作

1. 功能说明

本文示例将实现R322样机Delta型腿机器狗原地摆臂、原地圆形摆动、原地蹲起、原地踏步的功能。
原地摆臂
原地圆形摆动
原地蹲起
原地踏步

 2. 电子硬件

本实验中采用了以下硬件:
主控板

Basra主控板(兼容Arduino Uno)

扩展板

Bigfish2.1扩展板

SH-SR舵机扩展板
传感器近红外传感器
六轴陀螺仪
电池7.4v锂电池、11.1V动力电池

其它

电压显示器

电路连接说明:Delta型腿机器狗的电路连接方式可参考上文【R322】Delta型腿机器狗-全动作展示

3. 功能实现

编程环境:Arduino 1.8.0

下面提供一个Delta型腿机器狗原地动作(原地摆臂、原地圆形摆动、原地蹲起、原地踏步)的参考例程,具体实验效果可参考演示视频。

① 原地摆臂例程(parallel_dog_liftLeg.ino):

/*------------------------------------------------------------------------------------版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.Distributed under MIT license.See file LICENSE for detail or copy athttps://opensource.org/licenses/MITby 机器谱 2023-06-26 https://www.robotway.com/------------------------------*//*****Copyright 2017 Robot TIme摆臂例程*****/#include "Tlc5940.h"#include "tlc_servos.h"#include <math.h>#include "types.h"#include "config.h"// 相关函数声明/***** 红外相关函数 *****/void IRInit(); //红外初始化void enableIR(); //红外使能void disableIR(); //关闭红外void updateIR(); //红外避障更新动作/***** 平衡相关函数 *****/void switchAdjustStat(uint stat); //切换平衡调节模式 不调节/原地调节/行进间调节void readGyroSerial(); //读取陀螺仪串口消息void adjustAct(); //平衡调节动作/****** 腿部动作相关函数 *****/void setTurnLeftFlag(bool flag); //修改左转状态标志位void setTurnRightFlag(bool flag); //修改右转状态标志位void leg1(); //更新1号腿(左前)位置void leg2(); //更新2号腿(左后)位置void leg3(); //更新3号腿(右前)位置void leg4(); //更新4号腿(右后)位置bool calc(Point3d p, bool leg1, bool leg2, bool leg3, bool leg4); //逆解计算函数/***** 整机动作相关函数 *****/void dogReset(Point3d initPos, uint waitTime); //复位动作void dogInit(); //初始化动作void upDown(float x, float y, float z1, float z2, uint times); //蹲起动作void drawCircle(float ox, float oy, float z, float r, uint times); //原地圆形摆动动作void stepping(float x, float y, float z1, float z2, uint times); // 原地踏步动作void liftShoulder(uint height, uint times); //原地摆臂动作//动作周期计数器int cycleCount;//复位计数器void resetCycleCount(){cycleCount = -1;}void updateCycleCount(){cycleCount++;}//当前运动状态dogMode currentMode;//切换运动状态void setMode(dogMode mode){if (mode == currentMode) return;if (mode == DOG_MODE_TURN_LEFT){setTurnLeftFlag(true);setTurnRightFlag(false);} else if (mode == DOG_MODE_TURN_RIGHT){setTurnLeftFlag(false);setTurnRightFlag(true);} else {setTurnLeftFlag(false);setTurnRightFlag(false);}if (mode == DOG_MODE_BACK) //后退时关闭红外传感器{disableIR();} else if (mode == DOG_MODE_STOP) //静止后开始原地姿态调节{switchAdjustStat(ADJUST_STAT_LEG);dogReset({0, 0, Leg_Init_Z_Pos}, 200);}currentMode = mode;}void updateMode(){if (cycleCount == MOTION_TIMES + 1) setMode(DOG_MODE_BACK);if (cycleCount == 3 * MOTION_TIMES) setMode(DOG_MODE_LEFT);if (cycleCount == 4 * MOTION_TIMES) setMode(DOG_MODE_RIGHT);if (cycleCount == 5 * MOTION_TIMES) setMode(DOG_MODE_RIGHT_FRONT);if (cycleCount == 6 * MOTION_TIMES) setMode(DOG_MODE_RIGHT_BACK);if (cycleCount == 7 * MOTION_TIMES) setMode(DOG_MODE_LEFT_BACK);if (cycleCount == 8 * MOTION_TIMES) setMode(DOG_MODE_LEFT_FRONT);if (cycleCount == 9 * MOTION_TIMES) setMode(DOG_MODE_TURN_LEFT);if (cycleCount == 10 * MOTION_TIMES) setMode(DOG_MODE_TURN_RIGHT);if (cycleCount == 11 * MOTION_TIMES) setMode(DOG_MODE_STOP);}void setup(){//陀螺仪连接串口,波特率115200Serial.begin(115200);//舵机驱动板初始化Tlc.init(0);tlc_initServos();   // Note: this will drop the PWM freqency down to 50Hz.//红外传感器初始化IRInit();//大狗身体初始化dogInit();//原地摆臂动作10次后停止liftShoulder(40, 10);while(1);}void loop(){}

② 原地圆形摆动例程(parallel_dog_drawCircle.ino):

/*------------------------------------------------------------------------------------版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.Distributed under MIT license.See file LICENSE for detail or copy athttps://opensource.org/licenses/MITby 机器谱 2023-06-26 https://www.robotway.com/------------------------------*//*****Copyright 2017 Robot TIme原地圆形摆动例程*****/#include "Tlc5940.h"#include "tlc_servos.h"#include <math.h>#include "types.h"#include "config.h"// 相关函数声明/***** 红外相关函数 *****/void IRInit(); //红外初始化void enableIR(); //红外使能void disableIR(); //关闭红外void updateIR(); //红外避障更新动作/***** 平衡相关函数 *****/void switchAdjustStat(uint stat); //切换平衡调节模式 不调节/原地调节/行进间调节void readGyroSerial(); //读取陀螺仪串口消息void adjustAct(); //平衡调节动作/****** 腿部动作相关函数 *****/void setTurnLeftFlag(bool flag); //修改左转状态标志位void setTurnRightFlag(bool flag); //修改右转状态标志位void leg1(); //更新1号腿(左前)位置void leg2(); //更新2号腿(左后)位置void leg3(); //更新3号腿(右前)位置void leg4(); //更新4号腿(右后)位置bool calc(Point3d p, bool leg1, bool leg2, bool leg3, bool leg4); //逆解计算函数/***** 整机动作相关函数 *****/void dogReset(Point3d initPos, uint waitTime); //复位动作void dogInit(); //初始化动作void upDown(float x, float y, float z1, float z2, uint times); //蹲起动作void drawCircle(float ox, float oy, float z, float r, uint times); //原地圆形摆动动作void stepping(float x, float y, float z1, float z2, uint times); // 原地踏步动作void liftShoulder(uint height, uint times); //原地摆臂动作//动作周期计数器int cycleCount;//复位计数器void resetCycleCount(){cycleCount = -1;}void updateCycleCount(){cycleCount++;}//当前运动状态dogMode currentMode;//切换运动状态void setMode(dogMode mode){if (mode == currentMode) return;if (mode == DOG_MODE_TURN_LEFT){setTurnLeftFlag(true);setTurnRightFlag(false);} else if (mode == DOG_MODE_TURN_RIGHT){setTurnLeftFlag(false);setTurnRightFlag(true);} else {setTurnLeftFlag(false);setTurnRightFlag(false);}if (mode == DOG_MODE_BACK) //后退时关闭红外传感器{disableIR();} else if (mode == DOG_MODE_STOP) //静止后开始原地姿态调节{switchAdjustStat(ADJUST_STAT_LEG);dogReset({0, 0, Leg_Init_Z_Pos}, 200);}currentMode = mode;}void updateMode(){if (cycleCount == MOTION_TIMES + 1) setMode(DOG_MODE_BACK);if (cycleCount == 3 * MOTION_TIMES) setMode(DOG_MODE_LEFT);if (cycleCount == 4 * MOTION_TIMES) setMode(DOG_MODE_RIGHT);if (cycleCount == 5 * MOTION_TIMES) setMode(DOG_MODE_RIGHT_FRONT);if (cycleCount == 6 * MOTION_TIMES) setMode(DOG_MODE_RIGHT_BACK);if (cycleCount == 7 * MOTION_TIMES) setMode(DOG_MODE_LEFT_BACK);if (cycleCount == 8 * MOTION_TIMES) setMode(DOG_MODE_LEFT_FRONT);if (cycleCount == 9 * MOTION_TIMES) setMode(DOG_MODE_TURN_LEFT);if (cycleCount == 10 * MOTION_TIMES) setMode(DOG_MODE_TURN_RIGHT);if (cycleCount == 11 * MOTION_TIMES) setMode(DOG_MODE_STOP);}void setup(){//陀螺仪连接串口,波特率115200Serial.begin(115200);//舵机驱动板初始化Tlc.init(0);tlc_initServos();   // Note: this will drop the PWM freqency down to 50Hz.//红外传感器初始化IRInit();//大狗身体初始化dogInit();//原地做圆形摆动10周后停止drawCircle(0, 0, -120, 60, 10);while(1);}void loop(){}

③ 原地蹲起例程(parallel_dog_updown.ino):

/*------------------------------------------------------------------------------------版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.Distributed under MIT license.See file LICENSE for detail or copy athttps://opensource.org/licenses/MITby 机器谱 2023-06-26 https://www.robotway.com/------------------------------*//*****Copyright 2017 Robot TIme原地蹲起例程*****/#include "Tlc5940.h"#include "tlc_servos.h"#include <math.h>#include "types.h"#include "config.h"// 相关函数声明/***** 红外相关函数 *****/void IRInit(); //红外初始化void enableIR(); //红外使能void disableIR(); //关闭红外void updateIR(); //红外避障更新动作/***** 平衡相关函数 *****/void switchAdjustStat(uint stat); //切换平衡调节模式 不调节/原地调节/行进间调节void readGyroSerial(); //读取陀螺仪串口消息void adjustAct(); //平衡调节动作/****** 腿部动作相关函数 *****/void setTurnLeftFlag(bool flag); //修改左转状态标志位void setTurnRightFlag(bool flag); //修改右转状态标志位void leg1(); //更新1号腿(左前)位置void leg2(); //更新2号腿(左后)位置void leg3(); //更新3号腿(右前)位置void leg4(); //更新4号腿(右后)位置bool calc(Point3d p, bool leg1, bool leg2, bool leg3, bool leg4); //逆解计算函数/***** 整机动作相关函数 *****/void dogReset(Point3d initPos, uint waitTime); //复位动作void dogInit(); //初始化动作void upDown(float x, float y, float z1, float z2, uint times); //蹲起动作void drawCircle(float ox, float oy, float z, float r, uint times); //原地圆形摆动动作void stepping(float x, float y, float z1, float z2, uint times); // 原地踏步动作void liftShoulder(uint height, uint times); //原地摆臂动作//动作周期计数器int cycleCount;//复位计数器void resetCycleCount(){cycleCount = -1;}void updateCycleCount(){cycleCount++;}//当前运动状态dogMode currentMode;//切换运动状态void setMode(dogMode mode){if (mode == currentMode) return;if (mode == DOG_MODE_TURN_LEFT){setTurnLeftFlag(true);setTurnRightFlag(false);} else if (mode == DOG_MODE_TURN_RIGHT){setTurnLeftFlag(false);setTurnRightFlag(true);} else {setTurnLeftFlag(false);setTurnRightFlag(false);}if (mode == DOG_MODE_BACK) //后退时关闭红外传感器{disableIR();} else if (mode == DOG_MODE_STOP) //静止后开始原地姿态调节{switchAdjustStat(ADJUST_STAT_LEG);dogReset({0, 0, Leg_Init_Z_Pos}, 200);}currentMode = mode;}void updateMode(){if (cycleCount == MOTION_TIMES + 1) setMode(DOG_MODE_BACK);if (cycleCount == 3 * MOTION_TIMES) setMode(DOG_MODE_LEFT);if (cycleCount == 4 * MOTION_TIMES) setMode(DOG_MODE_RIGHT);if (cycleCount == 5 * MOTION_TIMES) setMode(DOG_MODE_RIGHT_FRONT);if (cycleCount == 6 * MOTION_TIMES) setMode(DOG_MODE_RIGHT_BACK);if (cycleCount == 7 * MOTION_TIMES) setMode(DOG_MODE_LEFT_BACK);if (cycleCount == 8 * MOTION_TIMES) setMode(DOG_MODE_LEFT_FRONT);if (cycleCount == 9 * MOTION_TIMES) setMode(DOG_MODE_TURN_LEFT);if (cycleCount == 10 * MOTION_TIMES) setMode(DOG_MODE_TURN_RIGHT);if (cycleCount == 11 * MOTION_TIMES) setMode(DOG_MODE_STOP);}void setup(){//陀螺仪连接串口,波特率115200Serial.begin(115200);//舵机驱动板初始化Tlc.init(0);tlc_initServos();   // Note: this will drop the PWM freqency down to 50Hz.//红外传感器初始化IRInit();//大狗身体初始化dogInit();//原地蹲起10次后停止upDown(0, 0, -160, -90, 10);while(1);}void loop(){}

④ 原地踏步例程(parallel_dog_stepping.ino):

/*------------------------------------------------------------------------------------版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.Distributed under MIT license.See file LICENSE for detail or copy athttps://opensource.org/licenses/MITby 机器谱 2023-06-26 https://www.robotway.com/------------------------------*//*****Copyright 2017 Robot TIme原地蹲起例程*****/#include "Tlc5940.h"#include "tlc_servos.h"#include <math.h>#include "types.h"#include "config.h"// 相关函数声明/***** 红外相关函数 *****/void IRInit(); //红外初始化void enableIR(); //红外使能void disableIR(); //关闭红外void updateIR(); //红外避障更新动作/***** 平衡相关函数 *****/void switchAdjustStat(uint stat); //切换平衡调节模式 不调节/原地调节/行进间调节void readGyroSerial(); //读取陀螺仪串口消息void adjustAct(); //平衡调节动作/****** 腿部动作相关函数 *****/void setTurnLeftFlag(bool flag); //修改左转状态标志位void setTurnRightFlag(bool flag); //修改右转状态标志位void leg1(); //更新1号腿(左前)位置void leg2(); //更新2号腿(左后)位置void leg3(); //更新3号腿(右前)位置void leg4(); //更新4号腿(右后)位置bool calc(Point3d p, bool leg1, bool leg2, bool leg3, bool leg4); //逆解计算函数/***** 整机动作相关函数 *****/void dogReset(Point3d initPos, uint waitTime); //复位动作void dogInit(); //初始化动作void upDown(float x, float y, float z1, float z2, uint times); //蹲起动作void drawCircle(float ox, float oy, float z, float r, uint times); //原地圆形摆动动作void stepping(float x, float y, float z1, float z2, uint times); // 原地踏步动作void liftShoulder(uint height, uint times); //原地摆臂动作//动作周期计数器int cycleCount;//复位计数器void resetCycleCount(){cycleCount = -1;}void updateCycleCount(){cycleCount++;}//当前运动状态dogMode currentMode;//切换运动状态void setMode(dogMode mode){if (mode == currentMode) return;if (mode == DOG_MODE_TURN_LEFT){setTurnLeftFlag(true);setTurnRightFlag(false);} else if (mode == DOG_MODE_TURN_RIGHT){setTurnLeftFlag(false);setTurnRightFlag(true);} else {setTurnLeftFlag(false);setTurnRightFlag(false);}if (mode == DOG_MODE_BACK) //后退时关闭红外传感器{disableIR();} else if (mode == DOG_MODE_STOP) //静止后开始原地姿态调节{switchAdjustStat(ADJUST_STAT_LEG);dogReset({0, 0, Leg_Init_Z_Pos}, 200);}currentMode = mode;}void updateMode(){if (cycleCount == MOTION_TIMES + 1) setMode(DOG_MODE_BACK);if (cycleCount == 3 * MOTION_TIMES) setMode(DOG_MODE_LEFT);if (cycleCount == 4 * MOTION_TIMES) setMode(DOG_MODE_RIGHT);if (cycleCount == 5 * MOTION_TIMES) setMode(DOG_MODE_RIGHT_FRONT);if (cycleCount == 6 * MOTION_TIMES) setMode(DOG_MODE_RIGHT_BACK);if (cycleCount == 7 * MOTION_TIMES) setMode(DOG_MODE_LEFT_BACK);if (cycleCount == 8 * MOTION_TIMES) setMode(DOG_MODE_LEFT_FRONT);if (cycleCount == 9 * MOTION_TIMES) setMode(DOG_MODE_TURN_LEFT);if (cycleCount == 10 * MOTION_TIMES) setMode(DOG_MODE_TURN_RIGHT);if (cycleCount == 11 * MOTION_TIMES) setMode(DOG_MODE_STOP);}void setup(){//陀螺仪连接串口,波特率115200Serial.begin(115200);//舵机驱动板初始化Tlc.init(0);tlc_initServos();   // Note: this will drop the PWM freqency down to 50Hz.//红外传感器初始化IRInit();//大狗身体初始化dogInit();//原地蹲起10次后停止upDown(0, 0, -160, -90, 10);while(1);}void loop(){}

原地动作-程序源代码资料详见 Delta型腿机器狗-原地动作

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

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

相关文章

前端 | (二)各种各样的常用标签 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;HTML排版标签&#x1f4da;HTML语义化标签&#x1f4da;块级元素与行内元素&#x1f4da;文本标签&#x1f407;常用的文本标签&#x1f407;不常用的文本标…

CentOS5678 repo源 地址 阿里云开源镜像站

CentOS5678 repo 地址 阿里云开源镜像站 https://mirrors.aliyun.com/repo/ CentOS-5.repo https://mirrors.aliyun.com/repo/Centos-5.repo [base] nameCentOS-$releasever - Base - mirrors.aliyun.com failovermethodpriority baseurlhttp://mirrors.aliyun.com/centos/$r…

联通 Flink 实时计算平台化运维实践

摘要&#xff1a;本文整理自联通数科实时计算团队负责人、Apache StreamPark Committer 穆纯进在 Flink Forward Asia 2022 平台建设专场的分享&#xff0c;本篇内容主要分为四个部分&#xff1a; 实时计算平台背景介绍 Flink 实时作业运维挑战 基于 StreamPark 一体化管理 …

Flutter——最详细(NavigationBar)使用教程

NavigationBar简介 Material 3 导航栏组件! 导航栏提供了一种持久且便捷的方式来在应用程序的主要目的地之间进行切换。 使用场景&#xff1a; 底部菜单栏模块 属性作用onDestinationSelected选择索引回调监听器selectedIndex目前选定目的地的索引destinations存放菜单按钮back…

26.Java 异常

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的 要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常: 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个…

WooCommerce企业级电子商务需要了解的事情

建立成功的企业业务变得比以往任何时候都容易得多。借助各种可用的平台&#xff0c;将您的想法付诸实践是绝对可行的。 “WooCommerce 是最知名的 WordPress 网站电子商务平台之一。” 它于 2011 年推出&#xff0c;自此受到大型和小型企业的欢迎。它的流行主要归功于其各种免费…

Mysql教程(一):Mysql数据模型和SQL语法分析

Mysql教程&#xff08;一&#xff09;&#xff1a;Mysql数据模型和SQL语法分析 1、Mysql数据模型 1.1 关系型数据库&#xff08;RDBMS&#xff09; 概念&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库。 特点&#xff1a; 使用表存储数…

【Matlab】智能优化算法_蚁群优化算法ACO

【Matlab】智能优化算法_蚁群优化算法ACO 1.背景介绍2.废话不多说&#xff0c;直接上代码3.文件结构4.详细代码及注释4.1 ACO.m4.2 createColony.m4.3 createGraph.m4.4 drawBestTour.m4.5 drawGraph.m4.6 drawPhromone.m4.7 ACO.mfitnessFunction.m4.8 rouletteWheel.m4.9 upd…

BIO、NIO、AIO之间有什么区别

一、简介 在计算机中&#xff0c;IO 传输数据有三种工作方式&#xff0c;分别是&#xff1a; BIO、NIO、AIO。 在讲解 BIO、NIO、AIO 之前&#xff0c;我们先来回顾一下这几个概念&#xff1a;同步与异步&#xff0c;阻塞与非阻塞。 同步与异步的区别 同步就是发起一个请求后…

day27 贪心算法

1.什么是贪心&#xff1f; 比如10张钞票&#xff0c;有1&#xff0c;5&#xff0c;20&#xff0c;100等面额&#xff0c;取五张&#xff0c;如何取得到数额最多的钱&#xff1f;每次取面额最大的那张钞票&#xff1b;就是每个阶段的局部最优&#xff1b;全局最优就是最后拿到的…

【天梯赛集训】7.17习题集

AC&#xff1a; 12 / 12 用时&#xff1a;2 h 21 min 没卡思路&#xff0c;卡了几个测试点。 7-1 输入输出整数 #include <iostream>using namespace std;int main() {int a;cin >> a;cout << a;return 0; } 7-2 调整数组使奇数全部都位于偶数前面其他数字顺…

VSCode LSP 语言服务器协议总结

为什么使用语言服务器协议&#xff1f; LSP(Language Server Protocol)语言服务器是一种特殊的 Visual Studio Code 扩展&#xff0c;可为许多编程语言提供编辑体验。使用语言服务器&#xff0c;您可以实现自动完成、错误检查&#xff08;诊断&#xff09;、跳转到定义以及VS …