机器人工程专业实践镜像2021版-功能扩展-coppeliasim+webots

举报
zhangrelay 发表于 2021/10/17 22:36:00 2021/10/17
5.2k+ 0 0
【摘要】 镜像虽然提供了大部分课程所需功能,但同样支持扩展。这里以两款仿真软件为例 coppeliasimwebots 其实就是在官网下载,解压到硬盘就可以使用的。 分别解压就行。 启动V-Rep(新版为coppeliasim) : ./vrep.sh 启动webots: ./webots  等待启动完成,即...

镜像虽然提供了大部分课程所需功能,但同样支持扩展。这里以两款仿真软件为例

  • coppeliasim
  • webots

其实就是在官网下载,解压到硬盘就可以使用的。

分别解压就行。

启动V-Rep(新版为coppeliasim) :

  • ./vrep.sh

启动webots:

  • ./webots

 等待启动完成,即可愉快玩耍。忽略更新。

 

缺少的功能包依据上学期课程讲解,或者依据提示补充安装即可。

现在打开一个cpp案例:

尝试一下编译:

完全可以正常使用。


      void Driver::displayHelp() {
       string s("Commands:\n"
                " 这只是一个测试^_^\n"
                " I for displaying the commands\n"
                " A for avoid obstacles\n"
                " F for move forward\n"
                " S for stop\n"
                " T for turn\n"
                " R for positioning ROBOT1 at (0.1,0.3)\n"
                " G for knowing the (x,z) position of ROBOT1");
        cout << s << endl;
      }
  
 

 

 

webots中C++的案例都可以直接编译后使用,非常方便。

