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

2023-05-16

单目纯视觉避障方案——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 = 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)
    #场景中颜色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 mask
    mask_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,黑色灰度是0
    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']

    #当有可行路径mask_path总灰度>255时,计算可行路径mask_path的质心并解算出w角速度,否则flag_stop=1,trutlebot原地旋转
    flag_stop=0
    if(gray_scale_path > 200):
        #算路径质心的x坐标
        x = int(moments_path['m10']/moments_path['m00'])
        #算图像中心x坐标与路径质心x坐标差值offset
        offset = x-(W/2)
        #根据offset解算出角速度,调整k可以调整偏转程度
        w = k * offset
        print (w)
    else:
        w = math.radians (5)
        flag_stop=1

    #flag_rush用于标志是否能使用向球门冲的函数
    #设置条件可以理解为机器人看到的背景像素足够多,不能看到障碍物,可以看到蓝色球门
    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'])
        # 算图像中心x坐标与球门质心坐标x坐标差值offset
        offset = x - (W / 2)
        # 根据offset解算出角速度,调整k可以调整偏转程度
        w = k * offset
        if (abs (w) < math.radians (1)) :
            flag_rush=1
            print("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 = 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(使用前将#替换为@)

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

  • 解决 SpringBoot 图片加载失败

    x1f4e2 本文章通过实战记录相关问题以及提供解决方案 x1f464 公众号 xff1a 恩故事还在继续 目录 1 问题描述2 解决方案2 1 打开 IDEA 3 参考文献 1 问题描述 在使用 SpringBoot 开发项目的时候发现了
  • 仿牛客论坛项目部署总结

    x1f4e2 本文章通过实战记录相关问题以及提供解决方案 x1f464 公众号 xff1a 恩故事还在继续 目录 1 前言2 部署项目需求3 环境配置3 1 阿里云服务器3 2 本地文件上传到服务器3 3 MySQL配置与安装3 4 Mav
  • 时间片轮转调度算法的计算

    在分时系统中 xff0c 最简单最常用的就是基于时间片轮转调度算法 xff0c 时间片轮转调度算法是非常公平的处理机分配方式 xff0c 让就绪队列的每个进程每次仅运行一个时间片 1 时间片轮转调度算法的基本原理 在时间片轮转调度算法中 x
  • IntelliJ IDEA添加注释常用的快捷键

    IDEA可以使用快捷键添加行注释Ctrl 43 块注释Ctrl 43 Shift 43 xff0c 还可以快速生成类注释 方法注释等 下面就介绍这几种快捷键的用法 1 行注释Ctrl 43 首先你的光标要处于这一行 xff0c 处于这行的哪
  • Android Studio 设置代码提示和代码自动补全快捷键

    想必使用过Eclipse的小伙伴们都习惯Eclipse快捷键带来的方便 但是当我们使用Android studio来进行开发的时候也想要这种方便该怎么办呢 当然使用过Android studio的小伙伴可能已经知道了它的方便以及强大之处 接
  • 编写一个算法,实现一维数组a输入任意n个整数,假设n=7,输入7个数字为3,7,6,8,9,4,1

    问题描述 编写一个算法 xff0c 实现一维数组a输入任意n个整数 xff0c 假设n 61 7 xff0c 输入7个数字为3 7 6 8 9 4 1 xff0c 然后建立一个具有如图所示的方阵 xff0c 并输出打印 1 3 7 6 8
  • 1.0 DS1302-外部RTC

    一 综述 DS1302是美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片 xff0c 因为应用非常广泛 xff0c 结果就导致了大量的国产仿制品 xff0c GC1302是一款国产DS1302仿制芯片 xff0c 使用方法
  • 现代C++语言

    include lt iostream gt include lt limits gt include lt future gt include lt string gt include lt map gt using namespace
  • ubuntu 解压 打包 命令全集

    tar 解包 xff1a tar xvf FileName tar 打包 xff1a tar cvf FileName tar DirName xff08 注 xff1a tar是打包 xff0c 不是压缩 xff01 xff09 gz 解
  • 在IDEA中解决进行有关详细信息, 请使用 -Xlint:unchecked 重新编译。

    springboot默认的打包是如下 xff1a lt build gt lt plugins gt lt plugin gt lt groupId gt org springframework boot lt groupId gt lt
  • Jetson Nano更换软件源

    Nano的镜像默认是国外的源 xff0c 速度很慢 xff0c 国内的源有的上不去 xff0c 有的包无法安装 xff0c 经过测试清华大学的源完美可用 xff0c 现放上教程 首先备份原本的source list文件 sudo cp et
  • prometheus在k8s中的部署

    1 k8s的监控指标 监控指标具体实现举例Pod性能cAdvisor容器CPU xff0c 内存利用率Node性能node exporter节点CPU xff0c 内存利用率K8S资源对象kube state metricsPod Depl
  • vue前端

    span class token operator lt span span class token operator span DOCTYPE html span class token operator gt span span cla
  • VueCli 脚手架的安装

    配置淘宝npm仓库 xff1a span class token function npm span config span class token builtin class name set span registry https re
  • vue进阶知识

    Vue单文件组件 xff08 又名 vue文件 xff0c 缩写为SFC xff09 是一种特殊 的文件格式 xff0c 它允许讲Vue组件的模板 逻辑与样式封装在 单个文件中 正如所见 xff0c Vue SFC 是经典的 HTML CS
  • ssh@host:""ssh切换到其他机器上执行多条命令;Pseudo-terminal will not be allocated because stdin is not a terminal.

    1 背景 xff1a shell脚本在主机器上执行kafka的启动命令 其他机器也会起这个进程 之前的脚本每次执行的时候出现卡住的现象 xff0c 不能回到命令行 解决方法 xff1a 第一种 span class hljs comment
  • centos升级glibc(升级到 2.17版)

    1 原先的系统glibc库的版本是2 12 xff0c 需要升级到2 17版本 下载地址 xff1a http ftp gnu org gnu glibc glibc 2 17 tar gz 这里可以选择你所需要的版本 2 安装部署 roo
  • u盘启动盘安装centos7.4操作系统

    1 使用UltraISO软件将ISO镜像刻录到U盘 xff0c 然后用u盘安装操作系统 制作好的u盘如下所示 xff1a 2 启动华为h3c服务器 xff0c 出现下面的界面 按照提示按住Ctrl 43 A制作raid 继续点击下一步 xf
  • redis一主一从两台机器高可用

    目录 1 机器规划 2 redis的部署安装 2 1配置文件内容 2 2 启动2台机器上的redis服务 2 3 查看2台机器上redis数据信息 3 redis主从之间手动切换 3 1 停掉22上的redis进程 xff0c 到23从re
  • cumulusclips的部署

    描述 xff1a CumulusClips是一个开源的视频分享 xff08 内容管理 xff09 平台 xff0c 能够提供最佳的视频分享功能之一类似YouTube 在CumulusClips的帮助下 xff0c 您可以开始自己的视频分享网

随机推荐