首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

开源机器人技术工具包(1)

开源机器人技术工具包(1)

传统机器人的类型有很多,形式也各式各样,但是随着软件代理(虚拟机器人)的出现,这些变种又大大扩充了。虚拟机器人借鉴了物理机器人的很多特性。例如,物理机器人的机动性意味着某种形式的移动,但是移动软件机器人(或 代理)也可以有机动性 —— 此处是指在网络上不同主机之间迁移的能力。图 1 给出了物理和虚拟领域中自治机器人的一个简单的分类。本文将着重使用 软件代理 作为在人工合成环境中仿真机器人的机制。
图 1. 自治机器人的简单分类机器人的元素不管我们是在讨论物理机器人还是虚拟(软件)机器人,有一些基本的概念都是相同的。机器人用一些传感器用来感知环境,用一些效应器来对环境进行操作,用一个控制系统让机器人按照我们期望的方式进行反应(参见图 2)。
图 2. 所有机器人系统的基本元素在物理世界中,消防机器人可以使用温度传感器、红外(IR)传感器、全球定位系统(GPS)来感知环境,并使用发动机和灭火器作为效应器来对环境进行操作。而虚拟搜索代理则可以使用 Web 服务器和 HTTP 接口来感知环境(Internet)并对环境进行操作,并使用一个终端作为效应器来与用户进行通信。
图 3 所示的系统是一个封闭循环,传感器负责为控制系统提供数据,而控制系统则驱动着环境中因素的变化。考虑这个问题的另外一种方法是采用反馈这个术语。如果控制系统指定了一个改变环境的操作,那么传感器就可以验证发生了这种变化,并将环境的新状态反馈给控制系统。而开放循环系统只能假设操作成功改变了环境的状态,这永远都不是什么好事。
图 3. 对环境进行封闭循环操作在构建机器人时,我们必须要从一个整体来考虑传感器、效应器和控制系统。对于本文来说,我们将着重介绍控制系统,以及在将其嵌入物理机器人之前可以对其进行仿真和验证的方法。
机器人技术和仿真仿真在机器人技术领域扮演了一个关键的角色,因为它可以进行一些实验,如果没有仿真技术,这些实验可能会非常昂贵,而且需要花费大量的时间。仿真让我们可以在动态的合成环境中尝试一些做法,同时可以搜集这些响应数据,从而确定控制系统的品质。仿真还可以允许对机器人控制系统进行革新,这依赖于很多代控制系统的随机排列(遗传算法可以证实这一点)。
Linux 和机器人技术Linux 是机器人技术采用的一个流行操作系统,因为从根源上来说,它与机器人技术的历史是类似的。机器人技术是一个实验领域。它是有关优化、尝试新事务和在将来不断革新的一种技术。Linux 从根本上来说,在这些方面也都具有相同的特性。早期的机器人都非常怪异,很少可以展示出实际应用价值。类似地,Linux 最开始也只是某些“瘾君子”的操作系统,但是它现在已经成长为一个功能强大而且十分稳定的操作系统了,我们在从嵌入式设备到超级计算机(包括很多机器人)上面都可以找到 Linux 的踪迹。

仿真的一大优点表现在多机器人的仿真中。为这些仿真提供的一个流行比赛是机器人足球赛,在这种比赛中,参赛选手可以使用仿真机器人,也可以使用物理机器人,一组机器人会与另外一组机器人展开世界上流行的英式足球较量(这使得这项比赛非常适合成为一项国际赛事)。机器人必须能够完全与整个团队中的其他机器人进行合作(可能相互之间需要进行通信),并与对手团队中的机器人展开竞赛,这对于机器人的行为是一项挑战性极强的测试。
但是对于仿真来说,也有些频感乏术的地方。真实的世界往往都非常凌乱,并且充满了各种噪音,因此这种合成环境基本上都很难进行建模。对机器人进行仿真通常都非常困难,因为真实世界中的传感器通常都可能呈现出不同的或非预期的特性。尽管有这些缺陷,我们依然可以通过在合成环境中对机器人进行仿真而学习到很多知识。
Linux 上的开源工具包有几个开源工具包可以用来构建机器人控制系统。本文将介绍移动机器人仿真器和物理建模系统,最后再介绍一下一个可以支持在物理机器人中嵌入仿真控制系统的仿真器。这些工具包大部分都可以在 Linux 上运行,这主要是由于 Linux 的开源模型。开源软件是这样一个平台:我们在这种平台上只使用很少的努力就可以很快地开发软件,因此这种平台是非常理想的。Linux 也可以进行定制,这在其他操作系统中是不可能的(例如将内核做得最小并对内核进行扩充)。有关这些工具包的链接都在本文末尾  一节中可以找到。
ODERussell Smith 的 Open Dynamics Engine(ODE)是一个开源的物理引擎,使用它可以仿真铰接式固形体运动。这样不管我们使用哪种图形库(可能使用 OpenGL),都可以对真实对象的物理特性进行仿真。我们可以使用 ODE 来对合成环境中的各种对象进行建模,例如三维游戏环境中的人物或虚拟驾驶中的交通工具。除了速度快之外, ODE 还可以支持实时仿真的碰撞检测。
什么是铰接式固形体?铰接式固形体(articulated rigid body) 就是一个使用各种连接手段将各种图形连接在一起而构成的一个结构。例如,我们可以认为构成腿或交通工具底盘、悬吊系统、轮子等元素的装置都是连接。ODE 可以有效地对这些元素进行建模,包括摩擦力模型。

