webots小教程-PD控制(弹簧阻尼系统)

Webots 实现PD控制

文件已分享到我的github,欢迎交流。
效果如下
欠阻尼状态
欠阻尼在这里插入图片描述在这里插入图片描述

过阻尼状态如下
过阻尼在这里插入图片描述
在这里插入图片描述

临界阻尼状态如下
临界阻尼在这里插入图片描述
在这里插入图片描述下面开始展示搭建过程

世界搭建

新建一个空白的世界

1.   新建一个空白的世界


右键空白处选择添加新的

2.	右键空白处选择新建


添加背景光源

2.	添加背景光源


添加地板
同样的方法添加一个地板


添加后如下
添加后效果如图


添加一个机器人
添加一个机器人


机器人位置会出现一个坐标系
添加后机器人所在位置会出现一个坐标系


在机器人子类选择添加

在机器人子类右键或双击选择新建


为机器人主体添加一个形状
给机器人添加一个形状


添加几何形状
在形状里的几何形状右键选择新建


选择为box形状选择添加为box形状


添加后出现一个白盒子,有一半在地里面添加后会出现一个小白盒子,有一半在地里


为方便观察将尺寸改大,并将其从地里面扯出来
尺寸放大点,再把它从地里拔出来


在机器人子类上选择新建
在机器人子类下继续选择新建


添加一个直线滑轨

选择添加一个滑轨


滑轨参数添加滑轨参数


在滑轨上添加一个直线电机
在滑轨上添加一个直线电机


在滑轨上添加一个位置传感器

为滑轨添加一个位置传感器


划归末端添加一个固体
滑轨末端添加一个固体


给此固体添加形状
给此固体添加一个形状


依旧选为box,尺寸也一样
同样选择为box


改变颜色,方便观察
为其改变一下外观
改变外观改变外观


我改好后如下
同样方法为robot也改个颜色


将两个方块放到一起,方便观察
把两个方块放在一起方便观察


为滑轨末端的固体添加质量
给滑轨末端的固体添加一个重力属性


设置质量和密度
质量设置为2Kg先设置重量再关闭密度(设为-1),下面会报个错不用理他。


给电机和传感器起名字

为电机和传感器命名在程序中会根据这个"name"去匹配相应的部件


改变滑轨初始位置,使得两个方块不挨在一起

改变滑轨初始位置,使得两个方块不挨在一起至此仿真世界建立完毕

代码

新建controller
用向导新建一个控制器
我用的c语言来编写这个控制器我选的C语言
我选择用vs来写代码,反正vs2019好用还免费。用第一个也行,都一样。
我选的VS,比较方便
。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。
。。。。。。。。。。。。。
。。。。。。。。。。。。
。。。。。。。。。。。
。。。。。。。。。。
。。。。。。。。。
。。。。。。。。
。。。。。。
。。。。。
。。。。
。。。
。。

程序如下

/*
 * File:          pid.c
 * Date:          2021.08.10
 * Description:   PD Controller test
 * Author:        HiYoung
 * Modifications: 2021.08.10
 */

#include <webots/robot.h>
#include <webots/motor.h>
#include <webots/position_sensor.h>

#define TIME_STEP 64

int main(int argc, char **argv) 
{
  wb_robot_init();

  /*加载驱动*/
  WbDeviceTag motor = wb_robot_get_device("linear motor1");//直线电机
  WbDeviceTag sensor = wb_robot_get_device("position sensor1");//位置传感器
  wb_position_sensor_enable(sensor, TIME_STEP);//位置传感器使能

  double last_pos = 0;
  /*临界阻尼*/
  double kp = 100;
  double kd = 301;
  /*欠阻尼*/
  //double kp = 100;
  //double kd = 200;
  /*过阻尼*/
  //double kp = 100;
  //double kd = 400;
  while (wb_robot_step(TIME_STEP) != -1) 
  {
      double pos = wb_position_sensor_get_value(sensor);
      double force = kp * (0 - pos) + kd *(last_pos - pos);
      /*     F     = Kp * x           + Kd * dx            */
      last_pos = pos;
      if (force > 500)
          force = 500;
      else if (force < -500)
          force = -500;
      wb_motor_set_force(motor, force);
      printf("%f\r\n", pos);
  };
  wb_robot_cleanup();
  return 0;
}


效果如下
参数自己去算,自己去实验,还是挺直观的。

在这里插入图片描述

  • 16
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值