1

这里的小社区,但希望有人看到这一点。我正在尝试为 E-puck 进行 Webots 模拟的纯 C++ 实现。C++ 文档非常缺乏,我似乎无法找到解决此问题的方法(C 实现非常出色,但所有函数调用都针对 C++ 进行了更改)。

本质上,我只是想让一个简单的应用程序启动并运行……我想让 E-puck 向前发展。我将在下面发布我的全部代码......我所做的只是实例化一个机器人实体,打印出所有 IR 传感器值,并尝试将其向前移动。

问题是它不动。我认为会有一些将DifferentialWheel 对象链接到E-puck 的调用(类似于camera = getCamera("camera")调用)。

如果我注释掉我对 setSpeed 的调用,程序就会完美运行(不会移动,但会打印值)。如果我把它留在里面,一旦接到那个电话,模拟就会在一个步骤后冻结。老实说,我不确定我做错了什么。

// 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(以及Robot 和Supervisor)。

您必须将 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 回答