1. 引言
目前机械臂作为比较成熟的机器人,很多大学都采购了各种机械臂作为实验教学设备。但是应用于实验教学中的实体机械臂往往会受到设备数量的限制,并且设备极容易受到损害。所以可以利用仿真技术,通过交互式计算机图形技术和机器人学理论等,在计算机中生成机械臂的三维几何图形并显示,用来确定机械臂的本体及工作环境的动态变化过程,通过系统仿真可以在操作实体机械臂之前验证操作算法及控制程序的准确性,避免直接对设备操作以减少对设备的损害 [1]。但目前高校中对机械臂的仿真实验是在PC机上完全虚拟化操作,学生只能给仿真软件修改参数以及编辑代码运行查看仿真结果,缺乏对实体机械臂控制的真实性,难以培养学生解决实际问题的能力。
基于此,设计一种基于ROS操作系统的半虚拟化仿真,通过设计的一个硬件接口板与显示虚拟化仿真结果的PC设备相连接,能够让学生在真实的开发环境上操作,并在虚拟化的设备上显示操作结果,即可解决实验设备紧缺、损坏的局限性又可培养学生在真实的开发环境中解决实际开发问题的能力。
2. 半虚拟化仿真系统设计方案
2.1. 仿真设计结构组成
本设计的主要思路是:应用场景虚拟化,学生训练用的开发环境是真实的,虚拟化场景与真实开发环境之间采用专门设计的接口卡进行连接,如图1所示。其中,部件1为本设计的虚拟仿真软件,GAZEBO动力学仿真器,它是包含在ROS系统中的一个标准功能包集(Stack),可对机器人进行物理学特性仿真,它集成了目前常用的各类传感器,如激光测距传感器、RGB 图像传感器、深度点云传感器、重力加速度传感器等 [2]。部件3为专门设计的虚拟接口卡,作为将嵌入式设备发送的指令送给仿真软件,进行信号传输的中间件。部件5为嵌入式系统开发板,可为任意的单片机设备,如:51单片机。部件2、3为通讯连线。
其中,虚拟仿真场景基于ROS操作系统进行设计,仿真机械臂的运动。ROS操作系统分为三个层级:组织ROS文件结构的文件系统级(Filesystem level)、管理进程及通信的计算图级(Computation Graph level)和包括社区开发人员及其算法代码的开源社区级(Community level) [3]。其中计算图级是最重要的概念,主要包括节点管理器(Master)、参数服务器(Parameter Server)、节点(Node)、消息(message)、服务(service) [4]。

Figure 1. Composition diagram of semi virtualization simulation design
图1. 半虚拟化仿真设计组成图
ROS的研发是为了在机器人的研究中可以复用已有内容,从而提高工作效率。它采用了一种解耦合架构,使得各个程序可以分别设计,并进行有机结合,按照使用的各种包的形式分别管理 [5] 在ROS中有很多GAZEBO的插件,两者之间可以通过话题通信。使用GAZEBO也可以与ROS中的Rviz三维可视化工具联系起来,将得到的数据直接在Rviz中显示出来,方便开发人员搭建需要的仿真环境。通过仿真环境的测试,减少开发成本,加快开发速率 [6]。
2.2. 仿真设计操作流程
在本设计中,首先在ROS中基于GAZEBO创建好三轴机械臂模型用于仿真。然后将仿真软件的运行设备(PC端)与专门设计的虚拟接口卡相连接,再将虚拟接口卡连接至嵌入式开发环境。由嵌入式开发设备发送控制命令,传送到虚拟接口卡,虚拟接口卡将控制命令转成脉冲信号发送到PC端并由PC端解析串口信号,最后通过ROS进行通信,控制仿真软件中机械臂运动,操作流程如图2所示。
3. 机械臂仿真模型搭建
3.1. 机械臂建模
在ROS中通常使用URDF来描述机器人的结构、外观以及重量等基本属性,文件主要由LINK和JOINT标签组成 [7]。其中LINK标签描述的内容有机器人连杆的几何、运动以及动力学等特性,而JOINT标签则用于机器人关节及关节与连杆之间的相关特性的描述。这两个标签内都有另外的子标签用于描述机器人的几何信息(颜色、位置等)以及物理信息(重量、惯性动能等)。

