[openrtm-users 01652] Re: NXTRTCについて

trhr1104 @ yahoo.co.jp trhr1104 @ yahoo.co.jp
2011年 3月 6日 (日) 01:58:10 JST


加藤です。
   
  以前栗原様に教えていただいたNXTRTCのモータCを動かすプログラムについて質問があります。
   
  添付していただいたNXTRTCのプログラムですが、
  新しくInPortに 50 というデータが届いた場合、モータCが50の速度で動く。
   
  という解釈で合っていますでしょうか?
   
  お時間頂けたらご教授お願いします。

kurihara shinji <shinji.kurihara @ aist.go.jp> wrote:
  加藤様

栗原です。

> 繋いだ先のNXT自体に別のプログラムを実行させておくことはできますでしょうか?
「別のプログラムを実行させておく」がどのような方法(別スレッド?)で実行されている
のかはわかりませんが、別のモータを制御する事は可能です。

NXTRTC.pyの"def onExecute(self,ec_idl):"内にあります以下の行
vel_[self._mapping[self._map[0][0]]] = self._d_vel.data[0]
vel_[self._mapping[self._map[0][1]]] = self._d_vel.data[1]
を、以下のようにして頂くことで、NXTのCのポートに接続されている
モータを動かす事ができます。
vel_[0] = self._d_vel.data[0]
vel_[1] = self._d_vel.data[1]
vel_[2] = self._d_vel.data[1] # ここに”別のモータ”の速度を入力する。

”別のモータ”の速度を独自に変更したい場合は、速度を計算した
結果を"vel_[2] = "の行のself._d_vel.data[1]のところと置き
換えてみて下さい。

ちなみに、上記のように変更した場合、InPortに新しいデータが
届いた時のみモータが動きます。

上記の変更を行ったNXTRTC.pyを添付させて頂いております。


以上、宜しくお願い致します。



On Thu, 3 Mar 2011 14:16:26 +0900 (JST)
wrote:

> 専門学校生 加藤です。
> 
> パソコンからNXTRTCに繋ぎ制御することができました。
> ありがとうございました。
> 
> 一つ質問があります。
> 繋いだ先のNXT自体に別のプログラムを実行させておくことはできますでしょうか?
> 一度やってみたのですがエラーが発生してしまいました。
> 
> パソコンからモータA,Bを動かすプログラムを送信し、NXT側でモータA,Bが動いたときに別のモータを動かす。
> 
> のような動作をさせたいです。
> 可能でしょうか?
> 
> お時間頂けたらご教授お願いします。
> 
> 


-- 
----------
栗原 眞二 

独立行政法人産業技術総合研究所
知能システム研究部門 統合知能研究グループ
〒305-8568
茨城県つくば市梅園1-1-1 中央第2

TEL: 029-861-5956
#!/usr/bin/env python
# -*- coding:shift_jis -*-
# -*- Python -*-

import sys
import time
sys.path.append(".")

# Import RTM module
import OpenRTM
import RTC


# import NXTBrick class
import NXTBrick


# This module's spesification
# 
nxtrtc_spec = ["implementation_id", "NXTRTC", 
"type_name", "NXTRTC", 
"description", "NXT sample component", 
"version", "0.1", 
"vendor", "AIST", 
"category", "example", 
"activity_type", "DataFlowComponent", 
"max_instance", "10", 
"language", "Python", 
"lang_type", "SCRIPT",
"conf.default.map", "A,B",
""]

# 

class NXTRTC(OpenRTM.DataFlowComponentBase):
def __init__(self, manager):
OpenRTM.DataFlowComponentBase.__init__(self, manager)

# DataPorts initialization
# 
self._d_vel = RTC.TimedFloatSeq(RTC.Time(0,0),[])
self._velIn = OpenRTM.InPort("vel", self._d_vel,
OpenRTM.RingBuffer(8))
self.registerInPort("vel",self._velIn)
self._d_pos = RTC.TimedFloatSeq(RTC.Time(0,0),[])
self._posOut = OpenRTM.OutPort("pos", self._d_pos,
OpenRTM.RingBuffer(8))
self.registerOutPort("pos",self._posOut)
self._d_sens = RTC.TimedFloatSeq(RTC.Time(0,0),[])
self._sensOut = OpenRTM.OutPort("sens", self._d_sens,
OpenRTM.RingBuffer(8))
self.registerOutPort("sens",self._sensOut)

# initialize of configuration-data.
# 
self._map = [['A', 'B']]
self._nxtbrick = None
self._mapping = {'A':0,'B':1,'C':2}

def onInitialize(self):
# Bind variables and configuration variable
# 
self.bindParameter("map", self._map, "A,B")

# create NXTBrick object
try:
print "Connecting to NXT brick ...."
self._nxtbrick = NXTBrick.NXTBrick()
print "Connection established."
except:
print "NXTBrick connection failed."
return RTC.RTC_ERROR

return RTC.RTC_OK

def onFinalize(self):
self._nxtbrick.close()

def onActivated(self, ec_id):
self._nxtbrick.setMotors([0,0,0])
# reset NXTBrick's position.
self._nxtbrick.resetPosition()
return RTC.RTC_OK

def onDeactivated(self, ec_id):
self._nxtbrick.setMotors([0,0,0])
# reset NXTBrick's position.
self._nxtbrick.resetPosition()

return RTC.RTC_OK

def onExecute(self, ec_id):
# check new data.
if self._velIn.isNew():
# read velocity data from inport.
self._d_vel = self._velIn.read()
vel_ = [0,0,0]
#vel_[self._mapping[self._map[0][0]]] = self._d_vel.data[0]
#vel_[self._mapping[self._map[0][1]]] = self._d_vel.data[1]
vel_[0] = self._d_vel.data[0]
vel_[1] = self._d_vel.data[1]
vel_[2] = self._d_vel.data[1]
# set velocity
self._nxtbrick.setMotors(vel_)

# get sensor data.
sensor_ = self._nxtbrick.getSensors()
if sensor_:
self._d_sens.data = sensor_
# write sensor data to outport.
self._sensOut.write()

# get position data.
position_ = self._nxtbrick.getMotors()
if position_:
self._d_pos.data = \
[position_[self._mapping[self._map[0][0]]][9], \
position_[self._mapping[self._map[0][1]]][9]]
# write position data to outport.
self._posOut.write()

return RTC.RTC_OK



def MyModuleInit(manager):
profile = OpenRTM.Properties(defaults_str=nxtrtc_spec)
manager.registerFactory(profile,
NXTRTC,
OpenRTM.Delete)

# Create a component
comp = manager.createComponent("NXTRTC")



def main():
mgr = OpenRTM.Manager.init(len(sys.argv), sys.argv)
#mgr = OpenRTM.Manager.init(sys.argv)
mgr.setModuleInitProc(MyModuleInit)
mgr.activateManager()
mgr.runManager()

if __name__ == "__main__":
main()



 
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://www.openrtm.org/pipermail/openrtm-users/attachments/20110306/f1de8c6b/attachment-0001.html>


openrtm-users メーリングリストの案内