逛 B 站,偶然发现一个 up 主上传的视频,可以实现 Simulink 中搭建机器人的控制器设计,对运行在虚拟机中 Gazebo 中的机械臂进行控制,链接:三关节机械臂Gazebo-Simulink联合仿真,这让我很感兴趣,Matlab 中大量的轮子对控制器、规划器的设计非常有帮助,并且,能够大大提升算法开发和调试的效率,因此,决定要了解一下,毕竟最近做的控制器设计都是在 Matlab 中进行的,要是有 Gazebo 这样强大的物理仿真软件来验证运行效果岂不是如虎添翼!
顺藤摸瓜,发现 Matlab 官方提供了相关 demo ,链接: Control Manipulator Robot with Co-Simulation in Simulink and Gazebo。该 demo 旨在通过 Simulink 和 Gazebo 联合仿真实现对机械臂的控制。具体是指:针对 UR10 机械臂,使用逆运动学实现笛卡尔空间位姿到关节空间关节角的解算,然后应用具有动态补偿前馈项的关节空间 PD 控制器来控制机械臂运动。
然而我们知道控制是实时的,其中包含控制指令的发送,机器人状态的反馈。为了实现上述要求,Matlab 官方为用户提供了以下几个核心模块:
- Gazebo Pacer:仿真时间同步模块;
- Gazebo Read:根据设定的 Topic 和 Message type 从 Gazebo 接收相应的 Message;
- Gazebo Apply Command:向 Gazebo simulation 发送指令;
- gzlink、gzjoint、gzworld:函数作为机器人模型参数查询接口。
Step 1、Set Up Gazebo with Robot Model and Plugin
在此之前,有一个教程是为了测试基本的 Matlab 和 Gazebo 之间的通信:Perform Co-Simulation between Simulink and Gazebo。
这里,我没用官方提供的虚拟机,采用的自己的 Linux 操作系统,为了实现通信,需要在 Linux 中手动配置相关插件,这个按照步骤来就行了。
我将在 Matlab 中生成的 GazeboPlugin.zip 放到了 /usr/src
路径下,然后编译。
这里应该注意 Gazebo 的环境变量设置问题,不然每次开 Gazebo 加载 world 都得 export,可以把这个编译好的插件路径写入 bashrc 。
最后可以通过在 Matlab 中接收并观察到 Gazebo 中的传感器信息来验证已经建立了 Matlab 和 Gazebo 之间的通信。
下面 demo 是配置 UR 机械臂仿真环境的教程:Configure Gazebo and Simulink for Co-simulation of a Manipulator Robot。
通信建立起来之后,下一步就是配置 UR10 机械臂的 Gazebo world 文件。按照教程,把 UR 机械臂克隆到自己建立的工作空间之后,用 roslaunch ur_gazebo ur10.launch
打开,然后使用 Gazebo save world as
将当前世界保存为Ur10BasicWithPlugin.world
,这里边有个问题,需要将ros_control
这个插件注释掉,不然用 Gazebo 打开这个 world 的时候会报错。
注释之后,就能正常打开了:
接下来,运行 Simulink,配置好 IP 地址,建立通信之后,运行提供的 Simulink 仿真,就能够实现对机械臂的笛卡尔空间位置控制了,至此,环境配置完毕。