1. 引言
足式机器人是一种模仿人类或动物行走方式的机器人 [1] 。随着人工智能、传感器和材料科学等领域的进步,足式机器人的应用领域不断拓展,涵盖了工业、军事、医疗、教育等多个领域。例如,在工业领域,足式机器人可以用于物流搬运、装配、焊接等工作;在医疗领域,足式机器人可以用于辅助康复训练、手术辅助等工作。随着足式机器人技术的不断发展和应用领域的不断拓展,足式机器人的市场规模也在不断扩大 [2] [3] [4] [5] 。四足机器人是足部步行机器人其中比较有代表性的一种,除此之外还有双足、六足、八足机器人等。四足式行走机器人与双足、六足、八足式行走机器人相比在实际的应用中具有更好的适应能力和可操作性。它比双足式行走机器人有着更强的负重载物能力和运动稳定性。在构造上和六足式和八足式行走机器人相比,组成部分简单。制作难度低。除此之外他们的控制要求低,造价低,所以成为了大多数人研究的对象之一 [6] [7] 。为满足户外排污口寻迹识别应用场景中对于多足机器人在地形及稳定性方面的需求,本文提出一种基于Python智能四足循迹识别机器人控制系统设计。
本文所述智能四足循迹识别机器人控制系统主要包含硬件系统及软件系统,其中硬件系统以树莓派4B为主控制芯片,辅以电源电路﹑行走电路﹑无线收发电路﹑嵌套模块控制电路来实现对四足机器人的控制;软件系统利用PID算法控制程序来确保四足式机器人在行走过程中的稳定性和良好的反馈;进而根据摄像头对外界信号的采集,利用视觉循迹算法来实现图像的获取与处理,从而实现循迹和物体识别跟随等功能。在完成本文系统软硬件设计的基础上对其进行实物测试,测试结果显示:本文所提智能四足循迹识别机器人控制系统可实现多向控制、路线寻迹、物体识别与跟随等功能,在户外排污口寻迹识别方面具有良好的应用前景。
2. 系统总体设计
本文所述智能四足循迹识别机器人控制系统主要包含硬件系统及软件系统,其中硬件系统以树莓派4B为主控制芯片,辅以电源电路﹑行走电路﹑无线收发电路﹑嵌套模块控制电路来实现对四足机器人的控制;软件系统利用PID算法控制程序来确保四足式机器人在行走过程中的稳定性和良好的反馈;系统通过摄像头对外界信号的采集,利用视觉循迹算法来实现图像的获取与处理,从而实现循迹和物体识别跟随等功能 [8] [9] 。系统构成框架图如下图1所示。

Figure 1. System composition framework diagram
图1. 系统构成框架图
3. 系统硬件系统设计
本文所述系统硬件系统以树莓派4B为主控制芯片,辅以电源电路﹑行走模块﹑无线收发电路﹑嵌套模块控制电路来实现对四足机器人的控制。
3.1. 主控制芯片
树莓派提供了良好的编程语言平台,这样集各种语言开发环境为一体的树莓派操作系统是很多编程初学者的一个很好的选择。正因为树莓派的高性价比、高性能,可操作性强等优点,使它在于其它学习板和功能板的竞争中占据一定的主动地位。本次的四足式机器人采用的是树莓派4B板和树莓派扩展板相结合,充分利用了树莓派本身的外设接口并且加以延伸达到了实现本次智能循迹和物体跟随等功能。
3.2. 电源模块

