【R328】4自由度并联机器狗
作者:机器谱
下蹲 行走 跳跃 |
1. 功能说明
本文示例将实现R328a样机4自由度并联机器狗下蹲的功能。
2. 结构说明
本样机的并联驱动结构与 【R082】4自由度并联四足 类似,两款样机可以对比来看。
本样机腿部的结构如下图所示:驱动核心部分是两个5杆结构的组合。
下蹲
两个五杆结构图
驱动核心部分再搭配下图的四杆结构,即可构成单侧的腿。驱动核心部分再搭配下图的四杆结构,即可构成单侧的腿。
单侧腿部图
四杆结构
整机
3. 电子硬件
在这个示例中,我们采用了以下硬件,请大家参考:
电路连接:为了便于识别控制4自由度并联机器狗,我们先规定好机器狗的前方以及舵机位置编号(如下图所示):
将舵机(A1、A2 、B1、B2)连接在Bigfish扩展板的D4、D7、D3、D8端口,如下图所示:
4. 功能实现
上位机:Controller 1.0
下位机编程环境:Arduino 1.8.19
实现思路:实现4自由度并联机器狗站立、前蹲、后蹲的动作。
4.1 调试舵机角度
利用上位机 Controller软件调整4自由度并联机器狗的舵机角度,记录下机器狗站立、前蹲、后蹲时舵机的角度;然后利用Arduino IDE进行下位机编程,利用这些角度实现机器狗下蹲的功能。
对于如何利用Controller软件进行调试机器狗的舵机角度,可参考【U002】如何驱动模拟舵机-Controller 1.0b软件的使用 在本次实验中,经过调试,对于4自由度并联机器狗站立、前蹲、后蹲时的舵机角度值如下图所示:
主控板 | |
扩展板 | |
电池 | 7.4V锂电池 |
/*------------------------------------------------------------------------------------ 版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved. Distributed under MIT license.See file LICENSE for detail or copy at https://opensource.org/licenses/MIT by 机器谱 2023-05-26 https://www.robotway.com/ ------------------------------*/ /* 本例程实现机器小狗站立、前蹲和后蹲 */ #include<Servo.h> #define SERVO_SPEED 60 //定义舵机转动快慢的时间 #define ACTION_DELAY 0 //定义所有舵机每个状态时间间隔 Servo myServo[4]; int f = 15; //定义舵机每个状态间转动的次数,以此来确定每个舵机每次转动的角度 int servo_port[4] = {3,4,7,8}; //定义舵机引脚 int servo_num = sizeof(servo_port) / sizeof(servo_port[0]); //定义舵机数量 float value_init[4] = {1513,1457,1074,1545}; //定义舵机初始角度 void setup() { Serial.begin(9600); for(int i=0;i<servo_num;i++){ ServoGo(i,value_init[i]); } delay(2000); } void loop() { Dog_squat(); } void Dog_squat() { servo_move(value_init[0],value_init[1],value_init[2],value_init[3]);//直立 servo_move(1243,1703,1278,1299);//向后蹲下 servo_move(value_init[0],value_init[1],value_init[2],value_init[3]);//直立 servo_move(1715,1255,1052,1545);//向前蹲下 servo_move(value_init[0],value_init[1],value_init[2],value_init[3]);//直立 } void ServoStart(int which) { if(!myServo[which].attached())myServo[which].attach(servo_port[which]); pinMode(servo_port[which], OUTPUT); } void ServoStop(int which) { myServo[which].detach(); digitalWrite(servo_port[which],LOW); } void ServoGo(int which , int where) { if(where!=200) { if(where==201) ServoStop(which); else { ServoStart(which); myServo[which].write(where); } } } void servo_move(float value0, float value1, float value2, float value3) //舵机转动 {
float value_arguments[] = {value0, value1, value2, value3}; float value_delta[servo_num];
for(int i=0;i<servo_num;i++) { value_delta[i] = (value_arguments[i] - value_init[i]) / f; }
for(int i=0;i<f;i++) { for(int k=0;k<servo_num;k++) { value_init[k] = value_delta[k] == 0 ? value_arguments[k] : value_init[k] + value_delta[k]; } for(int j=0;j<servo_num;j++) { ServoGo(j,value_init[j]); } delay(SERVO_SPEED); } delay(ACTION_DELAY); } |
机器狗站立时的舵机值
机器狗前蹲时的舵机值
机器狗后蹲时的舵机值
4.2 示例程序
下面提供一个4自由度并联机器狗下蹲的参考例程(Dog_squat.ino),实验效果可参考演示视频。
5. 扩展样机
本样机可以做出一些扩展,如下图所示的在样机上方增加平板,此样机可用探索者零件或探索者兼容零件制作。
6. 资料清单
序号 | 内容 |
1 | 【R328】-下蹲-程序源代码 |
2 | 【R328】-下蹲-样机3D文件 |
【整体打包】-【R328】4自由度并联机器狗-下蹲-资料附件.zip | 6.23MB | 下载7次 | 下载 |
行走
1. 功能说明
本文示例将实现R328a样机4自由度并联机器狗行走的功能。
2. 电子硬件
在这个示例中,我们采用了以下硬件,请大家参考:
主控板 | |
扩展板 | |
电池 | 7.4V锂电池 |
/*------------------------------------------------------------------------------------ 版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved. Distributed under MIT license.See file LICENSE for detail or copy at https://opensource.org/licenses/MIT by 机器谱 2023-05-26 https://www.robotway.com/ ------------------------------*/ /* 本例程实现机器小狗行走 调试小狗行走的注意事项: 3、8对应着小狗左侧的上下舵机; 4、7对应着小狗右侧的上下舵机; 连接好舵机后,将调试好的小狗初始直立状态写入float value_init[4] = { };中即可; */ #include<Servo.h> #define SERVO_SPEED 20 //定义舵机转动快慢的时间 #define ACTION_DELAY 0 //定义所有舵机每个状态时间间隔 Servo myServo[4]; int f = 15;//定义舵机每个状态间转动的次数,以此来确定每个舵机每次转动的角度 int servo_port[4] = {3,4,7,8};//定义舵机引脚 int servo_num = sizeof(servo_port) / sizeof(servo_port[0]);//定义舵机数量 float value_init[4] = {1478,1500,1545,1478};//定义舵机初始角度 int leg_range = 180; //小狗左右两条腿摆动的幅度 float reset_init[4]={0,0,0,0}; void setup() { Serial.begin(9600); for(int i=0;i<servo_num;i++) ServoGo(i,value_init[i]); for(int i=0;i<servo_num;i++){ reset_init[i] = value_init[i]; } delay(2000); } void loop() { Dog_walk(); } void Dog_walk() { servo_move(value_init[0],value_init[1],reset_init[2]+leg_range,reset_init[3]); servo_move(value_init[0],value_init[1],reset_init[2],reset_init[3]-leg_range); } void ServoStart(int which) { if(!myServo[which].attached())myServo[which].attach(servo_port[which]); pinMode(servo_port[which], OUTPUT); } void ServoStop(int which) { myServo[which].detach(); digitalWrite(servo_port[which],LOW); } void ServoGo(int which , int where) { if(where!=200) { if(where==201) ServoStop(which); else { ServoStart(which); myServo[which].write(where); } } } void servo_move(float value0, float value1, float value2, float value3) //舵机转动 {
float value_arguments[] = {value0, value1, value2, value3}; float value_delta[servo_num];
for(int i=0;i<servo_num;i++) { value_delta[i] = (value_arguments[i] - value_init[i]) / f; }
for(int i=0;i<f;i++) { for(int k=0;k<servo_num;k++) { value_init[k] = value_delta[k] == 0 ? value_arguments[k] : value_init[k] + value_delta[k]; } for(int j=0;j<servo_num;j++) { ServoGo(j,value_init[j]); } delay(SERVO_SPEED); } delay(ACTION_DELAY); } |
电路连接:机器狗左侧的上下舵机连接在Bigfish扩展板的D3、D8端口;机器狗右侧的上下舵机连接在Bigfish扩展板的D4、D7端口。
3. 功能实现
上位机:Controller 1.0
下位机编程环境:Arduino 1.8.19
实现思路:实现机器狗可以灵活的自由行走。
3.1 调试舵机角度
对于如何利用Controller软件进行调试机器狗的舵机角度,可参考【U002】如何驱动模拟舵机-Controller 1.0b软件的使用
在本次实验中,经过调试,对于4自由度并联机器狗行走时的舵机角度值如下图所示:
机器狗行走时的舵机值
3.1 示例程序
下面提供一个4自由度并联机器狗行走的参考例程(Dog_walk_finall.ino),实验效果可参考演示视频。
4. 资料清单
序号 | 内容 |
1 | 【R328】-行走-程序源代码 |
【整体打包】-【R328】4自由度并联机器狗-行走-资料附件.zip | 3.44KB | 下载2次 | 下载 |
跳跃
1. 功能说明
本文示例将实现R328a样机4自由度并联机器狗跳跃的功能。
2. 电子硬件
在这个示例中,我们采用了以下硬件,请大家参考:
主控板 | |
扩展板 | |
电池 | 7.4V锂电池 |
/*------------------------------------------------------------------------------------ 版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved. Distributed under MIT license.See file LICENSE for detail or copy at https://opensource.org/licenses/MIT by 机器谱 2023-05-26 https://www.robotway.com/ ------------------------------*/ #include<Servo.h> #define SERVO_NUMBER4 const int servo_pin[SERVO_NUMBER] = {4,7,3,8};//定义使用舵机的数组 const int servo_init_ang[SERVO_NUMBER] = {85,82,101,104};//定义小狗站立的初始角度 const int max_h_ang = 28;//小狗蹦跳时四肢的上下幅度 const int max_w_ang = 25;//小狗蹦跳时四肢的前后幅度 int servo_limit_ang[SERVO_NUMBER][2]; Servo myservo[SERVO_NUMBER]; int i=1; void setup() { Serial.begin(9600); servo_limit_ang[0][0] = (servo_init_ang[0]- max_h_ang/2) * (180.0 / 270.0);//将180°舵机的算法转换成270°舵机 servo_limit_ang[0][1] = (servo_init_ang[0]+ max_h_ang/2) * (180.0 / 270.0); servo_limit_ang[1][0] = (servo_init_ang[1]+ max_w_ang/2) * (180.0 / 270.0); servo_limit_ang[1][1] = (servo_init_ang[1]- max_w_ang/2) * (180.0 / 270.0); servo_limit_ang[2][0] = (servo_init_ang[2]+ max_h_ang/2) * (180.0 / 270.0); servo_limit_ang[2][1] = (servo_init_ang[2]- max_h_ang/2) * (180.0 / 270.0); servo_limit_ang[3][0] = (servo_init_ang[3]- max_w_ang/2) * (180.0 / 270.0); servo_limit_ang[3][1] = (servo_init_ang[3]+ max_w_ang/2) * (180.0 / 270.0); resetDog(); delay(2000); }
void loop() { bonceF(10000);//行走100秒 }
void resetDog() { //初始化小狗 for(int i=0;i<SERVO_NUMBER;++i) { myservo[i].attach(servo_pin[i]); myservo[i].write(servo_init_ang[i]);//小狗准备行走时的角度
} }
void bonceF(int run_number) { float time_rate = 2.0; delay(1000); for(int i=0;i<run_number;++i) { for(int j=1;j<=10;++j) { myservo[0].write(map(servo_limit_ang[0][1]-max_h_ang/10*j,0,180,0,270)); myservo[2].write(map(servo_limit_ang[2][1]+max_h_ang/10*j,0,180,0,270)); delay(max_h_ang/10*5*time_rate); } for(int j=1;j<=10;++j) { myservo[1].write(map(servo_limit_ang[1][0]-max_w_ang/10*j,0,180,0,270)); myservo[3].write(map(servo_limit_ang[3][0]+max_w_ang/10*j,0,180,0,270)); delay(max_w_ang/10*5*time_rate); } for(int k=1;k<=10;++k) { myservo[0].write(map(servo_limit_ang[0][0]+max_h_ang/10*k,0,180,0,270)); myservo[2].write(map(servo_limit_ang[2][0]-max_h_ang/10*k,0,180,0,270)); delay(max_h_ang/10*5*time_rate); } for(int k=1;k<=10;++k) { myservo[1].write(map(servo_limit_ang[1][1]+max_w_ang/10*k,0,180,0,270)); myservo[3].write(map(servo_limit_ang[3][1]-max_w_ang/10*k,0,180,0,270)); delay(max_w_ang/10*5*time_rate); } } } |
电路连接:机器狗左侧的上下舵机连接在Bigfish扩展板的D3、D8端口;机器狗右侧的上下舵机连接在Bigfish扩展板的D4、D7端口。
3. 功能实现
上位机:Controller 1.0
下位机编程环境:Arduino 1.8.19
实现思路:实现机器狗跳跃的动作。
3.1 调试舵机角度
对于如何利用Controller软件进行调试机器狗的舵机角度,可参考【U002】如何驱动模拟舵机-Controller 1.0b软件的使用
在本次实验中,经过调试,对于4自由度并联机器狗跳跃时的舵机角度值如下图所示:
机器狗跳跃时的舵机值
3.2 示例程序
下面提供一个4自由度并联机器狗跳跃动作的参考例程(dog_bengTiao.ino),实验效果可参考演示视频。
4. 资料清单
序号 | 内容 |
1 | 【R328】-跳跃-程序源代码 |
【整体打包】-【R328】4自由度并联机器狗-跳跃-资料附件.zip | 3.17KB | 下载3次 | 下载 |
|