人车混合机器人实现身体平衡功能
1. 功能说明
在R035c样机上安装一个六轴陀螺仪传感器,本文示例将实现机器人身体平衡功能。当用手把机器人人形部分摆动到左侧时,人形部分会自动恢复到中间;当用手把机器人人形部分摆动到右侧时,人形部分也会自动恢复到中间。
2. 结构说明
R035c样机主要是由四轮四驱底盘上搭载一个人形部分机构组成的。
3. 电子硬件
在这个示例中,我们采用了以下硬件,请大家参考:
主控板 |
Basra主控板(兼容Arduino Uno) |
扩展板 |
Bigfish2.1扩展板 |
传感器 | 六轴陀螺仪 |
电池 | 7.4V锂电池 |
电路连接:
① 六轴陀螺仪传感器(GND、VCC、RX、TX)连接在Bigfish扩展板的Gnd、Vcc(3.3v)、RX、TX;
② 机器人身体中间部分的舵机连接在Bigfish扩展板的(Gnd、Vcc、D3)端口。
4. 功能实现
编程环境:Arduino 1.8.19
实现思路:实现机器人身体平衡功能。当用手把机器人人形部分摆动到左侧时,人形部分会自动恢复到中间;当用手把机器人人形部分摆动到右侧时,人形部分也会自动恢复到中间。
将参考例程(Robot_body_balance.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-04-25 https://www.robotway.com/------------------------------*//* 功能:机器人身体平衡接线:陀螺仪传感器(GND、VCC、RX、TX)接在扩展板的( Gnd、Vcc(3.3v)、RX、TX);机器人身体中间部分的舵机接在扩展板的(Gnd、Vcc、D3);操作:当用手把机器人人形部分摆动到左侧,人形部分会自动恢复到中间;当用手把机器人人形部分摆动到右侧,人形部分会自动恢复到中间;注意:一定要等人形部分的舵机不转动了,再手动摆动机器人;*/#include<Servo.h> //调用舵机库函数#include<Math.h>Servo myservo;#define myservopin 3 //机器人身体中间部分的舵机引脚号//陀螺仪的相关参数#define Gyroscope_left_LimitAngle_X 0.50 //读取到陀螺仪 X 轴向左偏的极限数值#define Gyroscope_Right_LimitAngle_X -0.65 //读取到陀螺仪 X 轴向右偏的极限数值#define Gyroscope_Middle_LimitAngle_X -0.01 //读取到陀螺仪 X 轴平放时的数值//机器人人形部分姿态参数#define Servo_One_Min_Angle 66 //机器人身体中间部分的舵机左偏极限角度#define Servo_One_Max_Angle 118 //机器人身体中间部分的舵机右偏极限角度#define Servo_One_Middle_Angle 90 //机器人身体中间部分的舵机处于中间位置角度#define Servo_Speed 10 //舵机速度void setup(){Serial.begin(115200); //打开串口,并设置波特率为115200myservo.attach(myservopin);}void loop(){Get_gyroscope_And_Control(); //根据陀螺仪传感器的数据实现姿态跟随}
判断机器人人形部分姿态的参考程序(Gyroscope_Device.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-04-25 https://www.robotway.com/------------------------------*/unsigned char Re_buf[11],counter=0;unsigned char sign=0;float a[3],w[3],angle[3],T;int gyroscope_middle_position_min = (Gyroscope_Middle_LimitAngle_X-0.2) * 100;int gyroscope_middle_position_max = (Gyroscope_Middle_LimitAngle_X+0.2) * 100;int gyroscope_left_position_min = Gyroscope_left_LimitAngle_X * 100;int gyroscope_left_position_max = gyroscope_middle_position_max;int gyroscope_right_position_min = gyroscope_middle_position_min;int gyroscope_right_position_max = Gyroscope_Right_LimitAngle_X * 100;unsigned long record_time = 0;int count = 0;void Get_gyroscope_And_Control(){int gyroscope_acc_data[2]={0,0};int map_data= 0;int servo_angle = 0;if(sign){sign=0;if(Re_buf[0]==0x55) //检查帧头{ switch(Re_buf [1]){case 0x51:{record_time = millis();a[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*16;a[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*16;a[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*16;T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;map_data = a[0] * 100;//把陀螺仪的沿X轴的加速度值转为舵机的角度if( ( millis() - record_time ) < 3000 ){count ++;//每隔1s,判断机器人人形部分的姿态;if(count >= 100) {count = 0;//默认机器人处于平衡态(如机器人处于直立状态)if(map_data>=gyroscope_middle_position_min && map_data<=gyroscope_middle_position_max) //i am state{ServoStop(); }//检测到机器人人形部分摆动到左侧,人形部分会自动恢复到平衡态(中间);if(map_data>gyroscope_left_position_max && map_data< gyroscope_left_position_min) //i am left{ myservo.attach(myservopin);servo_angle = map( abs(map_data), abs(gyroscope_left_position_min), abs(gyroscope_left_position_max), Servo_One_Min_Angle, Servo_One_Middle_Angle);Servo_move(servo_angle, Servo_One_Middle_Angle);delay(300);ServoStop();}//检测到机器人人形部分摆动到右侧,人形部分会自动恢复到平衡态(中间);if(map_data>gyroscope_right_position_max && map_data< gyroscope_right_position_min) //i am right{myservo.attach(myservopin);servo_angle = map( abs(map_data), abs(gyroscope_right_position_min), abs(gyroscope_right_position_max), Servo_One_Middle_Angle, Servo_One_Max_Angle);Servo_move(servo_angle, Servo_One_Middle_Angle);delay(300);ServoStop();} } } }break;}}} }void serialEvent() {while (Serial.available()) { Re_buf[counter]=(unsigned char)Serial.read();if(counter==0&&Re_buf[0]!=0x55) return; //第0号数据不是帧头 counter++; if(counter==11) //接收到11个数据{ counter=0; //重新赋值,准备下一帧数据的接收sign=1;} }}void ServoStop(){myservo.detach();digitalWrite(myservopin,LOW);}void Servo_move(int start_angle, int finish_angle){int flag = 0;if( (start_angle - finish_angle) >0 ){ flag = -1;}else { flag = 1; }for( int i=0; i< abs(start_angle - finish_angle);i++){myservo.write( start_angle + flag*i );delay(Servo_Speed);}}
5. 扩展样机
本样机可以有一些扩展,如减少样机底盘上的2个直流驱动轮,或者将样机底盘上的直流驱动轮替换成舵机,如下图所示:
人车混合机器人实现身体平衡功能相关推荐
- nasm纠正性训练指南pdf_打开部队军事体能训练科学化的钥匙军人身体运动功能评估(EMPF)...
军训伤防治任务任重而道远,归根结底还是要落到科学施训上,单纯强调"伤"的防治,既达不到控制伤病效果,而且体现不出"预防"的重要性,还会因此降低训练强度,影响训练 ...
- 【iOS与EV3混合机器人编程系列之三】编写EV3 Port Viewer 应用监测EV3端口数据
在前两篇文章中,我们对iOS与EV3混合机器人编程做了一个基本的设想,并且介绍了要完成项目所需的软硬件准备和知识准备. 那么在今天这一篇文章中,我们将直接真正开始项目实践. ==第一个项目: EV3 ...
- AIGC:ChatGPT(一个里程碑式的对话聊天机器人)的简介(意义/功能/核心技术等)、使用方法(七类任务)、案例应用(提问基础性/事实性/逻辑性/创造性/开放性的问题以及编程相关)之详细攻略
AIGC:ChatGPT(一个里程碑式的对话聊天机器人)的简介(意义/功能/核心技术等).使用方法(七类任务).案例应用(提问基础性/事实性/逻辑性/创造性/开放性的问题以及编程相关)之详细攻略 导读 ...
- 智能车就是计算机,无人车就是机器人
纪念邮票上的19世纪人工接线式电话 「汽车」就像今天的「手机」一样会是个返璞词,定义已经在发生着各种微妙的变化,也许你还不知道而已. 现在「手机」一词通常指「智能手机」或者「手持电话机」,其实小林更愿 ...
- 不惧困难,阿特拉斯机器人展示超强平衡能力
去年在世界机器人大赛上跌跌撞撞的阿特拉斯机器人今年证明了自己. 阿特拉斯机器人(希腊神话中的大力神),是美国武器合约商波士顿动力公司为美军研制的世界最先进人形机器人.阿特拉斯机器人身高1.9米,体重1 ...
- matlab 跳步循环,跳步急停是用单脚或双脚起跳,上体稍后仰,两脚同时平行落地。落地时()着地,用前脚掌内侧抵蹬住地面,两膝弯曲,降低重心,两臂屈肘微张,以保持身体平衡。...
跳步急停是用单脚或双脚起跳,上体稍后仰,两脚同时平行落地.落地时()着地,用前脚掌内侧抵蹬住地面,两膝弯曲,降低重心,两臂屈肘微张,以保持身体平衡. 更多相关问题 [单选] 柴油机对机油进行强制冷却的 ...
- 打开程序时固定位置_FANUC机器人:参考位置功能介绍与设定方法
机器人参考位置概述 机器人参考位置是在运行程序中或手动运行过程中频繁使用的固定位置(预先设定的位置).参考位置通常是离开工装夹具等外围设备的可动区域范围内的安全位置. 机器人位于参考位置时,会立即输出 ...
- ROS中阶笔记(三):机器人仿真—ArbotiX+rviz功能仿真
ROS中阶笔记(三):机器人仿真-ArbotiX+rviz功能仿真 文章目录 01 机器人URDF模型优化-xacro模型文件 1.1 xacro模型文件 1.2 xacro使用方法 1.3 模型显示 ...
- 发那科机器人点位编辑_FANUC机器人:参考位置功能介绍与设定方法
机器人参考位置概述 机器人参考位置是在运行程序中或手动运行过程中频繁使用的固定位置(预先设定的位置).参考位置通常是离开工装夹具等外围设备的可动区域范围内的安全位置. 机器人位于参考位置时,会立即输出 ...
最新文章
- swift-初探webView与JS交互
- 显卡mx150和230哪个好_MX250显卡等于GTX1050?笔记本显卡MX250和MX150的区别对比
- 74. Search a 2D Matrix (Graph; Divide-and-Conquer)
- Java编程字符逆序输出_用JAVA编写一程序:从键盘输入多个字符串到程序中,并将它们按逆序输出在屏幕上。...
- 使用MultipartFile实现文件上传_SpringMVC
- Linux Ubuntu 安装编译Opencv 3.4.3 C++开发环境
- Python3日期时间的操作
- linux常用的BootLoader U-boot的前世今生
- RasbbitMQ 交换机、路由键与队列绑定
- Linux学习(lesson1)
- Tricks(三十四)—— 判断某一属性列是数值型还是标称型
- Android 表单之 EditText(输入框)详解
- 线性代数知识点整理(自用)
- 二叉搜索树 根据前序序列求中序序列
- Excel2019合并两列内容单元格内容自动换行的方法
- Azure云平台学习之路(一)——Azure简介
- 华为升级emui10是鸿蒙系统吗,华为鸿蒙正式发布,EMUI10.0即将登场,你需要这份升级名单吗?...
- 简单粗暴理解与实现机器学习之K-近邻算法(三):距离度量、欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、标准化距离、余弦距离、汉明距离、杰卡德距离、马氏距离
- 高德地图/腾讯地图地址转换经纬度
- ubuntu上关于anaconda虚拟环境配置
热门文章
- 聚焦医疗人工智能,TPP助力“健康中国2030”建设
- Typora激活方法
- (程序)MALTAB求解含未知数的矩阵逆
- 2023年中国政法大学法硕(非法学)考研上岸前辈备考经验
- 计算机研究生学校分析报告,2015-2018年全国硕士研究生报考数据分析报告|硕士研究生|数据分析_新浪教育_新浪网...
- c语言字符常量的界限符,关于C语言的字符常量和符号常量
- 记录MySQL 解压包的安装的过程
- 从事Java程序员五年的艰辛之路。月薪从3k到18k,我整整花了五年
- ORA-00904 标识符无效 解决方案
- iOS系统H264视频硬件编解码说明