Webots 实现PD控制

  • 世界搭建
  • 代码


文件已分享到我的github,欢迎交流。

效果如下

欠阻尼状态

android开发recyclerview滑动阻尼系数 滑道阻尼_pid

android开发recyclerview滑动阻尼系数 滑道阻尼_位置传感器_02

android开发recyclerview滑动阻尼系数 滑道阻尼_c语言_03

过阻尼状态如下

android开发recyclerview滑动阻尼系数 滑道阻尼_位置传感器_04

android开发recyclerview滑动阻尼系数 滑道阻尼_pid_05


android开发recyclerview滑动阻尼系数 滑道阻尼_控制器_06

临界阻尼状态如下

android开发recyclerview滑动阻尼系数 滑道阻尼_c语言_07

android开发recyclerview滑动阻尼系数 滑道阻尼_仿真器_08


android开发recyclerview滑动阻尼系数 滑道阻尼_pid_09

下面开始展示搭建过程

世界搭建

新建一个空白的世界

android开发recyclerview滑动阻尼系数 滑道阻尼_控制器_10




右键空白处选择添加新的

android开发recyclerview滑动阻尼系数 滑道阻尼_仿真器_11




添加背景光源

android开发recyclerview滑动阻尼系数 滑道阻尼_位置传感器_12




添加地板

android开发recyclerview滑动阻尼系数 滑道阻尼_仿真器_13




添加后如下

android开发recyclerview滑动阻尼系数 滑道阻尼_pid_14




添加一个机器人

android开发recyclerview滑动阻尼系数 滑道阻尼_c语言_15




机器人位置会出现一个坐标系

android开发recyclerview滑动阻尼系数 滑道阻尼_pid_16




在机器人子类选择添加

android开发recyclerview滑动阻尼系数 滑道阻尼_控制器_17




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

android开发recyclerview滑动阻尼系数 滑道阻尼_控制器_18




添加几何形状

android开发recyclerview滑动阻尼系数 滑道阻尼_c语言_19




选择为box形状

android开发recyclerview滑动阻尼系数 滑道阻尼_仿真器_20




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

android开发recyclerview滑动阻尼系数 滑道阻尼_仿真器_21




为方便观察将尺寸改大,并将其从地里面扯出来

android开发recyclerview滑动阻尼系数 滑道阻尼_控制器_22




在机器人子类上选择新建

android开发recyclerview滑动阻尼系数 滑道阻尼_控制器_23




添加一个直线滑轨

android开发recyclerview滑动阻尼系数 滑道阻尼_控制器_24




滑轨参数

android开发recyclerview滑动阻尼系数 滑道阻尼_仿真器_25




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

android开发recyclerview滑动阻尼系数 滑道阻尼_c语言_26




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

android开发recyclerview滑动阻尼系数 滑道阻尼_pid_27




划归末端添加一个固体

android开发recyclerview滑动阻尼系数 滑道阻尼_位置传感器_28




给此固体添加形状

android开发recyclerview滑动阻尼系数 滑道阻尼_控制器_29




依旧选为box,尺寸也一样

android开发recyclerview滑动阻尼系数 滑道阻尼_仿真器_30




改变颜色,方便观察

android开发recyclerview滑动阻尼系数 滑道阻尼_c语言_31


android开发recyclerview滑动阻尼系数 滑道阻尼_控制器_32

android开发recyclerview滑动阻尼系数 滑道阻尼_控制器_33




我改好后如下

android开发recyclerview滑动阻尼系数 滑道阻尼_pid_34




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

android开发recyclerview滑动阻尼系数 滑道阻尼_c语言_35




为滑轨末端的固体添加质量

android开发recyclerview滑动阻尼系数 滑道阻尼_位置传感器_36




设置质量和密度

android开发recyclerview滑动阻尼系数 滑道阻尼_pid_37

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



给电机和传感器起名字

android开发recyclerview滑动阻尼系数 滑道阻尼_c语言_38

在程序中会根据这个"name"去匹配相应的部件



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

android开发recyclerview滑动阻尼系数 滑道阻尼_位置传感器_39

至此仿真世界建立完毕

代码

新建controller

android开发recyclerview滑动阻尼系数 滑道阻尼_c语言_40


我用的c语言来编写这个控制器

android开发recyclerview滑动阻尼系数 滑道阻尼_c语言_41


我选择用vs来写代码,反正vs2019好用还免费。用第一个也行,都一样。

android开发recyclerview滑动阻尼系数 滑道阻尼_c语言_42


。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。

。。。。。。。。。。。。。

。。。。。。。。。。。。

。。。。。。。。。。。

。。。。。。。。。。

。。。。。。。。。

。。。。。。。。

。。。。。。

。。。。。

。。。。

。。。

。。


程序如下

/*
 * 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;
}

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

android开发recyclerview滑动阻尼系数 滑道阻尼_仿真器_43