webots自学笔记(三)控制器与电机控制
2017-11-16 17:09
891 查看
上一次建了四足机器人的模型,模型文件在上一篇有下载地址,这一次用控制器让它走起来。由于在忙一些毕业设计的事情,以后的每一次的篇幅可能会短一点。Webots的编程语言支持C、C++、matlab、python、java,本文以C编写机器人控制器。
在webots菜单栏:向导 -> 新机器人控制器 ,新建一个控制器,选择C语言,命名为my_controller。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/d8852238d2a67c605dc9dca1c4cb2225.png)
在每个servo节点下定义name属性,在控制器中要使用到。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/036e45523c88eff5f82414282e801ccd.png)
将下方代码代替控制器编辑文本my_controller的内容,点击编辑按钮
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/bbe462dbad48e17700c5159efd7496c0.png)
,没有编译错误后再点击生成按钮
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/f8ff63516030b21c4942f45cae3ed004.png)
,如果没有问题会出现是否恢复模拟,点击确定。(PS:这个过程会重置你的场景树中的模型,控制器和场景树两个部分最好是分别操作,完成后保存。)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/a11dcf73d6dfdc57f2e4367089f461c4.png)
控制器已经生产好了,需要将控制器与机器人进行绑定,确定你的仿真时间是否在0时刻,不是的话点击仿真视图的重置按钮
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/3b78bd56a732ffdaab56577954aae60e.png)
(中间的仿真视图的,不是代码编辑器的.),在机器人的节点下,点击controller节点,选择之前生成的控制器。选择my_controller。(这里我之前命名的是my_robot)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/2f94a00afcb560159e0e1b3dd1e27924.png)
到这里还差最后一步, 文件 -> 保存世界 , 如果仿真时间不为0时刻无法保存。保存完成后,再一次点击仿真视图的重置按钮。点击仿真按钮,机器人就动起来了。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/8bd2219c967e014445a875c4c1527888.gif)
今天发现自己的文章被删除原链接转载,好气哦,转载了下面还加这个,好气哦,刚开始写帖子,简直毁灭我的积极性。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/cb2822834972b23977bb126b28eb38ff.png)
补充一点,在仿真中,除了位置控制,有时需要用到电机的其他控制方法。其他的控制函数如下:
速度控制:wb_servo_set_velocity()
加速度控制:wb_servo_set_acceleration()
详细了解可以查看reference 3.42-Servo
在webots菜单栏:向导 -> 新机器人控制器 ,新建一个控制器,选择C语言,命名为my_controller。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/d8852238d2a67c605dc9dca1c4cb2225.png)
在每个servo节点下定义name属性,在控制器中要使用到。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/036e45523c88eff5f82414282e801ccd.png)
将下方代码代替控制器编辑文本my_controller的内容,点击编辑按钮
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/bbe462dbad48e17700c5159efd7496c0.png)
,没有编译错误后再点击生成按钮
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/f8ff63516030b21c4942f45cae3ed004.png)
,如果没有问题会出现是否恢复模拟,点击确定。(PS:这个过程会重置你的场景树中的模型,控制器和场景树两个部分最好是分别操作,完成后保存。)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/a11dcf73d6dfdc57f2e4367089f461c4.png)
/* * 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时刻,不是的话点击仿真视图的重置按钮
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/3b78bd56a732ffdaab56577954aae60e.png)
(中间的仿真视图的,不是代码编辑器的.),在机器人的节点下,点击controller节点,选择之前生成的控制器。选择my_controller。(这里我之前命名的是my_robot)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/2f94a00afcb560159e0e1b3dd1e27924.png)
到这里还差最后一步, 文件 -> 保存世界 , 如果仿真时间不为0时刻无法保存。保存完成后,再一次点击仿真视图的重置按钮。点击仿真按钮,机器人就动起来了。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/8bd2219c967e014445a875c4c1527888.gif)
今天发现自己的文章被删除原链接转载,好气哦,转载了下面还加这个,好气哦,刚开始写帖子,简直毁灭我的积极性。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/23/cb2822834972b23977bb126b28eb38ff.png)
补充一点,在仿真中,除了位置控制,有时需要用到电机的其他控制方法。其他的控制函数如下:
速度控制:wb_servo_set_velocity()
加速度控制:wb_servo_set_acceleration()
详细了解可以查看reference 3.42-Servo
相关文章推荐
- webots自学笔记(六)实用控制器函数补充
- Python2.7自学笔记3――流程控制语句
- webots自学笔记(九)弹簧与阻尼添加
- Java SE 自学笔记2 之流程控制
- webots自学笔记(一)软件界面和简单模型仿真
- STM32控制直流电机笔记(一)——电源转换和电机驱动电路设计及注意事项
- Unity3D自学笔记——有限状态机(二)角色行走控制
- Arduino学习笔记(四)Matlab串口控制Arduino转动电机
- 安卓自学笔记:10:用SeekBar实现通过滑块控制图片透明度
- webots自学笔记(一)软件界面和简单模型仿真
- 黑马程序员——.NET自学笔记4_流程控制
- 电机控制 编程笔记 event1.c
- sqlserver自学笔记之的流程控制语句
- C# MVC 自学笔记—3 添加控制器
- Shader自学笔记 1.3 使用属性控制渲染效果
- Android开发自学笔记(五):使用代码控制界面
- webots自学笔记(二)节点与机器人建模
- Java自学笔记之程序的流程控制
- 【PHP自学笔记】第四章 PHP流程控制语句
- webots自学笔记(一)软件界面和简单模型仿真