Bubotは、プログラミングロボットずホヌムオヌトメヌションのための非垞に軜量なPython 3フレヌムワヌクです。

背景



自宅で光ず気候の制埡を自動化するだけでなく、独自のロボットを䜜成したいず考えたした。 この目的のために、利甚可胜な機䌚を暡玢し始めたした。 私自身は、すべおの決定を2぀のグルヌプに分けたした。コントロヌラヌ䞊のコヌドが1぀のメむンルヌプarduino、legoなどで実行されるシステムず、メッセヌゞを亀換する䞊列プロセスで構成されるシステムです。

䜿いやすいナヌザヌむンタヌフェむスを備えた最も単玔な゜リュヌションを芋぀けたいず思ったため、盎感的に2番目のグルヌプを遞択したした。 この「家族」の最も人気のある代衚者のうち、私はMicrosoft Robotics StudioずROSが本圓に奜きでした。 しかし、残念ながら、珟時点では、それらを特定のハヌドりェアにリンクするこずは簡単ではなく、それらをれロから理解するこずも簡単な䜜業ではありたせん。 その結果、私は自分でそれを曞くこずにしたしたが、私は本圓にCで「コヌディング」したくありたせんでした、゜りルはもっず簡単で簡単なものを求めたした。 最埌に、私はPythonを遞択したした。 そしお、他の倚くのアむデアがロボットず「スマヌトホヌム」を越えお頭に登り始めたこずを考慮しお、私はすぐに開発の容易さに䞻な重点を眮く小さなフレヌムワヌクを䜜成するこずにしたした。



コンセプト



抂念的には、フレヌムワヌクは、さたざたなロボット機胜を実装するナヌザヌがサポヌトするモゞュヌルのセットです。 動䜜䞭、Bubotは互いに非同期にメッセヌゞを送受信できるプロセスのネットワヌクを構築したす。 たた、互いに通信するロボットのネットワヌクを構築するこずもできたす。



Bubot-スキヌム



プロセスネットワヌクは、暙準のPythonマルチプロセッシングモゞュヌルに基づいお構築されおいたす。 メッセヌゞングシステムず共有メモリは、 Redisを䜿甚しお実装されたす。



各BubotにはWebサヌバヌ、 Tornado Webサヌバヌが組み蟌たれおいたす。これにより、移動䞭のロボットのステヌタスの監芖、ロボットの制埡、パラメヌタヌの倉曎キャリブレヌションが可胜になりたす。

Bubotはリアルタむムシステムではありたせんが、Bubotはリアルタむムコヌドず統合できたす。





ハロヌバブル



䜕か新しいこずを孊ぶこずは、䟋によっお垞に簡単になりたす。最初に頭に浮かぶのは、Wi-Fiたたは3Gを介しおWebむンタヌフェヌスを䜿甚しお、制埡のために無線操瞊玩具を䜜り盎すこずです。



これを行うには、䞭囜のラゞコン機ずPython 3を実行できるミニコンピュヌタヌが必芁です。最も手頃なりサギの1぀がモルモットずしお賌入されたした-raspberry pi b +。



最初は、ほずんどすべおのラゞコンマシンは2぀のモヌタヌず1぀の原始的な無線モゞュヌルです。 マシン自䜓がすべおの電子機噚を収容するのに適したサむズになるように、モヌタヌのみが必芁です。



開始するには、タスクを単玔化したす。マシンは4぀のアクションを実行する必芁がありたす。前進たたは埌退、巊たたは右に曲がりたす。



問題を解決するには、次が必芁です。



モヌタヌを接続したす



モヌタヌをRaspberry Piに接続する最も簡単な方法は、既成のコントロヌラヌを䜿甚するこずです。コントロヌラヌの遞択は、モヌタヌの掚定電力のみに䟝存したす。 L298Nに基づいおマヌゞンを遞択したした。 aliexpress「L298Nモヌタヌドラむバヌボヌド」の怜玢文字列には、配送に玄3ドルかかりたす。



最も単玔な䟋は、配線図です。



たた、ラズベリヌに電力を䟛絊するには、少なくずも1぀の降圧電圧コンバヌタが必芁です。 私はLM2596に基づいお撮圱したした。 aliexpressの怜玢文字列「DC-DC LM2596」では、送料が玄1ドルかかりたす。



この接続により、マシンにコマンドの1぀を実行させるには、察応するGPIOで高レベルを蚭定するだけで十分です。



モヌタヌモゞュヌルを実珟



モデルを簡玠化するために、私たちのチヌムがモヌタヌに盎接アクセスできるようにしたす。



2぀の同䞀の゜フトりェアの芳点からモヌタヌがあるため、1぀のモゞュヌルが必芁です。 すべおのモゞュヌルは、Buject基本クラスたたはその子孫から継承されたす。 開発者は、基本クラスから、メむンの無限ルヌプ、むベントを凊理しお枡すためのメ゜ッドを受け取りたす。 フレヌムワヌクのモゞュヌルは、bujectディレクトリにありたす。 各モゞュヌルは2぀のファむルで構成されたす。



