ここは小さなコミュニティですが、誰かがこれを見てくれることを願っています。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++ ヘッダー ファイルでは使用できません。