系列文章目录
前言
欢迎访问机器人代码生成器主页! RobCoGen 是一种高效的代码生成器,用于生成铰接式机器人运动学和动力学的代码。其设计目的是在执行时间方面达到最佳性能,并减轻用户手动开发关键软件的负担。
RobCoGen 既适用于仿真,也适用于硬实时控制真实硬件!RobCoGen 的源代码和仿真器均以许可证形式发布。
请使用左侧的导航栏浏览网站,了解有关 RobCoGen 的更多信息。
感谢您的访问!
马可-弗里吉里奥
(网站最后更新日期:2020 年 12 月)
一、介绍
RobCoGen 是一个代码生成器,程序的输出是源代码(目前是 C++ 和 Octave (Matlab) 文件)。RobCoGen 是一个命令行工具,基本上用 Java 编写。
生成的源代码可以高效地实现特定关节机器人的常用运动学和动力学算法。只要需要进行运动学/动力学计算,就可以在自定义应用程序中使用这些代码。
RobCoGen 的主要输入是描述关节型机器人(如机械手或人形机器人)结构的文本文件。输出是经过优化的机器人专用代码,既适用于仿真,也适用于实时控制。
RobCoGen 并非刚体动力学仿真器。不过,它能为机器人生成正向动力学算法的快速实现,而正向动力学算法是仿真器的基本组成部分。
RobCoGen 并非控制器。不过,它能生成各种矩阵(坐标变换、雅各布矩阵、惯性矩阵)的代码,这些矩阵通常用于基于模型的控制器。
1.1 动机
为了仿真和控制机器人,我们需要高效的代码,可能需要使用不同的编程语言。对于实时控制,我们还需要可预测的执行时间。刚体动力学算法是教科书上的知识,但要手工实现却并非易事;坐标变换在概念上很简单,但处理起来却令人困惑。RobCoGen 就是为了解决所有这些问题而设计的,它可以让机器人专家从一些艰苦、耗时和容易出错的手工编码中解脱出来。
现有的基于符号简化的工具可能存在一些缺点,包括:不太容易使用、不支持多种编程语言、只能在市场上买到、生成的代码难以理解。另一方面,与代码生成方法相比,通用动力学引擎的效率较低。通用动力学引擎更加灵活,因为它们可以使用运行时创建的机器人模型(即数据结构),但这样做很少是应用程序的实际要求。
1.2 特点
RobCoGen 可生成常用运动学和动力学算法/方程的高效实现。它可生成坐标变换(如齐次变换,即正向运动学)、几何雅各布系数、正向动力学、逆向动力学以及计算关节空间惯性矩阵(JSIM)的代码。
目前,RobCoGen 支持 C++ 和 Octave(Matlab)。
1.2.1 运动学
RobCoGen 可生成各种坐标变换矩阵,用于映射机器人结构上不同坐标系之间的坐标。这意味着您将获得一组矩阵,以及一个根据关节状态向量值更新矩阵元素的程序。
生成的代码实现了相同变换的各种表示方法。其中,RobCoGen 的输出包括
- 齐次变换(4x4 矩阵)
- 运动(速度)矢量的空间变换(大小为 6x6)
- 力矢量的空间变换(大小为 6x6)
- 此外,还可以生成几何雅各比的代码。
生成的变换/雅各比取决于用户在命令行调用生成器时必须提供的配置文件(参见用法)。有些变换即使没有提供配置文件也会生成,因为动力学算法需要这些变换。
1.2.2 动力学
RobCoGen 可根据已知的最快算法生成优化的机器人专用实例。具体来说
- 用于逆动力学的递归牛顿-欧拉算法
- 用于正向动力学的关节体算法
- 用于关节空间惯性矩阵 JSIM 的复合刚体算法
所有动力学代码都基于罗伊-费瑟斯通(Roy Featherstone)的研究成果,主要是他在 2008 年出版的《刚体动力学算法》(Rigid Body Dynamics Algorithms)一书。事实上,动力学代码使用的是 6D 空间矢量。所有例程都支持浮动基座机器人。
到目前为止,我主要使用 C++ 代码,因为使用这种语言可以获得很高的性能。因此,我并没有为动力学算法开发所有的 Matlab 生成器。不过,其中一个代码生成输出提供了一个结构,可以与罗伊-费瑟斯通的 Matlab 动力学代码一起使用;因此,在实践中,我们仍然可以在 Matlab 中计算动力学,而无需编写自定义代码。
1.2.2.1 参数机器人模型
RobCoGen 支持参数机器人模型,即某些属性不受数值常数限制的机器人描述。参见此处。
参数化是一项功能强大的特性,例如可以创建仿真,在运行时改变机器人的某些特性。然后就可以应用优化策略来支持机器人的设计过程。
模型参数化通常反映在生成的代码中,具体细节取决于目标语言。一般来说,数值求解器会使用某种机制来解决运行时的参数值问题。这种机制可能与变量的机制不同,以反映两类属性的不同性质。
参数化应被视为试验性的。例如,目前还没有指定参数默认初始值的机制。
1.2.2.2 自动微分(C++)
RobCoGen 生成的 C++ 代码可与自动微分工具一起使用,以有效计算生成代码所计算的任何量相对于任何变量(如关节状态向量或设计属性,如连接质量)的导数。
该功能在 0.4ad.0 实验版本中引入,现在 0.5.1 版本中也有提供,但有一些限制。
原则上,任何基于运算符重载的 AD 工具都可以与 RobCoGenerated C++ 代码一起使用,因为代码使用的是自定义标量类型。然而,在实践中,每个外部工具一般都需要一些额外的定义。在这方面,RobCoGen 支持 CppAD。
欲了解更多信息,请参阅有关生成的 C++ 代码的页面。
二、用法
unzip robcogen-0.5.2.zip cd robcogen-0.5.2/exe/ ./robcogen.sh ../sample/fancy/model/fancy.kindsl # launches the program # you may now input 1, 4, and 28 to exit ls -l /tmp/gen/cpp/ # check the generated C++
2.1 程序要求
RobCoGen 是一个 Java 程序,附带所需程序库。
要实际运行 RobCoGen,需要
- Java 运行时环境 (jre)
- 符号计算引擎 Maxima
如今,任何机器都可能已经安装了 jre。Maxima 可用于多种平台。在 Ubuntu 等 Linux 发行版中,两者都可以通过软件包管理器安装。
到目前为止,RobCoGen 只在 Ubuntu Linux 中进行了测试,不过它应该可以在 Java 和 Maxima 支持的任何平台上使用。
2.2 执行
RobCoGen 是一个命令行程序:
cd exe/ ./robcogen.sh <robot description file> [<desired transforms file>]
参数:
- <机器人描述文件>:机器人模型的 .kindsl 文件路径;必须填写。参见此处。
- (所需变换文件):.dtdsl 文件的路径,其中包含所需的坐标变换和几何雅各布系数列表;可选。
RobCoGen 发行版中的 sample/fancy/model 文件夹包含这两个参数的样本。
如果提供了第二个参数,它所引用的矩阵将与代码的其余部分一起生成。否则,将不会生成雅各布矩阵;由于动力学算法需要,无论如何都会生成一些坐标变换。
2.3 前台
RobCoGen 有一个简单的文本界面,提示用户输入整数。从显示的列表中输入一个代码,即可触发相应的生成器(大写字母标识符只是代码的简短助记符名)。
0 - CTDSL 坐标变换描述文件(.ctdsl - 变换-DSL 的一个文件) 该文件包含与给定机器人相关的所有变换的抽象描述。生成其他内容并不需要该文件,但该功能是为调试和感兴趣的用户提供的。
1 - ALLMx 所有 Maxima 代码。注意:必须先生成 Maxima 代码,然后再生成其他变换或 Jacobian 的实现。
2 - TMx 用于坐标变换的 Maxima 代码
3 - JMx 用于几何雅各布的 Maxima 代码
4 - ALLC++ 所有 C++ 代码。C++ 代码非常快速、高效,并且与硬实时约束兼容。例如,反动力学代码可以安全地用于执行执行器控制的实时回路中。
5 - CC++ C++ 普通代码(编译其余部分时需要)
6 - TC++ C++ 坐标变换
7 - JC++ C++ 几何雅各比
8 - DC++ C++ 动力学通用代码(编译与动力学相关的其他文件时需要)
9 - IDC++ C++ 反动力学实现(牛顿-欧拉算法)。它支持浮动基数机器人。在这种情况下,类的界面将与固定基座机器人的界面不同。另外请注意,浮动基座机器人的逆动力学基本公式实际上是一种混合动力学算法,其中基座的空间加速度是一个输出值。
10 - FDC++ C++ 正向动力学实现(关节体算法)。它支持浮动基座情况。
11 - JSIMC++ C++ 联合空间惯性矩阵计算(复合刚体算法)。该代码包含 L^T L 因式分解,用于高效计算逆。它支持浮动基本情况(尽管逆的计算仍然只适用于执行关节空间块)。
12 - MKC++ 用于生成 C++ 代码的 CMake 文件
13 - ALLMt 所有 Matlab 代码
14 - TMt Matlab 坐标变换
15 - JMt Matlab 几何雅各布数
16 - DMt Matlab 动力学通用代码。这基本上只是一个包含链接惯性属性的文件,用不同的坐标系表示。
17 - IDMt Matlab 反动力学实现
18 - JSIMMt 联合空间惯性矩阵的 Matlab 算法
19 -
20 -
21 -
22 - RB 用于描述运动学树的其他格式
23 - RB_ROS 等效的 XML URDF 机器人描述文件,如 ROS 文档所述
24 - RB_Feath 一个等效的 Matlab 格式机器人模型,可在罗伊-费瑟斯通(Roy Featherstone)的网页上使用 Matlab 刚体动力学软件。
25 - RB_SDFAST 等效的 SD/FAST 模型说明
26 - 测试 使用 Octave 测试生成 C++ 的辅助 C++ 代码
27 - 重新加载 重新加载输入文件
28 - 退出
2.4 配置文件
启动程序的脚本有三个配置文件:
- core.cfg 用于核心配置
- cpp.cfg 用于调整生成的 C++
- 用于配置日志的 log4j.cfg 文件
- (以前,这些文件分别是 framework.properties、cpp.properties 和 log4j.properties)
默认值应该有效。在以下段落中,我将介绍可能需要更改的几个选项。如果你知道自己在做什么,可以自定义其他选项。配置文件本身包含了一些文档。
输出路径
参见主配置文件中的属性 generator.outdir...。
.base 子属性选择文件系统中放置生成代码的根目录。
自 0.5.1 版起,其他子属性 . 被视为 base 的子文件夹。此外,将 .robotsubdir 设为 true 会产生一个额外的子文件夹,命名为机器人模型;在这种情况下,最终路径将以 // 的形式出现。
常量折叠
自 0.5.0 版起。
主配置文件中的 generator.misc.constantfolding 属性。默认为假。
常量折叠意味着机器人模型常量将以浮点字面形式出现在生成的代码中,可能会多次出现在不同位置。当设置为 false 时,将使用符号标识符代替;这些标识符如何与实际值关联,取决于目标语言。
PI 表达式形式的常量(如 PI、PI/2.0 等)总是折叠通过。如果不希望出现这种情况,请使用浮点字面形式(如 3.14159)。
测试
代码生成器本身没有特定的测试,但有测试生成代码的 C++ 和 Octave 函数。
测试本身是用 Octave 编写的,与动态算法的另一个参考实现进行简单的数值比较。
更多信息,请参阅测试函数库的 readme。
这些测试也包含在 RobCoGen 的二进制发行版中,文件夹为 etc/octave-tests。
从 0.5.1 版开始,RobCoGen 会生成一些 C++ 程序和脚本,以帮助测试生成的 C++。参见用户界面选项 26。
三、生成的 C++ 代码
3.1 概述
生成的 C++ 代码由命名空间 iit:: 中的类组织。
所有向量和矩阵都是通过 iit-rbd 库中定义的类型实现的,该库随 RobCoGen 一起发布。内部使用的是 Eigen 库。
生成的代码带有一些 Doxygen 注释,因此请使用 Doxygen 生成进一步的最新文档。由于 RobCoGen 的新版本导致生成的代码发生变化,这些变化可能不会立即反映在本页中,而 Doxygen 文档则更有可能与代码保持一致。
3.2 编译
CMake 文件可与源代码一起生成。在输出文件夹中执行 CMake 的常规程序(假设使用 Unix shell):
mkdir build cd build cmake -D EIGEN_ROOT=<path to eigen> .. make sudo make install
安装目标会将头文件复制到 /usr/local/include/iit/robots//... 中,以便日后将其包含到其他源代码中。
#include <iit/robots/<robot_name_lowercase>/...
共享库名为 libiitgen<机器人名称小写>.so,复制到 /usr/local/lib。
3.3 要求
为生成 C++ 代码而需要安装的库。
Eigen
如果 Eigen 未安装在 "标准 "目录下,请确保在运行 CMake 之前设置 CMake 缓存变量 EIGEN_ROOT。 该变量必须使 $EIGEN_ROOT/Eigen/Dense/ 成为有效路径。 缓存变量默认为同名环境变量。
iit::rbd 头文件
iit_rbd 库是一组头文件,包含生成的 C++ 所需的常用功能。该库包含在 RobCoGen 的发行版中。请将 iit_rbd 头文件安装到您的系统 include 路径(对于 Linux 发行版,该库包含一个简单的 install.sh 脚本)。
请从源代码中生成 Doxygen 文档,以获取更多信息。
Robotics Code Generator 教程(下)+https://developer.aliyun.com/article/1585350