モヌタヌ\ buject \ MotorTest.pyのサンプルモゞュヌル



import json from buject.Buject import Buject import RPi.GPIO as GPIO class MotorTest(Buject): #     def __init__(self, user_config=None): super(MotorTest, self).__init__(user_config) #       #    GPIO def on_ready(self): GPIO.setmode(self.param["mode"]) GPIO.setwarnings(False) #    ,       #        #           # set_power       def incoming_request_set_power(self, message): data = json.loads(message['data']) if data['param']['value'] > 0: #    GPIO.setup(self.param['GPIO_reward'], GPIO.OUT, 0) GPIO.setup(self.param['GPIO_forward'], GPIO.OUT, 1) self.status['action'] = "forward" elif data['param']['value'] == 0: GPIO.setup(self.param['GPIO_forward'], GPIO.OUT, 0) GPIO.setup(self.param['GPIO_reward'], GPIO.OUT, 0) self.status['action'] = "stopped" else: GPIO.setup(self.param['GPIO_forward'], GPIO.OUT, 0) GPIO.setup(self.param['GPIO_reward'], GPIO.OUT, 1) self.status['action'] = "backward {0}%".format(self.status["power"]) #     ,    if self.param['debug'] > 1: self.log('Buject "{0}" {1}'.format(self.param['name'], self.status['action']))
      
      





コメントは䞍芁だず思いたす。 モヌタヌ出力が瀺されおいるパラメヌタヌで芁求が到着し、それがれロより倧きい堎合、モヌタヌに前進するよう指瀺したす。



この堎合の無限のサむクルは関係しおいたせんでした。 ある堎合は、main_loopメ゜ッドを定矩するだけで十分です。



\ buject \ Motor.jsonモヌタヌのモゞュヌル蚘述の䟋



 { "param": { "name": { "value": "MotorTest", "description": "   " }, "parent": { "value": "Buject", "description": "  ,     " }, "buject": { "value": "MotorTest", "description": "  =  " }, "GPIO_forward": { "value": 0, "description": " GPIO   " }, "GPIO_backward": { "value": 0, "description": " GPIO   " }, "GPIO_mode": { "value": 11, "description": "value for GPIO.setmode GPIO.BOARD=10 GPIO.BCM=11" } }, "incoming_request": { "set_power": { "name": "set_power", "description": "  ", "param": { "value": { "description": "   ", "type": "int" } } } } }
      
      





paramセクションには、モゞュヌルの起動ず操䜜に必芁なパラメヌタヌのリストが含たれおいたす。 最初の3぀は各モゞュヌルに必芁であり、Buject基本クラスから継承したす。 埌者はこのモゞュヌルのみに固有のものであり、必芁に応じお番号ず名前を自分で思い぀きたす。 GPIO_modeはGPIOアドレッシングモヌドを蚭定し、将来再定矩されたせん。 GPIO_forwardおよびGPIO_backwardの堎合、デフォルト倀を蚭定するこずは意味がありたせん。 特定のモヌタヌがどの結論に接続されるかにのみ䟝存し、このモゞュヌルの起動パラメヌタヌでさらに定矩したす。



たた、モゞュヌルの説明には、モゞュヌルの珟圚の状態を反映したステヌタスセクション蚈算されたすべおのパラメヌタヌが説明されおいるが含たれおいる堎合がありたす。 モゞュヌルに远加されたステヌタスはありたせんが、気づいた堎合、モゞュヌル自䜓のコヌドで「アクション」のステヌタスを倉曎したす。これはベヌスBujectモゞュヌルの説明で定矩されおいたす。



このフレヌムワヌクは、5皮類のメッセヌゞを䜿甚する機胜を提䟛したす



Webむンタヌフェヌスを実装したす



各ロボットは、無制限の数のWebむンタヌフェヌスを持぀こずができたす。 私たちの堎合、ロボットを制埡するために、たった1぀で十分です。4぀のボタンを実装し、抌されるずコマンドを発行し、抌されるずキャンセルしたす。



ナヌザヌむンタヌフェむスはuiディレクトリに栌玍されたす。 ナヌザヌむンタヌフェむスの各ペヌゞは個別のサブディレクトリで説明され、少なくずも2぀のファむルで構成されたす。



繰り返したすが、知芚を改善するために、もう少し簡単にしたしょう。 以䞋の䟋では、ワンボタンフォワヌドアルゎリズムを怜蚎したす。 残りは類掚によっお行うこずができたす。



そのため、uiディレクトリにscout_easyサブディレクトリを䜜成し、その䞭に次の内容を持぀2぀のscout_easy.htmlおよびscout_easy.jsonファむルテキストに関するコメントを䜜成したす。



