[openrtm-users 00036] Re: HelloRTWorldについて&デバイスとの通信について

Noriaki Ando n-ando @ aist.go.jp
2005年 10月 28日 (金) 15:21:47 JST


船戸様

あんどう@産総研です


> はじめに安藤さん、7月のRTミドルウェア講習会ではお世話になりました。
> また他のメーリングメンバーのみなさまの書き込みも、有難く拝見させて頂いております。
> 
> まだLinux、ロボット制御、更にはC++も学習中の身ではありますが、質問させてください。

講習会ではわざわざ遠くからありがとうございました。

> <質問1>
> rtc-linkを含む、SimpleIOのサンプルは動作させることができました。しかし、
> HelloRTWorldCompを実行しようとすると、
> 
> #]./HelloRTWorldComp -f rtc.conf
> Unknown exception.
> omniORB: ERROR -- the application attempted to invoke an operation on a nil refrence.
> zsh: abort ./HelloRTWorldComp -f rtc.conf
> 
> とアボートしてしまいます。
> この原因について、アドバイスをお願いします。
> OSは、VineLinux3.1 です。

ネームサーバは動いていますか?
rtc.conf に書いたネームサーバのホスト名(or IP アドレス)とポート番号は
起動させたネームサーバと合致していますか?
 
> <質問2>
> コンポーネントを用いて、制御対象(モータ)を制御するために踏まなければならない
> プロセスが分かりません。コンポーネントから直接モータを制御するCPU等との通信を
> 確立させるための方法が分からないと言った方がいいでしょうか。

まぁ、この辺はRTミドルウエアと関係ないことなので、
ハードウエアに応じてコンポーネント開発者がよしなにやってください
というのが本当のところですが。
 
> 現在CPUはH8/3069を用いており、PC側はWindowsXPのハイパーターミナルを用いて、
> PC-H8間のUSBによるシリアル通信でモータをドライブさせていますが、
> ハイパーターミナルがやってくれている事をコンポーネントで行わせるためには
> どうしたら良いのかが分かりません。
> もちろん、コンポーネントで動作させる場合は、LAN経由での通信を想定しております。

そのモータにどのようなコマンドを送って制御しているのかわからないので、
なんともいえませんが、ハイパーターミナルということは、
コマンドは文字列で送るようなシステムになっているのでしょうね。

ならば、そのモータを制御するための一連の関数群(もしくはC++ならクラス)
をつくって、そのプログラムをつかってモータを制御できるようにしてください。

以下のページが役に立つと思います。
http://www.linux.or.jp/JF/JFdocs/Serial-Programming-HOWTO.html

それができたら、そのプログラムをコンポーネントに組み込んでください。


まぁ、C++で書くとしたら、
(そちらのシステムの情報がないので想像で書くしかないのですが)


------------------------------------------------------------
class MotorControl
{
  MotorControl(){};
  MotorContorl(char* port_name)
  {
    シリアルポートをオープンする。
  };
  ~MotorContorl(){};

  bool open(char* port_name)
  {
    シリアルポートをオープンする。
  }

  void setMode(Mode mode)
  {
    モードをセットするコマンドをシリアルに送信
  }

  void setPos(int pos)
  {
    位置指令をセットするコマンドを送信
  }

  void setVelocity(int vel)
  {
    速度指令をセットするコマンドを送信
  }

  int getPos()
  {
    現在位置を取得するコマンドを送信し現在位置を受信
  }

  int getVelocity()
  {
    現在速度を取得するコマンドを送信し現在速度を受信
  }
          :
  そのほか必要な機能を実装
          :
};        
------------------------------------------------------------

このクラスがちゃんと動くか、単一の(コンポーネントでない)プログラムで
テストをします。

------------------------------------------------------------
inlcude <iostream>
include "MotorContorl.h"

int main(void)
{
  MotorControl mot("/dev/ttyS0");

  // 位置制御モードのテスト
  mot.setMode(MotorContro::POSCTRL_MODE);
  mot.setPos(266);
  for (int i = 0; i < 1000; i++)
  {
    std::cout << "Position: " << getPos() << std::endl;
    usleep(10000); // 10ms休む
  }

  // 速度制御モードのテスト
  :

}
------------------------------------------------------------

これでちゃんと動くようになったら、コンポーネントに組み込みます。

InPort -> 位置入力
OutPort -> 位置出力

というコンポーネントを考えると、rtc_active_do なんかは

m_PosRefIn : InPortのインスタンス
m_PosRef : InPort にバインドされた変数
m_mot : MotorControl のインスタンス
m_PosCurOut : OutPortのインスタンス
m_PosCur : OutPort にバインドされた変数

とすると

RtmRes rtc_active_do()
{
  m_PosRefIn.read();
  m_mot.setPos(m_PosRef.data);

  m_PosCur.data = getPos();
  m_PosCurOut.write();

  return RTM_OK;
}

こんな感じで書けるのではないでしょうか?


          安藤慶昭@独立行政法人産業技術総合研究所 研究員
                    知能システム研究部門 タスクインテリジェンス研究グループ
                    〒305-8568 茨城県つくば市梅園1-1-1 中央第2
                    TEL: 029-861-5981 FAX: 029-861-5971
                    n-ando @ aist.go.jp, n-ando @ ieee.org



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