articles:nextage_rtm

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
articles:nextage_rtm [2021/08/30 11:34] – [hrpsys_config] Takashi Suehiroarticles:nextage_rtm [2021/09/22 11:16] (現在) – [init1] Takashi Suehiro
行 36: 行 36:
 いずれにしてもnextage_ros_brigeに関するまとまった情報がないので,ソースコードおよび利用手順を追いかけて いずれにしてもnextage_ros_brigeに関するまとまった情報がないので,ソースコードおよび利用手順を追いかけて
 解析していく必要がある. 解析していく必要がある.
 +
 +==== プログラムの構造上の問題点 ====
 +
 +基本的な継承関係は以下のようになっている((HrpsysCofgigurator2は省略)).
 +  * HrpsysCofgigurator (hrpsys_config.py)
 +  * HIRONX(HrpsysCofgigurator) (hiro_client.py)
 +  * NextageClient(HIRONX) (nextage_clinet.py)
 +
 +クラスとしてはHrpsysCofgiguratorがスーパークラスでその下がサブクラスである.
 +
 +問題は,HrpsysCofgiguratorがヒューマノイドロボットを含む多数のロボットの機能(メソッド)をいろいろ含んでいて,
 +サブクラスではそのサブセットの機能を使う構造になっているという点である.
 +
 +**サブクラスなのだから機能もそのサブセットで良いと思ったとしたら大間違い.オブジェクト指向を理解していないと言える.
 +((スーパークラスはサブクラスの「汎化」であって,その機能はサブクラスの機能の共通部分を抽象化したものになっていなくてはならない.))
 +**
 +
 +そのためプログラムを追うことがとても難しくなっている.下から順に上に追っていくに従って,
 +どれを読まなくても良いのかよくわからない状態で読まなくても良い他のロボット用のプログラムを読まされることになる.
 +
 +とても困ったものである.
  
 ==== nextage.py ==== ==== nextage.py ====
行 130: 行 151:
 データの部分書き換えなどの整合性をとっている. データの部分書き換えなどの整合性をとっている.
  
-__init__関数ではgazeboシミュレータの利用をチェックしている.gazeboを使わない場合はHIRONXの__init__を呼び出す.+%%__init__関数%%ではgazeboシミュレータの利用をチェックしている.gazeboを使わない場合はHIRONXの%%__init__%%を呼び出す.
  
 gazeboを使う方の処理は今回は無視する. gazeboを使う方の処理は今回は無視する.
行 573: 行 594:
   * connectLoggerPort   * connectLoggerPort
   * setupLogger   * setupLogger
 +  * goActual
 +  * setJointAngle
 +  * setJointAngles
 +  * setJointAnglesOfGroup
 +  * setJointAnglesSequence
 +  * setJointAnglesSequenceOfGroup
 +  * waitInterpolation
 +  * waitInterpolationOfGroup
 +  * setInterpolationMode
 +  * getJointAngles
 +  * getCurrentPose
 +  * getCurrentPosition
 +  * getCurrentRotation
 +  * getCurrentRPY
 +  * getReferencePose
 +  * getReferencePosition
 +  * getReferenceRotation
 +  * getReferenceRPY
 +  * setTargetPose
 +  * setTargetPoseRelative
 +  * clear
 +  * clearOfGroup
 +  * saveLog
 +  * clearLog
 +  * setMaxLogLength
 +  * getActualState
 +  * flat2Groups
 +
 +上書きされているもの
 +  * init
 +  * getRTCList
   * setSelfGroups   * setSelfGroups
 +  * isCalibDone
 +  * isServoOn
 +  * servoOn
 +  * servoOff
 +  * checkEncoders
  
  
行 626: 行 683:
         self.configurator_name = cname         self.configurator_name = cname
 </code> </code>
 +=== waitForRTCManager ===
 +<code python>
 +    def waitForRTCManager(self, managerhost=nshost):
 +        '''!@brief
 +        Wait for RTC manager.
 +
 +        @param managerhost str: name of host computer that manager is running
 +        '''
 +        self.ms = None
 +        while self.ms == None:
 +            time.sleep(1)
 +            if managerhost == "localhost":
 +                managerhost = socket.gethostname()
 +            self.ms = rtm.findRTCmanager(managerhost)
 +            print(self.configurator_name + "wait for RTCmanager : " + str(managerhost))
 +</code>
 +=== waitForRobotHardware ===
 +<code python>
 +    def waitForRobotHardware(self, robotname="Robot"):
 +        '''!@brief
 +        Wait for RobotHardware is exists and activated.
 +
 +        @param robotname str: name of RobotHardware component.
 +        '''
 +        self.rh = None
 +        timeout_count = 0
 +        # wait for simulator or RobotHardware setup which sometime takes a long time
 +        while self.rh == None and timeout_count < 10:  # <- time out limit
 +            if timeout_count > 0: # do not sleep initial loop
 +                time.sleep(1);
 +            self.rh = rtm.findRTC("RobotHardware0")
 +            if not self.rh:
 +                self.rh = rtm.findRTC(robotname)
 +            print(self.configurator_name + "wait for %s : %s ( timeout %d < 10)" % ( robotname, self.rh, timeout_count))
 +            if self.rh and self.rh.isActive() == None:  # just in case rh is not ready...
 +                self.rh = None
 +            timeout_count += 1
 +        if not self.rh:
 +            print(self.configurator_name + "Could not find " + robotname)
 +            if self.ms:
 +                print(self.configurator_name + "Candidates are .... " + str([x.name()  for x in self.ms.get_components()]))
 +            print(self.configurator_name + "Exitting.... " + robotname)
 +            exit(1)
 +
 +        print(self.configurator_name + "findComps -> %s : %s isActive? = %s " % (self.rh.name(), self.rh,  self.rh.isActive()))
 +
 +</code>
 +
 +=== getJointAngleControllerList ===
 +<code python>
 +    def getJointAngleControllerList(self):
 +        '''!@brief
 +        Get list of controller list that need to control joint angles
 +        '''
 +        controller_list = [self.es, self.ic, self.gc, self.abc, self.st, self.co,
 +                           self.tc, self.hes, self.el]
 +        return filter(lambda c: c != None, controller_list)  # only return existing controllers
 +</code>
 +==== rtm ====
 +=== findRTCManager ===
 +=== findRTC ===
 +
 +
  
 ===== nextage_handleに必要な情報 ===== ===== nextage_handleに必要な情報 =====
行 947: 行 1067:
             self.log.start(self.log.owned_ecs[0])             self.log.start(self.log.owned_ecs[0])
 </code> </code>
 +==== キャリブレーション ====
 +キャリブレションの実施確認
 +
 +hiro_handle:なし
 +
 +nextage:
 +
 +
 +==== 動作 ====
 +
  • articles/nextage_rtm.1630290893.txt.gz
  • 最終更新: 2021/08/30 11:34
  • by Takashi Suehiro