上一节我们介绍了如何运行一个仿真,相信大家都迫不及待的想创建自己的仿真了吧,那就请往下看吧。下载的开发包内的tutorial是以创建一个复合摆为例子说明如何创建仿真的,这里我就以自由落体的小球为例,采用最简单的模型来说明整个仿真程序的整体结构。
Yobotics机器人仿真开发包教程(二)――创建和编译仿真
刘念邱 2004年4月7日
上一节我们介绍了如何运行一个仿真,相信大家都迫不及待的想创建自己的仿真了吧,那就请往下看吧。
下载的开发包内的tutorial是以创建一个复合摆为例子说明如何创建仿真的,这里我就以自由落体的小球为例,采用最简单的模型来说明整个仿真程序的整体结构。
一、建立工程
运行JBuilder(我现在用的是JBuilder9 personal),选择File-〉;New Project新建一个工程,工程名设为freeball(也可以使自己喜欢的名字),在Directory一栏选择保存的目录,后两步都使用默认设置,所以点击完成即可,如图所示:
二、编写仿真程序
首先创建仿真类,点击File-〉New Class...打开对话框,在Class name一栏中输入类名,这里是FreeBallSimulation,注意选择Generate main method复选框(图片中还没勾选),如下图所示:
完成后点击ok即可。这时JBuilder已经自动为我们生成了FreeBallSimulation.java文件,里面包含了下述代码:
package freeball;
/**
* 〈p〉Title: 〈/p〉
* 〈p〉Description:〈/p〉
* 〈p〉Copyright: Copyright (c) 2004〈/p〉
* 〈p〉Company: 〈/p〉
* @author not attributable
* @version 1.0
*/
public class FreeBallSimulation {
public FreeBallSimulation() {
}
public static void main(String[] args) {
FreeBallSimulation freeBallSimulation1 = new FreeBallSimulation();
}
}
接着再用同样的方法新建一个FreeBallRobot类,这里需要注意要去掉Generate main method复选框中的勾,完成后同样会生成FreeBallRobot.java文件,按照下面的内容输入代码,其中黑色的为自动生成的,红色的为手工输入的:
package freeball;
import com.yobotics.simulationconstructionset.*; //这里输入yobotics开发包的所有类
import javax.vecmath.*; //这里输入了java3d扩展中的vector数学库
/**
* 〈p〉Title: 〈/p〉
* 〈p〉Description: 〈/p〉
* 〈p〉Copyright: Copyright (c) 2004〈/p〉
* 〈p〉Company: 〈/p〉
* @author not attributable
* @version 1.0
*/
public class FreeBallRobot extends Robot{
public FreeBallRobot() {
super("freeball"); //设置仿真的名字
Joint ball_joint = new FloatingJoint("ball_joint",new Vector3d(0.0,0.0,1.0),this); //新建一个自由移动的接点,"ball_joint"为该接点的名称,位置为(0,0,1),也就是在原点上方1的位置
Link ball = new Link("ball"); //新建一个仿真的实体
ball.setMass(1.0); //设置它的质量为1.0
ball.setComOffset(0.0,0.0,0.0); //设置它的质心偏移量
ball.setMomentOfInertia(1.0,1.0,1.0); //设置它的转动惯量
ball.addSphere(0.05); //设置它的外形,这里是半径为0.05的球
ball_joint.setLink(ball); //设置与接点相关联的实体
this.addRootJoint(ball_joint); //设置仿真的根节点
}
}
完成FreeBallRobot.java的编码后让我们再来完成FreeBallSimulation的编码吧,以下是它的代码:
package freeball;
import com.yobotics.simulationconstructionset.*; //这里输入yobotics开发包的所有类
/**
* 〈p〉Title: 〈/p〉
* 〈p〉Description: 〈/p〉
* 〈p〉Copyright: Copyright (c) 2004〈/p〉
* 〈p〉Company: 〈/p〉
* @author not attributable
* @version 1.0
*/
public class FreeBallSimulation {
private SimulationConstructionSet sim; //声明一个仿真类
public FreeBallSimulation() {
FreeBallRobot freeball = new FreeBallRobot(); //定义一个FreeBallRobot,这也是这次我们要方针的对象
sim = new SimulationConstructionSet(freeball); //定义仿真类,并关联要仿真的机器人
Thread myThread = new Thread(sim); //这一行与下一行新建一个线程来运行方针,基本上不用改动
myThread.start();
}
public static void main(String[] args) {
FreeBallSimulation freeBallSimulation1 = new FreeBallSimulation();
}
}
编写完代码就按或Run-〉;Run Project运行仿真,第一次运行会出现Project Properties对话框的Run页,要求选择运行的main class,点击"New"出现如下窗口:
点击“...”按钮,在Browse页中选择freeball-〉;FreeBallSimulation,完成确定即可。完成配置后再点击运行,是不是熟悉的仿真界面就出现在眼前了,如下图:
开始仿真,可以看到小球不断加速下落,很快穿过地板看不到了,也许你会问为什么掉在地上没有停下来,因为目前的仿真并没有加入地面因素,所以尽管我们能看到地面,但对于小球,周围是空无一物的。
三、分析仿真程序整体结构
从刚刚编写的代码可以看出,一个基本的仿真程序至少包含两个类――Robot类和Simulation类,一个描述了要仿真的机器人的实体,另一个则是仿真环境,缺一不可(注意:尽管开发包所附的pdf指南中Link example的代码只有Simulation类,传入构造函数的是null,实际上是不允许的,SimulationConstructionSet只接受Robot类,不然会出错,Link example实际上是先定义Robot nullRob = null实现传入null,尽管这样看起来只有一个simulation类,实际上依然有robot类)。
首先看Simulation类,它是程序的main class,首先我们需要一个SimulationContructionSet,它负责构建和维护整个仿真环境,然后我们加入需要仿真的机器人(这里的机器人指的是仿真的实体对象),通过构造函数将机器人与仿真环境联系起来。然后开始仿真,整个流程如下所示:
定义机器人-〉定义仿真环境并与机器人建立关联-〉开始运行
之所以没有将声明SimulationContructionSet作为第一步,是因为我们完全可以先定义机器人,然后声明仿真环境的同时使用new。
再来看Robot类,它是从基类Robot继承下来的,具有实体的基本特性以及与仿真环境的接口,我们只需要根据自己的要求加入特性即可。
Yobotics仿真包的活动元素为joint,它定义了一个活动元,这里我们使用了一个FloatingJoint,它可以随意移动,还有PinJoint等,不同的joint具有不同的自由度。Joint代表了活动方式,并没有实体,而link则代表了实体,具有质量、质心、形状等属性,一一定义好这些属性后,便可以将Joint与Link关联起来,形成完整的实体,最后使用this.addRootJoint将该接点设为根接点,根接点的坐标系以环境为准,如果要新增别的接点,都必须要么是根接点,要么是子接点,每一接点的坐标都是相对上一接点位置固定不变的。若一个接点向上搜索始终找不到根接点,则仿真中该接点链将不被处理。
总结:
这里我们通过一个简单的程序,让大家了解了一个完整的仿真程序至少包含两个类:机器人类与仿真环境类,仿真环境类必须关联机器人类。机器人的实体都是由Joint跟Link组成,一个代表活动方式,一个包含了实体信息,Joint必须与一个Link相关联。
相关文档:
Yobotics机器人仿真开发包教程(一)――运行一个仿真
相关讨论:
phpbb2/viewtopic.php?t=3270
|