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 ...
随机推荐
- PHP上传图片重命名6种方案
一. 适用场景:无法使用从数据库中返回的自增长数字,给上传图片重命名.这是图片或文件上传的流程决定的.一般图片上传处理过程是,先上传图片到服务器,重命名之后,插入到数据库.也就是说,在数据库中非常容易 ...
- JSP获取绝对物理地址
session.getServletContext().getRealPath(""); 但是 getRealPath("a"+File.separator); ...
- Bloom Filter的基本原理和变种
学习一个东西首先要知道这个东西是什么,可以做什么,接着再了解这个东西有什么好处和优势,然后再学习他的工作原理.下面我们分别从这三点简单介绍一下bloom filter,以及和他的变种. What:在允 ...
- Spring 4 MVC+Hibernate 4+MySQL+Maven使用注解集成实例
Spring 4 MVC+Hibernate 4+MySQL+Maven使用注解集成实例 转自:通过注解的方式集成Spring 4 MVC+Hibernate 4+MySQL+Maven,开发项目样例 ...
- 《JAVASCRIPT高级程序设计》创建对象的七种模式
细看javascript创建对象模式的诞生,具体的脉络为:不使用任何模式——工厂模式——构造函数模式——原型模式——组合使用构造函数模式——动态原型模式——寄生构造函数模式——稳妥构造函数模式.每一种 ...
- [html5] 学习笔记-Canvas应用
通过使用HTML5游戏开发的引擎CreatJS,创建HTML5 Canvas上的更好交互. 1.认识CreateJS CreateJS是一个外部库,用它可以比Canvas更方便的绘制图形. 官网:ht ...
- 比特(bit)、字,字节(B)存储单位之间的关系+其与操作系统位数的关系+不同编译器编译方式下数据类型的表示范围
1.在表示网络传输速度中与表示存储单位的不同: 表示存储单位时:1kB=1024B,但在网络中表示传输速度是1KB=1000B 2.下面介绍表示存储单位时的关系及其与操作系统位数的关系: 1B=8bi ...
- MongoDB基础之一:Conetos下安装MongoDB
1.下载自己需要的版本,我这用的是mongodb-linux-x86_64-2.4.9.tgz #cd /usr/local/src # wget http://fastdl.mongodb.org/ ...
- 类似qq空间的无限回复怎么实现??
在开发网站的时候遇到这样一个问题,下面是自己的一些思路: 1.把数据库简单的设计出来了 2.这是自己写的简单的例子 3.图表形式 1: 1.发表一篇文章 2: 2给1评论 3: 3给2评论 2 ...
- ArcGIS制图表达Representation实战篇2-河流渐变与符号旋转
ArcGIS制图表达Representation实战篇2-河流渐变与符号旋转 by 李远祥 上一章节主要是从实战中使用规则和几何效果,如何分解制图规则.本章主要还是通过一些特殊要求如河流线宽渐变和符号 ...