トップ » 技術記事 » レゴマインドストームNXTをPythonから操作するNXT_Pythonを使ってみる(1) - とりあえず走らせてみよう

レゴマインドストームNXTをPythonから操作するNXT_Pythonを使ってみる(1) - とりあえず走らせてみよう

タグ: Lego Mindstorms Python

どうも、あかさたです。八角研究所内の勉強会でレゴマインドストームNXTを使ってみようという話が出ています。そこで、勉強会に先立って制御プログラムを書く方法を紹介する記事を書いてみることにしました。勉強会ではJavaかCを使うという話なので、同じ言語では学習の効果が薄くなってしまうので、本連載では敢えてPythonでNXTを制御してみたいと思います。

レゴマインドストームとは?

レゴマインドストームとは、レゴ社がMITと共同開発したレゴでロボットを組み立てるための製品シリーズです。最初に発表されたRCXは1998年、現在の最新版であるNXTは2006年に販売開始されました。RCXとNXTはいずれもマイクロプロセッサが組み込まれた「ブロック」です。RCXとNXTにプログラムを転送することで、自立的に動作するロボットをレゴで作ることができます。

ハードとソフトの楽しさが一つになっている本シリーズは、玩具用としてだけではなく教育用としても高い注目を集めています。

※ さらにユニークというか、レゴらしいことに、ブロック型を組み立てるように制御プログラムを記述できるビジュアル型言語も提供されます。

私は2004年に、RCXにソースコードを転送して制御ソフトウェアとその設計を競争する「ETロボコン(当時UMLロボコン)」に参加していたこともあり、(元々レゴ好きというのもありますが)このシリーズにはかなりの思い入れがあります。当時、私はC++で書いた制御プログラムをRCXに転送して制御していました。

少し脱線しますが、今のNXTではRCXと比べるとブロックや板状のパーツより、骨組みのようなパーツが主体になっているようです。(あくまで個人的な印象です。)元々、こういうテクニカルなシリーズは、ブロックより骨組み的なパーツが増える傾向があるのですが、ブロック主体の方が「組み立てる楽しみがあるのに」と思わなくもありません。もっとも、以前、ブロック主体でマインドストームRCX(古いマインドストーム)を組み立てたら、ブロックの接着力が弱くて、少し動かすと簡単に崩れて困ったことはあるので、その辺が理由かも知れません。

NXT_Pythonとは?

NXT_Python はレゴマインドストームNXTをPythonで制御するためのライブラリです。マインドストームを制御する方法は、コードを転送して自走させる「転送」方式と、通信で遠隔操作する「通信」方式があります。必然、前者はNXTの限られたリソースの上で動作させなくてはならないため、組み込み的なプログラムになります。このライブラリは後者の通信方式でNXTを制御するためのものです。

NXT_Pythonのインストール

早速ライブラリをインストールしてみることにしましょう。NXT_Pythonに必要となるのは以下のパッケージです。動作確認はUACを無効にしたWindows Vista SP1で行いました。

Python 2.5.2はWindowsインストーラがあるので、それをインストールしてください。2.4系のインストーラもありますが、本記事では動作確認をしていません。PyBluezとPyUSBにはWindowsインストーラが存在します。Bluetoothを使う場合はPyBluezを、USBを使う場合はPyUSBをインストールしてください。

本記事ではBluetoothを使用しています。NXTとBluetoothは製品によっては相性問題が発生する場合があるため、ネット上で動作する製品とOSの組み合わせなどを調べてから環境を準備すると良いでしょう。

PyUSBの動作には libusb-win32 が必要です。Windowsインストーラがあるので、それを使ってインストールしてください。ただし、執筆時点(2008年7月現在)のWindows Vistaには対応していません。インストールすると最悪OSが起動しなくなることもあるので注意してください。

NXT_Python(執筆時点の最新版は0.7)は、zipもしくはtarballをダウンロードして解凍してから、コマンドプロンプトから「python setup.py install」を実行すればインストールを行うことができます。(Pythonでは定番ですね。)

とりあえず走らせてみよう

レゴと言えばブロックの組み立てが楽しみなのですが、NXTに最初から車の組み立て説明書が付属しているので、本記事ではそれを使いたいと思います。基本的にこの車は、二つのモータを同じ方向に動かすと前進後進になり、逆回転をさせるとスピンになり、片方を止めて片方を動かすとその方向に曲がるという動作をします。

とりあえず何も考えずにただ走るプログラムを掲載しましょう。プログラムを実行するには、NXT の電源を入れて、Bluetooth を待ち受けるモード(デフォルトでは待ち受けない)にしてください。

import nxt.locator
from nxt.motor import *

def go_forward(b):
	m_left = Motor(b, PORT_B)
	m_left.power = 70
	m_left.mode = MODE_MOTOR_ON
	m_left.run_state = RUN_STATE_RUNNING
	m_left.tacho_limit = 3000
	m_left.set_output_state()
	m_right = Motor(b, PORT_C)
	m_right.power = 70
	m_right.mode = MODE_MOTOR_ON
	m_right.run_state = RUN_STATE_RUNNING
	m_right.tacho_limit = 3000
	m_right.set_output_state()

sock = nxt.locator.find_one_brick()
if sock:
	go_forward(sock.connect())
	sock.close()
else:
	print 'No NXT bricks found'

大きく見ると、(1) NXTの検出(nxt.locator.find_one_brick())を行い、(2) NXTに接続(sock.connect())し、(3) モータを生成(go_forward())して、(4) 接続を閉じる(sock.close())という手順を実行しています。

go_forwardメソッドの説明をしましょう。モータの制御は (1) モータを生成し、(2) 出力(power)を設定し、(3) モータをオン(MODE_MOTOR_ON)にし、(4) モータを回転状態(RUN_STATE_RUNNING)にし、(5) 回転角の制限(tacho_limit)を設定し、(6) 設定の反映(set_output_state())という手順を実行しています。

tacho_limitについて補足すると、これを設定しないとモータが延々と回り続けてしまうため、回転角度がこの数値内になるように設定しています。もちろん、実際に走行する際には回転角度によるモータの制御は現実的ではない(精度が良いわけではないし、時間やセンサーの入力で制御する方が適切という意味です)ので、注意してください。

まとめ

以上、PythonからレゴマインドストームNXTを制御するNXT_Python でした。実質通信プログラムということもあって、若干の癖はあるもののスクリプト言語から手軽にレゴを制御できるというのはわくわくしますね。

今回はモータを制御するだけでしたが、次回はセンサーと組み合わせてもう少し複雑な制御をする例を紹介します。それでは!

Series Navigationライントレーサを開発する»

執筆者紹介

あかさた

あかさた

未踏(2006年度下期)でWeb上で動作するモデリング環境 Kodougu の開発をしてました。こちらでもブログを書いています。

TrackBack URL :