webots自學筆記(三)控制器與電機控制


      原創文章,來自“博客園,_阿龍clliu” http://www.cnblogs.com/clliu/,轉載請注明原文章出處。

 

      上一次建了四足機器人的模型,模型文件在上一篇有下載地址,這一次用控制器讓它走起來。由於在忙一些畢業設計的事情,以后的每一次的篇幅可能會短一點。Webots的編程語言支持C、C++、matlab、python、java,本文以C編寫機器人控制器。

       在webots菜單欄:向導 -> 新機器人控制器 ,新建一個控制器,選擇C語言,命名為my_controller。

      在每個servo節點下定義name屬性,在控制器中要使用到。

      將下方代碼代替控制器編輯文本my_controller的內容,點擊編輯按鈕,沒有編譯錯誤后再點擊生成按鈕 ,如果沒有問題會出現是否恢復模擬,點擊確定。(PS:這個過程會重置你的場景樹中的模型,控制器和場景樹兩個部分最好是分別操作,完成后保存。)

 

/*
 * File:          my_robot.c
 * Date:          
 * Description:   
 * Author:        clliu
 * Modifications: 
 */


#include <webots/robot.h>
#include <webots/servo.h>
#include <assert.h>
#include <math.h>
#include <stdio.h>


#define TIME_STEP 16
#define rad_2_deg(X) ( X / pi * 180.0 )
#define deg_2_rad(X) ( X / 180.0 * pi )
#define pi 3.1415926
#define T 1


int main(int argc, char **argv)
{
  //定義webots電機設備
  WbDeviceTag servos[8];
  
  //定義電機名字,與場景樹種servo節點下name屬性對應
  const char *SERVO_NAMES[] = { 
   "fore_left_1",
   "fore_right_1", 
   "hind_left_1", 
   "hind_right_1", 
   "fore_left_2",
   "fore_right_2", 
   "hind_left_2", 
   "hind_right_2", 
    NULL };
    
  //CPG控制擺動參數  
  double Ah = 10 ;
  double Ak = 15 ;
  double t = 0.0;
  
  //機器人重置,webots內部函數
  wb_robot_init();
  printf("robot inited!\n");


  //將電機設備逐一加載
  int i;
  for (i = 0; SERVO_NAMES[i]; i++) {
    servos[i] = wb_robot_get_device(SERVO_NAMES[i]);
    assert(servos[i]);
  }


  //進入仿真執行的循環
  while (wb_robot_step(TIME_STEP) != -1) {
    


    //計算每個servo的角度,這個控制理論是基於CPG(中樞神經發生器)的,有興趣可以自行了解
    double lf_hip_pos = Ah * sin(2 * pi / T * t - pi / 2);
    double lf_knee_pos = Ak * sin(2 * pi / T * t + pi) ;
    double lb_hip_pos =  Ah * sin(2 * pi / T * t + pi / 2);
    double lb_knee_pos = Ak * sin(2 * pi / T * t) ;
    double rf_hip_pos = Ah * sin(2 * pi / T * t + pi / 2);
    double rf_knee_pos = Ak * sin(2 * pi / T * t) ;
    double rb_hip_pos =  Ah * sin(2 * pi / T * t - pi / 2);
    double rb_knee_pos = Ak * sin(2 * pi / T * t + pi) ;
    

    //使用位置控制模式控制電機
     wb_servo_set_position(servos[0], deg_2_rad(lf_hip_pos));
     wb_servo_set_position(servos[1], deg_2_rad(rf_hip_pos));
     wb_servo_set_position(servos[2], deg_2_rad(lb_hip_pos));
     wb_servo_set_position(servos[3], deg_2_rad(rb_hip_pos));

     wb_servo_set_position(servos[4], deg_2_rad(lf_knee_pos));
     wb_servo_set_position(servos[5], deg_2_rad(rf_knee_pos));
     wb_servo_set_position(servos[6], deg_2_rad(lb_knee_pos));
     wb_servo_set_position(servos[7], deg_2_rad(rb_knee_pos));
     
     
     //實時時間計算,進行一次循環的時間間隔為worldInfo節點下basicTimeStep的屬性值
     t += (double)TIME_STEP / 1000.0;
     
    
  };
  
  //清理
  wb_robot_cleanup();
  
  return 0;
}

      控制器已經生產好了,需要將控制器與機器人進行綁定,確定你的仿真時間是否在0時刻,不是的話點擊仿真視圖的重置按鈕(中間的仿真視圖的,不是代碼編輯器的.),在機器人的節點下,點擊controller節點,選擇之前生成的控制器。選擇my_controller。(這里我之前命名的是my_robot)

      

 

      到這里還差最后一步, 文件 -> 保存世界 , 如果仿真時間不為0時刻無法保存。保存完成后,再一次點擊仿真視圖的重置按鈕。點擊仿真按鈕,機器人就動起來了。

    

     今天發現自己的文章被刪除原鏈接轉載,好氣哦,轉載了下面還加這個,好氣哦,剛開始寫帖子,簡直毀滅我的積極性。

 

 

     補充一點,在仿真中,除了位置控制,有時需要用到電機的其他控制方法。其他的控制函數如下:

     速度控制:wb_servo_set_velocity()

     加速度控制:wb_servo_set_acceleration()

     詳細了解可以查看reference 3.42-Servo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM