ROS2 Moveit2 - URDF 和 SRDF
URDF
MoveIt 2 从 URDF(统一机器人描述格式)开始,这是用于在 ROS 和 ROS2 中描述机器人的原生格式。在本教程中,您将找到 URDF 的资源、重要提示以及 MoveIt 2 特定要求的列表。
URDF 资源
-
URDF ROS Wiki 页面 - URDF ROS Wiki 页面是关于 URDF 的大部分信息的来源。
-
URDF 教程 - 使用 URDF 的教程。
-
SOLIDWORKS URDF 插件 - 一个插件,可让您直接从 SOLIDWORKS 模型生成 URDF。
注意:虽然上面的文档是为 ROS 编写的,但只要您将命令从 ROS 更改为 ROS2(即:rosrun -> ros2 run 或 roslaunch -> ros2 launch),所有文档都是有效的.
重要提示
本部分包含一组提示,用于确保您生成的 URDF 可以与 MoveIt 2 一起使用。在开始将 MoveIt 2 与机器人一起使用之前,请确保您阅读了所有这些提示。
关节名称中的特殊字符
关节名称不应包含以下任何特殊字符:-,[,],(,),
我们希望能够尽快摆脱对联名的这些限制。
安全限制
翻译:
一些URDF文件除了机器人的关节限制外还设置了安全限制。下面是为熊猫机器人头盘关节指定的安全控制器的示例:
<safety_controller k_position="100" k_velocity="1.5" soft_lower_limit="-2.857" soft_upper_limit="2.857"/>
“soft_lower_limit”字段和“soft_upper_limit”字段指定了该关节的关节位置限制。MoveIt 2 将比较这些限制和 URDF 中指定的关节硬限制,并选择更保守的限制。
注意:如果safety_controller中的“soft_lower_limit”和“soft_upper_limit”设置为0.0,您的关节将无法移动。MoveIt 2 依赖于您指定正确的机器人模型。
碰撞检查
MoveIt 2 使用 URDF 中指定的meshes(网格)进行冲突检查。URDF 允许您分别指定两组网格用于可视化和碰撞检测。一般来说,可视化网格可以详细且美观,但碰撞检测网格应该简单得多。网格中的三角形数量会影响碰撞检测机器人链接所需的时间。整个机器人的三角形数量应该在几千个左右。
Test your URDF
测试您的 URDF 并确保一切正常非常重要。ROS URDF 软件包提供了一个check_urdf工具。要使用 check_urdf 工具验证 URDF,请按照此处的说明进行操作。
URDF 示例
有许多 URDF 可用于使用 ROS 的机器人。
-
URDF 示例 - 来自 ROS 社区的 URDF 列表。
SRDF
SRDF 或语义机器人描述格式是对 URDF 的补充,并指定了关节组、默认机器人配置、其他碰撞检查信息以及完全指定机器人姿势可能需要的其他转换。生成 SRDF 的推荐方法是使用 MoveIt Setup Assistant。
虚拟关节
URDF 仅包含有关机器人物理关节的信息。通常,需要定义额外的关节,以指定机器人上根链接相对于世界坐标系的位置。在这种情况下,使用虚拟关节来指定此连接。例如,像PR2这样的移动机器人在平面上移动是使用平面虚拟关节来指定的,该平面虚拟关节将世界坐标系连接到机器人的坐标系上。一个固定的机器人(如工业机械手)应该通过固定的关节连接到世界。
被动接头(Passive Joints)
被动关节是机器人上的未致动关节,例如差速驱动机器人上的被动脚轮。它们在 SRDF 中单独指定,以确保运动规划或控制管道中的不同组件知道不能直接控制关节。如果您的机器人有未启动的脚轮,则应将它们指定为被动脚轮。
组
“组”(有时称为“JointGroup”或“规划组”)是 MoveIt 2 中的一个中心概念。MoveIt 2 始终作用于特定组。MoveIt 2 将仅考虑移动它正在规划的组中的关节 - 其他关节保持静止。(机器人中所有关节可能移动的运动计划可以通过创建一个包含所有关节的组来实现。组只是关节和链接的集合。可以通过以下几种不同方式之一指定每个组:
关节集合
可以将组指定为关节的集合。每个关节的所有子链接都将自动包含在组中。
链接集合
也可以将组指定为链接的集合。链接的所有父关节也包含在组中。
串行链
使用base link和 tip link指定串行链。链条中的尖端环节是链条中最后一个关节的 child link。链中的基础环节是链中第一个关节的parent link。
子组的集合
组也可以是组的集合。例如,您可以将 left_arm 和 right_arm 定义为两个组,然后定义一个名为 both_arms 的新组,其中包含这两个组。
末端执行器
机器人中的某些组可以被赋予特殊名称作为末端执行器。末端执行器通常通过固定关节连接到另一组(如手臂)。请注意,在指定作为末端执行器的组时,请务必确保末端执行器与其连接到的父组之间没有公共链接。
自碰撞
默认自碰撞矩阵生成器(Setup Assistant 的一部分)在机器人上搜索可以安全地禁用碰撞检查的链接对,从而减少运动规划处理时间。当这些链接对始终处于碰撞状态、从不处于碰撞状态、在机器人的默认位置发生碰撞时或当链接在运动链上彼此相邻时,它们将被禁用。采样密度指定了要检查多少个随机机器人位置以进行自碰撞。较高的密度需要更多的计算时间,而较低的密度更有可能禁用不应被禁用的对。默认值为 10,000 次碰撞检查。碰撞检查是并行进行的,以减少处理时间。
机器人姿势
SRDF 还可以存储机器人的固定配置。在这种情况下,SRDF 的一个典型示例是定义操纵器的 HOME 位置。配置与字符串 ID 一起存储,以后可以使用该字符串 ID 来恢复配置。
SRDF 文档
有关 SRDF 语法的信息,请在 ROS SRDF Wiki 页面上阅读更多详细信息。
装载 URDF 和 SRDF
MoveIt的所有使用RobotModel的组件都需要访问URDF和SRDF才能正常运行。在ROS 1中,这是通过将每个XML加载到全局参数服务器中的字符串参数(分别为/robot_description和/robot_description_semantic)来实现的。ROS 2没有全局参数服务器,因此确保所有适当的节点都有访问权限需要更多的工作。
启动文件规范
一种选择是为需要它们的每个节点设置参数,这通常使用启动文件完成。
加载 URDF 通常使用 xacro,因此加载它看起来像
from launch_ros.parameter_descriptions import ParameterValue from launch.substitutions import Command robot_description = ParameterValue(Command(['xacro ', PATH_TO_URDF]), value_type=str)
同时,必须明确地读入 SRDF。
with open(PATH_TO_SRDF, 'r') as f: semantic_content = f.read()
然后,必须将值加载到 EACH 节点中。
move_group_node = Node(package='moveit_ros_move_group', executable='move_group', output='screen', parameters=[{ 'robot_description': robot_description, 'robot_description_semantic': semantic_content, # More params }], )
字符串主题规范
另一种方法是将两个字符串发布为主题。此模式已通过 Robot State Publisher 完成,该发布器发布有关该主题的消息。这可以在启动文件中完成:std_msgs/msg/String
/robot_description
rsp_node = Node(package='robot_state_publisher', executable='robot_state_publisher', respawn=True, output='screen', parameters=[{ 'robot_description': robot_description, 'publish_frequency': 15.0 }] )
您还可以指示 MoveIt 节点发布主题。
move_group_node = Node(package='moveit_ros_move_group', executable='move_group', output='screen', parameters=[{ 'robot_description': robot_description, 'publish_robot_description': True, # More params }], )
将机器人描述发布为主题只需执行一次,无需在需要描述的每个节点中执行。
类似地,我们也可以将SRDF作为一条消息发布。这要求一个节点在启动文件中设置参数,并设置额外的参数publish_robot_description_semantic为True。
move_group_node = Node(package='moveit_ros_move_group', executable='move_group', output='screen', parameters=[{ 'robot_description_semantic': semantic_content, 'publish_robot_description_semantic': True, # More params }], )
然后,所有其他节点都可以订阅发布的字符串消息。
幕后花絮:RDFLoader
在 MoveIt 代码中的许多地方,机器人描述和语义是使用 RDFLoader 类加载的,该类将尝试从节点读取参数,如果失败,将尝试在短时间内订阅 String 主题。如果两种方法都无法获取参数,则警告将打印到控制台。