Figure 2. Power module schematic diagram
图2. 电源模块原理图
本系统电源模块采用的是7.4 V 2200 mAh大容量锂电池,给四足机器人的舵机提供了强大的动力,其电路图如图2所示。
3.3. 摄像头模块设计
本次采用的是一款USB摄像头,在几乎不占用Raspberry运算资源的情况下提供480P,30FPS的高清晰度、低延迟的图像。图3为树莓派扩展板外接USB摄像头控制电路。
3.4. 控制舵机
树莓派款扩展板建有8路带过流保护的PWM舵机接口,有效保护舵机,内建单总线串口电路,可直接控制串口舵机。本次四足步行机器人采用的是三端口串行总线数字舵机LX-824,舵机拥有不同方向三个接线端口,很方便机器人的接线,采用原装进口的电位器,从而解决了舵机抖动的弊端,大大提高了舵机工作的线性度、精度和稳定性 [10] 。L298P是典型双H桥直流电机驱动芯片,可用于驱动直流电机或双极性步进电机,此驱动板与市面上的其他类型的驱动板相比,具有体积小,重量轻等优点。如图4为以L298P典型双H桥直流电机驱动芯片为核心的舵机控制电路。
3.5. 行走模块
本文所述系统行走模块采用图5所示的四足结构,每条腿有两个自由度,每腿处有一个舵机,共4个舵机。舵机控制角度达240˚,工作电压6~8.4 V,堵转扭矩17 kg/cm (7.4 V),工作方式为三端口串行总线串口通讯,如图5所示。
4. 系统软件系统设计
本系统所述软件系统利用PID算法 [11] 控制程序来确保四足式机器人在行走过程中的稳定性和良好的反馈;根据摄像头对外界信号的采集,利用视觉循迹算法来实现图像的获取与处理,从而实现循迹和物体识别跟随等功能。
4.1. 系统PID控制代码
PID系统产生的值,完全作为系统的输入参数r(k)被u(k)替代,则有以下代码
Pout=Kp*e(t) + Ki*Sum[e(t)] + Kd*[e(t) - e(t-1)]#标准直接计算公式
def PID_Controller_Direct_Mem(standard_out,t):
global time_sample, Kp, Ki, Kd, error_bef, real_out_ajust
if t > time_sample:
print(Time Out! Quit!)
return -1
error_now = real_out_ajust[t] - standard_out
error_bef.append(error_now) #记录了所有的误差
integrate_res = np.sum(error_bef)
Diffirent_res = error_now - error_bef[t-1]
return Kp*error_now + Ki*integrate_res + Kd*Diffirent_res#返回误差
4.2. 视觉循迹算法程序
循迹算法是将摄像头所采集到的图像缩小,然后通过算法程序转为灰度图,接着进行二值化,腐蚀,膨胀等操作来去除图像中的噪点,得到更加准确的图像误差。接下来将图像分割成3段进行处理,每一段都用矩形将白线框起来,并且标出中心点,用这三个点来近似的表示这条线,利用中心点来进行巡线 [12] [13] 。
global line_cv_ok, line_weight, line_weight_sum, line_deflection_angle #获取总图像大小
if up_x is not None and center_x is not None and down_x is not None and line_cv_ok is False:
centroid_sum = up_x * line_weight[0] + center_x * line_weight[1] + down_x * line_weight[2]
center_pos = (centroid_sum / line_weight_sum)#求出三个点的加权平均X
deflection_angle = math.atan((center_pos - (img_w / 2)) / (img_h / 2)) # 求出弧度
line_deflection_angle= -math.degrees(deflection_angle) #转换成角度
line_cv_ok = True
4.3. 颜色识别与跟随程序
在图像处理转化为灰度图的过程中,用R、G、B三原色来表示真彩色,其中R代表红色、G代表绿色、B代表蓝色。R分量,G分量,B分量的取值上限为255,下限为0。R、G、B三个值可以用来表现一个像素点的颜色,所以同理可得一个像素点矩阵是由红色、绿色、蓝色三个颜色的向量矩阵组成的。所以通过对像素点矩阵进行操作处理并按照相应的规律就可以达到处理图像的效果。若要根据需求要对像素点的颜色进行改变,只要改变这个像素点在像素点矩阵中的位置即可 [14] 。
# 启动动作在运行线程
th2 = threading.Thread(target=run_action)
th2.setDaemon(True)
th2.start()
# 要识别的颜色字典
color_dist = {'red': {'Lower': np.array([0, 60, 60]), 'Upper': np.array([6, 255, 255])},
'blue': {'Lower': np.array([100, 80, 46]), 'Upper': np.array([124, 255, 255])},
'green': {'Lower': np.array([35, 43, 46]), 'Upper': np.array([77, 255, 255])},}
# PS中的HSV范围,H是0-360,S是0-1,V(B)是0-1
# opencv中的HSV范围,H是0-180,S是0-255,V是0-255
# 青色颜色 48,112,216
# 把PS中H的值除以2,S乘255,V乘255,可以得到对应的opencv的HSV值
# cyan_rect = {'Lower': np.array([18, 72, 186]),
# 'Upper': np.array([78, 142, 246])}
cv_continue(0, 0)
SSR.running_action_group('0', 1)
while True:
if orgFrame is not None and get_image_ok:
t1 = cv2.getTickCount()
frame = cv2.flip(orgFrame, 1)
min_frame = cv2.resize(frame, (160, 120), interpolation=cv2.INTER_LINEAR)
img_h, img_w = min_frame.shape[:2]
img_center_x = img_w / 2
img_center_y = img_h / 2
# print(img_center_x, img_center_y)
# 高斯模糊
gs_frame = cv2.GaussianBlur(min_frame, (5, 5), 0)
# 转换颜色空间
hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV)# 查找颜色
mask = cv2.inRange(hsv, color_dist['green']['Lower'], color_dist['green']['Upper'])# 腐蚀
mask = cv2.erode(mask, None, iterations=2)# 膨胀
kernel = np.ones((5, 5), np.uint8)
mask = cv2.dilate(mask, kernel, iterations=2)# 查找轮廓
# cv2.imshow('mask', mask)
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
center = None
if len(cnts) > 0:
c = max(cnts, key=cv2.contourArea)
# 求出最小外接圆原点坐标x, y和半径
((x, y), radius) = cv2.minEnclosingCircle(c)
if radius >= 7:#
cv2.circle(frame, (int(x * 3), int(y * 3)), int(radius * 3), (0, 0, 255), 2)
cv2.circle(frame, (int(x * 3), int(y * 3)), 5, (0, 0, 255), -1)
# print(x, y, radius)# 获取小球x轴位置
ball_x = int(x)# 获取小球半径
ball_size = int(radius)# 设置要保持的点的位置
turn_lr_pid.SetPoint = img_center_x# 更新x轴位置
turn_lr_pid.update(ball_x)# pid输出
turn_out_pwm = turn_lr_pid.output# 整型
turn_out_pwm = int(turn_out_pwm)
if turn_out_pwm > 500:
turn_out_pwm = 500
elif turn_out_pwm < -500:
turn_out_pwm = -500
###########################################
go_pid.SetPoint = 28
go_pid.update(60 - ball_size) # 小球最大半径60
move_back_pwm = go_pid.output
move_back_pwm = -int(move_back_pwm)
if move_back_pwm > 500:
move_back_pwm = 500
elif move_back_pwm < -500:
move_back_pwm = -500
# print turn_out_pwm
# print move_back_pwm
# print 'ball', ball_size
dis_ok = True
# 设置要保持的点的位置
# 参数:图片, 起点, 终点, 颜色, 粗细
cv2.namedWindow(ball_track, cv2.WINDOW_AUTOSIZE)
cv2.imshow('ball_track', frame)
cv2.waitKey(1)
get_image_ok = False
t2 = cv2.getTickCount()
time_r = (t2 - t1) / cv2.getTickFrequency() * 1000
# print(%sms % time_r)
else:
time.sleep(0.01)
5. 系统实物测试
在完成本文所述系统硬件及软件设计的基础上对其进行实物测试,主要包括多向控制功能测试、巡线、颜色识别与跟随等功能测试,具体如下。
5.1. 多向控制功能测试
系统多向控制功能测试,如图6所示。

