我们已经使用URDF构建了一个机器人底座模型,并在Gazebo中将其进行了客可视化,下面然我们开始构建机械臂。机械臂的构建过程类似与机器人底座的构建过程,均使用URDF的方式构建,系需要参照机器人底座的URDF文件,并进行一些修改即可。下面来介绍机械臂的建立过程。
机械臂构建
机械臂需求
如果想要构建一个真正的机械臂,则基于实际需求,需要考虑类似的嵌入式框架、电子控制、执行器之间的实时通信、电源管理系统以及一个好的终端执行器。本文章的目的是在ROS中模拟机械臂,使其在现实中也能以同样的方式进行工作,所以我们的需求包括:一组独立运动且具有良好力矩的连杆、一套能够提供足够的有效载荷的好的执行器、驱动控制等
具体机械臂规格参数如下:
- 类型:5自由度的机械臂
- 有效载荷:3~5千克
软件参数
如果我们将机械臂试作一个黑匣子,机械必将会根据每个执行器接收到的命令给出一个位姿,命令可以是位置、力、效力或速度命令的形式
ROS消息格式
用来指挥或者控制机械臂的 话题 为 /arm_controller/command,其 消息格式为trajectory_msgs/JointTrajectoryROS控制器
在给定一系列关节位姿后,我们使用 jiont_trajectory_controller 控制机械臂执行关节空间轨迹。控制器的轨迹有控制器的名称空间 follow_joint_trajectory 中的有关接口发送给的,改接口为control_msgs::FollowTointTrajectoryAction
机械臂建模
由于已经在构建移动底座那部分内容中说明了建模的相关方法,并且本部分也将采用相同的方法构建机械臂,所我们直接开始逐步构建机械臂模型
- 初始化工作空间
我们将要在之前创造好的工作空间(chapter3_ws)中进行初始化。首先在之前给的链接中下载网格文件,然后进入到urdf文件夹,创建一个名为 robot_arm.urdf.xacro 文件,具体命令如下:cd ~/chapter3_ws/src/robot_description/urdf/
gedit robot_arm.urdf.xacro
使用一级代码初始化XML的version标签以及robot标签,然后一步步在文件中添加内容:
1 |
|
到这我们就完成了工作空间初始化的工作,下面定义连杆组件
- 定义连杆组件
下面将以下代码添加到< robot > 标签中去(即放在两个< robot > 标签中间)。由于5个连杆组件均包含各自不同的坐标信息,因此我们直接在这里进行定义。
- 组件一:机械臂底座
1 | <link name="base_link"> |
- 组件二:二头肌组件(bicep)
1 | <link name="bicep"> |
- 组件三:bottom_wrist
1 | <link name="bottom_wrist"> |
- 组件四:肘部连杆组件(elbow)
1 | <link name="elbow"> |
- 组件五:top_wrist
1 | <link name="top_wrist"> |
同时大家也可以去在该 网址 内寻找arm_base.urdf.xacro 文件获取内容。
- 定义关节组件
我们将为机械臂定义为可旋转的关节,即可以在指定区域内之间进行旋转。由于机械臂中所有关节都在指定区间内移动,并且对所有关节都是通用的,所以我们将这些关节组件定义在之前构建机器人底座时创建的同一个 robot_essentials.xacro 文件中:
1 | <xacro:macro name="wheel_joint" params="prefix origin"> |
同时在 robot_arm.urdf.xacro 中定义关节组件:
1 | <xacro:arm_joint prefix="shoulder" parent="arm_base" child="bicep" originxyz="-0.05166 0.0 0.20271" originrpy="0 0 1.5708"/> |
到这里就完成了文件内容的添加,下面我们使用rviz进行可视化,查看构建的机械臂是否和预期结果一样。具体操作指令如下:
cd ~/chapter3_ws/
source devel/setuo.bash
roscd robot_description/urdf/
roslaunch urdf_tutorial diaplay.launch model:=robot_arm.urdf.xacro
在选项 Global 中将 Fixed Frame 设置为arm_base,就能顺利的看到我们构建的机器人模型啦(如第一幅图所示)
同时,我们也可添加 tf 显示就能够看到更详细的信息(如第二幅图所示)
机械臂模拟
通过上一节操作我们已经完成了可以用于ROS的机械臂URDF文件。现在我们构建一个可以用于ROS的机器人模型,需要添加一些标签,方便在Gazebo中查看该模型。
- 定义碰撞
为了在Gazebo中查看机器人模型我们需要添加 < collision > 标签。改标签位于 < link > 中,与< visual > 同级。定义方法与定义 < visual > 标签的方法相同,只需要在连杆上指定必要的视觉和惯性标签即可,因为有5个不同的连杆组件,具体所有的连杆内容请参考(https://github.com/PacktPublishing/ROS-Robotics-Projects-SecondEdition/blob/master/chapter_3_ws/src/robot_description/urdf/robot_base.urdf.xacro) 内的代码,下面是对于arm_base连杆的:
1 | <inertial> |
到这里机器人模型的Gazebo属性就添加好了,下面开始创建机械装置。
- 定义执行器
现在我们为所有的连杆添加执行器信息。执行器的宏定义在 robot_arm_essentials.xacro 文件中,如下图所示:
1 | <xacro:macro name="arm_transmission" params="prefix "> |
同时我们还需要在机械臂文件中调用上述宏,具体如下:
1 | <xacro:arm_transmission prefix="arm_base"/> |
在添加了机械装置之后,就可以调佣控制器来使用相应的模型组件并让机器人动起来了。
- 定义控制器
最后我们使用向已经创建的 gazebo_essentials_arm.xacro 文件中添加控制器 joint_state_publisher 来导入建立Gazebo和ROS通信连接所必须的组件,具体方法如下:
1 | <gazebo> |
joint_state_publisher控制器用于发布机械臂连杆在空间中的状态信息。
到这里我们已经为机器人定义了宏和Gazebo插件。下面我们把这些内容添加到机械臂文件中。可以通过< robot > 宏标签内添加如下内容:
1 | <xacro:include filename="$(find robot_description)/urdf/robot_base_essentials.xacro" /> |
下面我们创建一个名为 arm_control.yaml 的文件,并定义机械臂控制器的配置参数:
cd chapter3_ws/src/robot_description/config/
gedit arm_control.yaml
并将一下代码加入到上述文件中去:
1 | arm_controller: |
至此,我们完成了机械臂模型的构建,下面在Gazebo中进行测试。
机械臂测试
下面我们对机械臂模型进行激活和测试,查看它是如何进行运动的,具体步骤如下:
- 创建一个启动文件来启动机械臂及控制器,执行以下命令,创建启动文件:
cd chapter3_ws/src/robot_description/launch/
gedit arm_gazebo_control_xacro.launch
将下列代码加入到上述文件:
1 |
|
- 运行以下命令,对机械臂进行可视化,然后打开新窗口,应执行命令查看相应的话题列表:
roslaunch robot_description arm_gazebo_control_xacro.launch
rostopic list
- 使用以下命令通过发布运动的数值控制机械臂运动:
rostopic pub /arm_controller/command trajectory_msgs/JointTrajectory ‘{joint_names: [“arm_base_joint”, “shoulder_joint”, “bottom_wrist_joint”, “elbow_joint”, “top_wrist_joint”], points: [{positions: [-0.1, 0.210116830848170721, 0.022747275919015486, 0.0024182584123728645, 0.00012406874824844039], time_from_start: [1.0,.0.]}]}’
系统集成
至此,我们成功创建的一个机器人的底座和一个机械臂,并且在Gazebo中对其进行了模拟测试,距离构建移动机械臂只有一步之遥。
移动机械臂建模
我们通过xacro简单的实现机器人底座和机械臂的连接,即创建移动机器机械臂的目标就是将机械臂与机器人底座连接。因此我们需要将机械臂模型中的 arm_base 连杆组件连接到机器人底座模型中的 base_link 连杆组件中。具体方法就是创建一个名为 mobile_manipulator.urdf.xacro 文件,然后将下列代码添加到该文件中去:
1 |
|
然后可以使用以下命令启动rviz,加载移动机械臂模型并 对其进行可视化,具体操作如下:
cd chapter3_ws/
source devel/setup.bash
roscd robot_description/urdf/
roslaunch urdf_tutorial display.launch model:=mobile_manipulator.urdf
移动机械臂模拟与测试
首先使用以下命令创建启动文件,并将设置代码加入到该文件中去:
cd chapter3_ws/src/robot_description/launch
gedit mobile_manipulator_gazebo_control_xacro.launch
1 |
|
最后运行一下命令可视化移动机械臂模型:
cd chapter3_ws/
source devel/setup.bash
roslaunch robot_description mobile_manipulator_gazebo_xacro.launch model
现在就可以基于前面使用过的 rqt_robot_steering 以及 rostopic的参数来控制移动机械臂了。
总结
在本次学习中,我们了解了如何在ROS中借助Gazebo定义、建模和模拟机器人。我们通过Gazebo上的插件定义了机器人的物理特性。从机器人底座开始,接着创建了一个5自由度的机械臂。最后,我们将机器人底座和机械臂组装起来,构成了移动机械臂。