Проблема с настройкой скорости на DifferentialWheels в Webots C ++

Здесь небольшое сообщество, но, надеюсь, кто-нибудь это увидит. Я пытаюсь сделать чистую реализацию на C ++ симуляции Webots для электронной шайбы. Документации по C ++ катастрофически не хватает, и я не могу найти решение этой проблемы (реализация C великолепна, но все вызовы функций были изменены для C ++).

По сути, я просто пытаюсь запустить простое приложение ... Я хочу, чтобы электронная шайба двигалась вперед. Я опубликую весь свой код ниже ... все, что я делаю, это создаю экземпляр объекта Robot, распечатываю все значения ИК-датчика и пытаюсь продвинуть его вперед.

Проблема в том, что он не двигается. Я бы подумал, что будет какой-то вызов, чтобы связать объект 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 ++.


person the_e    schedule 09.08.2012    source источник


Ответы (2)


Не похоже, что вы инициализировали diffWheels, поэтому я могу представить, что вы получаете segfault из-за разыменования указателя мусора. Попробуйте поставить

diffWheels = new DifferentialWheels;

в конструкторе MyRobot.

person bkconrad    schedule 10.08.2012

Проблема, вызывающая зависание, связана с использованием неинициализированной переменной diffWheels. DifferentialWheels (а также робот и супервизор) не требует инициализации.

Вы должны изменить базовый класс своего класса MyRobot на DifferentialWheels

class MyRobot : public DifferentialWheels

а затем просто позвоните

setSpeed(1000, 1000)

и не

diffWheels->setSpeed(1000, 1000)
person StefaniaPedrazzi    schedule 10.08.2012