单目纯视觉避障方案——2020中国机器人大赛FIRA避障仿真组决赛代码开源

目录

  • 单目纯视觉避障方案——2020中国机器人大赛FIRA避障仿真组决赛代码开源
    • 比赛环境介绍
    • 赛题要求
    • 比赛思路
      • 该方案的出彩点
      • 仍需优化的地方
    • 代码
    • 效果展示

特别鸣谢两位吴同学,董同学和曾同学为最终版代码做出的努力

比赛环境介绍

比赛仿真环境地址:https://github.com/zerowind168/SIMUROSOT-ROBOCHALLENGE

此为 2020 年 FIRA SIMUROSOT ROBO CHANLLENGE 中国赛区的比赛环境

操作系统: ubuntu 16.04

ROS版本: Kinectic

赛题要求

该比赛分为两个任务。简单来说,任务一提供了障碍物的位置信息,机器人可以通过一个单目摄像头返回的图像信息进行避障,最终到达对面的球门;任务二则只提供了视觉信息,最终目标仍然是到达对面的球门。

由于机器人采用双轮差动的方式行驶,给赛题的完成增加了不少难度。

比赛思路

最终版本代码的思路主要分为以下几个部分:

  1. 场地信息提取
  2. 通过计算图片的“质心”得到下一步的行驶方向
  3. 解算速度并发送至机器人驱动模块

该方案的出彩点

本方案的核心代码只有一行,且通过路径图像的质点实时导航的方式基本不需要过多的处理。

仍需优化的地方

  1. 通过路径图像的质点导航,可能被诱导向错误路径行驶或者导致机器人擦边障碍物;
  2. 检测球门的代码条件需要完全看不到视野内的障碍物,可能会导致看到蓝色球门时只能看到一根门柱,最终无法过门撞到柱子;
  3. 速度过慢,理论来讲增大速度的同时增加偏转幅度并不会导致避障效果的降低。

代码

# coding=utf-8
#四川大学ros避障代码,纯视觉算法
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,腐蚀系数,扩大障碍物及灰色背景的面积,一般来说腐蚀系数越大越安全,但太大可能导致可行的路径被遮挡
erate = 150
#背景灰度总和阀值,可调参数
gary_scale_value = 48000000
#向ros发布命令的周期与频率,rate=1/dt,一般需要和图像处理速度匹配
dt = 0.1
rate = 10def navigation(bgr_image):H, W, C = bgr_image.shapeimage = np.array(bgr_image, dtype= np.uint8)hsv_image = cv.cvtColor(image, cv.COLOR_BGR2HSV)hsv_image = cv.GaussianBlur(hsv_image, (5, 5),0)#场景中颜色hsv上下界值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")#vigation maskmask_gray = cv.inRange(hsv_image,lowerb=lower_hsv_gray,upperb=upper_hsv_gray)#Gray,场景外颜色mask_blue = cv.inRange(hsv_image,lowerb=lower_hsv_blue,upperb=upper_hsv_blue)#Blue,对面球门颜色mask_white = cv.inRange(hsv_image,lowerb=lower_hsv_white,upperb=upper_hsv_white)#White,白线颜色mask_black = cv.inRange(hsv_image,lowerb=lower_hsv_black,upperb=upper_hsv_black) #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)#腐蚀,增加障碍物(黑色)的面积,通过erate调整kernel = np.ones ((erate, erate), np.uint8)mask_path = cv.erode (mask_path, kernel)#moments函数求矩,可供计算空间矩,中心矩,和中心归一化矩#求整个可行路径的矩,对于01二值化的图像,m00代表灰度的总和,白色灰度255,黑色灰度是0moments_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']#当有可行路径mask_path总灰度>255时,计算可行路径mask_path的质心并解算出w角速度,否则flag_stop=1,trutlebot原地旋转flag_stop=0if(gray_scale_path > 200):#算路径质心的x坐标x = int(moments_path['m10']/moments_path['m00'])#算图像中心x坐标与路径质心x坐标差值offsetoffset = x-(W/2)#根据offset解算出角速度,调整k可以调整偏转程度w = k * offsetprint (w)else:w = math.radians (5)flag_stop=1#flag_rush用于标志是否能使用向球门冲的函数#设置条件可以理解为机器人看到的背景像素足够多,不能看到障碍物,可以看到蓝色球门flag_rush = 0if(gray_scale_gray>gary_scale_value and gray_scale_black<200 and gray_scale_blue>200):x = int (moments_blue['m10'] / moments_blue['m00'])# 算图像中心x坐标与球门质心坐标x坐标差值offsetoffset = x - (W / 2)# 根据offset解算出角速度,调整k可以调整偏转程度w = k * offsetif (abs (w) < math.radians (1)) :flag_rush=1print("flag_rush")return w,flag_rush,flag_stop#运动函数,v值自定,w值根据navigation()解算得出
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 = vtwist.angular.z = wif flag_stop:twist.linear.x = 0if flag_rush:twist.linear.x = 0twist.angular.z = 0robot.publish_twist (twist)breakrobot.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.5twist.angular.z = 0robot.publish_twist (twist)rate_run.sleep ()if __name__ == '__main__':robot = Robot()run(robot)

效果展示