Figure 3. Display manipulator modeling in Rviz
图3. Rviz中显示机械臂建模
根据以上对标签的介绍,可以在ROS中创建一个三连接杆、三关节组机械臂模型的URDF文件,该机械臂的启动文件位于ros_robotics文件夹中。打开一个新终端,输入命令“roslaunch ros_robotics rrbot_rviz.launch”,可在可视化工具RVIZ进行显示,如图3所示。
但是当前的模型只是具备运动学和动力学属性,在GAZEBO中不能正常运行,所以接下来进行GAZEBO仿真的配置。
GAZEBO仿真软件中机械臂模型文件为SDF格式,此格式与URDF格式十分相似,例如描述机械臂内容的XML标签,很多与URDF文件相同。通过在URDF文件中添加
标签,在GAZEBO仿真时可以将URDF文件自动转换成可识别的SDF格式的机械臂描述。再添加
、
/
标签以在GAZEBO中能够显示机械臂每个连杆的颜色以及摩擦系数。此外GAZEBO中所模拟的物体具备现实世界物体的物理学特性,因此在其内构建的机械臂会由于重力的影响,不会一直直立,终会倒塌,所以需要将机械臂模型设定在GAZEBO的基础坐标world下,在机械臂模型文件中添加相应配置如
图4所示:

Figure 4. The mechanical arm model is fixed under the basic coordinate world
图4. 机械臂模型固定在基础坐标world下
完成以上,在新的终端输入命令“roslaunch ros_robotics rrbot_gazebo.launch”,就可在GAZEBO中显示虚拟机械臂模型了,如图5(a)和图5(b)。
(a)
(b)
Figure 5. (a) Initial upright state of manipulator in gazebo; (b) Mechanical arm collapsed in gazebo
图5. (a) 机械臂在GAZEBO中初始直立状态;(b) 机械臂在GAZEBO中倒塌状态
3.2. 仿真机械臂实现ROS通信
当前配置可在GAZEBO中仿真显示机械臂模型,但要让GAZEBO中机械臂能够通过ROS通信,还需添加额外控件。
首先为控制在GAZEBO中的机械臂模型,需要在URDF文件中对于机械臂的每个旋转副关节添加
标签以定义机械臂关节和执行器的相互关系。
然后需定义一个关键插件:gazebo_ros_control,用来解析上述添加的
标签并加载相应的硬件接口以及控制器管理器。此外还需要进行关节控制器参数的设置,创建YAML文件,在其内定义joint_state_controller控制器以及本仿真机械臂模型的所有关节控制器的控制器类型,并且在每个关节控制器内还需定义控制器的比例积分微分增益。
最后创建启动文件rrbot_control.launch,通过
标签在机械臂初始化时可将上述YAML文件中所有参数加载到参数服务器中,再配置controle_spawner节点和robot_state_publisher节点。在新的终端输入命令“roslaunch ros_robotics rrbot_control.launch”即可启动所有的ros_control控制器。这样就完成了GAZEBO中机械臂与ROS通信的联系。
4. 半虚拟化仿真实现
4.1. 虚拟接口卡设计
虚拟接口卡是连接真实开发环境与虚拟设备之间的信息通道,它负责两方面的信息传输:一方面是开发板发出的控制信号,用于控制虚拟设备的动作,对电脑仿真软件来说,成为输入信息;另一方面,虚拟设备的传感器、开关量等信息需要通过该接口板送给开发环境,成为输出信息。因此,虚拟接口卡要及时准确地将双方信息传递过去。
虚拟接口卡有两种实现方式:基于嵌入式微处理器的低速接口卡;基于CPLD/FPGA的高速接口卡 [8]。基于嵌入式微处理器的虚拟场景接口板电气原理图如图6所示。

Figure 6. Electrical schematic diagram of virtual scene interface board
图6. 虚拟场景接口板电气原理图
由图6可以看到,编号2部分是嵌入式微处理器,单片机或者ARM处理器都可以。根据使用场景不同,模拟量输入通道及输出通道、转换器是可以改变的。如果虚拟应用场景中只有数字量信号,则可选用不带AD转换器和DA转换器的微处理器。针对高速数字量信号,如脉冲信号,则使用嵌入式微处理器的计数器或中断引脚进行捕捉或输出 [9]。
编号1部分即为虚拟接口卡与运行虚拟仿真软件的PC端的通讯接口,图中所示的三种接口可任意选择。
编号3部分的目的是提高接口板的可靠性。
编号4部分包含了各种接口信号,如GPIO、输入输出等。
4.1.1. 输入信息处理
按信息种类来分,输入信息可分为开关量和模拟量两类,对于开关量信息来说,按连接方式分,又可分为总线连接方式和非总线方式两类。对于非总线连接方式,当传送给虚拟接口卡任一开关量输入信号发生改变,该接口卡都要检测到并及时传送给电脑。开关量信号变化的检测可有如下三种方案:
1) 定期扫描检测方式:接口板核心电路采用单片机组成。单片机不断读取输入引脚的状态,与上次保存的状态比较。如果不同,表示有引脚的电平发生了变化,可以立即上报给电脑。
2) 边沿触发中断方式:任一开关量信号发生变化,检测其边沿的变化,并连接至单片机的中断引脚。在单片机中断处理程序中,直接读入各输入引脚状态,并立即上报给电脑即可。但该方式对于多路信号的同时检测比较困难,而且速度与方式1相比没有大幅度的提高。
3) CPLD或FPGA的实现:采用CPLD或FPGA来检测信号变化,响应速度只取决于内部逻辑器件的级联门数及门级之间的传输延迟,速度可在ns级。但与电脑之间的传输方面实现比较复杂,需要实现UART接口或USB接口,实现成本较高。
由于虚拟机械臂的控制采用步进电机进行驱动,采用数字脉冲信号,因此,虚拟接口卡采用方式1是比较合适的。本设计采用STC15F2K60S单片机作为接口卡的处理器。该单片机基于8051内核,可以每个时钟脉冲运行1条指令,在12 MHz晶振频率下,就可达到1/12 us运行一条指令,可以捕捉微秒级的脉冲信号,基本满足步进电机控制信号的变化频率。
4.1.2. 接口卡与电脑之间通讯
1) 通讯速率
不管是输入或者输出信息都需要通过通讯方式进行传输,当输入信号的扫描周期达到20 KHz时,要一次传输32路开关量信息,采用串行传输方式,每传送一个字节需要增加起始位和停止位,因此通讯速率需要达到20 KHz*(32 + 8) ≈ 800 Kbps。本设计采用USB接口通讯方式完全可满足要求。
2) 通讯协议
尽量缩短通讯协议包的长度,可以加快传输速度。协议包格式如下:
协议包分为4字节格式和单字节格式两类。在4字节格式中,首字节的最高位为1,其他字节的最高位为0;首字节的次高位为0,表示4字节格式,该位为1,表示单字节格式。4字节格式如图7所示。
单字节格式如图8所示:

