NXT Python Facade 클래스

NXT Python Facade 클래스

NXT Python 자체는 NXT 인텔리전트 블록의 거의 모든 기능을 사용할 수 있습니다만, 그러한 기능 모든 것을 직접 사용하는 것은 번잡하기 때문에 사용하고 싶은 기능만을 인터페이스 하는 Facade 클래스를 만듭니다.

NXT의 주된 기능을 열거합니다.

  • 입력
    • 모터 속도값을 준다
    • 사운드의 음정값을 준다
    • 액정 표시에 출력하는 메세지를 준다
  • 출력
    • 모터 엔코더값을 읽는다
    • 센서값(사운드, 초음파, 터치, 빛)을 읽는다
    • 시스템 정보를 읽는다
  • 그 외
    • NXT의 검색
    • NXT에의 접속
    • NXT의 파일의 읽고 쓰기
    • 펌웨어(firmware)의 읽고 쓰기

이것들 모든 것을 한 번에 서포트하는 클래스를 만드는 것은 Facade 클래스를 만드는 의미가 없어져 버립니다. 필요한 기능이 나오면 그때 그때 Facade 클래스를 갱신하면 좋습니다. 따라서, 여기서 작성하는 Facade 클래스에서는 이번에 작성하는 로봇에 맞추어 이하의 기능만을 지원하기로 하겠습니다.

  • 입력
    • 모터 속도치값을 준다: setMotors()
  • 출력
    • 모터 엔코더값을 읽는다: getMotors()
    • 센서값(사운드, 초음파, 터치, 빛)을 읽는다: getSensors()

함수명은 대체로 이미지입니다. 이 생각으로 작성한 클래스(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 클래스가 생겼습니다. 매우 간단한 클래스입니다만, 모터에 속도를 주고 포지션을 읽어 센서의 값을 읽을 수 있는 클래스가 생겼습니다. 처음터 뭐든지 할 수 있도록 하려고 하면, 결국 무엇을 하기 위한 클래스인가 잘 모르는 클래스가 생기게 됩니다. 버전 업은 언제라도 할 수 있으므로, 우선은 최저한의 기능에서도 제대로 움직이는 클래스를 만드는 것이 중요합니다.

ダウンロード

最新バージョン : 2.1.0-RELESE

統計

Webサイト統計
ユーザ数:3399
プロジェクト統計
RTコンポーネント309
RTミドルウエア35
ツール25
文書・仕様書2

OpenRTM@Github

OpenRTM-aist GitHubサイト

ROS

Robot Operating System

Choreonoid

モーションエディタ/シミュレータ

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク

産総研が提供するRTC集

東京オープンソースロボティクス協会