webots自学笔记(五)使用物理插件ODE建立铰链
原创文章,来自“博客园,_阿龙clliu” http://www.cnblogs.com/clliu/,转载请注明原文章出处。
在一些三维制图软件或仿真软件里,都有运动副的概念,webots的节点里好像没有,不要担心,在物理插件里可以做到,不过要学习有关于ODE(开源动力学引擎的)一些内容。在webots中,怎样建立一个铰链呢,我做了一个简单的例子,小区门口的那种可以控制的栏杆,效果图如下。

那每一个杆件,它们的关系在怎么定义呢?其实关系是在ODE中定义的,我们只需要建立一些没有约束关系的杆件就行。场景树贴出在下面,虽然这些节点是以servo定义的,但是在不需要约束关系的杆件,例如连杆3,将type改成none,那么,杆件3与gan Robot的关系就不是servo关系了,在仿真中可以看成两个零件。模型就不介绍怎么建立了,后面会给出整个仿真的文件。

建立完模型之后,点击菜单栏的 向导 —>新物理插件,代码如下:
//来自“博客园,_阿龙clliu” http://www.cnblogs.com/clliu/,
#include <ode/ode.h>
#include <plugins/physics.h> dBodyID getBody(const char *def) {
dBodyID body = dWebotsGetBodyFromDEF(def);
if (! body) dWebotsConsolePrintf("Warning: did not find body with DEF name: %s", def);
return body;
} void webots_physics_init(dWorldID world, dSpaceID space, dJointGroupID contactJointGroup) { //得到杆件的ID
dBodyID link1 = getBody("link1");
dBodyID link2 = getBody("link2");
dBodyID link3 = getBody("link3");
dBodyID link4 = getBody("link4");
dBodyID link5 = getBody("link5");
dBodyID link6 = getBody("link6"); //创建一个铰链副
dJointID hingeJoint = dJointCreateHinge(world, );
//定义铰链副约束的两个零件,link1和link3
dJointAttach(hingeJoint, link1, link3); //定义铰链的作用点
dVector3 hinge_interface;
//将link1零件自身坐标系的(0,0,0)点转为全局坐标系坐标,赋给hinge_interface
dBodyGetRelPointPos(link1, , , , hinge_interface); //设置铰链作用点
dJointSetHingeAnchor(hingeJoint, hinge_interface[], hinge_interface[], hinge_interface[]);
//设置铰链作用轴(作用方向)
dJointSetHingeAxis(hingeJoint, , , ); //link4?link3??
hingeJoint = dJointCreateHinge(world, );
dJointAttach(hingeJoint, link4, link3); dBodyGetRelPointPos(link4, , -0.05, , hinge_interface); dJointSetHingeAnchor(hingeJoint, hinge_interface[], hinge_interface[], hinge_interface[]);
dJointSetHingeAxis(hingeJoint, , , ); //link5?link3??
hingeJoint = dJointCreateHinge(world, );
dJointAttach(hingeJoint, link5, link3); dBodyGetRelPointPos(link5, , -0.05, , hinge_interface); dJointSetHingeAnchor(hingeJoint, hinge_interface[], hinge_interface[], hinge_interface[]);
dJointSetHingeAxis(hingeJoint, , , ); //link6?link3??
hingeJoint = dJointCreateHinge(world, );
dJointAttach(hingeJoint, link6, link3); dBodyGetRelPointPos(link6, , -0.05, , hinge_interface); dJointSetHingeAnchor(hingeJoint, hinge_interface[], hinge_interface[], hinge_interface[]);
dJointSetHingeAxis(hingeJoint, , , ); //link4?link2??
hingeJoint = dJointCreateHinge(world, );
dJointAttach(hingeJoint, link4, link2); dBodyGetRelPointPos(link4, , 0.05, , hinge_interface); dJointSetHingeAnchor(hingeJoint, hinge_interface[], hinge_interface[], hinge_interface[]);
dJointSetHingeAxis(hingeJoint, , , ); //link5?link2??
hingeJoint = dJointCreateHinge(world, );
dJointAttach(hingeJoint, link5, link2); dBodyGetRelPointPos(link5, , 0.05, , hinge_interface); dJointSetHingeAnchor(hingeJoint, hinge_interface[], hinge_interface[], hinge_interface[]);
dJointSetHingeAxis(hingeJoint, , , ); //link6?link2??
hingeJoint = dJointCreateHinge(world, );
dJointAttach(hingeJoint, link6, link2); dBodyGetRelPointPos(link6, , 0.05, , hinge_interface); dJointSetHingeAnchor(hingeJoint, hinge_interface[], hinge_interface[], hinge_interface[]);
dJointSetHingeAxis(hingeJoint, , , );
} void webots_physics_step() { } void webots_physics_draw() { } int webots_physics_collide(dGeomID g1, dGeomID g2) { return ;
} void webots_physics_cleanup() { }
设置完成物理引擎,在worldInfo节点下physics节点下选择该物理插件。控制器代码如下:
//来自“博客园,_阿龙clliu” http://www.cnblogs.com/clliu/,
#include <webots/robot.h>
#include <webots/servo.h>
#include <assert.h>
#include <math.h> #define TIME_STEP 32
#define rad_2_deg(X) ( X / pi * 180.0 )
#define deg_2_rad(X) ( X / 180.0 * pi )
#define pi 3.1415926
#define frep 1 int main(int argc, char **argv)
{ double t = ;
double servo_pos; wb_robot_init(); WbDeviceTag servo;
servo = wb_robot_get_device("link2");
assert(servo); while (wb_robot_step(TIME_STEP) != -) { servo_pos = + * sin(frep * t + pi);
wb_servo_set_position(servo,deg_2_rad(servo_pos)); t += (double)TIME_STEP / 1000.0;
}; wb_robot_cleanup(); return ;
}
如果没有什么错误,就能实现之前GIF的效果了,如果没做出来,也没关系,给出原文件,仿真文件下载地址。
如果有什么疑问,欢迎再下方提问。
webots自学笔记(五)使用物理插件ODE建立铰链的更多相关文章
- webots自学笔记(一)软件界面和简单模型仿真
本人是某非理工类某高校大四狗,由于毕设研究需要使用webots软件,在学习使用webots的过程花费了很多时间.由于这个软件基本没有什么中文资料,所以想把自己所学到的一些东西写下来,如有什么错误的地方 ...
- webots自学笔记(二)节点与机器人建模
原创文章,出自"博客园, _阿龙clliu" :http://www.cnblogs.com/clliu/ 上一次介绍了界面和一个简单的自由落体,然而在实际运用中,机器人的结构都是 ...
- webots自学笔记(三)控制器与电机控制
原创文章,来自“博客园,_阿龙clliu” http://www.cnblogs.com/clliu/,装载请注明原文章出处. 上一次建了四足机器人的模型,模型文件在上一篇有下载地址,这一次用控制器让 ...
- webots自学笔记(四)传感器API使用、查看官方文档
原创文章,来自“博客园,_阿龙clliu” http://www.cnblogs.com/clliu/,转载请注明原文章出处. 不能说webots的学习资料少,只能说 ...
- webots自学笔记(六)实用控制器函数补充
原创文章,来自"博客园,_阿龙clliu" http://www.cnblogs.com/clliu/,转载请注明原文章出处. 用Webots软件做机器人仿真时,可以编 ...
- webpack4 自学笔记五(tree-shaking)
全部的代码及笔记都可以在我的github上查看, 欢迎star: https://github.com/Jasonwang911/webpackStudyInit/tree/master/ThreeS ...
- JDK源码阅读-------自学笔记(五)(浅析数组)
一.数组基础 1.定义和特点 数组也可以看做是对象,数组变量属于引用类型,数组中每个元素相当于该队形的成员变量,数组对象存储在堆中. 2.初始化数组 常用类初始化 // 整型初始化 int[] int ...
- vue 自学笔记记录
vue 自学笔记(一): 知识内容: 安装vue ,创建vue实例,安装第一个组件,单项数据流 https://www.cnblogs.com/baili-luoyun/p/10763163.htm ...
- python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍
python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...
随机推荐
- 数据挖掘学习笔记--AdaBoost算法(一)
声明: 这篇笔记是自己对AdaBoost原理的一些理解,如果有错,还望指正,俯谢- 背景: AdaBoost算法,这个算法思路简单,但是论文真是各种晦涩啊-,以下是自己看了A Short Introd ...
- Hadoop权威指南:HDFS-写入数据
Hadoop权威指南:HDFS-写入数据 FileSystem类有一系列的新建文件的方法.最简单的方法是给准备建的文件指定一个Path对象,然后返回一个用于写入数据的输出流: public FSDat ...
- webpack基础入门
我相信,有不少的朋友对webpack都有或多或少的了解.网上也有了各种各样的文章,文章内作者也写出了不少自己对于webpack这个工具的理解.在我刚刚接触webpack的时候,老实说,网上大部分的文章 ...
- 编写JQuery插件-1
看到这篇文章的人相信大家都学会了jq,或者正在用jq,在这里简单介绍一下jq的插件封装: jQuery的插件主要分为3种类型: 1.封装对象方法的插件 这种插件是将对象的方法封装起来,用于对通过选择器 ...
- maven常用命令介绍(持续更新)
一.Maven的基本概念 主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 1.1.项目构建 项目构建过程包括[清理项目]→[编译项目]→[测试项目]→[生成测试报告]→[打包项目]→[ ...
- (@WhiteTaken)设计模式学习——简单工厂
最近工作比较忙,所以没有怎么写博客,这几天将集中学习一下(厉风行)讲解的设计模式的相关知识,并对主要的代码进行介绍. 言归正传,接下来介绍最简单也是最基础的简单工厂设计模式. 什么是简单工厂? 简单工 ...
- Ffmpeg 视频教程
最近一段时间找时间录制了一些Ffmpeg视频教程,还有录制完毕,会持续更新,内容会包含Ffmeg保存文件,网络流转发, 编码,解码,播放器制作,以及服务端搭建等等,适合初学者,有需要的朋友的可以关注: ...
- php文件上传分类
<?php/** * 文件上传类 * @author lijiamin * @time 2017-02-17 * @email 1195989301@qq.com */class Upload{ ...
- 一步一步在Windows中使用MyCat负载均衡 上篇
传统关系型数据库的分布式开发通常需要自己做,不仅耗时耗力而且效果不是很理想,当想快速搭建时,最初想到的是看有没有第三方,网上牛人还是很多的,做得比较好的其中之一Mycat,它是开源的分布式数据库系统, ...
- MATLAB中的分类器
MATLAB中的分类器 目前了解到的MATLAB中分类器有:K近邻分类器,随机森林分类器,朴素贝叶斯,集成学习方法,鉴别分析分类器,支持向量机.现将其主要函数使用方法总结如下,更多细节需参考MAT ...