基于edison的自动抓取机器人

2015-09-022.4万
AI 快速预览详细 收起
基于Intel Edison的自动抓取机器人项目,通过图像分析处理和距离传感器实现远程机械臂自动抓取。硬件包括Tplinkw703n(刷入openWRT)、L298N、直流减速电机、摄像头和舵机。通过Python和Socket通信实现手机控制。适用于STEM教育场景,激发孩子对机器人技术的兴趣。
基于edison的动抓取机器人          



远程机械臂去抓取物体时,一般情况下我们会人工去控制每一个舵机的转动角度,但是由于视差以及人工操作的不可控性使抓取操作变得不那么简单。在自动抓取机器人中我们通过edison进行图像分析处理,自动调节机械臂与物体之间的相对位置,当图像于抓取位置图像相吻合时,再通过过距离传感器消除视察实现自动抓取。


硬件组成:
1.Intel Edison & Arduino Breakout Kit      ×1
2.Tplinkw703n(刷入openWRT)                    ×1
3.L298N                                                          ×2
4.直流减速电机                                             ×4
5.摄像头                                                        ×1
6.舵机                                                           ×5
第一部分:设置GPIO
GPIO python来驱动GPIO
import mraaprint (mraa.getVersion())
x = mraa.Gpio(13)
x.dir(mraa.DIR_OUT)
x.write(1)

第二部分:封装轮子

  • class Wheel:  
  •     pins ={'a':[13,15],'b':[16,18],'c':[19,21],'d':[22,24]}# 这里指定了四个轮子所使用的8个GPIO接口  
  •     def __init__(self,name):  
  •         self.name = name  
  •         self.pin = Wheel.pins[self.name]  
  •         GPIO.setmode(GPIO.BOARD)  
  •         GPIO.setup(self.pin[0],GPIO.OUT)  
  •         GPIO.setup(self.pin[1],GPIO.OUT)  
  •         self.stop()  
  •     def forward(self):  
  •         GPIO.output(self.pin[0],GPIO.HIGH)  
  •         GPIO.output(self.pin[1],GPIO.LOW)  
  •     def stop(self):  
  •         GPIO.output(self.pin[0],False)  
  •         GPIO.output(self.pin[1],False)  
  •     def back(self):  
  •         GPIO.output(self.pin[0],False)  
  •         GPIO.output(self.pin[1],True)  

  • Wheel('a').forward() #a,b,c,d是四个轮子的名字  
通过调用每个Wheel实例,可以对他们自由操作。由于整个车是由四个轮子协同来工作的,我们需要同时来让四个轮子一起工作,对此对这种协同工作进行封装,让我们不必在关心怎样驱动4个轮子就可以前进了:


第三部分: 封装车子

前进、后退、左转、右转,封装一下代码

  • class Car:   
  •     wheels=[Wheel('a'),Wheel('b'),Wheel('c'),Wheel('d')]   
  •     @staticmethod  
  •     def init():  
  •         GPIO.setmode(GPIO.BOARD)  
  •     @staticmethod  
  •     def forward():  
  •         for wheel in Car.wheels:  
  •             wheel.forward()  
  •        @staticmethod  
  •     def back():  
  •         for wheel in Car.wheels:  
  •             wheel.back()  
  •     @staticmethod  
  •     def left():  
  •         Car.wheels[0].forward()   
  •         Car.wheels[1].forward()  
  •         Car.wheels[3].back()  
  •         Car.wheels[2].back()  
  •     @staticmethod  
  •     def right():  
  •         Car.wheels[2].forward()   
  •         Car.wheels[3].forward()  
  •         Car.wheels[0].back()  
  •         Car.wheels[1].back()  
  •     @staticmethod  
  •     def stop():  
  •         Car.wheel[0].stop()   
  •         Car.wheel[1].stop()   
  •         Car.wheel[3].stop()  
  •         Car.wheel[2].stop()  


  • 远程遥控小车,因此小车必须提供和外部遥控设备的通信接口:
  • 基于edison的自动抓取机器人图2


第四部分:通信程序

选择了Wifi的方式,所以使用socket作为接口最直接不过了:


  • rom socket import *  
  • import sys  
  • import time  
  • import car  
  •   
  • commands ={'forward':Car.forward,  
  •   'back':Car.back,   
  •   'stop':Car.stop,  
  •   'left':Car.left,  
  •   'right':Car.right  
  • }  
  •   
  • def execute(command):     
  •     print command  
  •     commands[command]()  
  •   
  • HOST ='192.168.2.101' #the ip of edison  
  • PORT = 8888  
  • s= socket(AF_INET, SOCK_STREAM)  
  • s.bind((HOST, PORT))  
  • s.listen(1)  
  • print ('listening on 8888')  
  • while 1:  
  •     conn, addr = s.accept()  
  •     print ('Connected by:', addr)  
  •     while 1:  
  •             command= conn.recv(1024).replace('\n','')  
  •             if not command:break  
  •             execute(command)  
  •     conn.close()  


> sudo python server.py 之后,edison会监听8888端口一旦有消息传递过来,根据命令参数调用相应的方法。小车的服务端接口就相当一个执行者,接受到命令就立刻执行,此次只要可以建立和小车的socket连接,便可以轻松控制。

第五部分: 手机操作小车

