2

私は移動ロボット用のAriaC++プログラミングライブラリ(http://robots.mobilerobots.com/wiki/ARIA)を使用しています。私はこのAPIを初めて使用するため、ArActionから派生した単純なアクションクラスから始めたいと思いました。ここで、MobileSimを介してシミュレートされたp3dxロボットを制御するために、小さなテストプログラム(ArAction)を開発しようとしました。開発は、gcc4.4.5を使用してUbuntu10.10で行われます。コードの作成(コンパイル)はエラーなしで正常に機能します。たとえば、ArActionのfire()メソッドで希望の速度を設定することもでき、シミュレーションも希望どおりに機能しています。

ただし、残念ながら、オーバーライドしているArActionにアタッチされたArRobotオブジェクトを使用することはできません。問題は、ArRobotオブジェクトのメンバー関数がどれも機能していないように見えることです。たとえば、getVel()またはgetCompass()を呼び出すと、常にゼロ値が返されます。また、hasFrontBumpers()メソッドを呼び出すと、「Aria:Receivedsignal'SIGSEGV'。Exiting。」というエラーメッセージが表示されてプログラムがクラッシュすることもあります。このメソッド呼び出しを削除して再コンパイルするとすぐに、エラーも再びなくなります...

クラッシュにつながる関連コードは次のとおりです。

ArActionDesired * forward::fire(ArActionDesired d)
{
  desiredState.reset();

  ArRobot *r = getRobot();
  if(r == NULL)
  {
    printf("ArRobot = NULL\n");
    deactivate();
    return &desiredState;
  }

  printf("ok, ArRobot is not NULL, check for bumpers...\n");
  r->hasFrontBumpers(); // <-- this leads to the SIGSEV-based "crash"

  return &desiredState;
}

私がここで見逃しているアイデアはありますか?それは私のコーディングの問題ですか、それともシミュレーション環境の問題ですか?よろしくお願いします!

よろしく、マティアス

4

2 に答える 2

1

わかりました、今すぐ見つけてください-記録のために:バージョン2.7.2のAriaライブラリはgcc-3とlibstdc ++ 5に基づいていますが、Ubuntu 10.10(私が使用している)にはデフォルトでgcc-4とlibstdc++6が付属しています。そのため、両方のパッケージの古いバージョンを手動でインストールする必要がありましたが、コードは正常に実行されています...

乾杯!

于 2011-02-05T00:34:01.740 に答える
0

hasFrontBumpers()からp3dxを呼び出すとfire()、同様のLinuxプラットフォームで問題なく動作します。何かが間違っている場合、それはこのメソッドではなく、システムの初期化にあります。動かないロボットの理由は、robot.enableMotors()呼び出されていないことが原因である可能性があります。

于 2011-02-04T17:10:25.283 に答える