手势控制小海龟移动

这是很早之前学习ros做的一个小demo,适合初学者学习。
一.要求
要求通过电脑自带摄像头检测手势动作控制小海龟移动
二.问题分析
本设计需要运行三个节点,第一个节点为reconition(发布),通过采用传统的视觉算法检测手势动作,并将检测完后的数据传递到command(手势订阅)节点,command(海龟运动发布)节点订阅到手势信息后进行判断,并将相应指令传递给小海龟/turtle1/cmd_vel’,控制其运动。
note:其实也可以不必采用传统的视觉检测算法,也可以采用深度学习的方法,但是我感觉没有必要,所以采取了简单的方法来做。
三.运行环境
需要安装opencv2或者以上的cv库,numpy库
四.代码参考

recognition

#!/usr/bin/env python# organize importsimport cv2
import imutils
import numpy as np
from std_msgs.msg import String
import math
import rospy
# global variables#Based on skin detection
def getContours(img):kernel = np.ones((5, 5), np.uint8)closed = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)closed = cv2.morphologyEx(closed, cv2.MORPH_CLOSE, kernel)_,contours, h = cv2.findContours(closed, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)vaildContours = []for cont in contours:if cv2.contourArea(cont) > 9000:# x,y,w,h = cv2.boundingRect(cont)# if h/w >0.75:# filter face failed#print(cv2.contourArea(cont))# time.sleep(1)vaildContours.append(cv2.convexHull(cont))# print(cv2.convexHull(cont))# rect = cv2.minAreaRect(cont)# box = cv2.cv.BoxPoint(rect)# vaildContours.append(np.int0(box))return  vaildContoursdef HSVBin(img):hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)lower_skin = np.array([100, 50, 0])upper_skin = np.array([125, 255, 255])mask = cv2.inRange(hsv, lower_skin, upper_skin)# res = cv2.bitwise_and(img,img,mask=mask)return mask
def cal_distance(p1, p2):return math.sqrt(math.pow((p2[0] - p1[0]), 2) + math.pow((p2[1] - p1[1]), 2))if __name__ == '__main__':rospy.init_node('recognition', anonymous=True)pub = rospy.Publisher('gesture', String, queue_size=10)rate = rospy.Rate(10)  # 10hzcap = cv2.VideoCapture(0)a=1while (cap.isOpened()):while not rospy.is_shutdown():#x = []#y = []ret, img = cap.read()skinMask = HSVBin(img)contours = getContours(skinMask)for c in contours:M = cv2.moments(c)cX = int(M["m10"] / M["m00"])cY = int(M["m01"] / M["m00"])#cv2.drawContours(img, [c], -1, (0, 255, 0), 2)#cv2.circle(img, (cX, cY), 7, (255, 255, 255), -1)#cv2.putText(img, "center", (cX - 20, cY - 20),#           cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)distance=[]for i in c:#print(i[0])point1 = tuple(i[0])point2 = (cX, cY)distance.append(cal_distance(point1, point2))Direction_point=tuple(c[distance.index(max(distance))][0])#cv2.circle(img, Direction_point, 7, (255, 255, 255), -1)#cv2.line(img, Direction_point,(cX, cY), (255, 0, 0))if cal_distance(Direction_point, (cX,cY))>=100:if abs(Direction_point[0]-cX)>abs(Direction_point[1]-cY):if Direction_point[0]-cX>0:print('Left')a=3cv2.putText(img, "Left", ( 200, 20),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 4)elif Direction_point[0]-cX<=0:print('Right')a=4cv2.putText(img, "Right", (200, 20),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 4)elif abs(Direction_point[0]-cX)<abs(Direction_point[1]-cY):if Direction_point[1]-cY>0:print('Down')a=5cv2.putText(img, "Down", (200, 20),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 4)elif Direction_point[1]-cY<=0:print('Up')a=2cv2.putText(img, "Up", (200, 20),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255,0), 4)else:print('stop')a=1cv2.putText(img, "Stop", (200, 20),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 4)pub.publish(str(a))cv2.imshow("hold the turtle", img)rate.sleep()k = cv2.waitKey(10)if k == 27:breakk = cv2.waitKey(10)if k == 27:break

command.py

#!/usr/bin/env pythonimport rospy
#!/usr/bin/env pythonfrom geometry_msgs.msg import Twist
from std_msgs.msg import Stringfingers = 0
def callback(data):global fingersfingers = data.datarospy.init_node('command')
rospy.Subscriber("gesture", String, callback)
cmd_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=1)
rate = rospy.Rate(10)while not rospy.is_shutdown():twist = Twist()if fingers == '2':twist.linear.x = 0.6rospy.loginfo("driving forward")elif fingers == '3':twist.angular.z = -1rospy.loginfo("turning left")elif fingers == '4':twist.angular.z = 1rospy.loginfo("turning right")elif fingers == '5':twist.linear.x = -0.6rospy.loginfo("turning right")else:twist.linear.x = 0.0twist.angular.z = 0.0rospy.loginfo("stoped")cmd_vel_pub.publish(twist)rate.sleep()

