机器人学是一个跨多个学科的工程领域,在当今有着广泛的应用,与移动机器人和不移动机器的标准分类不同,机器人还根据应用场景、工作介质等进行分类,如地上移动机器人、空中机器人、海洋机器人和空间一起人等。其中最常见的是移动机器人,另一类常用的静态机器人是机械别,它在工业中有着广泛的应用。它最初应用于起重,这了任务通常能够自动完成且具有重复性,但目前机械臂已经变得足够聪明,能够理解环境和感兴趣的物体,并与人类一起执行任务。这类机械臂现在叫cobot,就时移动机械臂。
本次教程主要介绍常见的移动机械臂,以便更好的了解和使用他们。在此基础上,我们将探讨构建移动机械臂项目先决条件和方法。通过本次学习,我门可以分别对机器人底座和机械臂进行建模和模拟,然后将他们组合在一起,并能够查看运行情况。
本次学习过程主要涵盖的主题包括:
- 常见的移动机械臂
- 移动机械臂的构建入门
- 单位极坐标系
- 机器人底座构建
- 机器臂构建
- 系统集成
那让我们一步一步的学习下去吧!!!!
技术要求
学习本次内容的相关要求如下:
- Ubuntu 18.04 及以上系统,(我这里是用的是Ubuntu 20.04系统),预先安装ROS Melodic Morenia 和Gazebo 9
- Ros 功能包:ros_control、ros_controllers、gazebo_ros_control
- 时间线和测试平台:
本章代码可以从一下网址下载:https://github.com/PacktPublishing/ROS-Robotics-Projects-SecondEdition/tree/master/chapter_3_ws/src/robot_description
常见的移动机械臂
移动机械臂已经在市场中存在很长一段时间了。最初为了提高移动机器人和机械臂的灵活性,开始组合使用移动机器人和机械臂。
- 来之Willow Garage 的移动机械臂 PR2
PR2(http://wiki.ros.org/Robots/PR2) 像人类一样具有理性导航的机动性和在环境中操纵物体的灵巧性。然而因为购置一台的价格需要40万美元的高昂价格,并不收到工业界的喜爱,但ROS在2007年出开始流行时,PR2是测试各种ROS功能包的试验台。但很快,移动机器人制造商开始在现有的移动机器人底座上建造机械臂,因为与PR2相比这样的方式成本更低。实物如下图一:
- Fetch Robotics公司的 Fetch 移动机械臂
Fetch(https://robots.ros.org/fetch/) 是一个&自由度机械臂和一个附加自由度(源自移动底座)的组合,躯干提升装置安装在一个移动机器人底座上,目标是承载100千克的有效载荷。Fetch有5英尺高,可以通过深度摄像头和激光扫描仪等传感器感知环境。事物如上图二:
- Pal Robotics公司的 Tiago 移动机械臂
其设计与Fetch相类似,相比于Fetch,Tiago(https://robots.ros.org/tiago/) 有一些优点。它有一个7自由度的机械臂,但他的手腕上还有一个力扭矩传感器,能够细致监测相关操作。Tiago还有许多内置软件功能,如NLP系统和人脸识别软件包等都可以随时部署。同时相比于Fetch,其手臂的有限载荷能力只有3千克,底座智能承载50千克。实物如上图三:
- Kinova Robotics公司的 MOVA 移动机械臂
该机械臂具有两条手臂,与PR2类似。不同的是这一款机械臂的动作复杂、缓慢且平滑。
至此我们大致了解了移动机械臂的基本情况。
移动机械臂的构建入门
下面将通过模拟的方式构建一台移动机械臂。以为一个移动机械臂需要一个良好的在中移动机器人底座和一个机械臂,所以这里将分别构建移动机器人底座和机械臂,然后将二者结合起来构成一个完整的移动机械臂。
对于移动机器人底座,我们的需求是:
- 能够在平坦的平面上移动,但不能再不规则的平面上移动
- 可以是差动驱动机器人,具有固定的方向盘和全轮驱动
- 目标载荷为50千克
对于机械臂,我们的需求是:
- 5个自由度
- 目标载荷为5千克
单位以及坐标系
在开始使用Gazebo和ROS中构建机械臂之前,我们需要记住ROS遵循的测量单位和坐标系。
就我们需要的而言,以下信息足够我们完成构建移动机械臂
测量单位:
- 底座单位:长度以米为单位;质量以千克为单位;时间以秒为单位。
- 推导单位:角度以弧度为单位;频率以赫兹为单位;力以牛顿为单位。
- 运动学推导单位:线速度以米每秒为单位;角速度以弧度每秒为单位;
坐标系约定:
- 使用右手坐标系:拇指为z轴,中指为y轴,食指为x轴。
- 绕z轴逆时针旋转为正,顺时针旋转为负
Gazebo及ROS机器人模型格式设定
Gazebo是一个支持ROS的物理模拟引擎,他可以在没有ROS的情况下独立运行。在Gazebo中创建的大多数模型都符合一种称为模拟描述格式(SDF)的XML格式。ROS则使用一种称为通用机器人描述格式(URDF)的XML格式。虽然这两种的机器人模型格式不同,但URDF文件能够在Gazebo的保护下自动转换成SDF,但是如果模型在SDF中定义的,则在引入某些基于ROS的特征时则可能会存在一些问题。
鉴于此,我们将以URDF格式创建机器人模型,并允许Gazebo的内置API完成转换工作,生成Gazebo支持的格式。
为了实现ROS和Gazebo的集成,我们需要在两者之间建立依赖关系,并将ROS消息转换成Gazebo可接受的消息。我们需要gazebo_ros_pkgs包用于帮助Gazebo理解ROS消息和服务。需要ros_control和ros_controller包提供机器人关节和执行器空间转换处理以及基于现有控制器对位置、速度以及力的控制处理功能。可以通过一下命令安装上述所需的功能包:
sudo apt-get install ros-noetic-ros-control
sudo apt-get install ros-noetic-ros-controllers
sudo apt-get install ros-noetic-gazebo-ros-control
这里由于版本不同,Ubuntu 18.04 的melodic版本将noetic更改为melodic就可以了,同时我这里由于提前安装过所以新安装为软件为零,第一次下载的稍有不同。
机器人底座构建
如前面所述,ROS从URDF的角度理解机器人。URFD是包含机器人的所有必要信息的XML标记列表。穿件了机器人底座的URDF文件之后,我们将在代码周围引入必要的连接器和封装,一遍可以与独立的物理模拟器(如Gazebo)交互和通信。
机器人底座需求
如果想要简历一个真正的机器人底座,那么需要考虑许多因素,例如电源管理系统、必要的电气和嵌入式特性以及机械动力传输系统。因为基于ROS能够对真实工作的机器人进行模拟仿真,所以我们能够用URDF的物理特性定义底盘和轮子、使用Gazebo-ros插件定义驱动器、适应ros-controllers定义驱动器的控制。
具体规格参数为:
- 尺寸:600×450×200 (长 × 宽 × 高,单位为毫米)
- 类型:四轮差分驱动机器人
- 速度:最高1米/秒
- 载荷:50千克
软件参数
接下来让我们了解一下构建这么一个移动机械臂所需要的ROS相关信息。
我们将移动机器人的底座看做一个黑匣子,在ROS术语中,通过一份名为/cmd_vel(命令速度)的topic接受信息,获得移动指定速度,并通过/odom(里程计)输出移动到的位置
ROS消息格式
/cmd_del尊村geometry_msgs/Twist消息格式;/odom遵从nav_msgs/Odometry消息格式ROS 控制器
我们将使用diff_driver_controller插件对机器人底座的差分运动学模型进行定义,能够实现机器人在空间中的运动
机器人底座建模
至此我们已经具备了构建机器人底座所需的所有信息,下年我们开始进行机器人建模。
- 初始化工作空间
我们需要做的就是为机器人模型定义类型为< link >< joint >网格的标记
按照一下步骤进行:
- 穿件ROS工作空间,添加文件
mkdir -p ~/chapter3_ws/src
catkin_init_workspace
cd ~/chapter3_ws/src/
catkin_create_pkg robot_description catkin
cd ~/chapter3_ws/
catkin_make
cd ~/chapter3_ws/src/robot_description/
mkdir config launch meshes urdf
从该网址获取网格文件,然后使用一下命令进入urdf文件夹,并创建robot_base.urdf.xacro的文件:
cd ~/chapter3_ws/src/robot_description/urdf/
gedit robot_base.urdf.xacro初始化XML版本标记以及< robot >标记,稍后将一步步的添加码源
1 |
|
至此我们完成了工作空间的初始化,下面定义连杆组件
- 定义连杆组件
目前我们已经完成了机器人模型的部分构建,接下来将定义底盘连杆的代码写到< robot >标记下(即两个< robot >之间):
1 | <?xml version="1.0"?> |
上述代码定义的是机器人的底盘,我们称之为base_link
同时我们需要将四个轮子连接到base_link。为了方便定义,将通过xacro来实现同一段轮子模型代码的复用,复用是将对其进行重命名,以实现对四个轮子的区分。首先需要穿件一个名为robot_essentials.xacro的文件,然后定义标准的宏,一遍对轮子模型进行复用:
1 |
|
到这里我们在上述文件中创建了一个轮子的通用宏。现在需要做的就是在自己的机器人模型文件中调用宏文件,只需将下列代码加入到robot_base.urdf.xacro文件中:
1 | <xacro:robot_wheel prefix="front_left"/> |
通过上述宏的形式就能够使用很少的代码对相同连杆元素模型代码实现复用
- 定义关键组件
作为关节组件的轮子仅与机器人底盘相连接,因此轮子连接至base_link,并且绕各自坐标系中的Y轴旋转。所以我们可以使用连续型的关节组件。又由于四个轮子是相同的,我们又可以将轮子关节组件以xacro的形式定义在robot_essentials.xacro文件中,具体如下:
1 | <xacro:macro name="wheel_joint" params="prefix origin"> |
同时我们还同样需要在robot_base.urdf.xacro文件中对轮子关节组件进行如下定义:
1 | <xacro:wheel_joint prefix="front_left" origin="0.222 0.250 0"/> |
到这里我们已经完成了机器人底座的模型构建,下面我们可以通过可视化工具rviz来看一看构造的模型是否与预期一致,具体操作命令如下:
cd ~/chapter3_ws/
source devel/setup.bash
roscd robot_description/urdf/
roslaunch urdf_tutorial display.launch model:=robot_base.urdf.xacro
如果一切顺利的话就能够通过rviz可视化界面看到我们构建的机器人模型了
机器人底座模拟
目前我们已经完成了可以用于ROS的机械臂URDF文件,已经构建了一个可以用于ROS的机器人模型。下面我们将添加一点标签,以便在Gazebo中查看该模型。
- 定义碰撞
为了在Gazebo中进行机器人模型的可视化,我们需要添加< collision > 标签,位于 < link > 标签中,与< visual> 标签同级,标签内容弄如下:
1 | <collision> |
对于底座,由于我们已经在robot_base.urdf.xacro文件中已经定义了base_link,因此将上述内容添加到该文件中的相应位置
对于所有的四个轮子连杆,我们已经在robot_essentials.xacro中已经有了定义,因此同样需要将上述内容添加到该文件中的相应位置
由于Gazebo是一个物理模拟器,所以我们需要在 < interial > 标签中添加物理学属性。我们可以从第三方软件中获得质量和惯性特性,然后将这些特性与适当的标签添加在 < link > 标签内。
- 对于底座,在 robot_base.urdf.xacro 文件中添加内容如下:
1 | <inertial> |
- 对于所有的四个轮子,在 robot_essentials.xacro 文件中添加的内容如下:
1 | <inertial> |
到这里我们已经完成了Gazebo的属性添加,下面我们将要创建机械装置
- 定义执行器
下面我们需要在 robot_base_essentials.xacro 文件中为机器人轮子定义执行信息:
1 | <xacro:macro name="base_transmission" params="prefix "> |
在机器人模型文件 robot_base.urdf.xacr 中以宏的形式调用
1 | <xacro:base_transmission prefix="front_left"/> |
- 定义控制器
最后我们将导入建立Gazebo和ROS通信连接所必须的插件。添加方法为创建一个含有 < Gazebo > 标签的 gazebo_essentials_base.xacro 文件。
- 在创建的文件中添加gazebo_ros_control插件
1 | <gazebo> |
- 添加机器人差分驱动插件
1 | <gazebo> |
- 轮子的摩擦属性以宏的形式定义
1 | <xacro:macro name="wheel_friction" params="prefix "> |
- 在机器人模型文件 robot_base.urdf.xacr 中调用宏
1 | <xacro:wheel_friction prefix="front_left"/> |
到这里我们已经定义了包含Gazebo插件的机器人宏,下面我们要把它们添加到机器人模型文件中。
具体步骤只需要在机器人模型文件中的 < robot > 宏标签内添加以下代码:
1 | <xacro:include filename="$(find robot_description)/urdf/robot_base_essentials.xacro" /> |
到目前为止我们已经完成了URDF文件的构建,下我们对控制器进行配置,具体配置文件请在 该代码仓库 中下载获取。
cd ~/chapter3_ws/src/robot_description/config
gedit control.ymal
机器人底座测试
在完成机器人底座的模型构建之后,下面我们来运行这个模型,查看机器人底座是怎样的运行的,具体操作步骤如下:
创建一个启动文件来启动机器人及其控制器,执行以下命令,进入蓝筹稳健并创建启动文件base_gazebo_control_xacro.launch
cd ~/chapter3_ws/src/robot_description/launch
gedit base_gazebo_control_xacro.launch将一下代码写入到上述启动文件中
1 |
|
- 执行以下命令,查看机器人底座的可视化形象:
cd ~/chapter3_ws/
source devel.setup.bash
roslaunch robot_description base_gazebo_control_xacro.launch
启动Gazebo环境之后,将会看到如下图所示的信息输出,且没有错误信息:
- 新建终端窗口,执行 rostopic list 命令查看直线上述过程所需的ROS话题:
rostopic list
ROS相应的话题如下图所示:
其中Gazebo显示的机器人如下图所示:
- 执行以下命令,使用rqt_robot_steering 节点控制机器人底座移动,在出现的窗口界面,选择我们的话题/robot_base_controller/cmd_vel,然后移动滑块就可以控制机器人移动了:
rosrun rqt_robot_steering rqt_robot_steering
至此,构建移动机械臂的第一阶段:构建移动机器人底座的任务我们就完成了,第二阶段的任务是构建机械臂以及系统的集成,具体内容请参考下面链接