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 ...
随机推荐
- C# 编写通用的JSON数据进行序列化和反序列化
注意事项:使用JSON系列化和反系列化,必须要添加引用System.Runtime.Serialization. 1.通用类代码如下: /// <summary> /// JSON序 ...
- 关于JAVA IO流的学习
初学Java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见 ...
- CodeForces462B
Appleman and Card Game Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & % ...
- 深入了解GCD
首先提出一些问题: dispatch_async 函数如何实现,分发到主队列和全局队列有什么区别,一定会新建线程执行任务么? dispatch_sync 函数如何实现,为什么说 GCD 死锁是队列导致 ...
- JavaScript字符集编码与解码
一.字符集 1)字符与字节(Character) 字符是各种文字和符号的总称,包括乱码:一个字符对应1~n个字节,一字节对应8位,每位用0或1表示. 2)字符集(Character Set) 字符集是 ...
- cocos2dx内存管理的个人理解
1.一帧开始之后的过程中,将所有执行到的autorelease的对象加入到池中:2.一帧结束之前取出池中的所有对象记作objs,清空池:3.对取出来的objs进行遍历,每个元素进行一次release: ...
- asp.net 验证码技术
网站验证码是一种很常用的技术.下面我介绍下技术上是如何实现的. 验证码是一张图片.我们需要在前台代码中写一段<img>,src指向一张页面(ValidateImage.aspx). < ...
- C++学习的心路历程之心理障碍
断断续续的C++学习已经过了1年多了,可是,我还是没有迈出可以自如输出写点什么的那一步.甚至我因为这个老是怀疑自己的智商,我是真心想学懂,因为这个关系到我的就业,直接关系到我的饭碗.我是十分的着急,可 ...
- 重写titleView
在一些特定的情况下不能使用原有的titleView需要重写titleView代码如下 #import "TitleView.h" @implementation TitleView ...
- 学习笔记--jQuery基础
学习笔记也算总结知识点,有些示例可能没有具体到元素,直接给出的语法.大家有基本理解在看可能会好些. jQuery使用前提,需要安装jQuery库 jQuery 库是一个 JavaScript 文件,您 ...