单目纯视觉避障方案——2020中国机器人大赛FIRA避障仿真组决赛代码开源
目录
- 单目纯视觉避障方案——2020中国机器人大赛FIRA避障仿真组决赛代码开源
-
特别鸣谢两位吴同学,董同学和曾同学为最终版代码做出的努力
比赛环境介绍
比赛仿真环境地址:https://github.com/zerowind168/SIMUROSOT-ROBOCHALLENGE
此为 2020 年 FIRA SIMUROSOT ROBO CHANLLENGE 中国赛区的比赛环境
操作系统: ubuntu 16.04
ROS版本: Kinectic
赛题要求
该比赛分为两个任务。简单来说,任务一提供了障碍物的位置信息,机器人可以通过一个单目摄像头返回的图像信息进行避障,最终到达对面的球门;任务二则只提供了视觉信息,最终目标仍然是到达对面的球门。
由于机器人采用双轮差动的方式行驶,给赛题的完成增加了不少难度。
比赛思路
最终版本代码的思路主要分为以下几个部分:
- 场地信息提取
- 通过计算图片的“质心”得到下一步的行驶方向
- 解算速度并发送至机器人驱动模块
该方案的出彩点
本方案的核心代码只有一行,且通过路径图像的质点实时导航的方式基本不需要过多的处理。
仍需优化的地方
- 通过路径图像的质点导航,可能被诱导向错误路径行驶或者导致机器人擦边障碍物;
- 检测球门的代码条件需要完全看不到视野内的障碍物,可能会导致看到蓝色球门时只能看到一根门柱,最终无法过门撞到柱子;
- 速度过慢,理论来讲增大速度的同时增加偏转幅度并不会导致避障效果的降低。
代码
import rospy
import numpy as np
import math
import time
import cv2 as cv
from robot import Robot
from geometry_msgs.msg import Twist
k = -0.0086
v = 0.5
erate = 150
gary_scale_value = 48000000
dt = 0.1
rate = 10
def navigation(bgr_image):
H, W, C = bgr_image.shape
image = np.array(bgr_image, dtype= np.uint8)
hsv_image = cv.cvtColor(image, cv.COLOR_BGR2HSV)
hsv_image = cv.GaussianBlur(hsv_image, (5, 5),0)
lower_hsv_gray = np.array([0,0,46])
upper_hsv_gray = np.array([180,43,220])
lower_hsv_blue = np.array([100,43,46])
upper_hsv_blue = np.array([155,255,255])
lower_hsv_white = np.array([0,0,221])
upper_hsv_white = np.array([180,30,255])
lower_hsv_black = np.array([0,0,0])
upper_hsv_black = np.array([180,255,46])
print("carema turned on")
mask_gray = cv.inRange(hsv_image,lowerb=lower_hsv_gray,upperb=upper_hsv_gray)
mask_blue = cv.inRange(hsv_image,lowerb=lower_hsv_blue,upperb=upper_hsv_blue)
mask_white = cv.inRange(hsv_image,lowerb=lower_hsv_white,upperb=upper_hsv_white)
mask_black = cv.inRange(hsv_image,lowerb=lower_hsv_black,upperb=upper_hsv_black)
mask_path = ~(mask_black + mask_gray + mask_blue + mask_white)
kernel = np.ones((5,5),np.uint8)
mask_path = cv.erode(mask_path,kernel)
mask_path = cv.dilate(mask_path,kernel)
kernel = np.ones((55,55),np.uint8)
mask_path = cv.dilate(mask_path,kernel)
mask_path = cv.erode(mask_path,kernel)
kernel = np.ones ((erate, erate), np.uint8)
mask_path = cv.erode (mask_path, kernel)
moments_path = cv.moments(mask_path)
gray_scale_path = moments_path['m00']
moments_gray = cv.moments(mask_gray)
gray_scale_gray = moments_gray['m00']
moments_black = cv.moments(mask_black)
gray_scale_black = moments_black['m00']
moments_blue = cv.moments(mask_blue)
gray_scale_blue = moments_blue['m00']
flag_stop=0
if(gray_scale_path > 200):
x = int(moments_path['m10']/moments_path['m00'])
offset = x-(W/2)
w = k * offset
print (w)
else:
w = math.radians (5)
flag_stop=1
flag_rush = 0
if(gray_scale_gray>gary_scale_value and gray_scale_black<200 and gray_scale_blue>200):
x = int (moments_blue['m10'] / moments_blue['m00'])
offset = x - (W / 2)
w = k * offset
if (abs (w) < math.radians (1)) :
flag_rush=1
print("flag_rush")
return w,flag_rush,flag_stop
def run(robot):
rate_run = rospy.Rate (rate)
twist = Twist ()
for i in xrange(0, 9999):
img = robot.get_image ()
w, flag_rush, flag_stop = navigation (img)
twist.linear.x = v
twist.angular.z = w
if flag_stop:
twist.linear.x = 0
if flag_rush:
twist.linear.x = 0
twist.angular.z = 0
robot.publish_twist (twist)
break
robot.publish_twist(twist)
rate_run.sleep()
rushDoor(robot)
def rushDoor(robot):
rate_run = rospy.Rate (rate)
twist = Twist ()
for i in xrange (0, 9999) :
twist.linear.x = 0.5
twist.angular.z = 0
robot.publish_twist (twist)
rate_run.sleep ()
if __name__ == '__main__':
robot = Robot()
run(robot)
效果展示
2020中国机器人大赛FIRA避障仿真组算法alpha版本效果展示
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)