原创文章,来自“博客园,_阿龙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自学笔记(三)控制器与电机控制的更多相关文章

  1. webots自学笔记(六)实用控制器函数补充

    原创文章,来自"博客园,_阿龙clliu" http://www.cnblogs.com/clliu/,转载请注明原文章出处.       用Webots软件做机器人仿真时,可以编 ...

  2. webots自学笔记(二)节点与机器人建模

    原创文章,出自"博客园, _阿龙clliu" :http://www.cnblogs.com/clliu/ 上一次介绍了界面和一个简单的自由落体,然而在实际运用中,机器人的结构都是 ...

  3. webots自学笔记(一)软件界面和简单模型仿真

    本人是某非理工类某高校大四狗,由于毕设研究需要使用webots软件,在学习使用webots的过程花费了很多时间.由于这个软件基本没有什么中文资料,所以想把自己所学到的一些东西写下来,如有什么错误的地方 ...

  4. webots自学笔记(五)使用物理插件ODE建立铰链

    原创文章,来自"博客园,_阿龙clliu" http://www.cnblogs.com/clliu/,转载请注明原文章出处. 在一些三维制图软件或仿真软件里,都有运动副的概念,w ...

  5. webots自学笔记(四)传感器API使用、查看官方文档

           原创文章,来自“博客园,_阿龙clliu” http://www.cnblogs.com/clliu/,转载请注明原文章出处.           不能说webots的学习资料少,只能说 ...

  6. webpack4 自学笔记三(提取公用代码)

    全部的代码及笔记都可以在我的github上查看, 欢迎star:https://github.com/Jasonwang911/webpackStudyInit/tree/master/commonT ...

  7. 【C++初学者自学笔记三】哑元函数、缺省参数、内联函数(模块二,PS:需要用到重载函数)

    一,哑元函数:一个函数的参数只有类型没有名字的则这个参数称之为哑元.类似于void fun(int); 功能:1保持向前的兼容性,比方说我们需要做成一个成品,然后成品是会不断的更新第一代第二代,当我们 ...

  8. vue 自学笔记(三) 计算属性与侦听器

    一:计算属性 虽然在模板内使用表达式对属性进行处理十分便利,例如在小胡子语法里写number + 1实现对数据的简单处理,但若我们在其中加入大量的代码,使得逻辑变重,导致难以维护.例如下面的代码,并不 ...

  9. vue 自学笔记记录

    vue 自学笔记(一): 知识内容:  安装vue ,创建vue实例,安装第一个组件,单项数据流 https://www.cnblogs.com/baili-luoyun/p/10763163.htm ...

随机推荐

  1. 如何在asp.net页面使用css和js

    一.如何在asp.net页面中使用css1.可以直接写在需要样式控制的控件里 例如:<div style="border:#ff6100 1px solid">< ...

  2. MyBatis-Generator的配置说明和使用

    关于MyBatis: MyBatis Generator (MBG) 是一个Mybatis的代码生成器 MyBatis 和 iBATIS. 他可以生成Mybatis各个版本的代码,和iBATIS 2. ...

  3. HDU1494(dp)

    跑跑卡丁车 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  4. (二)Windows下Redis的主从复制

    Redis拥有非常强大的主从复制功能,而且还支持一个master可以拥有多个slave,而一个slave又可以拥有多个slave,从而形成强大的多级服务器集群架构.目前在同一台window下安装三个r ...

  5. 最新升级的火狐38.0.6识别ajax调用返回的""空值可能有异常。

    自已在调用一段ajax开发中,返回的是空值 string result = string.Empty;return result; 但在页面进行$.ajax调用 时 输出alert(result);应 ...

  6. spring boot框架eclipse快速搭建

    1.maven安装配置好,使用eclipse创建maven项目(选择maven-archetype-quickstart) 2.然后进入http://docs.spring.io/spring-boo ...

  7. uml系列(七)——交互图

    交互图是uml中描述系统中的对象如何进行交互动作的 . 废话不多说,还是来张图: 概念          交互图,主要描述的是系统中的一组对象的消息的传递的,为对象间的交互定义了一个可视的表示方法. ...

  8. 数据库--iOS

    1.创建表 @"create table if not exists Person(id integer primary key autoincrement,name text,gender ...

  9. python书籍推荐

    python书籍推荐列表: 技巧:关于如何在windows平台上行获取目录下的文件名称.(我的python书籍的位置E:\Python\Python_book) D:\>e: E:\>cd ...

  10. ICMP(网际控制报文协议)

    为了更有效的提高ip数据报的成功转发和交付的效率,在网际层使用了icmp网际控制报文协议,这个协议允许主机和路由器提供差错和异常情况的报告,icmp不是高层协议,而是网际层的协议,加在ip数据报中一起 ...