サーボモーターの動きでロボットの喜怒哀楽を表現
pythonの「pigpioライブラリ」で、汎用のSERVO(サーボモーター)制御関数を作成した。
サーボモーターを制御する関数で、
(1)モード0:大きく動く【喜怒を表現】
(2)モード1:小さく動く【哀楽を表現】]
の2つのモードを利用できる。
パラメーター:
md: モード[0:大きく動く【喜怒を表現】、1:小さく動く【哀楽を表現】]
acw:反時計回り角度(0~-90°)
cw:時計回り角度(0~90°)
pw:パルス幅(動き幅:0.1以下)
cst:停止時間(秒)
pin:GPIOピン番号(0~31)
ロボットの性別、喜怒哀楽をサーボモーターの動きで表現するための関数で、パラメーターを細かく設定することで、ロボットの表情(喜怒哀楽)を表現することができる。
例えば、
(1)普通の表情
(2)嬉しい表情
(3)寂しい表情
(4)怒った表情
をこのサーボモーター制御関数のパラメーターを設定して表現する。
この関数は、複数のロボットが会話する時に各々のロボットの表情を制御できる。
サーボモーターの他に、pigpioライブラリでLEDの制御を細かくすることでロボットの表情(喜怒哀楽)を変えることができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
#!/usr/bin/env python # -*- coding: utf-8 -*- import pigpio from time import sleep import sys import threading # SERVOを駆動 class ServoThread(threading.Thread): # スレッドを立ち上げてサーボを駆動 def __init__(self,md,acw,cw,pw,cst,pin): super(ServoThread, self).__init__() self.md = md # モード[0:大きく動く【喜怒を表現】、1:小さく動く【哀楽を表現】] self.acw = acw # 反時計回り角度 self.cw = cw # 時計回り角度 self.pw = pw # パルス幅(動き幅) self.cst = cst # 停止時間 self.pin = pin # GPIOピン番号 self.stop_event = threading.Event() self.setDaemon(True) def stop(self): self.stop_event.set() def run(self): minpw = 600 # 最大反時計回りパルス値 center = 1500 # 中央位置のパルス幅 maxpw = 2400 # 最大時計回りパルス幅 off = 0 # 停止パルス幅 if self.md == 0: # モード0:大きく動く【喜怒を表現】 if not(0 >= self.acw >= -90): # 最大−90度まで指定可能 print('self.acw---設定エラー') return False if not(0 <= self.cw <=90): # 最大90度まで指定可能 print('self.cw---設定エラー') return False if not(0 <= self.pin <= 31): # 許容GPIOピン(0の場合は、何もしない) print('self.pin---設定エラー') return False pac = center - (center - minpw) * -self.acw / 90 # 反時計回り角度をパルス幅に置換 pc = center + (maxpw - center) * self.cw / 90 # 時計回り角度をパルス幅に置換 pi = pigpio.pi() while not self.stop_event.is_set(): pi.set_servo_pulsewidth(self.pin, pac) # 反時計回りに動く if self.cst != 0: sleep(self.cst) pi.set_servo_pulsewidth(self.pin, center) # 中央位置 if self.cst != 0: sleep(self.cst) pi.set_servo_pulsewidth(self.pin, pc) # 時計回りに動く if self.cst != 0: sleep(self.cst) pi.set_servo_pulsewidth(self.pin, center) # 中央位置 if self.cst != 0: sleep(self.cst) pi.set_servo_pulsewidth(self.self.pin, off) # 停止 pi.stop() # リソース開放 sys.exit() elif self.md == 1: # モード1:小さく動く【哀楽を表現】 if not(0 >= self.acw >= -90): # 最大−90度まで指定可能 print('self.acw---設定エラー') return False if not(0 <= self.cw <=90): # 最大90度まで指定可能 print('self.cw---設定エラー') return False if 0.1 < self.pw: # パルス幅(動き幅)を制限する print('self.pw---設定エラー') return False if not(0 <= self.pin <= 31): # 許容GPIOピン(0の場合は、何もしない) print('self.pin---設定エラー') return False pac = center - (center - minpw) * -self.acw / 90 # 反時計回り角度をパルス幅に置換 pc = center + (maxpw - center) * self.cw / 90 # 時計回り角度をパルス幅に置換 pi = pigpio.pi() d = center if (pac < pc) and (pc == 1500): self.pw = -self.pw while not self.stop_event.is_set(): pi.set_servo_pulsewidth(self.pin, d) d += self.pw if d >= pc or d <= pac: self.pw *= -1 pi.set_servo_pulsewidth(self.pin, off) # 停止 pi.stop() # リソース開放 sys.exit() else: pass if __name__ == '__main__': Servo = ServoThread(md=0,acw=-15,cw=15,pw=0.02,pin=17,cst=0.6) # サーボ駆動スレッドインスタンス Servo.start() # サーボ駆動開始 sleep(5) # ロボットの何らかの動作。例えば、「会話」中にサーボで動きを表現する。 Servo.stop() # サーボ駆動停止 sys.exit() |
群馬プログラミングカレッジでは、複数ロボットの会話システムを開発しています。
用途は、
複数のロボットで色々な案内をする
芸術作品の案内
観光地の案内
お店の案内
など様々な案内を複数のロボットが行います。
ロボットは会話に応じて喜怒哀楽の表現をします。