1

ここは小さなコミュニティですが、誰かがこれを見てくれることを願っています。E パックの Webots シミュレーションの純粋な C++ 実装を実行しようとしています。C++ のドキュメントがまったく不足しており、この問題の解決策が見つからないようです (C の実装は優れていますが、関数呼び出しはすべて C++ 用に変更されています)。

基本的に、単純なアプリケーションを起動して実行しようとしているだけです...E-puckを前進させたいです。コード全体を以下に掲載します...私が行っているのは、Robot エンティティをインスタンス化し、すべての IR センサー値を出力して、それを前進させようとすることだけです。

問題は、動かないことです。DifferentialWheel オブジェクトを E-puck にリンクするための呼び出しがあると思います (camera = getCamera("camera")呼び出しに似ています)。

setSpeed の呼び出しをコメント アウトすると、プログラムは完全に機能します (移動せずに値を出力します)。そのままにしておくと、その呼び出しに到達すると、1 つのステップの後でシミュレーションがフリーズします。正直なところ、何が間違っているのか正確にはわかりません。

// webots
#include <webots/Robot.hpp>
#include <webots/Camera.hpp>
#include <webots/DistanceSensor.hpp>
#include <webots/DifferentialWheels.hpp>
#include <webots/LED.hpp>

// standard
#include <iostream>

using namespace webots;

#define TIME_STEP 16

class MyRobot : public Robot
{
  private:
    Camera *camera;
    DistanceSensor *distanceSensors[8];
    LED *leds[8];
    DifferentialWheels *diffWheels;

  public: 
    MyRobot() : Robot()
    {
      // camera
      camera             = getCamera("camera");

      // sensors
      distanceSensors[0] = getDistanceSensor("ps0");
      distanceSensors[1] = getDistanceSensor("ps1");
      distanceSensors[2] = getDistanceSensor("ps2");
      distanceSensors[3] = getDistanceSensor("ps3");
      distanceSensors[4] = getDistanceSensor("ps4");
      distanceSensors[5] = getDistanceSensor("ps5");
      distanceSensors[6] = getDistanceSensor("ps6");
      distanceSensors[7] = getDistanceSensor("ps7");
      for (unsigned int i = 0; i < 8; ++i)
        distanceSensors[i]->enable(TIME_STEP);

      // leds
      leds[0] = getLED("led0");
      leds[1] = getLED("led1");
      leds[2] = getLED("led2");
      leds[3] = getLED("led3");
      leds[4] = getLED("led4");
      leds[5] = getLED("led5");
      leds[6] = getLED("led6");
      leds[7] = getLED("led7");
    }

    virtual ~MyRobot()
    {
      // cleanup
    }

    void run()
    {
      double speed[2] = {20.0, 0.0};

      // main loop
      while (step(TIME_STEP) != -1)
      {
        // read sensor values
        for (unsigned int i = 0; i < 8; ++i)
          std::cout << " [" << distanceSensors[i]->getValue() << "]";
        std::cout << std::endl;

        // process data

        // send actuator commands
// this call kills the simulation
//        diffWheels->setSpeed(1000, 1000);

      }
    }
};

int main(int argc, char* argv[])
{

  MyRobot *robot = new MyRobot();
  robot->run();
  delete robot;
  return 0;
}

これが C 実装の場合、次のように呼び出しますwb_differential_wheels_set_speed(1000, 1000); 。しかし、その呼び出しは C++ ヘッダー ファイルでは使用できません。

4

2 に答える 2

2

フリーズを引き起こす問題は、初期化されていない変数 diffWheels の使用によるものです。DifferentialWheels (およびロボットとスーパーバイザー) を初期化する必要はありません。

MyRobot クラスの基本クラスを DifferentialWheels に変更する必要があります

class MyRobot : public DifferentialWheels

そして、単に呼び出す

setSpeed(1000, 1000)

そしてそうではない

diffWheels->setSpeed(1000, 1000)
于 2012-08-10T08:29:12.773 に答える
1

を初期化したようには見えないdiffWheelsので、ガベージ ポインターの逆参照からセグメンテーション違反が発生していると思います。入れてみて

diffWheels = new DifferentialWheels;

のコンストラクタでMyRobot

于 2012-08-10T00:05:17.637 に答える