安装opencv功能包:

$ sudo apt-get install ros-indigo-version-opencv libopencv-dev python-opencv

 检测指示线:

#!/usr/bin/env python
# coding=utf-8 import rospy
from sensor_msgs.msg import Image
import cv2, cv_bridge
import numpy
from geometry_msgs.msg import Twist class Follower:
def __init__(self):
self.bridge = cv_bridge.CvBridge()
cv2.namedWindow("window", 1)
# 订阅usb摄像头
self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.image_callback)
# self.image_sub = rospy.Subscriber("cv_bridge_image", Image, self.image_callback)
# 订阅深度相机
# self.image_sub = rospy.Subscriber("/camera/rgb/image_raw", Image, self.image_callback)
# self.image_sub = rospy.Subscriber("/camera/depth/image_raw", Image, self.image_callback)
    
self.cmd_vel_pub = rospy.Publisher("cmd_vel", Twist, queue_size=1)
self.twist = Twist() def image_callback(self, msg):
image = self.bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')
# hsv将RGB图像分解成色调H,饱和度S,明度V
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 颜色的范围 # 第二个参数:lower指的是图像中低于这个lower的值,图像值变为0
# 第三个参数:upper指的是图像中高于这个upper的值,图像值变为0
# 而在lower~upper之间的值变成255
lower_black = numpy.array([0, 0, 0])
upper_black = numpy.array([50, 50, 50])
mask = cv2.inRange(hsv, lower_black, upper_black)
masked = cv2.bitwise_and(image, image, mask=mask) # 在图像某处绘制一个指示,因为只考虑20行宽的图像,所以使用numpy切片将以外的空间区域清空
h, w, d = image.shape
search_top = 3*h/4
search_bot = search_top + 20
mask[0:search_top, 0:w] = 0
mask[search_bot:h, 0:w] = 0
# 计算mask图像的重心,即几何中心
M = cv2.moments(mask)
if M['m00'] > 0:
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
cv2.circle(image, (cx, cy), 20, (0, 0, 255), -1)
        
if not cv2.circle:
self.twist.linear.x = -0.5
self.twist.angular.z = 0.1
# 计算图像中心线和目标指示线中心的距离
erro = cx - w/2
self.twist.linear.x = 0.5
# self.twist.angular.z = -float(erro)/100
self.twist.angular.z = 0 self.cmd_vel_pub.publish(self.twist)
cv2.imshow("window", image)
cv2.waitKey(3) rospy.init_node("opencv")
follower = Follower()
rospy.spin()

  使用opencv的cvtColor()函数将RGB图像转换成HSV图像,使用numpy在HSV颜色空间中创建一个所需的色调范围,然后用inRange()函数根据色调范围生成一个二值图像。

  跟踪指示线的策略:只考虑图像1/3高处的20行宽的部分,在检测的图像中心绘制一个圆点用来标记。

 

