swanglei 发表于 2013-7-1 12:31:12

Sumo Robot 机器人大战

         近期,DFRobot内部员工业余时间Sumo Robot 机器人大战开赛在即,欢迎有兴趣的朋友参加,第一次测试性比赛时间为:7月15日。
         比赛规则如下:提供pdf文件附件。
Part1场地设置:1.      80cm直径圆形场地。2.      蓝底白圈,中间白色十字,白边宽度5cm。3.      材质:亚光深色桌。4.      场地边界一米外没有障碍物。Part2车辆限制:1.      原型机:mini Robot chassis2.      尺寸:<15X15cm 高度不限3.      重量:<500g (使用DFrobot自制称重器作为官方比赛用秤)4.      控制类型:自控(非遥控)5.      机器人比赛任何时刻尺寸不得超过15X15cm尺寸6.      可用电机:N20系列(即mini Robot chassis所配电机同系列不同变速箱)7.      驱动轮:2个Part3电子设置:1.      主要微处理器:Arduino系列2.      最大电池容量:4 节 1.5V电池Part4赛前准备:1.      位置:边线内任意直径两端。2.      启动时间:比赛开始后5秒内机器人不得位移。3.      比赛开始后所有人类远离场地边界1米以外。比赛结束前不得靠近。4.      比赛开始3分钟后比赛强制结束。(HCR进场清场,人类不得靠近)5.      比赛开始:裁判宣布比赛开始秒表开始计时。Part5输赢判定:1.      2胜制:率先获得2场胜利者获胜。2.      单场比赛最多局数10,10局后获得最多胜局者获胜。10局后仍未分出胜负…双双淘汰。3.      比赛双方其中一方离开边界(不包括压线)之后2秒内没有返回且另一方仍在界内,界内方获胜。比赛结束。4.      2秒内双双出界,且无任意方在2秒内返回,平局。比赛结束5.      3分钟内没有分出胜负,hcr进场清场,平局。比赛结束。6.      一方出界后,2秒内另一方亦出界,重新计时2秒,2秒内返回一方获胜。比赛结束。皆返回,比赛继续。7.      单场比赛中任何一方不得修改机器人程序,每局间隔1分钟,越期不参赛者,判负。8.      比赛采用淘汰赛制,对阵图于赛前一日抽签,并进行车辆检查。检查完毕任何外形不得修改。

swanglei 发表于 2013-7-1 12:38:12

上传一些国际上的赛事图片,供大家参考一下。


这里需要大家知道的是第一次比赛非常正式,目的只不过是让大家练练手,真正的比赛在第二次,大家可以改动的空间更大,完全自己设计机器人,到时候鹿死谁手。。。。。。哈哈。。。我们比赛见

swanglei 发表于 2013-7-1 12:49:16

本帖最后由 swanglei 于 2013-7-1 12:51 编辑

来个样例代码 头文件先。。。。
/*
* created 2013-05-23
* by lisper
* control two DC car
* init_dc (); need 4 arguments
* ctlcar (char left, char right);
*
*/
#include <Arduino.h>


#define Lfront LOW
#define Lback HIGH
#define Rfront HIGH
#define Rback LOW


uint8_t ld = 4;
uint8_t ls = 5;
uint8_t rd = 7;
uint8_t rs = 6;
// init dc, like: init_dc (4 5 7 6)
void init_dc (uint8_t ldp, uint8_t lsp, uint8_t rdp, uint8_t rsp) {
   ld = ldp;
   ls = lsp;
   rd = rdp;
   rs = rsp;
   pinMode (ld ,OUTPUT);
   pinMode (ls ,OUTPUT);
   pinMode (rd ,OUTPUT);
   pinMode (rs ,OUTPUT);
}
// x >= -127 && x <=127
void ctlcar (char left, char right) {
   if (left < 0) {
       left = -left;
       digitalWrite (ld, Lback);
   } else {
       digitalWrite (ld, Lfront);
   }
   if (right < 0) {
       right = -right;
       digitalWrite (rd, Rback);
   } else {
       digitalWrite (rd, Rfront);
   }
   analogWrite (ls, left*2);
   analogWrite (rs, right*2);
}

swanglei 发表于 2013-7-1 12:53:15

接下来主程序。。。
#include <Arduino.h>
#include "ctlcar.h"

#define sp 40   //speed
#define FOUND(x) (x > 200) //
#define OVER(x) (!x)

int front_pin = A0;    //front sensor pin
int left_pin = 8;    //left line pin
int right_pin = 10;    //right line pin
int left;    //left sensor value
int right;    //right sensor value
int front;    //front sensor value

int l_sp = 30;    //left speed
int r_sp = 30;    //right speed
unsigned long start_time = 0;   

void setup() {
   Serial.begin (9600);
   pinMode (front_pin, INPUT);
   pinMode (left_pin, INPUT);
   pinMode (right_pin, INPUT);
   init_dc (4, 5, 7, 6);
}
//
void loop() {
   front = analogRead (front_pin);
   left = digitalRead (left_pin);
   right = digitalRead (right_pin);
   //Serial.println (front);

   if (FOUND (front) && !OVER (left) && !OVER (right)) {
       ctlcar (50, 50);
   } else if (OVER (left) && !OVER (right)){
       ctlcar (-sp, -sp);
       delay (300);
       ctlcar (sp, -sp);
       delay (random (300, 400));
   } else if (OVER (right) && !OVER (left)){
       ctlcar (-sp, -sp);
       delay (300);
       ctlcar (-sp, sp);
       delay (random (300, 400));
   } else if (OVER (right) && OVER (left)){
       ctlcar (-sp, -sp);
       delay (300);
       if (random (-1, 1))
         ctlcar (-sp, sp);
       else
         ctlcar (sp, -sp);
       delay (random (300, 400));
   } else if (millis () - start_time > 300){
       if (random (-1, 1)) {
         ctlcar (sp, sp/2);
       } else {
         ctlcar (sp/2, sp);
       }
       start_time = millis ();
   }
}

swanglei 发表于 2013-8-13 22:49:38

晚上搜到一篇挺不错的资料——RobotCup的一篇技术文档,不过是英文的哦!!!哈哈

nemon 发表于 2014-1-24 08:42:24

mark………………
页: [1]
查看完整版本: Sumo Robot 机器人大战