Figure 8. Single byte communication format
图8. 单字节通讯格式
X可用于表示1个开关量输入信号。这样,4字节格式可传输27位开关量输入信号;单字节仅用于传输6位信号。当输入信号较少,或者只有最低6为输入信号发生变化时,使用单字节格式进行传输可提高传输速度。
举例:如果控制1个步进电机,只需要方向信号DIR(bit1)和脉冲信号PULSE(bit 0)即可。这样,接口板检测到这两个信号中的人一个发生变化,都会用单字节协议上传。如图9所示,在T1时刻,接口板会上传电脑单字节协议0xa2,T2时刻上传0xa3,T3时刻上传0xa2,……T6时刻上传0xa1,……。

Figure 9. Sequence diagram of step motor control signal
图9. 步进电机控制信号时序图
4.2. 半虚拟化仿真程序设计
将嵌入式开发板、虚拟接口卡、仿真软件运行设备(PC端)连线接通,嵌入式开发板发送控制信号,虚拟接口卡接收后通过串口给PC机发送控制命令,然后通过ROS控制仿真机械臂运动并在GAZEBO中显示。在ROS中对机械臂进行运动规划是通过Moveit!软件包来控制。Moveit!是ROS中的一个主程序库,在研究机械臂的多个领域中,如运动规划、碰撞检测抓取放置等,都可以应用Moveit!来解决问题 [10]。
启动GAZEBO仿真软件显示机械臂模型并启动ROS的控制器后,打开另一终端,在ROS中启动基于PYTHON的串口识别程序,如图10所示。在嵌入式开发板上发送一个控制信号,由虚拟接口卡接收后通过串口发送控制命令给PC端,在PC端中的PYTHON文件中解析出所有控制命令。例如在PC端接收到虚拟接口卡的P1.0指针发送了高电平,P0.0指针发送的低电平,根据已经定义好的虚拟接口卡指针与机械臂关节电机对应关系,该指令是让机械臂的一号关节按顺时针转动9度。然后给机械臂关节转动弧度参数赋值0.157弧度,并将此参数传给机械臂运动控制程序,可在GAZEBO仿真软件中查看机械臂运动。部分关节电机转动参数设置程序如图11所示。

Figure 11. Shutdown motor rotation parameter setting procedure
图11. 关机电机转动参数设置程序
5. 结论
该系统的半虚拟化设计,在PC端中的GAZEBO仿真软件中显示虚拟机械臂作为虚拟操作场景,再将虚拟接口卡和嵌入式系统开发板、PC端即电脑相连,实现了由外部硬件设备发送控制指令控制虚拟仿真机械臂运动,提供了一种可改善传统本科教学实验中机械臂设备成本高、损坏率高和全虚拟化仿真实验真实性较低的解决方案。既可满足对机械臂运动控制的教学实验,又可有真实的控制体验。并且虚拟化所具有的封装特性,能使得控制程序可以重用、共享并且不受地点的限制,可随时随地在宿舍或者教室里操作。这样的设计,既提高了学生学习兴趣和效率而且还可培养实际开发能力。
基金项目
2017年山东省重点研发项目“基于多肽的抗污染肿瘤标志物检测仪的研制”(2017GSF218088)。
2018年山东省本科教改项目“多学科交叉融合的软件工程专业创新型人才培养模式研究与实践”(M2018X130)。