ODE 目前可以支持球窝、铰链、滑块、定轴、角电机和 hinge-2 (用于交通工具的连接)连接类型,以及其他一些连接类型。它还可以支持各种碰撞原语(例如球面碰撞和平面碰撞)和几个碰撞空间。
ODE 主要是使用 C++ 语言编写的,但是它也提供了 C 和 C++ 的清晰接口来帮助我们与应用程序进行集成。有关 ODE 更好的一点是它发行所采用的许可证:LGPL(GNU Lesser General Public License)和 BSD License。在这两个许可证中,我们都可以在商业产品中使用 ODE 的源代码,而不需任何费用。其结果是我们在很多商业游戏、飞行模拟器和虚拟现实仿真中都可以找到 ODE。
清单 1 中的源代码给出了一个简单的例子,这个环境中中存在火星的地心引力,里面有一个球具有向上的速度。由于这个环境中具有地心引力,因此向上的速度不会坚持很久;最后这个球会上升到顶点并开始下降。在初始化完成之后(即在这个环境中创建对象并设置好属性之后),我们就可以通过 dWorldStep 对这个世界中的物理特性进行仿真了。要理解发生的现象,可以经常调用 dBodyGetPosition 并给它传入球的标识符来获得它的当前位置。
清单 1. 简单的 ODE 实验:地心引力环境中的球
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <ode/ode.h>

#define time_step        (float)0.1

int main()
{
  dWorldID myWorld_id;
  dBodyID mySphere_id;
  dMass sphereMass;
  const dReal *pos;
  float time = 0.0;

  /* Create a new world */
  myWorld_id = dWorldCreate();

  /* Create a sphere in the world */
  mySphere_id  = dBodyCreate( myWorld_id );

  /* Set the world's global gravity vector (Mars) -- x,y,z */
  dWorldSetGravity( myWorld_id, 0, 0, -3.77 );

  /* Set the Sphere's position in the world -- x,y,z */
  dBodySetPosition( mySphere_id, 0, 0, 100 );

  /* Set the Sphere's mass (density, radius) */
  dMassSetSphere( &sphereMass, 1, 2 );
  dBodySetMass( mySphere_id, &sphereMass );

  /* Give the sphere a small amount of upward (z) velocity */
  dBodySetLinearVel( mySphere_id, 0.0, 0.0, 5.0 );

  /* Run the simulation */
  while (time < 5.0) {

    /* Simulate the world for the defined time-step */
    dWorldStep( myWorld_id, time_step );

    /* Get the current position of the sphere */
    pos = dBodyGetPosition( mySphere_id );

    std::cout << "position (" << pos[0] << ", "
             << pos[1] << ", " << pos[2] << ")\n";

    /* Next time step */
    time += time_step;

  }

  /* Destroy the objects */
  dBodyDestroy( mySphere_id );
  dWorldDestroy( myWorld_id );

  return 0;
}




因此,如果我们需要一个工业级质量的物理引擎(它可以在 Linux 上运行,也可以在其他平台上运行)来仿真移动机器人或现实环境中无人驾驶交通工具,那么 ODE 就是一个极好的选择。与 OpenGL 应用程序编程接口(API)一起使用,ODE 就可以生成由真实相片构成的图形,并且具有真实的物理特性。
返回列表