基于ROS完成寻迹运动的更多相关文章

  1. Autoware 培训笔记 No. 4——寻迹

    1. 前言 好多初创公司公布出来的视频明显都是寻迹的效果,不是说寻迹不好,相反可以证明,寻迹是自动技术开始的第一步. 自动驾驶寻迹:一种能够自动按照给定的路线(通常是采用不同颜色或者其他信号标记来引导 ...

  2. MicroPython教程之TPYBoard开发板DIY红外寻迹小车

    智能小车现在差不多是电子竞赛或者DIY中的主流了,寻迹,壁障,遥控什么的,相信大家也都见得很多了,这次就大家探讨一下寻迹小车的制作方法,不同于以往的是这次的程序不用C语言写,而是要使用python语言 ...

  3. 基于ROS的分布式机器人远程控制平台

    基于ROS的分布式机器人远程控制平台   1 结构说明 HiBot架构主要使用C/S架构,其中HibotServer为服务器,Muqutte为消息服务器中间件,HiBotClient为运行在机器人上的 ...

  4. 基于ROS和python,通过TCP通信协议,完成键盘无线控制移动机器人运动

    一.所需工具包 1.ROS键盘包:teleop_twist_keyboard 2.TCP通讯包:socket $ cd ~/catkin_ws/src $ git clone https://gith ...

  5. 基于ROS的运动识别

    #!/usr/bin/env python # -*- coding: utf-8 -*- import rospy import cv2 import numpy as np from sensor ...

  6. 基于ROS和beaglebone的串口通信方式,使用键盘控制移动机器人

    一.所需工具包 1.ROS键盘包:teleop_twist_keyboard  2.ROS串口通讯包:serial $ cd ~/catkin_ws/src $ git clone https://g ...

  7. [转]基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动

    原文出处: https://blog.csdn.net/Forrest_Z/article/details/55002484 准备工作 1.下载串口通信的ROS包 (1)cd ~/catkin_ws/ ...

  8. QT下调试基于ros的catkin项目

    1.首先告诉qt ros的搜索路径,通过修改qt creator 桌面启动程序来实现 sudo    gedit ~/.local/share/applications/DigiaQtOpenSour ...

  9. 基于opencv3.0下的运动车辆识别

    在opencv的初等应用上,对运动物体的识别主要有帧差或背景差两种方式. 帧差法主要的原理是当前帧与前一帧作差取绝对值: 背景差主要的原理是当前帧与背景帧作差取绝对值: 在识别运动车辆上主要需要以下9 ...

随机推荐

  1. jdk1.8的环境下打包成jdk1.6

    第一步: 选中项目 ------->properties 第二部:(修改java build path和java conpiler) 第三部:需要打包成jdk6的jar包,就改成jre6. 注意 ...

  2. 小程序上拉加载更多数据(onReachBottom)

    <!--pages/test/test.wxml--> <block wx:for="{{list}}" wx:key="item.id"&g ...

  3. Handler Bundle Runnable

    Handler:   不能在子线程更新UI,可以通过handler来实现在子线程发送消息在主线程更新 Bundle:      https://blog.csdn.net/qq_36895346/ar ...

  4. Nginx负载均衡后端健康检查(支持HTTP和TCP)

    之前有一篇文章记录nginx负载均衡后端检查,链接为 https://www.cnblogs.com/minseo/p/9511456.html 但是只包含http健康检查不包含tcp下面安装ngin ...

  5. nvwgf2umx.dll 显卡崩溃问题尝试修复

    问题背景 游戏上线之后,搜集到的奔溃列表里面列表存在大量的显卡驱动异常崩溃,window在vista之后,将显卡驱动模型从Xpdm改为了WDDM. WDDM的说明详见百度百科,其中最主要的变更如下: ...

  6. Django2.0.4 + websocket 实现实时通信,主动推送,聊天室及客服系统

    webSocket是一种在单个TCP连接上进行全双工通信的协议. webSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebSocket API中,浏览器 ...

  7. Mac上配置GTK环境

    Mac上配置GTK环境 安装command line工具, 如果安装了Xcode, 就直接跳过该步骤 安装Homebrew 使用brew install pkg-config 使用brew insta ...

  8. python转换图片格式

    在图片所在的路径下,打开命令窗口 bmeps -c picturename.png picturename.eps

  9. Oracle查询重复数据并删除,只保留一条记录

    前言 项目中,在“资源目录-在线编目”中,资源项子表存在多条重发数据,需要进行数据清理,删除重发的数据,最终只保留一条相同的数据. 操作的表名:R_RESOURCE_DETAILS 操作步骤 一.重复 ...

  10. DS18B20初上电显示85℃问题

    以前用的温度采集都是用的AD,这次改为了DS18B20,看了资料,没有很复杂的部分,重要的就是时序.板子出来后初步测试也能正常读取温度,然而有个问题比较奇怪,就是在板子初上电时读取温度总是显示为+85 ...