这是核心代码,读者可以根据此代码自己编写完整。最后附上工程链接,有兴趣的可以去下载。
https://download.csdn.net/download/weixin_39591533/34379935

ROS-手势控制小海龟移动相关推荐

  1. ROS入门之使用命令行工具控制小海龟移动

    前面的文章主要是说明一下ROS入门需要了解的基本概念,这篇文章则是要说明一下如何使用命令行工具. 2.1 命令行工具的使用 ROS有很多常用命令:rostopic.rosservice.rosnode ...

  2. ROS 入门教程 —— 小海龟简单控制

    ROS 入门教程 -- 小海龟简单控制 这里我们直接介绍命令使用方法,原理请查看我的另外几篇博客: ROS 命令行工具的使用 ROS 创建工作空间与功能包 运行并控制小海龟 由于小海龟并不是 ROS ...

  3. ROS安装和 控制小海龟画圆

    1.ROS软件安装 (1)添加ROS软件源 sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -s ...

  4. ubuntu16.04中成功安装ROS后,小海龟示例

    那麽恭喜了,ROS成功安装上了--- 我们可以跑一个测试程序---小海龟.先安装示例 : $ sudo apt-get install ros-kinetic-turtlesim 然后,在三个不同的终 ...

  5. ROS实践--运行小海龟仿真例程

    ROS实践–运行小海龟仿真例程 由于在之前就已经安装了ROS,所以本文章只有小海龟的相关实验. 1.启动小海龟及其键盘控制 1.1 启动rosmaster 打开一个终端(快捷键ctrl+alt+t), ...

  6. turtlebot matlab,Turtlebot与Matlab入门教程-控制小海龟

    说明: 介绍如何在matlab中控制小海龟 步骤: 在Ubuntu端 启动roscore $ roscore 启动turtlesim $ rosrun turtlesim turtlesim_node ...

  7. ROS入门笔记(四):ROS实践(小海龟仿真)— ROS Topics

    ROS入门笔记(四):ROS实践(小海龟仿真)- ROS Topics 文章目录 1 基础知识 1.1 运行ROS Master所在主机的资源地址 1.2 ROS常用命令 1.2.1 查看所有以ros ...

  8. windows上ubuntu双系统安装+ROS配置全过程+小海龟+RVIZ

    win系统下安装 Linux 双系统教程 [系统名称]: Linux [系统大小]: 1.82G [系统版本]: 18.04.1 [安装环境]: win10 [下载方式]: 百度网盘: https:/ ...

  9. ros入门启动小海龟(ros2版本)

    首先终端 ros2 run turtlesim turtlesim_node 其次打开新的终端 ros2 run turtlesim turtlesim_node 最后再打开一个新的终端 ros2 r ...

最新文章

  1. 又踩到Dubbo的坑,但是这次我笑不出来
  2. 简述Android触摸屏手势识别
  3. Android Q Labs| 结束演讲
  4. HDFS--Hadoop分布式文件系统
  5. 多伦多计算机科学大学,加拿大计算机科学专业 - 加拿大多伦多大学的计算机专业...
  6. HDU - 2844 Coins(多重背包+完全背包)
  7. android 对话框
  8. 通过外部文件覆盖打包的Spring应用程序属性文件
  9. STM32----通用定时器TIM2~TIM5的三种功能
  10. Xcode 7 App Transport Security has blocked a cleartext HTTP 报错解决办法
  11. 微擎微信公众号小程序框架v2.7.3去sq一键安装纯净商业版
  12. @controlleradvice注解作用_springboot的常用注解分析
  13. 转:关于BFC的初步了解以及常见使用
  14. React跨域解决方案
  15. 新手如何做好网络营销
  16. Python数据预处理--Gensim构建语料词典
  17. CISCO3945E/K9路由器license激活教程
  18. 【Pyecharts | Scatter】气泡图实现 / 1990 与 2015 年各国家人均寿命与GDP
  19. 自定义View之仿虾米音乐TabLayout
  20. 线性变换到底是什么以及与矩阵之间的联系

热门文章

  1. Vue在组件上使用v-model
  2. C++ set与map、unordered_map、unordered_set与哈希表
  3. Modularity(模块化-无模块化)
  4. Type Conversion(类型转换)
  5. 求“厉害”数 (10 分)
  6. 重要的数据结构--队列(C语言实现)
  7. datagridview如何将sqlite实现多表查询_服气!月薪3W的Exceler,居然是这样合并多表数据的...
  8. __name__ == '__main__'的用法
  9. Spark- SparkSQL中 Row.getLong 出现NullPointerException错误的处理方法
  10. php遍历文本文档txt文件中的链接内容为数组