2017中国旅游暨安防机器人大赛总结

版权声明:学习,哪有那么多条条框框~ https://blog.csdn.net/Irish_Moonshine/article/details/77110568

可以说是一个迟到的总结吧。
一个多月的准备,到比赛的三天,再到后期录制视频,再到刚刚又重现看到PID控制算法。决定,还是应该总结一下,是因为我的怠惰而没有好好学习PID控制呢,还是因为我的大意没有能在在意到跑道上的油漆改变,又或是我的某种劣性心态让最后的选择走向了极端……

好,以上内容都是扯淡,下面步入正题:

先直接引用一下技术报告:

五、代码编程部分
在编程方面,我们尽可能降低了编程的难度。对于各种传感器和电机的调用在之前加以封装,直接以函数的形式调用。对于哪怕是非计算机专业的同学也是可以一目了然。但凡对C语言稍有接触的同学,都可以将想法付诸于实践。
我们队伍在具体操作的过程中,采用了分段编程的思想。将全程分为七个部分,按照统一的标准进行编写。比方说同样命名方式的变量名、同样的注释方式。这样一来极大的提高了我们队伍之内的团队协作能力和默契。与此同时,关键的函数调用则是大家在前期一起摸索所得到的,有了相同代码基础,每个分段根据自己的需求进行封装。无论是从代码可读性还是效率方面都有了很大的提升。
在不过千行的代码之下,我们贯彻浓缩就是精华的理念,说是极简主义也绝不过分。尤其肖同学精致的编码风格,执着追求的精神更是给我们这个队伍在编程方面上前进的动力,引领我们这个队伍的一步步前行。

六、亮点、创新点
1.这个机器人,经过大量的实战检验并且还同其余机器人进行过比对,不断完善优化而成。
2.十分优秀的驱动、控制能力,各种配件的占比恰到好处。在追求速度的同时也能保持自身的稳定和参数传递的精确。
3.我们不单单是为了比赛而比赛,在完成探险项目的同时。稍稍加以改装,我们也能适应寻宝以及快递的比赛。进德修业,与时偕行,是我们每一个人的追求。
4.在关键位置加以改装,为了适应探险比赛,我们不仅加设了保护措施,并且还用多种方法进行控制和校正。例如指南针和光敏传感器同时配合,确保在比赛过程中的稳定。

以上内容可能也没有什么用,接下来:

说起来,我们的代码是“老炮筒,汉阳造”? 未必未必,在考虑到巡线和转弯的速度和稳定劣势上,经过一开始的讨论。我们几乎把所有精力都放在了路线规划和路线的调整上。这个决策是没有什么问题的,然而我们缺少补救机制,缺少应对紧急情况的第二套代码。这一点,从总体看来是很尴尬的。
劣势的地方:一个是别人的二值传感器,红外距离探测器,PID,铰链,前后双传感器排,记忆功能。记得有一个学校的车,是能漂移并且准确巡线的,姑且称其为漂移大佬吧。 相当多的有待学习的地方,能不能学会并且又拥有自己的革新的话,
还看明年吧。

记录下一些小操作,以便于明年参考:

void run(int m, int p)                                                                      //舵机控制函数
{
    motor(1, m);
    motor(2, p);
}
void start()
{
    servo(1, 550);
    //      servo(3, 950);//左手放下
    //      servo(4, 30);//右手放下

    servo(2, 150);//头右
    msleep(500);
    servo(2, 900);//头左
    msleep(500);
    servo(2, 150);//头右
    msleep(500);
    servo(2, 900);//头左
    msleep(500);
    servo(2, 500);
    servo(3, 950);//左手放下
    servo(4, 50);//右手放下
    while (digital(1) == 0)
    {
        stop();
    }
}
void dance(void)
{
    stop();
    //sleep(2);
    servo(3, 150);
    msleep(500);
    servo(3, 950);//左手放下
    msleep(500);
    servo(4, 850);
    msleep(500);
    servo(4, 50);//右手放下
}
void line(void)
{
    if (analog(4)<Gray&&analog(5)<Gray&&analog(6)<Gray&&analog(3)<Gray&&analog(2)<Gray&&analog(7)<Gray&&analog(1)<Gray&&analog(8)<Gray)
        run(P, P);
    if (analog(4) > Gray&&analog(5) > Gray)                                                     //直行
        run(P, P);
    else if (analog(4) > Gray&&analog(5) < Gray)                                                //左偏
        run(P - 5, P);
    else if (analog(4) < Gray&&analog(5) > Gray)                                                //右偏
        run(P, P - 5);
    else if (analog(3) > Gray&&analog(6) < Gray)                                                //左偏
        run(P / 2, P);
    else if (analog(3) < Gray&&analog(6) > Gray)                                                //右偏
        run(P, P / 2);
    else if (analog(2)>Gray&&analog(7)<Gray)                                                        //左偏
        run(P / 2, P);
    else if (analog(2)<Gray&&analog(7)>Gray)                                                        //右偏
        run(P, P / 2);
    else if (analog(3) > Gray&&analog(6) < Gray&&analog(4) > Gray&&analog(5) < Gray)            //左偏
        run(P / 2, P);
    else if (analog(3) < Gray&&analog(6) > Gray&&analog(4) < Gray&&analog(5) > Gray)            //右偏
        run(P, P / 2);
}
void TurnLeft(int n)                                                                //左转
{
    float t, slp, mslp;
    t = 5.8 * n;
    slp = (int)t / 1000;
    mslp = (int)t % 1000;
    run(P, -P);
    sleep(slp);
    run(P, -P);
    msleep(mslp);
}
void TurnRight(int n)                                                               //右转
{
    float t, slp, mslp;
    t = 5.8 * n;
    slp = (int)t / 1000;
    mslp = (int)t % 1000;
    run(-P, P);
    sleep(slp);
    run(-P, P);
    msleep(mslp);
}
阅读更多
换一批

没有更多推荐了,返回首页