更多案例自主学习即可。


      // Copyright 1996-2020 Cyberbotics Ltd.
      //
      // Licensed under the Apache License, Version 2.0 (the "License");
      // you may not use this file except in compliance with the License.
      // You may obtain a copy of the License at
      //
      // http://www.apache.org/licenses/LICENSE-2.0
      //
      // Unless required by applicable law or agreed to in writing, software
      // distributed under the License is distributed on an "AS IS" BASIS,
      // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      // See the License for the specific language governing permissions and
      // limitations under the License.
      /*
       * Description: This controller gives to its node the following behavior:
       * Listen the keyboard. According to the pressed key, send a
       * message through an emitter or handle the position of Robot1
       */
      #include <webots/Emitter.hpp>
      #include <webots/Field.hpp>
      #include <webots/Keyboard.hpp>
      #include <webots/Node.hpp>
      #include <webots/Supervisor.hpp>
      #include <stdlib.h>
      #include <cstring>
      #include <iostream>
      #include <string>
      using namespace std;
      using namespace webots;
      class Driver : public Supervisor {
      public:
       Driver();
       void run();
      private:
       static void displayHelp();
       int timeStep;
        Emitter *emitter;
        Field *translationField;
        Keyboard *keyboard;
       double x;
       double z;
       double translation[3];
      };
      Driver::Driver() {
        timeStep = 128;
        x = 0.1f;
        z = 0.3f;
        translation[0] = x;
        translation[1] = 0;
        translation[2] = z;
        emitter = getEmitter("emitter");
        Node *robot = getFromDef("ROBOT1");
       if (!robot)
         // robot might be NULL if the controller is about to quit
         exit(1);
        translationField = robot->getField("translation");
        keyboard = getKeyboard();
        keyboard->enable(timeStep);
      }
      void Driver::run() {
       string previous_message("");
       string message("");
       displayHelp();
       // main loop
       while (step(timeStep) != -1) {
         // Read sensors; update message according to the pressed keyboard key
         int k = keyboard->getKey();
         switch (k) {
           case 'A':
              message.assign("avoid obstacles");
             break;
           case 'F':
              message.assign("move forward");
             break;
           case 'S':
              message.assign("stop");
             break;
           case 'T':
              message.assign("turn");
             break;
           case 'I':
             displayHelp();
             break;
           case 'G': {
             const double *translationValues = translationField->getSFVec3f();
              cout << "ROBOT1 is located at (" << translationValues[0] << "," << translationValues[2] << ")" << endl;
             break;
            }
           case 'R':
              cout << "Teleport ROBOT1 at (" << x << "," << z << ")" << endl;
              translationField->setSFVec3f(translation);
             break;
           default:
              message.clear();
          }
         // send actuators commands; send a new message through the emitter device
         if (!message.empty() && message.compare(previous_message)) {
            previous_message.assign(message);
            cout << "Please, " << message.c_str() << endl;
            emitter->send(message.c_str(), (int)strlen(message.c_str()) + 1);
          }
        }
      }
      void Driver::displayHelp() {
       string s("Commands:\n"
                " 这只是一个测试^_^\n"
                " I for displaying the commands\n"
                " A for avoid obstacles\n"
                " F for move forward\n"
                " S for stop\n"
                " T for turn\n"
                " R for positioning ROBOT1 at (0.1,0.3)\n"
                " G for knowing the (x,z) position of ROBOT1");
        cout << s << endl;
      }
      int main() {
        Driver *controller = new Driver();
        controller->run();
       delete controller;
       return 0;
      }
  
 

      // Copyright 1996-2020 Cyberbotics Ltd.
      //
      // Licensed under the Apache License, Version 2.0 (the "License");
      // you may not use this file except in compliance with the License.
      // You may obtain a copy of the License at
      //
      // http://www.apache.org/licenses/LICENSE-2.0
      //
      // Unless required by applicable law or agreed to in writing, software
      // distributed under the License is distributed on an "AS IS" BASIS,
      // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      // See the License for the specific language governing permissions and
      // limitations under the License.
      /*
       * Description: This controller gives to its robot the following behavior:
       * According to the messages it receives, the robot change its
       * behavior.
       */
      #include <webots/Camera.hpp>
      #include <webots/DistanceSensor.hpp>
      #include <webots/Motor.hpp>
      #include <webots/Receiver.hpp>
      #include <webots/Robot.hpp>
      #include <webots/utils/AnsiCodes.hpp>
      #include <algorithm>
      #include <iostream>
      #include <limits>
      #include <string>
      using namespace std;
      using namespace webots;
      static const double maxSpeed = 10.0;
      class Slave : public Robot {
      public:
       Slave();
       void run();
      private:
       enum Mode { STOP, MOVE_FORWARD, AVOID_OBSTACLES, TURN };
       static double boundSpeed(double speed);
       int timeStep;
        Mode mode;
        Receiver *receiver;
        Camera *camera;
        DistanceSensor *distanceSensors[2];
        Motor *motors[2];
      };
      Slave::Slave() {
        timeStep = 32;
        mode = AVOID_OBSTACLES;
        camera = getCamera("camera");
        camera->enable(4 * timeStep);
        receiver = getReceiver("receiver");
        receiver->enable(timeStep);
        motors[0] = getMotor("left wheel motor");
        motors[1] = getMotor("right wheel motor");
        motors[0]->setPosition(std::numeric_limits<double>::infinity());
        motors[1]->setPosition(std::numeric_limits<double>::infinity());
        motors[0]->setVelocity(0.0);
        motors[1]->setVelocity(0.0);
       string distanceSensorNames("ds0");
       for (int i = 0; i < 2; i++) {
          distanceSensors[i] = getDistanceSensor(distanceSensorNames);
          distanceSensors[i]->enable(timeStep);
          distanceSensorNames[2]++;  // for getting "ds1","ds2",...
        }
      }
      double Slave::boundSpeed(double speed) {
       return std::min(maxSpeed, std::max(-maxSpeed, speed));
      }
      void Slave::run() {
       // main loop
       while (step(timeStep) != -1) {
         // Read sensors, particularly the order of the supervisor
         if (receiver->getQueueLength() > 0) {
           string message((const char *)receiver->getData());
            receiver->nextPacket();
            cout << "I should " << AnsiCodes::RED_FOREGROUND << message << AnsiCodes::RESET << "!" << endl;
           if (message.compare("avoid obstacles") == 0)
              mode = AVOID_OBSTACLES;
           else if (message.compare("move forward") == 0)
              mode = MOVE_FORWARD;
           else if (message.compare("stop") == 0)
              mode = STOP;
           else if (message.compare("turn") == 0)
              mode = TURN;
          }
         double delta = distanceSensors[0]->getValue() - distanceSensors[1]->getValue();
         double speeds[2] = {0.0, 0.0};
         // send actuators commands according to the mode
         switch (mode) {
           case AVOID_OBSTACLES:
              speeds[0] = boundSpeed(maxSpeed / 2.0 + 0.1 * delta);
              speeds[1] = boundSpeed(maxSpeed / 2.0 - 0.1 * delta);
             break;
           case MOVE_FORWARD:
              speeds[0] = maxSpeed;
              speeds[1] = maxSpeed;
             break;
           case TURN:
              speeds[0] = maxSpeed / 2.0;
              speeds[1] = -maxSpeed / 2.0;
             break;
           default:
             break;
          }
          motors[0]->setVelocity(speeds[0]);
          motors[1]->setVelocity(speeds[1]);
        }
      }
      int main() {
        Slave *controller = new Slave();
        controller->run();
       delete controller;
       return 0;
      }
  
 

-End-


文章来源: zhangrelay.blog.csdn.net,作者:zhangrelay,版权归原作者所有,如需转载,请联系作者。

原文链接:zhangrelay.blog.csdn.net/article/details/120812159

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。