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[]; //定义电机名字,与场景树种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 = ;
double Ak = ;
double t = 0.0; //机器人重置,webots内部函数
wb_robot_init();
printf("robot inited!\n"); //将电机设备逐一加载
int i;
for (i = ; SERVO_NAMES[i]; i++) {
servos[i] = wb_robot_get_device(SERVO_NAMES[i]);
assert(servos[i]);
} //进入仿真执行的循环
while (wb_robot_step(TIME_STEP) != -) { //计算每个servo的角度,这个控制理论是基于CPG(中枢神经发生器)的,有兴趣可以自行了解
double lf_hip_pos = Ah * sin( * pi / T * t - pi / );
double lf_knee_pos = Ak * sin( * pi / T * t + pi) ;
double lb_hip_pos = Ah * sin( * pi / T * t + pi / );
double lb_knee_pos = Ak * sin( * pi / T * t) ;
double rf_hip_pos = Ah * sin( * pi / T * t + pi / );
double rf_knee_pos = Ak * sin( * pi / T * t) ;
double rb_hip_pos = Ah * sin( * pi / T * t - pi / );
double rb_knee_pos = Ak * sin( * pi / T * t + pi) ; //使用位置控制模式控制电机
wb_servo_set_position(servos[], deg_2_rad(lf_hip_pos));
wb_servo_set_position(servos[], deg_2_rad(rf_hip_pos));
wb_servo_set_position(servos[], deg_2_rad(lb_hip_pos));
wb_servo_set_position(servos[], deg_2_rad(rb_hip_pos)); wb_servo_set_position(servos[], deg_2_rad(lf_knee_pos));
wb_servo_set_position(servos[], deg_2_rad(rf_knee_pos));
wb_servo_set_position(servos[], deg_2_rad(lb_knee_pos));
wb_servo_set_position(servos[], deg_2_rad(rb_knee_pos)); //实时时间计算,进行一次循环的时间间隔为worldInfo节点下basicTimeStep的属性值
t += (double)TIME_STEP / 1000.0; }; //清理
wb_robot_cleanup(); return ;
}
控制器已经生产好了,需要将控制器与机器人进行绑定,确定你的仿真时间是否在0时刻,不是的话点击仿真视图的重置按钮
(中间的仿真视图的,不是代码编辑器的.),在机器人的节点下,点击controller节点,选择之前生成的控制器。选择my_controller。(这里我之前命名的是my_robot)

到这里还差最后一步, 文件 -> 保存世界 , 如果仿真时间不为0时刻无法保存。保存完成后,再一次点击仿真视图的重置按钮。点击仿真按钮,机器人就动起来了。

今天发现自己的文章被删除原链接转载,好气哦,转载了下面还加这个,好气哦,刚开始写帖子,简直毁灭我的积极性。

补充一点,在仿真中,除了位置控制,有时需要用到电机的其他控制方法。其他的控制函数如下:
速度控制:wb_servo_set_velocity()
加速度控制:wb_servo_set_acceleration()
详细了解可以查看reference 3.42-Servo
webots自学笔记(三)控制器与电机控制的更多相关文章
- webots自学笔记(六)实用控制器函数补充
原创文章,来自"博客园,_阿龙clliu" http://www.cnblogs.com/clliu/,转载请注明原文章出处. 用Webots软件做机器人仿真时,可以编 ...
- webots自学笔记(二)节点与机器人建模
原创文章,出自"博客园, _阿龙clliu" :http://www.cnblogs.com/clliu/ 上一次介绍了界面和一个简单的自由落体,然而在实际运用中,机器人的结构都是 ...
- webots自学笔记(一)软件界面和简单模型仿真
本人是某非理工类某高校大四狗,由于毕设研究需要使用webots软件,在学习使用webots的过程花费了很多时间.由于这个软件基本没有什么中文资料,所以想把自己所学到的一些东西写下来,如有什么错误的地方 ...
- webots自学笔记(五)使用物理插件ODE建立铰链
原创文章,来自"博客园,_阿龙clliu" http://www.cnblogs.com/clliu/,转载请注明原文章出处. 在一些三维制图软件或仿真软件里,都有运动副的概念,w ...
- webots自学笔记(四)传感器API使用、查看官方文档
原创文章,来自“博客园,_阿龙clliu” http://www.cnblogs.com/clliu/,转载请注明原文章出处. 不能说webots的学习资料少,只能说 ...
- webpack4 自学笔记三(提取公用代码)
全部的代码及笔记都可以在我的github上查看, 欢迎star:https://github.com/Jasonwang911/webpackStudyInit/tree/master/commonT ...
- 【C++初学者自学笔记三】哑元函数、缺省参数、内联函数(模块二,PS:需要用到重载函数)
一,哑元函数:一个函数的参数只有类型没有名字的则这个参数称之为哑元.类似于void fun(int); 功能:1保持向前的兼容性,比方说我们需要做成一个成品,然后成品是会不断的更新第一代第二代,当我们 ...
- vue 自学笔记(三) 计算属性与侦听器
一:计算属性 虽然在模板内使用表达式对属性进行处理十分便利,例如在小胡子语法里写number + 1实现对数据的简单处理,但若我们在其中加入大量的代码,使得逻辑变重,导致难以维护.例如下面的代码,并不 ...
- vue 自学笔记记录
vue 自学笔记(一): 知识内容: 安装vue ,创建vue实例,安装第一个组件,单项数据流 https://www.cnblogs.com/baili-luoyun/p/10763163.htm ...
随机推荐
- easyUI droppable组件使用
easyUI droppable组件使用: <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- Request中的方法调用
几种方法的调用: package com.stono.servlet; import java.io.IOException; import java.util.Enumeration; import ...
- jquery checkbox全选 获取值
<style> table { line-height:35px; }</style> <div align="left" style="m ...
- HDU5916
Harmonic Value Description Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
- BZOJ两水题连发~(BZOJ1854&&BZOJ1191)
前言:两题都是省选题不过水的惊人,且都可以用二分图最大匹配做哎--- 1854: [Scoi2010]游戏 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: ...
- javascript 计算两个日期的差值
代码 Typescript版 /** * TimeSpan just like the class TimpSpan in C# ,represent the time difference * @c ...
- node之路由介绍
路由介绍 ----路由是指向客户端提供它所发出的请求内容的机制:----对基于 Web 的客户端 / 服务器端程序而言,客户端在 URL 中指明它想要的内容,具体来说就是路径和查询字符串 下面我看看一 ...
- Ubuntu 制作U盘启动盘
部门需要一台Linux系统远程共享服务器,需要一个启动盘安装.但是由于公司windows 系统都安装了保安软件,而且软件的使用也是有限制的.所以不能使用UltraISO 这类软件制作U盘启动盘.还好部 ...
- Runloop -------iOS
正文 1.Runloop是什么? Runloop是线程的基础架构部分.是一个事件循环处理.是用来不停的调配工作(可以节省CPU)和处理输入事件(输入源(input source)和定时源(timer ...
- PHP 中使用 Composer
在线安装版本: http://www.phpcomposer.com/ 这个是国内的composer网站 thinkphp5自带了composer.phar组件,如果没有安装,则需要进行安装 以下命令 ...