ダウンロード
最新バージョン : 2.1.0-RELESE
| 2.1.0-RELESE | ダウンロードページ |
OpenRTM@Github
OpenRTM-aist GitHubサイト
ROS
Robot Operating System
Choreonoid
モーションエディタ/シミュレータ
DAQ-Middleware
ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク
産総研が提供するRTC集
東京オープンソースロボティクス協会
| 2.1.0-RELESE | ダウンロードページ |
OpenRTM-aist GitHubサイト
Robot Operating System
モーションエディタ/シミュレータ
ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク
産総研が提供するRTC集
東京オープンソースロボティクス協会
NXT Python Facade 클래스
NXT Python 자체는 NXT 인텔리전트 블록의 거의 모든 기능을 사용할 수 있습니다만, 그러한 기능 모든 것을 직접 사용하는 것은 번잡하기 때문에 사용하고 싶은 기능만을 인터페이스 하는 Facade 클래스를 만듭니다.
NXT의 주된 기능을 열거합니다.
이것들 모든 것을 한 번에 서포트하는 클래스를 만드는 것은 Facade 클래스를 만드는 의미가 없어져 버립니다. 필요한 기능이 나오면 그때 그때 Facade 클래스를 갱신하면 좋습니다. 따라서, 여기서 작성하는 Facade 클래스에서는 이번에 작성하는 로봇에 맞추어 이하의 기능만을 지원하기로 하겠습니다.
함수명은 대체로 이미지입니다. 이 생각으로 작성한 클래스(NXTBrick.py)를 이하에 나타냅니다.
#!/usr/bin/env python # @file NXTBrick.py # -*- coding:shift_jis -*- import nxt.locator from nxt.sensor import * from nxt.motor import * class NXTBrick: def __init__(self, bsock=None): """ 생성자 NXT 블록에의 연결을 실시해 모터나 센서 오브젝트를 작성한다. 모터의 엔코더의 리셋을 실시한다. """ if bsock: self.sock = bsock else: self.sock = nxt.locator.find_one_brick().connect() self.motors = [Motor(self.sock, PORT_A), Motor(self.sock, PORT_B), Motor(self.sock, PORT_C)] self.sensors = [TouchSensor(self.sock, PORT_1), SoundSensor(self.sock, PORT_2), LightSensor(self.sock, PORT_3), UltrasonicSensor(self.sock, PORT_4)] self.resetPosition() def close(self): """ NXT 블록과의 접속을 종료한다 """ self.sock.close() def resetPosition(self, relative = 0): """ NXT의 모터의 엔코더를 리셋한다 """ for m in self.motors: m.reset_position(relative) def setMotors(self, vels): """ 배열을 받아, 모터의 파워로서 세트 한다. vels의 수와 모터의 수가 일치하지 않는 경우, 양자의 요소수 중 작은 분으로 루프를 돌린다. """ for i, v in enumerate(vels[:min(len(vels),len(self.motors))]): self.motors[i].power = max(min(v,127),-127) self.motors[i].mode = MODE_MOTOR_ON | MODE_REGULATED self.motors[i].regulation_mode = REGULATION_MOTOR_SYNC self.motors[i].run_state = RUN_STATE_RUNNING self.motors[i].tacho_limit = 0 self.motors[i].set_output_state() def getMotors(self): """ 모터의 위치(각도)를 취득한다 """ state = [] for m in self.motors: state.append(m.get_output_state()) return state def getSensors(self): """ 센서의 값을 취득한다. 받았던 데이터는 배열로 반환한다. """ state = [] for s in self.sensors: state.append(s.get_sample()) return state """ 테스트 프로그램 모터에 적당한 출력을 주고 각도를 읽어 표시한다. 센서로부터 값을 읽어들여 표시한다. """ if __name__ == "__main__": import time nxt = NXTBrick() print "connected" # 모터의 테스트 for i in range(100): nxt.setMotors([80,-80,80]) print "Motor: " mstat = nxt.getMotors() for i, m in enumerate(mstat): print "(" , i, "): ", m time.sleep(0.1) nxt.setMotors([0,0,0]) # 센서의 테스트 for i in range(100): sensors = ["Touch", "Sound", "Light", "USonic"] sval = nxt.getSensors() for s in sensors: print s + ": " + sval print "" time.speel(0.1) 마지막 if name == "main":로부터 시작되는 부분은 테스트 프로그램입니다. 이 모듈을 단체(単体)로 움직였을 때에 실행됩니다. 우선은, 이 모듈이 완전하게 움직일 때까지 테스트를 하는 것이 중요합니다.
이상으로, NXT의 Facade 클래스가 생겼습니다. 매우 간단한 클래스입니다만, 모터에 속도를 주고 포지션을 읽어 센서의 값을 읽을 수 있는 클래스가 생겼습니다. 처음터 뭐든지 할 수 있도록 하려고 하면, 결국 무엇을 하기 위한 클래스인가 잘 모르는 클래스가 생기게 됩니다. 버전 업은 언제라도 할 수 있으므로, 우선은 최저한의 기능에서도 제대로 움직이는 클래스를 만드는 것이 중요합니다.