2020中国机器人大赛FIRA避障仿真组算法alpha版本效果展示

单目纯视觉避障方案——2020中国机器人大赛FIRA避障仿真组决赛代码开源相关推荐

  1. 2020中国机器人大赛视觉项目总结

    2020中国机器人大赛赛后总结 1:赛前准备 1.0:确定目标 1.1:认清自己 1.2:数据的准备 1.3:必要的知识储备 1.4:阅读比赛文件 2:赛场注意事项 2.0:规划好时间 2.1:前一天 ...

  2. 山东省高校机器人大赛-智能避障避险小车经验分享

    山东省高校机器人大赛-智能避障避险小车经验分享 概述 竞赛题目 详细设计过程 车体设计 现在开车 过⑧号障碍物 如何跑完全程 概述 今天是2020年2月9日,因为新冠肺炎的原因,学校依然没有要开学的意 ...

  3. 2020世界机器人大赛总决赛完美闭幕,MakeX挑战赛连续5年成为WRC官方合作赛项

    12月6日,历时4天的2020世界机器人大赛总决赛在佛山市的潭州国际会展中心完美闭幕.MakeX机器人挑战赛连续5年成为WRC官方合作赛项,受到了众多爱好者的高度关注与认可. ( MakeX 机器人挑 ...

  4. 小智机器人有初中课程吗_征战记大写的优秀!2020世界机器人大赛,看这些奖项收入囊中!...

     世界机器人 大赛   WORLD ROBOT CONTEST 冠军!亚军!季军! 一等奖!三等奖! 全部收入囊中!  赛项                         奖项  Enjoy AI非 ...

  5. nao机器人行走速度_数计学院学子在2020世界机器人大赛总决赛中荣获佳绩!

    12月3日至6日,2020世界机器人大赛总决赛在佛山潭州国际会展中心举行.由武汉纺织大学数学与计算机学院何儒汉教授指导,杨皓然.成振瑞.李幸阜.伏嘉豪.李创等5名本科生同学组成的参赛团队荣获 2020 ...

  6. 手机 机器人 谢超_我校学子在2020世界机器人大赛总决赛中荣获佳绩

    12月3日至6日,2020世界机器人大赛总决赛在佛山潭州国际会展中心举行,大赛由工信部.中国科协共同主办,中国电子学会等单位承办.由武汉纺织大学数计学院何儒汉教授指导,杨皓然.成振瑞.李幸阜.伏嘉豪. ...

  7. 2020世界机器人大赛:BCI脑控机器人大赛技术赛B榜成绩最终公布

    中国电子学会将联合相关单位举办的2020世界机器人大赛-BCI脑控机器人大赛,旨在打造集科技性.创新性.实用性于一体的世界级脑-机接口赛事,使之惠及人类社会生活发挥积极作用. 本次大赛技术赛重点考察各 ...

  8. 特斯拉AI高级总监Andrej Karpathy详解Tesla纯视觉自动驾驶方案

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:黄浴 链接:https://zhuanlan.zhihu.com/p/136179627 本文转 ...

  9. 2020中国机器人公司排行榜TOP10揭晓

    根据国际机器人联盟统计,中国的机器人密度世界排名在第23位,中国机器人在全球成长速度是最快的一个国家,那么,你知道中国机器人公司排名是怎么样吗?下面小编就根据市场需求分析来选出中国机器人公司top10 ...

最新文章

  1. 利用 Swoole 给应用写个防火墙
  2. AHK调用API获取ListView每列的坐标
  3. 微信小程序组件通信入门及组件生命周期函数
  4. React开发(205):react代码分割之context
  5. Linux下,C++编程论坛题目抽取
  6. java如何实现开机启动,怎样实现开机启动holer
  7. 《企业软件交付:敏捷与高效管理精要》——2.2 MyCo公司和MyProj企业软件交付项目...
  8. netlink 0001 --- 基础简介
  9. c++ explicit关键字解读
  10. 一些免费在线杀毒网址
  11. ubuntu中vim编辑模式退格键无法删除,方向键乱入ABCD解决方法
  12. Java-Object转JSONObject
  13. 利用cad等高线生成dem的步骤
  14. 基于cocos2dx-lua,udp的局域网游戏
  15. 跨系统实时同步数据解决方案
  16. 【Redis】五种数据类型及其使用场景
  17. MapInfo点符号的制作方法
  18. Centos7 安装Nat123
  19. 亚马逊常用API接口,亚马逊国际获得AMAZON商品详情 API 返回值说明
  20. omf多路径 oracle_【OMF】使用Oracle的OMF 特性

热门文章

  1. 关于Unity 3D第一人称视角移动时相机抖动的问题
  2. c语言实现用户注册,Django HTML表单实现用户注册
  3. 基于SSM框架的高校评教系统(附论文)
  4. web开发首选,CSS常用五类选择器
  5. 基于优先级配置矩阵的套餐系统
  6. js 调用window.print()方法打印
  7. GoLand 使用自定义包
  8. mysql+连接每一行数据_MySQL_深入mysql基础知识的详解,1.每个客户端连接都会从服务 - phpStudy...
  9. 根据文本自动生成UML时序图(draw.io格式)
  10. 最近遇到的问题 及解决方法