通过手机来操作,实际上就通过socket和edison进行通信,当edison处于listening状态,对于手机来说,它要做的最重要的事情就是发送消息到edison,成为一个小车的指挥者:






  • package com.simplexk;  
  • import java.io.PrintWriter;  
  • import java.net.Socket;  
  •   
  • public class Commander {  
  •     public static String HOST ="192.168.2.101"; //the ip of edison   
  •     public static int PORT =9000;  
  •     public static void send(Command forward) throws Exception {  
  •             Socket socket = new Socket(HOST, PORT);  
  •             PrintWriter writer = new PrintWriter(socket.getOutputStream());  
  •             writer.println(forward.toString());  
  •             writer.flush();  
  •             socket.close();  
  •     }  
  • }  

第六摄像头
1:tplinkw703n刷入openwrt进行图像采集
2:通过http://192.168.1.1:8080/?action=stream获取图像
3.703n除作为图像采集外,还作为路由器,将客户端(手机或电脑)与edison链接,通过wifi进行图像传输和控制
4.采集后的图像通过opencv进行识别和处理,作为控制信号。控制机械臂抓取物体。
5.由于采集图像与真实情况存在误差,不能准确的抓取物体,需要在机械臂爪臂上增加距离传感器,与图像识别相结合进行物体的抓取。
基于edison的自动抓取机器人图1

第七网页
<html>
<head>
<title>Edison</title>
</head>
<body>
<table width="915" border="1" cellpadding="2">
  <tr>
    <td width="432" height="326"><div align="left"><input type="button" value="   " style="height:80px; width:80px;"  />
        <input type="button" value="Go" style="height:80px; width:80px;"  />
      <input type="button" value="  " style="height:80px; width:80px;"  />
       <input type="button" value=" Servo11 " style="height:80px; width:80px;"  />
      <input type="button" value="Servo12" style="height:80px; width:80px;"  />
      <input type="button" value="Left" style="height:80px; width:80px;"  />
      <input type="button" value="Stop" style="height:80px; width:80px;"  />
      <input type="button" value="Right" style="height:80px; width:80px;"  />
      <input type="button" value=" Servo21 " style="height:80px; width:80px;"  />
      <input type="button" value="Servo22" style="height:80px; width:80px;"  />
      <input type="button" value="  " style="height:80px; width:80px;"  />
      <input type="button" value="Back" style="height:80px; width:80px;"  />
          <input type="button" value="  " style="height:80px; width:80px;"  />
          <input type="button" value=" Servo31 " style="height:80px; width:80px;"  />
          <input type="button" value="Servo32" style="height:80px; width:80px;"  />
          <input type="button" value="Auto" style="height:80px; width:80px;"  />
          <input type="button" value="camera11" style="height:80px; width:80px;"  />
          <input type="button" value="camera12" style="height:80px; width:80px;"  />
          <input type="button" value="  camera21" style="height:80px; width:80px;"  />
           <input type="button" value="camera22" style="height:80px; width:80px;"  />      
    </div></td>
    <td width="463"><iframe src="192.168.1.1:8080/?action=stream" width="320" height="240"> </td>
  </tr>
</table>
</body>
</html>
基于edison的自动抓取机器人图3




1.jpg (2.17 MB, 下载次数: 6346)

STEM教育 · 基于Edison的自动抓取机器人_image_3.webp

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(13)
孙毅
孙毅
好像大家众望所归啊。。。。@凌风清羽 人儿呢。。。哈哈,续教程啊。。。
沧海笑
沧海笑
教程很棒,好好学习。谢谢分享。
swanglei
swanglei
可以再试着加个外观,会更有趣
俞思涵!
俞思涵!
想做个能自动识别的,感觉这个给我的启发很大,坐等凌风同学更新!
孙毅
孙毅
恩,先给加个精儿把,等待凌风同学继续更新,完善啊!
孙毅
孙毅回复woaian250
哈哈哈,得让他知道,他有这么忠实的粉丝,赶紧上贴!
话说,他这周期末考试了吧。。。哈哈哈
woaian250
woaian250回复孙毅
每天都过来看一眼= =
woaian250
woaian250
好像还没看到教程啊。。
woaian250
woaian250回复孙毅
凌风同学加油。
孙毅
孙毅回复woaian250
凌风 同学最近有点忙哦。。。吼吼
Joyce
Joyce
教程,教程,坐等教程:lol
dsweiliang
dsweiliang
希望教程能详细一点,我也想做一个
dsweiliang
dsweiliang回复凌风清羽
好的,谢谢
凌风清羽
凌风清羽
作者
回复dsweiliang
好滴,这两天再准备教程
孙毅
孙毅
你这不是做的挺多的了吗,快做完了啊。。。
软件有可能的话,可以共享一下啊。。。。嘻嘻
凌风清羽
凌风清羽
作者
回复孙毅
明天上教程
qq815076543322
qq815076543322
希望能够更详细 这样子大家都可以试试看
凌风清羽
凌风清羽
作者
回复qq815076543322
明天更新教程
hnyzcj
hnyzcj
图好小,不清晰,下次麻烦弄清晰无码大图,谢谢,哈哈
hnyzcj
hnyzcj
有超级详细教程吗?我的学生需要。
Ash1
Ash1
wow~ ⊙o⊙ 最近流行这夹子吗 出现率好高哦~ 不过项目很棒的样子 赞一个!
- 没有更多了 -