我是靠谱客的博主 缓慢星星,最近开发中收集的这篇文章主要介绍Webots和ROS联合仿真探索(三):搭建仿真环境和仿真模型(四轮差分小车),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

说明:本篇文章用于介绍使用webots搭建简单的四轮差分小车模型,参考了多篇已有的文章,由于是第一次搭建,不准确之处欢迎批评指正。

联系方式:2250017028@qq.com
环境搭建可以参考该文章:webots环境搭建
在这里插入图片描述

1.车身

  1. 添加Robot节点,并将其配置为固定节点
    在这里插入图片描述2. 添加外观和物理属性
    i.首先在children中添加Base_nodes/Shape节点,并配置appearance和geometry属性
    在这里插入图片描述在这里插入图片描述
    ii. 配置物理属性和碰撞属性
    物理属性使用默认参数即可,碰撞属性将上面的Shape节点复制进来即可
    在这里插入图片描述

2.车轮

i.在Robot/children节点中添加HingeJoint节点,其中包括以下三个属性需要配置
在这里插入图片描述ii.配置参数
在这里插入图片描述技巧:

  1. 可以先确定Solid的相关参数,配置跟车身类似,HingeJointParameters/anchor属性就跟Solid/translation属性相同。
  2. device中的节点名称是由device/name属性确定的,即ROS调用服务的外设名称由此决定。

iii. 复制另外三个轮子
注意要修改轮子位置转轴位置电机名称等属性。

iv. 添加摩擦力属性
WorldInfo/ContactProperties中添加contactProperties子节点,并将该子节点下的coulombFriction属性值修改为0.5
在这里插入图片描述

4.搭建外设

Robot/children节点下添加其他外设或者机器人节点。
在这里插入图片描述这里的Robot也要设定为固定节点,并像上面车身节点一样配置相关属性
效果如图
在这里插入图片描述

3.测试

到这里基本可以完成模型搭建,可以使用webots的控制器模板来设计一个简单的控制器测试模型搭建是否正常。

// File:          my_controller.cpp
// Date:
// Description:
// Author:
// Modifications:

// You may need to add webots include files such as
// <webots/DistanceSensor.hpp>, <webots/Motor.hpp>, etc.
// and/or to add some other includes
#include <webots/Robot.hpp>
#include <webots/Motor.hpp>
#include <webots/Keyboard.hpp>
#include <webots/Camera.hpp>
#include <webots/RangeFinder.hpp>
// All the webots classes are defined in the "webots" namespace
using namespace webots;

// This is the main program of your controller.
// It creates an instance of your Robot instance, launches its
// function(s) and destroys it at the end of the execution.
// Note that only one instance of Robot should be created in
// a controller program.
// The arguments of the main function can be specified by the
// "controllerArgs" field of the Robot node

int main(int argc, char **argv) {
  // create the Robot instance.
  Robot *robot = new Robot();

  // get the time step of the current world.
  int timeStep = (int)robot->getBasicTimeStep();
  
  // Create Instancee
  Motor *wheels[4];
  Keyboard *keyboard;
  Camera *camera;
  RangeFinder *rf;
  
  char wheels_names[4][11] = {"rf_motor", "rr_motor", "lf_motor", "lr_motor"};
  
  // Set motor status
  for (int i = 0; i < 4; i++) 
  {
    wheels[i] = robot->getMotor(wheels_names[i]);
    wheels[i]->setPosition(INFINITY);
    wheels[i]->setVelocity(0);
  }
  
  // Enable Camera
  camera = robot->getCamera("kinect color");
  rf = robot->getRangeFinder("kinect range");
  camera->enable(4*timeStep);
  rf->enable(4*timeStep);
  
  // Enable keyboard
  keyboard = robot->getKeyboard();
  keyboard->enable(10*timeStep);
  
  // kinematic param
  float R_ = 0.1;  // radius
  float S_ = 0.4;  // axis dis
  float L_ = 0.41; // wheel dis
  float v1, v2, vel, omega;
  int key;
 
  // Main loop:
  // - perform simulation steps until Webots is stopping the controller
  while (robot->step(timeStep) != -1) {
    // Read the sensors:

    //Get Motor Data
    v1 = wheels[1]->getVelocity() * R_;
    v2 = wheels[3]->getVelocity() * R_;
    vel = (v1+v2)/2;
    omega = (v2 - v1) * L_ / (L_ * L_ + S_ * S_);
    printf("小车速度:v = %f, omega = %f",vel, omega);
    
    // Get Key Data
    key = keyboard->getKey();
    switch(key)
    {
      case 'Q': 
        wheels[0]->setVelocity(3);
        wheels[1]->setVelocity(3);
        wheels[2]->setVelocity(1);
        wheels[3]->setVelocity(1);
        break;
       case 'E': 
        wheels[0]->setVelocity(1);
        wheels[1]->setVelocity(1);
        wheels[2]->setVelocity(3);
        wheels[3]->setVelocity(3);
        break;
       case 'W': 
        wheels[0]->setVelocity(2);
        wheels[1]->setVelocity(2);
        wheels[2]->setVelocity(2);
        wheels[3]->setVelocity(2);
        break;
       case 'S': 
        wheels[0]->setVelocity(-2);
        wheels[1]->setVelocity(-2);
        wheels[2]->setVelocity(-2);
        wheels[3]->setVelocity(-2);
        break;
       case 'D': 
        wheels[0]->setVelocity(2);
        wheels[1]->setVelocity(2);
        wheels[2]->setVelocity(-2);
        wheels[3]->setVelocity(-2);
        break;
       case 'A': 
        wheels[0]->setVelocity(-2);
        wheels[1]->setVelocity(-2);
        wheels[2]->setVelocity(2);
        wheels[3]->setVelocity(2);
        break;
       default:
        wheels[0]->setVelocity(0);
        wheels[1]->setVelocity(0);
        wheels[2]->setVelocity(0);
        wheels[3]->setVelocity(0);
        break;
    }
    // Enter here functions to read sensor data, like:
    //  double val = ds->getValue();

    // Process sensor data here.

    // Enter here functions to send actuator commands, like:
    //  motor->setPosition(10.0);
  };

  // Enter here exit cleanup code.

  delete robot;
  return 0;
}

如果有其他问题,欢迎与我联系进行讨论!

最后

以上就是缓慢星星为你收集整理的Webots和ROS联合仿真探索(三):搭建仿真环境和仿真模型(四轮差分小车)的全部内容,希望文章能够帮你解决Webots和ROS联合仿真探索(三):搭建仿真环境和仿真模型(四轮差分小车)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部