이상으로 PC에서 Python을 사용해 NXT를 제어할 준비가 갖추어졌습니다.
RtcTemplate등을 사용하고, NXT의 컴퍼넌트의 양식을 생성하고 코딩을 하고 싶을 단계입니다. NXT Python는 깔끔하게 정리되어 있는 Python 모듈입니다만, NXT Python의 코드를 직접 RTC의 모형에 코딩하는 것은 조금 기다려 주십시오.
샘플을 봐도 알 수 있듯이 NXT Python는 로케이터, 모터, 센서 등의 복수의 모듈로 구성되어 있고 모터나 센서에의 섬세한 기능도 제어할 수 있기 때문에 액세스 방법도 약간 번잡합니다.
여기에서는 NXT Python의 복수의 모듈을 정리해 하나의 인터페이스로 액세스하기 위한 클래스를 만들기로 하겠습니다. 이것은 소프트웨어 패턴으로 Facade 패턴입니다.
Facade 패턴이란, GoF(Gang of Four; 4명의 갱들)에 의해서 정의된 컴퓨터 소프트웨어의 디자인 패턴의 하나이다. Facade라는 것은 「창구」를 의미한다. 관련하는 클래스군을 사용하기 위한 수속을 창구가 되는 하나의 클래스에 집약하는 것으로, 프로그램의 장황성을 없애는 것을 목적으로 한다.(출처: 프리 백과사전 「위키피디아(Wikipedia)」Facade 패턴)
이러한 클래스를 작성하면 이하의 이점이 있습니다.
이것은 RTC를 작성할 때 전반적으로 말할 수 있는 것입니다. 대상 로봇이나 디바이스 등을 적절히 클래스화하는 것으로 디바이스의 변경이나, RTC 자체의 변경·버전 업에도 유연하게 대응할 수 있어 변경에 강한 소프트웨어를 만들 수 있습니다.
절대로, onExecute()등에서
ioctl(xxxx, xxxx); // UNIX 디바이스에의 직접 액세스 inb(xxx); // I/O 에의 직접 액세스 outb(xxx); // I/O 에의 직접 액세스
와 같은 프리미티브 함수 호출을 해서는 안됩니다. 이상적으로는,
onExecute(ec_id) { // 유사 코드 if (m_inport.isNew()) { retval = m_myrobot.set_actuator(m_inport.read()); if (retval == fatal_error) return RTC::RTC_ERROR; } if (myrobot.get_sensor(sensor_data) == true) { m_outport.wrtie(sensor_data); } else { // read error의 경우 처리 if (fatal_error) return RTC::RTC_ERROR; } return RTC::RTC_OK; }
와 같이, 「InPort에서 값을 읽어 처리」하는 함수의 호출과 「어떠한 처리에 의해 값을 취득해 OutPort로 출력」하는 함수의 호출만으로부터 되는, 「추상 레벨이 높은」코드로 해야 합니다.