(a) 前进 (b) 后退
(c) 左转 (d) 右转
Figure 6. Multidirectional control function test
图6. 多向控制功能测试
5.2. 智能巡线
本文所述系统软件先是将图像缩小,然后转为灰度图,接着进行二值化,腐蚀,膨胀等操作来去除噪点。接下来将图像分割成3段进行处理,每一段都用矩形将白线框起来,并且标出中心点,用这三个点来近似的表示这条线,利用中心点来进行巡线,如图7所示。

Figure 7. Display of line patrol function
图7. 巡线功能展示
5.3. 颜色识别与跟随功能测试
本文所述系统通过摄像头识别目标颜色的位置,调动四足的前进、后退、左右转向的动作,需要让目标的中心点一直保持在画面的中心。实物测试中被测试物体使用的是篮球,来实现系统的颜色识别与跟随功能的测试,其测试效果图如图8所示。

Figure 8. Color recognition and following function test effect diagram
图8. 颜色识别与跟随功能测试效果图
上述实物测试结果显示:本文所提智能四足循迹识别机器人控制系统具有多向控制、智能寻迹、物体识别与跟随等功能,在户外排污口寻迹识别方面具有良好的应用前景。
6. 总结
为满足户外排污口寻迹识别所需地形及稳定性方面的要求,本文提出一种基于Python智能四足循迹识别机器人控制系统设计。本文所述系统主要包含硬件系统及软件系统,其中硬件系统以树莓派4B为主控制芯片,辅以电源电路﹑行走电路﹑无线收发电路﹑嵌套模块控制电路来实现对四足机器人的控制;软件系统利用PID算法控制程序来确保四足式机器人在行走过程中的稳定性和良好的反馈;根据摄像头对外界信号的采集,利用视觉循迹算法来实现图像的获取与处理,从而实现循迹和物体识别跟随等功能。在完成本文系统软硬件设计的基础上对其进行实物测试,测试结果显示:本文所提智能四足循迹识别机器人控制系统可实现多向控制、路线寻迹、物体识别与跟随等功能,在户外排污口寻迹识别方面具有良好的应用前景。
参考文献