各类大佬,高校的同学们欢迎与我一起交流基于幻尔公司的tonypi机器人在华北五省机器人大赛田径组的代码详解,以树莓派4b为例!

2024年比赛规则如下图所示:

由于23年已经被学姐叫过去写代码,所以已经有现成的代码可以供今年使用。那么今年取得的成绩也是在去年的基础上完成的。现在我将简单交流一下我们组使用的代码。

话不多说,先上成绩

由于我已在校内达成技术共享,所以校内算是开源了代码。

ok,步入正题

首先我们使用了幻尔公司iic例程的超声波传感器,具体安放位置在

进入代码环节

distance = 99999
img_centerx = 320
j = 0


def move():
    global distance, line_centerx, center_x_value, j
    for i in range(7):
        AGC.runActionGroup("left_move_fast")
    while True:
        if distance != 99999:
            if j == 0 and distance <= 380:
                for i in range(8):
                    AGC.runActionGroup("right_move_fast")
                for i in range(3):
                    AGC.runActionGroup("turn_right_fast")
                AGC.runActionGroup("turn_left_fast")
                j = j + 1
            elif j == 1 and distance <= 300:
                for i in range(7):
                    AGC.runActionGroup("left_move_fast")
                for i in range(1):
                    AGC.runActionGroup("turn_left_fast")
                    AGC.runActionGroup("turn_right_fast")
                j = j + 1
            elif j == 2 and distance <= 300:
                for i in range(9):
                    AGC.runActionGroup("right_move_fast")
                for i in range(2):
                    AGC.runActionGroup("turn_right_fast")
                
            else:
                if __isRunning:
                    
                    if line_centerx != -1:
                        
                        if abs(line_centerx - img_centerx) <= 70:
                            AGC.runActionGroup("go_forward_fast")
                        elif line_centerx - img_centerx > 70:
                            AGC.runActionGroup("turn_right_fast")
                        elif line_centerx - img_centerx < -70:
                            AGC.runActionGroup("turn_left_fast")
                    else:
             
                        time.sleep(0.01)
                else:    
                    time.sleep(0.01)
        else:
            time.sleep(0.01)
 

首先初始化超声波,定义图像中心线等等就不多说了,定义一个j = 0 为计数器

因为障碍物只有三个,并且其实赛题和线下调试已经很明确障碍物的摆放了,那么我们其实无需判断障碍物的放在那边,所以直接写出外道两障碍的代码即可,那么如果是内道两障碍呢?

其实也是可以的,下面我将用一个图来表明

那么在你都走内道的情况下,是不是无论内道摆放一个或者两个,你都要先向右走,所以我们直接让其第一步先向右走就可以了(如果你不小心走到了外道,或者你是寻中间线走法,该方法不适用) 

回到代码

这里先定义一个平移是因为今年赛题要求必须放中间,相机高度太低可能会看不到线,所以先平移找线

下一步来到我们避障环节

 初始化一个计数器 j 当 distance (超声波测距)小于380 则执行先平移,那么我为什么又加了这

因为你在避障的过程中,难免机器人在避障前,脚并没有完成时正确的与赛道或者线平行,并且在你平移自己魔改动作组的时候, 也会产生偏移,如果你不进行手动矫正,由于相机标定太低就可能会看不到线,这种写死的办法是非常安全的(有些人稍等片刻,关于为什么相机标定拉高或使用各种各样的办法解决,我都会在后续提到)

同理,这是第一个障碍,那么第二个障碍也可以这样

那么其他的主要逻辑:

当__isRunning为真时,如果line_centerx不是-1(意味着找到了线),则根据线的位置相对于图像中心的位置进行微调:

  • 如果线几乎在图像中心,机器人将向前快速移动。
  • 如果线偏右超过70个像素,机器人将向右快速转动。(右转)
  • 如果线偏左超过70个像素,机器人将向左快速转动。  (左转)

好的让我们聊聊,为什么相机标定不能过高,由于我们全部使用是为opencv的视觉识别,并且使用lab颜色空间进行识别,LAB颜色空间在处理荧光色和等特殊颜色时表现不佳,并且在进行颜色转换时,LAB颜色空间可能会丢失一些细微的颜色变化。例如,某些细微的色调差异在LAB颜色空间中可能被平滑化,导致颜色细节的丢失。

所以要是在光线不那么好,或者光的变化很大,或者一些干扰线反光的情况下,相机标定太高,其实可能并不能有太好的结果,再有如果动作组速度太快,低头走也能更看的清线(头部可能晃得厉害)

再有就是,中间走为什么不能偏头看的问题,

 你是解决了最开始进入大弯道的问题,但是会引发你出弯道时,看到的线不是正的,例如:

那你走着走着就没线了。

ok,这就是本次的讲解与交流,希望我们2025年华北五省机器人大赛还能再见到!

我是a小lo爱吃棒棒糖,bilibili有我的视频,

2024华北五省机器人大赛田径组(天津商业大学1队)第一名_哔哩哔哩_bilibili

某音和csdn都可以进行交流 某音ip为 a小loTnT (或搜索dys12345678)

后续我会讲解图像处理做的改进,这样可以减少转弯也更符合赛题!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