刘广亮,刘成业, 郑江花
(齐鲁工业大学(山东省科学院),山东省科学院自动化研究所,山东省机器人与制造自动化技术重点实验室,山东 济南 250014)
移动机器人由于功能需求不同,结构形式和控制实现方式差别较大。具备相同功能的机器人,不同的生产厂家会采用不同的硬件(如电机、控制器等)和接口协议,使用的导航、路径规划、机器视觉等相关算法也不尽相同。一个稳定可靠的机器人系统需要将众多不同的硬件和不同接口协议算法集成起来,从而成为扩展性强、可配置、接口适应性良好的机器人系统。
ROS(robot operating system)是面向机器人应用的开源的元操作系统[1],与平常我们理解的计算机操作系统不同,是一种平台架构[2],设计的主要目的是为机器人研究和开发者提供框架和代码复用的支持,因此ROS具有良好的扩展性。ROS提供了大量的工具包和广泛的库文件,已经形成一种生态系统,拥有大量开发者支持,提供了一站式的解决方案。
ROS应用领域众多,如移动机器人、关节机器人、服务机器人、水下机器人等,已经成为机器人开放性的标准配置,通过ROS可以实现对已有机器人的二次开发。百度无人驾驶系统Apollo平台在设计中就参考了ROS的系统架构,同时优化了通信机制及数据兼容性[3]。
ROS实现移动机器人运动控制的核心是ros_control设计与配置,通过自定义,可以实现对不同硬件接口协议的耦合,满足不同机器人硬件配置的要求。本文设计了移动机器人控制架构,基于ros_control控制机制,配置差速运动控制器和机械臂关节控制器,设计了RobotHW硬件控制接口,采用CAN协议实现数据底层通信,完成对移动机器人的运动控制。控制器设计部分可以通过修改配置文件中的参数,在不用重新编译源代码的情况下实现对机器人的灵活配置,以适应不同机器人的结构形式和控制模式。
系统总体架构包括遥控端和本体端两大部分[2,4](图1),遥控端与本体端之间通过远程通信模块进行通信。远程通信模块可以实现数据和图像长距离稳定通信,可视通信距离可以达到1 km。
遥控端由操控计算机、显示屏、操控杆、视频服务器、数传模块和图传模块等6部分组成。操控计算机负责发出控制指令并接收本体端的数据信息,显示屏完成实时远程视频图像监控,同时监控车体姿态、电流电压以及其他探测传感器信息。
操控部分包括摇杆操控、键盘或者屏幕的鼠标操控,系统可以同时适应不同操控模式,实现对机器人的远程操控。
远程通信模块包括数传模块和图传模块,图传模块负责接收机器人本体端的视频信息并显示在监视器上,数传模块负责操控端指令下达和车体数据接收。
机器人本体端由车载计算机、电源模块、视觉系统、数据采集系统、运动控制系统、数传模块和图传模块等7部分组成。
车载计算机是核心,负责机器人系统运算和各部分的通信。
视觉系统负责机器人视频和图像采集,机器人本体由多部摄像机提供视频和图像,包括左右云台摄像机、全景摄像系统和机械臂端摄像机。视觉系统根据远程操控端指令分别提供各个摄像机图像视频信息,经处理后通过图传模块发送给远程操控端。
数据采集系统负责传感器的数据采集,经处理后发送给远程操控端显示。传感器包括姿态传感器、超声避障传感器、激光雷达和Kinect相机。
运动控制系统包括车体运动控制和机械臂运动控制部分。
针对机器人的控制,ROS系统提供了独立开发包ros_control,ros_control是ROS为开发者提供的应用系统与机器人载体之间的中间件,包含控制器接口、传动装置接口、硬件接口、控制器工具箱等功能包。用户可以在ros_control已有功能包基础上,根据接口协议编写硬件接口,简单而快速地完成机器人应用的开发[5](图2)。
图2 ros_control 实现机制Fig.2 ros_control implementation mechanism
开发者要真正实现对机器人的控制,需要根据机器人具体设计指标要求进行设计和配置工作,实现控制系统对不同硬件环境条件的适应,因为不同的硬件(如不同的伺服电机、编码器)需要不同的硬件接口协议设计,同时要在配置文件中进行参数配置(如速度和加速度等),从而保证控制系统的灵活性和可扩展性。
控制系统的设计与配置工作主要包括控制器设计、控制器配置、硬件接口配置、硬件接口设计、硬件通信实现5个部分。
控制器设计是根据机器人功能要求设计自己的定制控制器。在ros_control中内置很多控制器,如Diff_drive_controller、effort_controllers、joint_state_controller、position_controllers、velocity_controllers、joint_trajectory_controllers等。本文的机器人控制主要用到了Diff_drive_controller、joint_state_controller、velocity_controllers、joint_trajectory_controllers。因为控制设计没有特殊要求,所以直接使用了ros_control基础包,然后进行必要的控制配置就可以实现所要求的功能。
控制器配置主要是对每个控制器具体参数进行配置,如机器人差速运动参数包括左右轮对应关节、左右轮直径、轮距、更新频率、速度限制、加速度限制等。通过参数配置实现对机器人运动速度进行S曲线[6]平滑,保证运动速度控制稳定连续流畅,避免了手动控制时控制速度值的跳动。
硬件接口配置是指不同硬件(如电机)具有不同通信参数(如通信方式和地址)和通信协议,系统提供专门的配置文件进行参数配置。例如电机通信参数设置我们是通过配置电机参数文件(motors_spec.yaml)来完成。在此文件中可以配置电机转速、力矩参数、位置读取和写入地址、速度读取和写入地址、电流读取和写入地址等参数。这些配置参数将被继承自RobotHW的接口类读取到,并用于接口通信和两轮差速运动控制中。
硬件接口设计是指在两轮差速运动模型中,差速运动控制器需要对每个轮运动速度进行稳定流畅的控制,而运动速度是由电机转速决定的,如何实现对不同型号电机的控制是ros_control功能包设计的关键。在图2中可以看到,对电机控制是通过RobotHW接口来实现的。我们设计了接口类GammabotHW ,继承自 hardware_interface::RobotHW。在接口类GammabotHW中可以监听遥控杆节点发出的以cmd_vel为话题(topic)的控制信息即Twist消息。Twist消息包含了机器人运动的线速度和角速度信息,二者又分别包括了3个运动方向的线速度和3个角度方向的角速度。
在两轮差速运动中,只是用到一个运动方向的线速度值和一个水平转向的角速度值。接口类GammabotHW监听到摇杆发出的消息中的这两个速度值,同时结合read函数读取的当前机器人速度值和配置文件速度加速度控制策略,依据S曲线模型[6]进行速度值平滑优化,得到最优速度值,然后再通过write函数下达指令。
接口类GammabotHW中实现的另一个重要功能是建立循环进程,实时执行read和write操作。read函数完成电机转速的读取,write函数完成电机运转速度指令下达。实时性是由ros_control差速运动模型来保证。
硬件通信的底层实现核心是read和write函数的功能实现,由电机控制器的通信系统来完成。采用PCAN-Basic API通信方式,在硬件上,通过USB转CAN硬件设备实现与电机控制器的数据通信。在通信软件系统中,按照CAN通信协议和电机控制器指令协议,设计了PCAN-USB的通信模块接口类和串口通信协议,实现了电机指令的底层数据传输。
构建主要的ROS功能包和接口层,见表1~2。
表1 主要的ROS功能包
表2 主要接口层
通过ros_control控制机制实现对机器人运动的控制,必须按照ros_control的机制模式与步骤进行编程设计和配置。ros_control的运动控制机制设计实现步骤包括4个部分(图3):上层配置文件、配置服务器、硬件接口层设计和硬件执行层设计[7-8]。
图3 ros_control 接口实现Fig.3 Interface implementation of ros_control
机器人运行控制系统编写具体实现包括如下步骤:
机器人系统包括远程操控端和车体端两个系统部分,因此上层配置文件也包括了远程操控端和车体端两个部分。车体端配置文件是gammbot_bringup包中的gammabot.launch,此文件主要由3个部分的内容组成:系统参数设置、系统启动节点和启动其他模块或服务的launch启动文件。系统参数设置中可以设置是否可以启动或停止某些传感器(如深度相机)的启动、端口参数设置以及是否仿真运行等。系统需要的启动节点主要有robot_state_publisher、gammabot_services_node。gammabot.launch中执行的其他启动文件有gammabot_hw.launch(接口启动文件)、gammabot_hw_controllers.launch(控制器启动文件)、twist_mux.launch(多路复用姿态信息控制启动文件)等。
远程操控端的配置启动文件是gammabot_gui包中的showgui.launch文件,在此文件中启动gammabot_gui节点用来显示监控屏幕,同时启动joy_node节点接收遥控杆控制信息。
ROS另一个强大功能就是参数配置服务器。用户可以在launch文件中直接配置节点参数,也可通过加载参数文件(一般为yaml格式文件)配置参数,系统启动后参数自动加载,用户就可以在系统的其他部分通过参数服务器调用或者设置参数。系统中的参数文件包括遥控杆配置参数文件(joy_profiles.yaml)、控制器配置文参数文件(gammabot_control.yaml)、仿真参数文件(gammabot_gazebo.xacro)、关节配置文件(joints_config.yaml)、电机配置文件(motors_spec.yaml)等。
依据ros_control的设计机制[9],在硬件接口层我们构建3层架构模式:接口管理层(GammabotHW)、接口配置层和接口实现层。
接口管理层(GammabotHW)通过接口注册函数完成各类接口的注册,执行实时监听消息。同时建立循环进程,循环执行的read和write完成状态读取和指令下达。接口配置层包括差速运动控制接口配置类(BaseDiffDrive)、机械臂控制配置类(ArmBuilder)、控制板控制配置类(BaseboardPub),主要完成从ROS读取在步骤2中配置的参数,并调用接口执行。接口实现层包括差速运动接口类(DiffDrive、Motor)、机械臂运动接口类(ArmhwInterface)、控制板控制接口类(MbdInterface),具体完成运动控制实现,调用通信层实现与底层硬件(控制板和电机等)数据交互。
此部分采用了CAN通信方式,通过编写独立的CAN通信模块来完成。Motor类通过CAN通信接口完成电机读写操作。
图4 移动机器人探测抓取放射源Fig.4 Detecting and capturing radioactive source by mobile robot
这样,基于ROS移动探测作业机器人的控制系统,实现了机器人本体运动、云台控制、六轴机械臂控制、图像采集、IMU姿态数据采集以及探测传感器数据采集等功能。
研发的移动探测作业机器人样机经过测试(图4),机器人能够自动探测环境辐射剂量率,并给出放射源方位信息。操作人员远程操控机器人找到放射源,并借助远程视频监视系统操作机器人机械手臂及抓手,实现对放射源进行拾取和有效处置。
本文采用ros_control控制机制,设计实现了机器人差速运动控制系统,系统具有良好扩展性和定制化可配置能力,通过设置配置文件的不同参数和定制化硬件接口协议,可以快速适用不同硬件的机器人控制系统。研发的机器人样机系统可以适应不同的电机驱动模式、通信接口、速度与加速度控制模式、摄像视频系统以及机械臂结构形式等,同时系统支持摇杆、鼠标、键盘等多种操控方式,具有方便、灵活、远程操控功能。所有这些适应不同机器人的硬件配置组合都可以通过配置文件参数修改或者模块定制化接口实现快速切换。
但是,基于ROS搭建的机器人控制系统也存在结构松散、通信阻塞和稳定性等方面的不足。因此,我们下一步将在原有机器人控制系统的基础上,在集中式控制、通信接口模块和前端交互模块进行优化设计,在已完成轮式电池驱动探测机器人样机的基础上,继续开展液压驱动和内燃机驱动移动探测机器人控制系统的研究。