在控制和机器人实验室中使用 Linux
安大略省金斯顿市女王大学的数学与工程项目运营着一个控制和机器人实验室,作为控制系统领域的课程设置的一部分。实验室实验使用我们定制的机电装置,并要求学生用 C 语言编写算法来控制硬件。
实验室最初在 DOS 下使用 C 语言作为实验室实验的软件环境,但并非所有学生都能轻松适应该环境。总的来说,配置文件太容易被意外更改,造成令人沮丧的后果。随后,开发了一个名为 dlxlab 的集成实验环境,用于模拟和运行控制实验室实验。它由一个单独的程序组成,模拟运行时以 dlxsim 运行,控制硬件实验时以 dlxrun 运行。该程序使用 Linux 下的 XView 工具包开发(参见 Michael Hall 的“使用 XView 编程”,LJ,1998 年 3 月),并在实验室中运行在各种运行 Linux 1.2.13 的 PC 兼容硬件上。
参加实验室的学生在计算背景和技能方面差异很大。控制实验室的主要目的是研究控制理论在实际电机、小车、倒立摆等方面的应用,而不会让软件操作主导体验。另一方面,理解底层接口代码也是一个理想的结果,因此硬件接口必须是“可见的”。
为了为物理系统设计控制算法,必须拥有被控系统的数学模型,形式为微分方程或差分方程,并了解模型中的物理参数。dlxlab 的用户界面设计尽可能地使 唯一 需要用户提供的信息就是这些。
对于程序在模拟模式下运行的情况,这个目标得以实现。对于控制实际硬件的情况,还必须提供描述硬件接口的信息,尽管可以通过头文件在很大程度上对用户隐藏。
程序的用户输入通过交互式构建系统文件来完成,该文件描述了正在研究的系统。
要模拟系统,可以使用系统描述文件作为参数调用 dlxsim。
dlxsim sim.sys &
其中一个实验室实验包括一对轨道安装的小车,通过弹簧耦合并由伺服电机驱动。 列表 1 显示了一个用于模拟这样一对弹簧耦合小车的简单系统文件。系统文件的格式是一系列以 begin ... end 分隔的块。这些块有两种类型
定义块,用于建立变量(包括参数)的标识符
代码块,包含 C 代码序列,程序执行这些代码序列来初始化变量,以及数值积分控制微分方程以模拟系统
主程序面板(见图 1)包含一个“构建”按钮,按下该按钮会处理系统文件。也就是说,用户系统文件通过解析过程转换为一系列 C 代码文件。这些文件由 gcc 编译为共享对象文件,并且生成的共享对象模块的内容在运行时动态链接到 dlxsim 中。链接的代码不仅包含系统微分方程,还包含用于交互式操作参数和根据系统文件中提供的变量名称绘制结果的模块。

图 2. 运行管理器
假设系统文件不包含语法错误,程序日志窗口仅包含进度消息,并且会出现一个用于控制模拟的弹出面板(图 2)。只要只进行参数更改,就可以进行一系列模拟运行。绘图和打印由作为子进程运行的 gnuplot 处理。
如果系统文件包含错误,则错误位置将在日志窗口中报告,并且弹出窗口不会出现。错误在解析级别或 C 代码段中捕获。在后一种情况下,来自 gcc 的错误消息指的是用户系统文件中的行,因为生成的 C 文件包含引用用户系统文件的 #line 语句。由于 dlxsim 系统文件编辑窗口是一个 XView textsw,它继承了与 XView 应用程序关联的行搜索菜单。
只要系统文件内容(例如变量名称、运动方程等)没有更改,就可以运行和绘制模拟。如果进行了此类更改,则必须调用“重建”按钮以释放资源,重新编译动态模块并重新链接生成的代码。
实际实验的系统文件包含代码段,这些代码段除了模拟文件的要求外,还在浮点程序变量和二进制硬件级别之间进行调解。 列表 2 显示了一个用于测量伺服电机对恒定电压输入响应的文件。该文件说明了系统文件中所谓的实用程序代码和定义部分的使用。此处放置的代码类型实际上没有任何限制。程序用户指南包含一个示例,该示例编写了用于使用文件中驻留的测量数据执行递归最小二乘辨识算法的代码。列表 2 中的示例更为简单,并使用库包含文件来抽象接口板数据访问。
包含文件用于将实际硬件接口隐藏在端口访问宏之后,例如用于设置数模转换器级别的 set_dac() 和用于从接口板读取光学正交位置编码器计数的 get_encoder()。使用这些宏的代码块被转换为动态链接的子例程,并由程序 main 实时控制循环重复调用。
此示例实际上是“开环控制”,主要说明了程序提供的硬件接口。反馈控制器通常采用测量数据的滤波,并且此类控制器的系统文件包括实现滤波器动态特性的系统代码段。
没错,当然,如果我们试图在平衡倒立双摆的同时运行打印服务器和 Apache WWW 守护程序,我们就会遇到麻烦。但是,在实验室环境中,窗口管理器(最好是 Open Look olvwm)和控制环境 dlxrun 是唯一运行的用户级应用程序。程序 dlxlab 是一个 XView 应用程序,以显式调度模式编写。这意味着控制循环的定时受编程循环的控制,而不是 XView 通知器的控制。
只要实验室机器配备了足够的内存以避免在实验期间进行交换,定时抖动的影响就比例如假装伺服电机的行为完全是线性的要小。最初认为有必要选择性地终止和重启某些守护进程,但我们的经验表明情况并非如此。无论如何,控制设计的目的之一是产生对未建模的扰动具有鲁棒性的控制器,而定时抖动提供了此类扰动的一个例子。
我们在机器上运行实验室实验,范围从 12MB 486SLC-66 到 Pentium P5-166。在我们的 486DX2-66 箱子上运行实验没有问题,采样率高达每秒数千个样本。实验室机器位于具有 10Base-2 同轴电缆的本地网络上,一台废弃的 386DX-16 勉强充当常驻打印服务器。
我办公室的 Linux 机器正在运行 Apache Web 服务器,并为我们的控制和机器人实验室提供了一个 WWW 页面。地址是 http://jhd486.mast.queensu.ca/。实验室页面上有实验室设备的照片以及指向我的主页的链接,我的主页提供了 dlxlab 程序的文档、源代码和二进制文件。
所描述的 dlxlab 环境最初是一个 awk 脚本,它将系统文件(上述文件的祖先)转换为在 SunOS-4.1 下运行的 XView 控制系统模拟程序。在 Linux 转换体验之后,我偶然发现了 Michael Johnson 的 Kernel Hacker's Guide 版本,并发现用户级 I/O 端口访问在 Linux 下是可能的。这使得该程序能够完成硬件控制以及模拟任务。
用于 PC 兼容机器的接口板的低成本和广泛可用性使其成为我们建立的实验室的理想选择。Linux 系统的完全开放性使得有可能充满信心地进行程序开发,相信它可以正常工作。在办公室、家中以及机器人和控制实验室中拥有相同的操作环境也很有帮助。
虚拟啤酒大家喝!