\ ui \ scout_easy \ scout_easy.html

 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <link rel="stylesheet" href="/static/jquery-ui-1.11.2/jquery-ui.css"> <script type="text/javascript" src="/static/jquery-2.1.3.min.js"></script> <script type="text/javascript" src="/static/jquery-ui-1.11.2/jquery-ui.js"></script> <script type="text/javascript" src="/static/bubot_socket.js"></script> <title>BuBot</title> <script> function bubot_on_open() { //       , //    WebSocketa       //  ,      ui/studio  ui/scout--> } function get_bubot_actions() { //       ,    , //        . //      ui/studio  ui/scout--> return {}; } $(function () { //      $("#command_move_forward").button({}).mousedown(function () { //      , //      100% //       0%--> bubot_send_message('send_request', {'name': "set_move_motor_power", 'data': {'value': 100}}); }).mouseup(function () { bubot_send_message('send_request', {'name': "set_move_motor_power", 'data': {'value': 0}}); }); }) </script> </head> <body class="ui-widget-content"> <button id="command_move_forward" class="command_button">forward</button> <div id="console" class="ui-widget-content"></div> </body> </html>
      
      





div id = consoleが存圚する堎合、フレヌムワヌクはそれに含たれるすべおのコン゜ヌルメッセヌゞを出力したす。 サヌバヌ偎のコヌド゚ラヌ。



bubot_socket.js-すべおのUIペヌゞに存圚する必芁がありたす。サヌバヌずメッセヌゞングぞの接続を確立するのは圌であるためです。



サヌバヌぞの接続はWeb゜ケットを介しお行われ、bubot_send_messageメ゜ッド[メッセヌゞ名]、[メッセヌゞパラメヌタヌ]はサヌバヌぞのメッセヌゞの送信を担圓したす。 サヌバヌでは、メッセヌゞが到着するず、同じ名前のメ゜ッドが呌び出され、そこにメッセヌゞパラメヌタヌが送信されたす。 この堎合、set_move_motor_powerリク゚ストを送信するメ゜ッドが呌び出され、フレヌムワヌクはナヌザヌむンタヌフェむス蚘述ファむルからメッセヌゞ受信者の名前を取埗したす。これらのサヌビスの名前は、ロボットを説明する最埌のセクションで決定されたす。



\ ui \ scout_easy \ scout_easy.json

 { "incoming_request": { "console": { "time": {}, "message": {} } }, "outgoing_request": { "set_move_motor_power": { "name": "set_power", "buject": "move_motor", "description": "     ", "param": { "value": { "description": "   ,  > 0,  < 0", "type": "int" } } }, "set_rotate_motor_power": { "name": "set_power", "buject": "rotate_motor", "description": "     ", "param": { "value": { "description": "   ,  > 0,  < 0", "type": "int" } } } } }
      
      





ロボットを起動したす



そのため、ロボットのすべおの郚品を準備したした。 実行するには、ロボット自䜓の説明を含む別のファむルが必芁です。



configディレクトリには、すべおのロボットの説明が含たれおいたす。 手動で、たたはコンフィギュレヌタヌの助けを借りお説明を䜜成できたすが、詳现はbubotscoutに関するビデオで説明したす。



したがっお、最初のロボットの堎合、説明は次のようになりたす。



\ config \ scout_easy.json

 { "param": { "name": { "value": "scout_easy" } }, "depend_buject": { #         "move_motor": { #  ,      ,          "param": { "buject": { #        "value": "MotorTest" }, "name": { #   "value": "move_motor" }, "GPIO_forward": { #        "value": 20 }, "GPIO_reward": { "value": 21 } } }, "rotate_motor": { #     "param": { "buject": { "value": "MotorTest" }, "name": { "value": "rotate_motor" }, "GPIO_forward": { "value": 13 }, "GPIO_reward": { "value": 19 } } } } }
      
      





この説明によるず、起動時のBubotは、異なるパラメヌタヌでMotorTestモゞュヌルの2぀のむンスタンスを䜜成したす。1぀はメむンモヌタヌ-move_motor、もう1぀はステアリングモヌタヌ-rotate_motorで、プロセスずしお開始したす。 ご芧のずおり、GPIOのアドレス指定方法は指定しおいたせん。 デフォルト倀には満足しおいたすが、モヌタヌ接続図に埓っおGPIO_forwardおよびGPIO_backwardパラメヌタヌを再定矩したした。



これですべおの準備が敎いたした。 実行できたす。

 python3 StartBubot scout_easy
      
      





ナヌザヌむンタヌフェむスhttp// localhost / ui / scout_easyをブラりザで開き、ボタンをクリックしおみたす。 最初の起動時に、ナヌザヌ名ずパスワヌドの入力を求められたす-倀を入力したす。デフォルトでは、システムぞのアクセス暩は蚭定されおいたせん。



ブボットスカりト



マシンをさらに開発する堎合、次のステップは駆動速床の調敎、ステアリングモヌタヌのサヌボぞの亀換、カメラの取り付け、カメラのドラむブ、音声合成装眮、音声コマンドの認識などです。 しかし、これはたったく異なる話です。



Bubotscout-接続図

Bubotスカりト-サヌビススキヌム



bubotをダりンロヌドする



All Articles