亚博智能论坛  
  
查看: 2152|回复: 7

用树莓派DIY六足行走的机器人

  [复制链接]
  • TA的每日心情
    萌哒
    2017-8-8 09:55
  • 2

    主题

    18

    帖子

    32

    积分

    新手上路

    Rank: 1

    积分
    32
    发表于 2017-8-8 09:51:59 | 显示全部楼层 |阅读模式
    目前用 Arduino、树莓派做小车、无人机、机器人的不少。趣无尽分享一款在由Roland Pelayo做的一个“六足行走机器人”。这个树莓派动力机器人能自主运行,自动避障,且也能实现手动模式由智能手机控制。 来具体看下过程。

    “六足行走”Hexapod Walker概念
    这个六足行走者(Hexapod Walker)将遵循大多数动物和昆虫使用的三脚架步态。三脚架步态如下图所示:
    Image courtesy of NC State University
    在六足行走者中有很多方法来使用这种步态。
    平衡了价格和性能后,我选择构建一个三伺服电机版本。然后我添加了另一台伺服电机,用于安装机器人的“眼睛”。
    机器人将有三个运动:前进,后退,右转,左转。
    任何运动都会涉及机器人向右或向左倾斜,然后移动由倾斜抬起的腿部。
    以下是运动的图表(腿上的灰色意味着机器人的重量在该腿上)。



    右转运动基本和左转运动相反。
    为了使三伺服电动机设计成为可能,在第三伺服电机倾斜步行者的同时,前后相应的后腿需要互连。
    这种六足步行者可以在两种模式下操作:
    在第一种模式(自主)中,步行者可以自由漫游。如果它检测到障碍物,它将向后退两步,然后向右转。
    第二种模式将允许用户使用连接到与机器人相同网络的任何智能电话来控制六足步行者的移动。
    根据我的设计要求,我需要一个控制器,能够做到
    1)可以同时控制四个伺服器
    2)从障碍物检测传感器读取输入
    3)连接到一个网络进行无线控制。
    创建Arduino 六足步行者是诱人的也更容易,但要增加的无线连接成本,所以我决定用树莓派。
    这是我设计的框架:
    所需材料
    在决定要使用的控制器之后,需要选择其余的组件。
    3 x Tower Pro SG-5010伺服电机(用于腿部和倾斜)
    1 x Tower Pro SG-90微型伺服电机(头部)
    1 x Raspberry Pi 2 (带USB WiFi加密狗 )或Raspberry Pi 3
    HC-SR04超声波传感器 – 这是障碍物检测传感器。
    压克力板
    1/2“x 1/8”铝棒
    螺丝和螺母
    电池。伺服应该有和树莓派有不同的电源,我的树莓派用了个小充电宝。
    开始我们的教程
    六足机器人主要由三个部分构成:主体(平台),行走足以及头部。
    搭建平台
    H这是一个可用于构建步行者身体的示例布局。我用亚克力板作为我的平台。腿的细节如下。
    接腿
    这是一个腿的布局。我使用了1/2″ x 1/8 ″的铝条。
    腿应该足够坚硬,以支撑六足步行者的重量。请不要塑料!
    这是倾斜的腿:
    安装树莓派和头部
    我在亚克力板上打了孔,然后用螺丝和螺母连接树莓派。
    头部由超声波传感器和连接到电路板的微型伺服电机组成。我用热胶将微型伺服与传感器连接起来:
    看下腿部运动细节:



    回复

    使用道具 举报

  • TA的每日心情
    萌哒
    2017-8-8 09:55
  • 2

    主题

    18

    帖子

    32

    积分

    新手上路

    Rank: 1

    积分
    32
     楼主| 发表于 2017-8-8 09:52:26 | 显示全部楼层
    本帖最后由 Lantern 于 2017-8-8 09:54 编辑

    连线
    以下是我连接对应表:
    tilt servo - > GPIO4right leg -> GPIO21left leg -> GPIO6head -> GPIO26HC-SR04 trigger - > GPIO23HC-SR04 echo - > GPIO24
    因为树莓派的GPIO不能接受大于3.3V的电压,所以需要为树莓派的回波连接添加一个分压器。
    我还添加了一个带有公头和母头的电路板,使接线更清洁。
    这是全组合六足步行者:
    软件Pigpio 用于伺服控制
    Pigpio 是一个用于控制伺服电机的 Python 库,用 SSH 连接到树莓派安装它。
    1. wget http://abyz.co.uk/rpi/pigpio/pigpio.zip
    2. unzip pigpio.zip
    3. cd PIGPIO
    4. make
    5. sudo make install
    复制代码
    Pigpio 运行于后台,在使用 Pigpio 前,你需要先运行。
    1. pigpiod
    复制代码
    设置 contrab:
    1. sudo crontab -e
    复制代码
    在末尾添加
    1. @reboot /usr/local/bin/pigpiod
    复制代码
    Apache 用于服务端
    安装 apache for the Raspberry Pi 用于 WiFi 控制:
    1. sudo apt-get install apache2 -y
    复制代码
    会创建一个目录 /var/www/html/,包含了控制页面。你可以用浏览器连接到树莓派了。RPi rover robot 可以让你在手机上控制树莓派。
    Python 程序
    以下是机器人控制程序。
    1. #!/usr/bin/python

    2. import RPi.GPIO as GPIO
    3. import pigpio
    4. import time
    5. import sys
    6. import os
    7. import signal
    8. GPIO.setmode(GPIO.BCM)
    9. GPIO.setwarnings(False)

    10. tilt = 4
    11. br = 21
    12. bl = 6
    13. trig = 23
    14. echo = 24
    15. head = 26

    16. GPIO.setup(trig, GPIO.OUT)
    17. GPIO.setup(echo, GPIO.IN)

    18. pi = pigpio.pi()


    19. def backward():
    20.     pi.set_servo_pulsewidth(tilt, 800)
    21.     time.sleep(0.15)
    22.     pi.set_servo_pulsewidth(bl, 800)   
    23.     time.sleep(0.15)
    24.     pi.set_servo_pulsewidth(tilt, 2000)
    25.     time.sleep(0.15)
    26.     pi.set_servo_pulsewidth(br, 1800)
    27.     time.sleep(0.15)
    28.     pi.set_servo_pulsewidth(tilt, 1500)
    29.     time.sleep(0.15)
    30.     pi.set_servo_pulsewidth(bl, 1500)  
    31.     time.sleep(0.15)
    32.     pi.set_servo_pulsewidth(br, 1500)  
    33.     time.sleep(0.15)
    34.     return;

    35. def forward():
    36.     pi.set_servo_pulsewidth(tilt, 800)
    37.     time.sleep(0.15)
    38.     pi.set_servo_pulsewidth(bl, 1800)      
    39.     time.sleep(0.15)
    40.     pi.set_servo_pulsewidth(tilt, 2000)
    41.     time.sleep(0.15)
    42.     pi.set_servo_pulsewidth(br, 800)
    43.     time.sleep(0.15)
    44.     pi.set_servo_pulsewidth(tilt, 1500)
    45.     time.sleep(0.15)
    46.     pi.set_servo_pulsewidth(bl, 1500)  
    47.     time.sleep(0.15)
    48.     pi.set_servo_pulsewidth(br, 1500)  
    49.     time.sleep(0.15)
    50.     return;

    51. def left():
    52.     pi.set_servo_pulsewidth(tilt, 800)
    53.     time.sleep(0.15)
    54.     pi.set_servo_pulsewidth(bl, 1800)      
    55.     time.sleep(0.15)
    56.     pi.set_servo_pulsewidth(tilt, 2000)
    57.     time.sleep(0.15)
    58.     pi.set_servo_pulsewidth(br, 1800)
    59.     time.sleep(0.15)
    60.     pi.set_servo_pulsewidth(tilt, 1500)
    61.     time.sleep(0.15)
    62.     pi.set_servo_pulsewidth(bl, 1500)  
    63.     time.sleep(0.15)
    64.     pi.set_servo_pulsewidth(br, 1500)  
    65.     time.sleep(0.15)
    66.     return;

    67. def right():
    68.     pi.set_servo_pulsewidth(tilt, 800)
    69.     time.sleep(0.15)
    70.     pi.set_servo_pulsewidth(bl, 800)   
    71.     time.sleep(0.15)
    72.     pi.set_servo_pulsewidth(tilt, 2000)
    73.     time.sleep(0.15)
    74.     pi.set_servo_pulsewidth(br, 800)
    75.     time.sleep(0.15)
    76.     pi.set_servo_pulsewidth(tilt, 1500)
    77.     time.sleep(0.15)
    78.     pi.set_servo_pulsewidth(bl, 1500)  
    79.     time.sleep(0.15)
    80.     pi.set_servo_pulsewidth(br, 1500)  
    81.     time.sleep(0.15)
    82.     return;
    83.      
    84. def stop():
    85.     pi.set_servo_pulsewidth(tilt, 0)
    86.     time.sleep(0.15)
    87.     pi.set_servo_pulsewidth(bl, 0)  
    88.     time.sleep(0.15)
    89.     pi.set_servo_pulsewidth(br, 0)  
    90.     time.sleep(0.15)
    91.      
    92.     return

    93. def obstacleDetected():
    94.     backward()
    95.     backward()
    96.     backward()
    97.     backward()
    98.     backward()
    99.     right()
    100.     right()
    101.     right()
    102.      
    103.     return

    104. def turnHead():
    105.     pi.set_servo_pulsewidth(head, 700)
    106.     time.sleep(0.5)
    107.     pi.set_servo_pulsewidth(head, 2100)
    108.     time.sleep(0.5)
    109.     pi.set_servo_pulsewidth(head, 1500)
    110.     time.sleep(0.5)

    111.     return

    112. def autoMode():
    113.     print ("Running in auto mode!")

    114.     turnHead()
    115.      
    116.     time.sleep(0.5)
    117.     GPIO.output(trig, 0)
    118.     time.sleep(0.5)
    119.      
    120.     GPIO.output(trig,1)
    121.     time.sleep(0.00001)
    122.     GPIO.output(trig,0)
    123.      
    124.     while GPIO.input(echo) == 0:
    125.         pulse_start = time.time()
    126.      
    127.     while GPIO.input(echo) == 1:
    128.         pulse_end = time.time()

    129.     pulse_duration = pulse_end - pulse_start
    130.      
    131.     distance = pulse_duration * 17150
    132.      
    133.     distance = round(distance, 2)
    134.      
    135.     if distance > 1 and distance < 35:
    136.         obstacleDetected()
    137.     else:
    138.         forward()
    139.         forward()
    140.         forward()
    141.      
    142.     pi.set_servo_pulsewidth(head, 2100)
    143.     time.sleep(0.5)
    144.     return
    145.      
    146. def manualMode():
    147.      
    148.         move = str(sys.argv[2])

    149.         if move == "F" or move == "f":
    150.         print("Moving forward!")
    151.         forward()
    152.     elif move == "B" or move == "b":
    153.         print("Moving backward!")
    154.         backward()
    155.     elif move == "L" or move == "l":
    156.         print("Moving left!")
    157.         left()
    158.     elif move == "R" or move == "r":
    159.         print("Moving right!")
    160.         right()
    161.     else:
    162.         print("Invalid argument!")
    163.      
    164.     return
    165.      
    166. def main():
    167.     opt = str(sys.argv[1])
    168.      
    169.     if opt == "A" or opt == "a":
    170.         autoMode()
    171.     elif opt == "M" or opt == "m":
    172.         manualMode()
    173.      
    174.     return
    175.          
    176. while True:
    177.     main()

    178. GPIO.cleanup()
    179. pi.stop()
    复制代码
    你可以通过终端指令测试机器人的控制,例如让它向前行走可以用
    1. python hexapod.py m f
    复制代码
    当然正式使用是需要用手机控制的,在 Apache 上部署我写好了程序吧,访问我的 Github 获取。以下是WebUI的截图:
    如何操作
    • 找到树莓派的IP地址。
    • 用手机浏览器访问这个IP,例如192.168.1.90/hexapod
    • 使用WebUI操控机器人
    回复

    使用道具 举报

  • TA的每日心情
    萌哒
    2017-8-8 09:55
  • 2

    主题

    18

    帖子

    32

    积分

    新手上路

    Rank: 1

    积分
    32
     楼主| 发表于 2017-8-8 09:55:05 | 显示全部楼层
    就说一句,6不6
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-7-28 17:46
  • 2

    主题

    4

    帖子

    15

    积分

    新手上路

    Rank: 1

    积分
    15
    发表于 2017-8-8 10:43:35 | 显示全部楼层
    6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-8-8 10:44
  • 2

    主题

    46

    帖子

    81

    积分

    菜鸟程序猿

    Rank: 2

    积分
    81
    发表于 2017-8-8 10:44:15 | 显示全部楼层
    就说一句,很6
    回复

    使用道具 举报

    该用户从未签到

    18

    主题

    43

    帖子

    114

    积分

    新手上路

    Rank: 1

    积分
    114
    发表于 2017-8-8 10:46:44 | 显示全部楼层
    这咋走来着?
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    3

    积分

    新手上路

    Rank: 1

    积分
    3
    发表于 2017-8-21 21:46:24 | 显示全部楼层
    楼主牛哟,但要讲得更深入些,顶了。
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    43

    帖子

    46

    积分

    新手上路

    Rank: 1

    积分
    46
    发表于 2018-3-19 02:04:45 | 显示全部楼层
    分享了,好的,谢谢
    回复

    使用道具 举报

    *滑动验证:
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表