65.9K
CodeProject 正在变化。 阅读更多。
Home

为机器人构建用户界面 - 第一部分。

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (7投票s)

2014 年 9 月 24 日

CPOL

14分钟阅读

viewsIcon

28894

这套教程演示了如何使用可视化工具包 (VTK) 来开发机器人用户界面。

这套教程演示了如何使用可视化工具包 (VTK) 来开发机器人用户界面。这是一个广泛的主题,因此将分为 3 篇文章,其中包含有关如何开始使用这些技术的建议和注意事项(根据我们的经验 - #include grainofsalt.h)。文章中同时讨论了 Windows 和 Linux(Ubuntu)的设置,以简化您的配置。

本系列文章面向对机器人技术有兴趣的初学者/中级 Python 爱好者(我们自己肯定不是专家)。如果您拥有 AR Drone、Brookstone Rover,或者模型直升机上的摄像头,并希望为其构建自定义用户界面,这可能是一个不错的起点。

整个主题分为 3 篇文章(作为一系列链接)

  1. 文章 1 - 项目目标和环境设置

    1. 项目目标

    2. 这些技术的作用以及它们为何如此吸引人

    3. 安装和设置 VTK 和 Python(Windows 和 Linux)

  2. 文章 2 - 使用 VTK 构建 3D 环境(分 3 部分)

    1. VTK 基础 - 设置场景和绘制图元

    2. VTK 可视化 - 复杂模型和表示真实世界传感器

    3. VTK 交互 - 摄像头、键盘和 3D 眼镜

  3. 文章 3 - 添加 2D 界面和通信

    1. 使用 PyQt 构建 2D UI - 使用 PyQt 包含 2D 小部件和绘图

    2. LCM 通信 - 将应用程序连接到真实世界设备

第一篇文章将介绍项目目标和开发环境的设置。

第 0 部分 - 项目目标

这个业余项目的目的是为应用程序构建一个精美的用户界面 (UI)。UI 的想法是:

  • 它将同时显示 2D 图形+信息,并包含环境的 3D 表示

  • 它将允许用户在 2D 层(例如,使用按钮、列表框等)和 3D 层(通过单击和光线追踪)中自然地进行交互

  • 它将与外部实时数据源进行通信

  • 它必须是跨平台的

  • 它应该具有灵活性,因为需求可能随时更改(……给我看一个没有这个条款的项目 :p)

这与我们过去处理过的许多项目非常相似。我敢打赌我们不是唯一这样做的。我的意思是,说实话,谁不想为他们的应用程序拥有一个真正花哨的 UI 呢?

“……不不不!不要那些花哨的图形烂货,我想要一个带有迷幻绿命令提示符的终端…… 32 位我的彩虹屁……太棒了,让它一行一行打印位置坐标和调试信息!……是的,现在让它打印得更快,这样我们就看不清了!是的!就像《黑客帝国》一样,没错!太棒了!我的天啊,iPhone 用户一定会喜欢的!!!!!”

……好吧……。

我们已经通过各种方式解决了这些要求。

嗯,这里有另一种方法可以做到这一点。但是,这是其中一种真正让我们惊叹的方法。它优雅而不压抑,快速而不至于显得粗糙。它有缺点,主要是文档不够多,这就是为什么我们认为需要将几页内容串联起来。

如果您想感受一下这项技术,并且还没有看过 MIT 参加 DARPA Urban Challenge 的视频,我建议您看看‘2007 年 DARPA 城市挑战赛 MIT 团队方法总结’,以获得一些想法。这是使用此类可视化+通信骨干的绝佳示例。这让我们惊叹不已——它就像机器人领域的 3D Max!

最初的想法实际上是与那个项目的一些人交流产生的。我们刚刚开始另一个可视化+通信业余项目,并且那些参与过该项目的一些人推荐了一个类似的软件结构。最初我们打算采用 DirectX 方法的克隆(ARX 视频),但 VTK/LCM 的灵活性足以让我们下定决心,即使您想从中去除酷炫因素。

第 1 部分 - 技术

layers_cutpng

那么……将使用什么?

以下技术将作为基础,但可能会根据我们发现的缺点或新事物而发生变化。如果您有任何建议或知道任何潜在的陷阱,请告诉我们。下一部分将讨论安装这些组件,本部分仅讨论它们以及它们在项目中的用途。

Python

它做什么?

  • Python 是一种编程语言,将用于将所有独立的软件组件焊接在一起,形成一个功能性的 UI。

为什么选择 Python?

  • 无内存管理

  • 跨平台,没有严重的问题

  • 无需编译,是一种脚本语言

  • 曾在数据分析项目中使用过,并开始喜欢它

一位用户问道:“为什么不直接使用 C/C++、VTK 和 Qt?”——这是我们一开始没有想到的。老实说,这归结于开发时间。虽然 C 在运行时会更快

  • Python 进行内存管理(不用追逐段错误——嘿,我们都会犯错,我们可能尤其如此)

  • 您构建的内容将跨平台运行,只需将文件复制过去即可。如果 Python 的导入语句有效,程序就应该可以运行。C/C++ 的跨平台有时会更棘手

可视化工具包 (VTK)

VTK-JPEG

它做什么?

  • VTK 是 Kitware 的一个基于 OpenGL 的可视化框架,用于科学绘图和数据可视化。它专门从事 3D,因此与 matplotlib 或 ggplot 有点不同。

为什么选择 VTK?

  • 对于渲染具有点云、网格和模型的复杂大型 3D 场景非常强大

  • 硬件加速 – 性能不是问题

  • 跨平台

  • 从案例研究来看,VTK 已被证明适用于此类应用程序

PyQt

164px-Python_and_Qt.svg

它做什么?

  • PyQt 是 Qt UI 库的包装器。它允许您构建表单和对话框,类似于 Microsoft 的 WPF 或 Java 的 SWING。

为什么选择 PyQt?

  • 您可以处理所有按钮、列表框、组合框、文本框、浏览器、多媒体播放器等

  • 完美地集成在 VTK 之上,允许您在 3D 环境之上构建 2D UI。

  • 可以使用 Qt Designer 设计 GUI,并将其导出以在 Python 中通过 PyQt 使用(花哨的 GUI 而无需在代码中 fiddling - 获胜!)。

LCM (Lightweight Communications and Marshalling)

lcm

它做什么?

  • LCM 允许您在不同机器和不同语言之间通过网络发布和消耗实时数据。

为什么选择 LCM?

  • 在网络应用程序中跳过所有痛苦的网络套接字代码。

  • 它让我想起了 XPDS 网络层,所以设计比较熟悉(但 LCM 的功能要广泛得多)。

  • 想想 ROS(机器人操作系统),但……嗯……更轻量级,据我所闻。我没有太多关于这方面的信息,但它是一位非常优秀的团队推荐的,这对我来说已经足够了(通过关联证明,哈哈)。

第 2 部分 - 设置您的开发环境

本节分为 3 部分 -

  • 第 2a 部分是在 Windows 中设置您的开发框架

  • 第 2b 部分是在 Linux 中设置您的开发框架

  • 第 3c 部分适用于 Windows 和 Linux 用户

根据您想遵循哪种方式,只需跳转到 2a 或 2b,最后是 2c(适用于两者)。

第 2a 部分 - 使用 Windows 设置您的开发环境

本节讨论如何在 Windows 中设置您的开发环境。如果您想在 Linux 操作系统中工作,请跳到第 2b 部分。

编辑(Daniel):如果您查看 Linux 的设置,Windows 用户会很高兴看到简单的说明。假设您已安装 Windows。

编辑(Sam):好吧,正如古老的爱尔兰祝福(略有改动)所说……

May the login screen rise up to meet you.
May the windows always be at your back.
May the GNU shine warm upon your face,
and free code fall soft upon your development fields.
And until we meet again,
...May you blue-screen at least once a day.

选项 1:使用 PythonXY 安装

首先需要安装 Python。如果您还没有 Python 设置,使用 Python(x,y) 设置所有必需的工具实际上很容易。

以下是 Python(x,y) 版本 2.7.x 的完整安装的快速步骤

  • 这里下载 Python(x,y) 安装程序

  • 在安装 Python(x,y) 之前,卸载任何其他 Python 发行版。

  • 在安装过程中,请确保安装 VTK 和 PyQt 插件。

.822241/PythonXY_VTK.png

  • 喝杯咖啡……

选项 2:使用 WinPython 安装

以下步骤由William Shipman提供,供那些想要升级现有安装或只想安装组件的用户使用(谢谢 William!)。

  • 如果您还没有安装WinPython,请安装它。

  • 使用 WinPython 并从“http://www.lfd.uci.edu/~gohlke/pythonlibs/”获取所需的包。

  • VTK 包有两种类型:一种是使用 PyQt 构建的,另一种是不带 PyQt 的。因此,您只需确保获取带有 PyQt 的包。据我所知,Christoph Gohlke 的安装程序(上面的链接)中包含了所有 PyQt 开发工具。所有包都以 .exe 安装程序的形式提供。大多数情况下,安装就像双击 .exe 一样简单。PyQt4 是唯一一个需要更多工作的,因为它会提示您输入 Python 安装的根目录。

LCM

好吧,到目前为止都很简单,但正如所有 Windows 用户都知道的那样,好日子不会永远持续下去,现在是时候做点工作了。

LCM 的安装需要您编译源代码。您将需要GTK+的以下包:

  • GLib (运行时,开发)

  • gettext-runtime (运行时)

构建 LCM

  • 按照 WinSpecific/README.txt 中的说明设置 GLib。

  • 在 MS Visual Studio 中打开 WinSpecific/LCM.sln 并构建解决方案。

如果没有错误且 VS 设置正常,请查看您的 bin 文件夹,您应该拥有所有 LCM 组件。跳过 Linux 安装,直接到标记为“集成开发环境”的部分。

第 2b 部分 - 使用 Linux 设置您的开发环境

本节讨论在 Linux 中设置您的环境。如果您已经完成了 Windows 安装,可以跳到“集成开发环境”。

以下步骤源自 MIT CSAIL 小组编写的安装指南,因此要感谢Dehann Fourie将其整理成一个流程并解决了所有难题!

Linux 操作系统和软件包

Linux 操作系统

就操作系统而言,我选择了 Ubuntu 14.04,因为我工作的团队使用它,而且说实话,这个发行版非常流畅。可以从 Ubuntu下载。对于不同类型的开发人员,有三种方法:

  1. “我已经有几台 Ubuntu 机器了……” - 太棒了,跳过开始部分,直接到软件包。

  2. “我不介意为这个项目格式化我的一个笔记本电脑或双引导” - 您可以刻录 DVD,然后按照 Ubuntu 安装程序的步骤进行安装。

  3. “呃,撕开一个分区进行 Linux 安装?这不会是我的首选……” - 没问题!您可以

    1. 获取一些虚拟机 (VM) 软件,例如 Oracle 的VirtualBox

    2. 在干净的 VM 中挂载下载的 Ubuntu ISO。

    3. 按照安装步骤进行,然后在 VM 中进行工作。

所需包

Ubuntu 软件包

一旦您有了一个可用的 Ubuntu 系统,您就需要安装一些软件包。这些是:

  • Python 2.7.5 - 这个项目的首选语言。

  • VTK 版本大于 5.8 - 用于 UI 的 3D 部分。

  • PyQt4 - 用于构建 2D 界面,PyQt 是 Python 和 Qt(本项目中使用的表单库)之间的桥梁。

您可以选择从“Ubuntu 软件中心”单独安装它们,或者打开终端(在 Ubuntu 中按 Ctrl+Alt+T)并一次性运行以下命令(您需要输入您的管理员密码):

sudo apt-get install libvtk5.8-qt4 libvtk5-qt4-dev libvtk5-dev libvtk5.8 python-qt4 python-vtk pyqt4-dev-tools

它应该会安装所有这些软件包及其依赖项,任何错误都会清楚地显示出来(尽管我对此感到惊讶)。

确实可以从头开始构建其中许多内容,这可能是一个好主意。但是,对于初学者来说,这工作量很大,并且容易导致在出现奇怪问题时(例如,找不到 PYTHONLIBS……)四处寻找修复。是的,您可能使用的是 VTK 5.8 而不是 6.x……但这难道不是一个简单的安装吗?如果您需要 6.x 中的功能,以后可以随时升级,我相信 5.8 和 6.x 之间的基础知识不会有太大变化。

LCM

LCM 的安装需要您编译源代码。据我所知,一个标准的 Ubuntu 安装(带有上述软件包)应该具备成功安装 LCM 所需的一切,但如果您遇到任何问题,请发表评论并附带错误(可能是在 `./Configure` 步骤中),我们将更新此帖子并添加额外的软件包。

要安装 LCM,请打开命令提示符(Ctrl+Alt+T),然后输入以下行:

cd ~/Downloads
wget http://lcm.googlecode.com/files/lcm-1.0.0.tar.gz
tar xzf lcm-1.0.0.tar.gz
cd lcm-1.0.0
./cofigure
make -j
sudo make install
sudo ldconfig

第 2c 部分 - 集成开发环境

好了,现在您应该已经拥有了所有必需的库和文件。下一步是安装一些 IDE(集成开发环境)并测试一切是否按预期工作。

有两个 IDE 对开发 Python 很有用(……嗯,还有很多其他 IDE,但这些是我们个人喜欢的)。

IDLE

对于简单的测试,您可能想在 IDLE 中进行尝试,它干净易用,适合处理小型项目。例如,它是测试来自网站的代码片段的绝佳应用程序。请注意,Python(x,y) 自带 Spyder,您也可以用它代替 IDLE。

为 Windows 安装 IDLE

  • 它应该已经随 Python(x,y) 一起安装了。

  • 如果您选择了 WinPython 路线,并且它没有安装,请从“http://www.lfd.uci.edu/~gohlke/pythonlibs/”安装。

  • 要安装 IDLE,请打开 Ubuntu 软件中心并安装“idle”软件包。

  • 您也可以打开命令提示符并运行“sudo apt-get install idle”。

  • 如果您打开 IDLE,您应该会看到一个标准的 Python 控制台。

www.eclipse.org下载 Eclipse。

  • 将其解压到一个好的位置(它没有安装程序)。

在 Ubuntu 中安装 Eclipse

  • 从软件中心安装 Eclipse 或使用 apt-get 命令“sudo apt-get install eclipse”。

安装 Eclipse 后,这里是 Windows 和 Linux 的通用步骤(但更多信息可以在PyDev 安装找到)。

  • 打开 Eclipse。

  • 在 Eclipse 的“帮助”菜单下,点击“安装新软件”。

  • 在顶部的“工作于”处,点击“添加……”。

  • 添加“http://pydev.org/updates&#8217”;

  • 从下拉列表中选择“PyDev”,然后安装它。

  • 安装完成后,您可能需要从“帮助”下的“更新软件”按钮进行任何更新。

  • 如果关闭欢迎屏幕并在其重启后,您可以选择“窗口”->“打开透视图->“PyDev”来选择 Python 开发透视图。

  • 关于在 PyDev 中开始使用 Python 的文档非常丰富,因此在此省略。

  • 小贴士:为了节省每次更改透视图的精力,请转到“窗口”->“首选项”->“常规”->“透视图”,并将 PyDev 透视图设为默认值(哇,一直切换透视图真的很令人沮丧!)。

测试您的环境

最后一步是测试您的环境。暂时跳过 LCM 测试,专注于 UI,尝试使用 VTK 文档中略微修改的示例文件。此示例包含一些 PyQt,因此它应该可以测试 UI 所需的所有组件。原始示例可以在Vtk – EmbedPyQt2找到。

测试开发环境

  • 打开一个 IDLE 实例,然后点击“文件”->“新建文件”(或按 Ctrl+N)。

  • 将下面的代码或来自原始 VTK 示例的代码复制到新文件中。

  • 从新文件的菜单中点击“运行”->“运行模块”。

  • 您应该会看到一个带有几个按钮的球体,并且应该能够使用交互式摄像头围绕球体移动(这是一个很棒的 VTK 示例,真正展示了如何布局所有部件)。

from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import QApplication
import vtk
from vtk.qt4.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
import sys

class Ui_MainWindow(object):
   def setupUi(self, MainWindow):
       MainWindow.setObjectName("MainWindow")
       MainWindow.resize(603, 553)
       self.centralWidget = QtGui.QWidget(MainWindow)
       self.gridlayout = QtGui.QGridLayout(self.centralWidget)
       self.vtkWidget = QVTKRenderWindowInteractor(self.centralWidget)
       self.gridlayout.addWidget(self.vtkWidget, 0, 0, 100, 100)
       self.buttonLeft = QtGui.QPushButton("Left")
       self.gridlayout.addWidget(self.buttonLeft, 96,48,1,1)
       self.buttonRight = QtGui.QPushButton("Right")
       self.gridlayout.addWidget(self.buttonRight, 96,52,1,1)
       self.buttonUp= QtGui.QPushButton("Up")
       self.gridlayout.addWidget(self.buttonUp, 94,50,1,1)
       self.buttonDown = QtGui.QPushButton("Down")
       self.gridlayout.addWidget(self.buttonDown, 98,50,1,1)
       self.buttonFire = QtGui.QPushButton("Fire Torpedo")
       self.gridlayout.addWidget(self.buttonFire, 95,50,3,1)
       MainWindow.setCentralWidget(self.centralWidget)


class SimpleView(QtGui.QMainWindow):

   def __init__(self, parent = None):
       QtGui.QMainWindow.__init__(self, parent)
       self.ui = Ui_MainWindow()
       self.ui.setupUi(self)
       self.ren = vtk.vtkRenderer()
       self.ui.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
       self.iren = self.ui.vtkWidget.GetRenderWindow().GetInteractor()

       # Create source
       source = vtk.vtkSphereSource()
       source.SetCenter(0, 0, 0)
       source.SetRadius(5.0)

       # Create a mapper
       mapper = vtk.vtkPolyDataMapper()
       mapper.SetInputConnection(source.GetOutputPort())

       # Create an actor
       actor = vtk.vtkActor()
       actor.SetMapper(mapper)

       self.ren.AddActor(actor)

if __name__ == "__main__":

   app = QApplication(sys.argv)
   window = SimpleView()
   window.show()
   window.iren.Initialize() # Need this line to actually show the render inside Qt
   sys.exit(app.exec_())

运行时,UI 应该显示类似于下图的内容。

Vtk with PyQt Sample

摘要

这就是设置开发环境的内容。下一篇文章(第 2 部分)将详细介绍使用 VTK 构建 3D 机器人环境的细节。它还将包含第一个项目源代码下载(也可在SemiSorted找到,如果您想提前了解)。

我们希望您在执行这些步骤时没有遇到任何问题 - 如果有任何问题,请给我们留言,以便我们改进指南!

在此期间,在我们编辑下一篇文章时,这里有一些很好的链接。

<mytubeelement data="{&quot;bundle&quot;:{&quot;label_delimitor&quot;:&quot;:&quot;,&quot;percentage&quot;:&quot;%&quot;,&quot;smart_buffer&quot;:&quot;Smart Buffer&quot;,&quot;start_playing_when_buffered&quot;:&quot;Start playing when buffered&quot;,&quot;sound&quot;:&quot;Sound&quot;,&quot;desktop_notification&quot;:&quot;Desktop Notification&quot;,&quot;c>

© . All rights reserved.