franka_matlab包
开发环境
在 MATLAB2019a 至 MATLAB2021a 上经过测试
在带有 PREEMPT_RT 内核补丁 和 Intel CPU的 Ubuntu Linux 18.04, 20.04 中经过测试
支持libfranka版本 0.9.0 (系统版本 4.2.1)
!! 重要 !!
franka_matlab 项目是基于 libfranka 的。强烈建议,为了评估配置以及最为重要的以太网通信质量,在尝试使用 Simulink 之前,请先尝试构建和运行 libfranka 的 C++ 例程。请确保以太网通信质量正常( 推荐测试 ),请 特别注意 禁用任何可能的电脑 CPU 节能模式 。
如果 libfranka 的 C++ 例程运行良好,但同时 Simulink 的同一例程却无法运行,请向我们反馈!
为了在外部模式下使用库,我们建议使用 franka_emika_panda.tlc 或 franka_emika_panda_shrlib.tlc,其中包含能够正确处理 1ms 实时循环的 ExtMode 版本。
指南
请确保您完全按照 libfranka 安装说明 ,以正确配置您的环境。
使用
>> addpath(franka_matlab 路径);
将 franka_matlab 的路径添加到您的项目中使用
>> init_franka_matlab();
初始化项目(推荐)或者如果您已经安装了 libfranka 并希望使用>> init_franka_matlab(libfranka_文件夹路径);
进行初始化。在后一种情况下,libfranka 构建时应该使用与位置无关的选项 ON!(-fPIC)(可选)默认情况下,代码生成的系统目标是自定义的 ‘franka_emika_panda.tlc’ 。您还可以设置为’ert.tlc’或’grt.tlc’,例如
>> set_code_gen_target('ert');
。请注意, 在 ert 和 grt 的情况下,外部模式可能会破坏实时过程 。’franka_emika_panda.tlc’是专门为避免这种情况而设计的 。只有第一次使用时,须使用
>> mex_franka_simulink_library();
和>> mex_franka_matlab_library();
来MEX Simulink和Matlab库。
运行示例程序
在 demos 文件夹中,您会找到一组和 libfranka 一样效果的示例,这些示例在 Simulink 中通过 Franka Simulink 库实现。您可以随意尝试、调整和扩展它们以满足您的项目需求。
请注意,示例会自动在“work”文件夹中生成代码。 如果您继续处理另一个项目,生成的代码仍将在work文件夹中生成。 如果你有自己的目标文件夹,您需要手动更改它。 我们为此提供了帮助脚本 set_code_gen_target_path(<您想要的新代码生成路径>)
。
在文件demos_common_configs.m中,有一组建立和运行模型所需的默认参数。当模型被打开时,它们会被自动加载。这样,仅须定义 robot_ip 即可。我们建议直接在demos_common_configs.m文件中定义robot_ip。
点击模型底部的第一个白色 UI按键 就可以将模型构建为独立的可执行文件。
成功构建后,您就可以通过终端运行可执行文件了(推荐执行,以便能够检查任何潜在的异常)。要先确保已经导出了 libfranka.so
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<放 libfranka 构建文件夹路径>
可执行文件现在应该等待与外部模式的连接。您现在可以通过 Simulink 模型与外部模式连接。
或者,要执行独立可执行文件并连接外部模式,您可以双击模型底部的绿色 UI按键。在这种自动执行的情况下,由于可执行文件在后台运行,因此无法直接观察到抛出的异常情况。
在Simulink模型中,“Play”按钮现在应该已经变成了绿色。确保刹车是打开的、用户按钮被释放、机器人处于空闲状态。
你现在可以按Play按钮了! 这样该模型就会被执行。
用franka_matlab从头开始做Simulink最小项目
确保遵循所有安装说明执行后,franka_matlab 位于路径 >> addpath(franka_matlab 路径);
,并正确初始化 >> init_franka_matlab();
。每次实例化 Matlab 时都需要执行这两个步骤,我们建议将这两个命令添加到启动脚本中。
打开一个空白的 Simulink 模型。
在 Simulink Library 浏览器中,选择 Franka Emika Library 并将“Apply Control”模块添加到您的模型中。每个项目都需要一个该模块的实例。
双击模块可以浏览和修改设置。对于本例,我们选择控制模式 “Joint Positions - Internal Controller Mode”(关节位置-内部控制器模式)。对于其余参数,我们建议在工作区中定义变量。运行脚本
>> demos_common_configs();
将自动定义一组标准默认参数。定义机器人IP
>> robot_ip = '这儿写机器人的IP'
您可以读取机器人的q_d初始状态,作为给模块输入的初始状态 q_d。
您还可以添加模块 Read Robot State 和一些示波器(Scope)及显示模块,用来监看来自机器人的所需信号。
在 Simulink Model Configurations->Code Generation 中选择 “franka_emika_panda.tlc“ 作为系统目标文件。
您现在可以使用
>> rtwbuild('你的模型名称');
或使用 Simulink 中的构建按键来构建模型。 如果您当前的项目文件夹看不到代码生成的Artifacts和最终可执行文件,请查看 franka_matlab 的工作文件夹。 您还可以使用cmd>> set_code_gen_target_path(<你的模型名称-字符串>, <目标文件夹-字符串>)
来更改代码生成的目标文件夹。生成独立的可执行文件后,您可以从终端执行它。 首先确保导出了环境变量 LD_LIBRARY_PATH。
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<本地libfranka构建文件夹路径>
在启动之前,可执行文件现在应该在等待外部模式连接。 您现在可以通过外部模式连接。
此时,请确保机器人的制动器处于打开状态,并且机器人处于空闲状态,用户按钮是释放状态。
点击 Simulink 中的播放按键应该就可以执行模型了!
示例:不使用外部模式以编程方式生成笛卡尔速度演示。
首先,确保您已经在 demos_common_configs.m 中更改了机器人的ip。 还要确保在执行 set_up_franka_simulink_model() 命令后,参数已正确加载到工作区中。
>> set_up_franka_simulink_model('generate_cartesian_velocity_motion');
>> build_standalone('generate_cartesian_velocity_motion');
在终端执行:
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<place the local libfranka build folder path>
执行位于工作文件夹中的可执行文件!
示例:使用外部模式以编程方式生成笛卡尔速度演示。
首先,确保您已经在 demos_common_configs.m 中更改了机器人的ip。 还要确保在执行 set_up_franka_simulink_model() 命令后,参数已正确加载到工作区中。
>> set_up_franka_simulink_model('generate_cartesian_velocity_motion', 'external_mode_on');
>> build_standalone('generate_cartesian_velocity_motion', '-DON_TARGET_WAIT_FOR_START=1', 'your target path for generated code');
在终端导出动态链接的 libfranka 路径:
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<place the libfranka folder build path>
执行您模型生成的可执行文件,该可执行文件位于您提供的目标路径中!
通过您的 Simulink 模型连接到外部模式。 点击播放开始控制!
注意事项
在同一个系统中,“Apply Control”模块的 多个实例 是 不允许的 (多个实例可以插入到相应的启用的子系统中)。
在 Franka Simulink 库中使用模块的 多个实例 是 允许的。 有且只有一个“Apply Control”模块是所有其他模块工作所必需的。
对于参数的设置,强烈建议参考Matlab文件demos_common_configs.m
通过 Matlab 函数,实验性地部分支持 Matlab 功能。尝试使用
>>automatic_error_recovery(robot_ip)
命令来自动脱离错误状态。
所有的故障排除请参考 Franka控制接口的故障排除页面 。请特别注意 由于不连续或违反通信约束(communication_constraints_violation)的问题而导致的运动停止 !请参考故障排除中的相应部分。