前言
Moveit的robot_moveit_config
包里有很多文件,在配置时容易搞不清关系,导致配置过程艰难、漫长。
同时互联网上的文档几乎没有详细介绍这部分配置包的,大神各有各的配法,比较混乱。
因此笔者整理了配置包内各个重要的文件,并梳理出了作用和调用的流程框架,希望对后来人有所帮助。
提示: 本篇文章非常详细,阅读时间较长,建议收藏作为工具书来查阅使用。
作者: Herman Ye @Auromix
Auromix是一个机器人爱好者组织,欢迎参与我们Github上的开源项目
目录
框架正在制作中…
配置包的文件解析
切片解析1: demo.launch
文件名为robot_moveit_config/launch/demo.launch
,是Moveit的经典demo,在RViz中显示机器人模型并通过RViz的MotionPlanning
插件来控制Moveit完成运动规划和轨迹控制。
以下为Moveit官方案例的panda_moveit_config/launch/demo.launch
完整代码:
<launch><arg name="arm_id" default="panda" /><!-- specify the planning pipeline --><arg name="pipeline" default="ompl" /><!-- By default, we do not start a database (it can be large) --><arg name="db" default="false" /><!-- Allow user to specify database location --><arg name="db_path" default="$(find panda_moveit_config)/default_warehouse_mongo_db" /><!-- By default, we are not in debug mode --><arg name="debug" default="false" /><!-- By default we will load the gripper --><arg name="load_gripper" default="true" /><!-- By default, we will load or override the robot_description --><arg name="load_robot_description" default="true"/><!-- Choose controller manager: fake, simple, or ros_control --><arg name="moveit_controller_manager" default="fake" /><!-- Set execution mode for fake execution controllers --><arg name="fake_execution_type" default="interpolate" /><!-- Transmission used for joint control: position, velocity, or effort --><arg name="transmission" /> <!-- By default, hide joint_state_publisher's GUI in 'fake' controller_manager mode --><arg name="use_gui" default="false" /><arg name="use_rviz" default="true" /><!-- Use rviz config for MoveIt tutorial --><arg name="rviz_tutorial" default="false" /><!-- If needed, broadcast static tf for robot root --><node pkg="tf2_ros" type="static_transform_publisher" name="virtual_joint_broadcaster_0" args="0 0 0 0 0 0 world $(arg arm_id)_link0" /><group if="$(eval arg('moveit_controller_manager') == 'fake')"><!-- We do not have a real robot connected, so publish fake joint states via a joint_state_publisherMoveIt's fake controller's joint states are considered via the 'source_list' parameter --><node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" unless="$(arg use_gui)"><rosparam param="source_list">[move_group/fake_controller_joint_states]</rosparam></node><!-- If desired, a GUI version is available allowing to move the simulated robot around manuallyThis corresponds to moving around the real robot without the use of MoveIt. --><node name="joint_state_publisher" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" if="$(arg use_gui)"><rosparam param="source_list">[move_group/fake_controller_joint_states]</rosparam></node><!-- Given the published joint states, publish tf for the robot links --><node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" respawn="true" output="screen" /></group><!-- Run the main MoveIt executable without trajectory execution (we do not have controllers configured by default) --><include file="$(dirname)/move_group.launch" pass_all_args="true"><arg name="allow_trajectory_execution" value="true" /><arg name="info" value="true" /></include><!-- Run Rviz and load the default config to see the state of the move_group node --><include file="$(dirname)/moveit_rviz.launch" if="$(arg use_rviz)"><arg name="rviz_tutorial" value="$(arg rviz_tutorial)"/><arg name="rviz_config" value="$(dirname)/moveit.rviz"/><arg name="debug" value="$(arg debug)"/></include><!-- If database loading was enabled, start mongodb as well --><include file="$(dirname)/default_warehouse_db.launch" if="$(arg db)"><arg name="moveit_warehouse_database_path" value="$(arg db_path)"/></include></launch>
对于代码中的各个部分,有以下解析:
arm_id
<arg name="arm_id" default="panda" /># 机器人的标识符。这个参数指定在机器人有多个实现时使用哪一个。# 当多机器人协同时,标识符可以用来区分它们。默认值设置为“panda”
pipeline
<arg name="pipeline" default="ompl" /># 机器人运动规划的管道。# MoveIt提供了几种规划算法,例如OMPL、SBPL等。此参数允许用户选择使用哪种算法进行运动规划。默认值为“ompl”。
关于OMPL(Open Motion Planning Library)
算法,可参考OMPL官方文档、OMPL Primer
db&db_path
<!-- By default, we do not start a database (it can be large) --><arg name="db" default="false" /><!-- Allow user to specify database location --><arg name="db_path" default="$(find panda_moveit_config)/default_warehouse_mongo_db" /># db:指定是否启动运动规划数据库。# 如果设为true,MoveIt会启动MongoDB数据库来存储或检索运动规划数据。默认值为false。# db_path:指定运动规划数据库的路径。# 这个参数允许用户指定MongoDB数据库的位置。默认值设置为“$(find panda_moveit_config)/default_warehouse_mongo_db”。
运动规划数据通常是指用于机器人或移动设备规划运动路径的数据,例如,目标位置、机器人当前位置、避障信息等。
在MoveIt中,Warehouse
的作用是提供持久化的存储方式,以保存完整的计划场景和机器人状态。通过使用适当的存储插件(如warehouse_ros_mongo
或warehouse_ros_sqlite
),用户可以将场景和状态保存到MongoDB
或SQLite
等不同的后端数据库中。这使得用户可以在不同的时间和地点重新加载和使用保存的场景和状态。
除了提供持久化存储的功能之外,Warehouse还可以用于数据查询、过滤和排序。通过使用MoveIt提供的接口,用户可以方便地从Warehouse中检索和获取他们所需要的场景和状态。这对于机器人操作中的实时计划和决策非常有用,因为它可以快速地检索到特定的场景和状态,而无需每次都重新计算或重新生成它们。
MongoDB
是一个流行的文档式(NoSQL)数据库,它以二进制JSON
格式存储数据。与传统的关系型数据库不同,MongoDB的结构灵活,适合存储半结构化数据或任意类型的文档。
关于在Moveit中使用数据库来存储和调用运动规划数据,可参考Moveit1 Warehouse MangoDB
debug
<!-- By default, we are not in debug mode --><arg name="debug" default="false" /># debug:指定是否启用RViz调试模式。如果设为true,则启用RViz中的调试模式。默认为false。# 该参数也会被传递给move_group.launch,用于开启move_group的GDB调试。
RViz debug mode
可以帮助开发人员诊断和解决问题。在调试模式下,Rviz可以显示更多的调试信息,例如ROS消息的内容和接收频率,帧率信息,以及RViz可视化中使用的资源和内存使用情况等。
这些信息可以帮助开发人员快速定位和解决问题,例如调试节点之间的通信问题、可视化资源的使用情况等。同时,调试模式还可以显式地显示Rviz中各种可视化元素的名称,标签和坐标信息, 以便更好的理解和调整要素的位置动态。
load_gripper
<!-- By default we will load the gripper --><arg name="load_gripper" default="true" /># load_gripper:指定是否加载机器人夹爪的控制器。此参数用于加载和配置夹爪的运动控制器。默认值为true。# 该参数将通过 pass_all_args="true" 属性被传递给move_group.launch
load_robot_description
<!-- By default, we will load or override the robot_description --><arg name="load_robot_description" default="true"/># 指定是否加载或覆盖机器人描述。MoveIt需要知道机器人的描述才能进行规划和控制。# 这个参数用于加载机器人的URDF文件或覆盖已有的机器人描述。默认值为true。# 该参数将通过 pass_all_args="true" 属性被传递给move_group.launch
load_robot_description
将机器人的描述文件(通常为urdf
或sdf格式)加载到ROS参数服务器中。如果load_robot_description参数为true,则会加载或覆盖先前设置的机器人描述文件。如果为false,则使用先前加载的机器人描述文件。
robot_description
的发布通过robot_state_publisher
节点来实现。该节点从参数服务器中获取机器人的描述信息,计算机器人每个联动部件的变换,并发布机器人的tf树和关节状态信息。 move_group节点接收tf和关节状态信息,用于运动规划和执行。
moveit_controller_manager
<!-- Choose controller manager: fake, simple, or ros_control --><arg name="moveit_controller_manager" default="fake" /># moveit_controller_manager:选择控制器管理器的类型。# 控制器管理器用于加载和配置机器人的控制器。# MoveIt提供了几种类型的控制器管理器,包括“fake”,“simple”和“ros_control”。默认值为“fake”。
MoveIt提供的控制器管理器包括以下三种类型:
-
fake
: 这种类型的控制器仅模拟运动,不与真实机器人进行通信。它通常用于快速测试和演示,对于仿真,通常使用fake控制器来模拟运动。 -
simple
: 这种类型的控制器与机器人进行通信,但仅提供了基本控制,例如直线/圆弧插值等。它适用于一些较简单的机器人。 -
ros_control
: 这是一种更灵活的控制器类型,可支持各种机器人和控制器硬件。它提供了更高级别的控制接口,例如电机控制器接口和传感器读取接口。
根据应用场景和机器人的要求,使用不同类型的控制器管理器。
ros_control是机器人强大的控制器,可参考ros_control WIKI文档和ros_control源代码
图片来源:ROS WIKI ros_control
fake_execution_type
<!-- Set execution mode for fake execution controllers --><arg name="fake_execution_type" default="interpolate" /># fake_execution_type:设置虚拟控制器的执行模式。# 如果选择“fake”控制器管理器,则使用虚拟控制器进行模拟运动。# 此参数指定用于虚拟运动的执行模式,包括“interpolate”和“step”。默认值为“interpolate”。
在Moveit官方文档中有关于fake controller
的描述,可参考Moveit1 Noetic官方文档
MoveIt提供了一系列虚拟轨迹控制器,可用于模拟。其中,虚拟控制器的配置文件位于 config/fake_controllers.yaml
。
可以根据需要调整以下控制器类型:
interpolate
: 在经过关键点时执行平稳插补,默认用于可视化。via points
: 遍历关键点,但不插补它们之间的点,用于可视化调试。last point
: 直接跳转到轨迹的最后一个点,用于离线基准测试。
虚拟控制器类型信息可在 fake_controllers.yaml
文件中配置。对于每个控制器,都需要指定名称、类型和涉及的关节。其中,频率为 rate: 10
,可用于插补控制器。但在对夹爪进行控制时,关节为空列表 []
。
示例:
rate: 10
controller_list:- name: fake_arm_controllertype: interpolatejoints:- joint_1- joint_2- joint_3- joint_4- joint_5- joint_6- name: fake_gripper_controllerjoints:[]
transmission
<!-- Transmission used for joint control: position, velocity, or effort --><arg name="transmission" /> # 设置用于关节控制的传输类型。这个参数用来选择传输类型,例如position、velocity或effort。# 默认情况下,这个参数未设置,不用理会。
use_gui
<!-- By default, hide joint_state_publisher's GUI in 'fake' controller_manager mode --><arg name="use_gui" default="false" /># use_gui:指定是否显示joint_state_publisher的GUI界面。# 如果设为true,则会在启动期间打开一个窗口,显示机器人的关节姿态。默认值为false。
在MoveIt的demo.launch
中,设置了一个默认的假控制器管理器(fake controller manager)模式,这意味着没有实际的控制器与机械臂连接。
在这种模式下,joint_state_publisher
发布的关节状态信息是通过fake_controller_joint_states
话题获得,隐藏其图形用户界面(GUI)可以避免用户误操作。因此,默认情况下隐藏joint_state_publisher
的GUI可以增加系统的可靠性。
use_rviz
<arg name="use_rviz" default="true" /># use_rviz:指定是否启用RViz。如果此参数设为true,则MoveIt将启动RViz进行可视化。默认值为true。
<!-- Use rviz config for MoveIt tutorial --><arg name="rviz_tutorial" default="false" /># rviz_tutorial:指定是否使用RViz配置进行MoveIt教程演示。# 如果设为true,则MoveIt将加载RViz演示配置。默认值为false。
虚拟关节静态TF节点
<!-- If needed, broadcast static tf for robot root --><node pkg="tf2_ros" type="static_transform_publisher" name="virtual_joint_broadcaster_0" args="0 0 0 0 0 0 world $(arg arm_id)_link0" /># 广播虚拟关节的静态变换# 将world坐标系映射到机器人的物理坐标系中的起点$(arg arm_id)_link0
通过使用虚拟关节,引入一个虚拟的“基准”点,来描述机器人在其环境中的位置,可以将机器人的关节状态映射到物理世界中的位置和姿态,以便进行逆运动学计算,规划器可以使用这些信息来规划运动轨迹或生成机器人姿态。
关节状态及机器人整体状态
<group if="$(eval arg('moveit_controller_manager') == 'fake')"><!-- We do not have a real robot connected, so publish fake joint states via a joint_state_publisherMoveIt's fake controller's joint states are considered via the 'source_list' parameter --><node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" unless="$(arg use_gui)"><rosparam param="source_list">[move_group/fake_controller_joint_states]</rosparam></node><!-- If desired, a GUI version is available allowing to move the simulated robot around manuallyThis corresponds to moving around the real robot without the use of MoveIt. --><node name="joint_state_publisher" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" if="$(arg use_gui)"><rosparam param="source_list">[move_group/fake_controller_joint_states]</rosparam></node><!-- Given the published joint states, publish tf for the robot links --><node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" respawn="true" output="screen" /></group># 如果moveit_controller_manager的类型是fake# 则启动joint_state_publisher和robot_state_publisher# 默认不启用joint_state_publisher_gui,以防用户在图形化窗口不小心调节了关节状态值
roslaunch xml
如果不熟悉这个代码片段里用到的ROS1 launch XML
语言,可参考ROS1 Launch文档
group的作用
这一个节点组group
的作用是当Moveit的控制器管理器被设为fake
类型时,该节点组会发布虚拟的机器人的关节状态/joint_states
,然后通过机器人状态发布器发布虚拟机器人的/tf
话题,以便在 RViz 订阅该/tf
话题并在RViz中显示虚拟机器人的状态。
在这个group
中,与robot_state_publisher
一起使用的还有joint_state_publisher
节点,它用于模拟发布关节状态信息。joint_state_publisher
会定期发布sensor_msgs/JointState
类型的/joint_states
话题,其中包含机器人各个关节的状态信息。robot_state_publisher
会订阅这些消息,并根据机器人的URDF模型计算机器人各个部件的位姿信息,并发布/tf
话题,最终完成机器人状态的更新和发布。
图解各节点关系
由rqt_graph
可知在这个demo中的各个节点及话题关系:
/move_group
节点发布/move_group/fake_controller_joint_states
话题/joint_state_publisher
节点订阅/move_group/fake_controller_joint_states
话题/joint_state_publisher
节点发布/joint_state
话题/robot_state_publisher
节点订阅/joint_state
话题/robot_state_publisher
节点发布/tf
话题- 虚拟关节静态TF节点发布
/tf
话题 /move_group
订阅/tf
话题,类型为- RViz订阅
/tf
话题
joint_state_publisher
Joint State Publisher是一个 ROS 包,用于发布机器人非固定关节的关节状态/joint_states
, 话题类型为sensor_msgs/JointState
。
在读取机器人的URDF 描述 robot_description
参数后,它会识别所有非固定关节,创建具有这些非固定关节的 JointState
消息,来设置和发布机器人关节状态值joint state values
。
它可以与 robot_state_publisher
一起使用,以发布所有关节状态的变换。
joint_state_publisher的输入
joint_state_publisher
订阅来自参数服务器的robot_description
,找到机器人描述中的所有非固定关节,并发布带有这些关节状态值的sensor_msgs/JointState
类型消息。
joint_state_publisher
可将source_list
作为输入,这是一个带有多个话题名的字符串列表,默认为空,将需要订阅的各个话题名填入其中,这些要订阅的话题是关于关节状态值的,话题类型也为sensor_msgs/JointState
在GUI模式下,joint_state_publisher_gui
能够接收来自joint_state_publisher_gui
图形化窗口工具的直接关节状态值(比如角度),这个状态值由用户拖动角度条来赋予。
在这个Moveit的案例中,/joint_state_publisher
节点订阅了来自/move_group
的/move_group/fake_controller_joint_states
话题,source_list
参数的内容为[move_group/fake_controller_joint_states]
joint_state_publisher的输出
joint_state_publisher
节点发布包含机器人关节name
,位置position
,速度velocity
和力度级别effort
等的/joint_states
话题,话题类型为sensor_msgs/JointState
robot_state_publisher
Robot State Publisher是一个ROS包,负责发布机器人整体运动学链的状态信息,包括关节和链路名称、父子关系以及每个链路的位置和方向等信息。该包对于在 RViz 或其他可视化工具中可视化机器人姿态至关重要。
它利用参数服务器中的robot_description
参数指定的通用机器人描述格式(URDF)和来自 /joint_states
话题,话题类型为sensor_msgs/msg/JointState
的关节状态值组,来计算机器人的正向运动学,并发布/tf
话题。
robot_state_publisher的输入
robot_state_publisher
在启动时会从参数服务器中的robot_description
加载机器人的运动学树模型URDF,可以通过启动文件传递robot_description
参数,其值为机器人的URDF描述字符串。
同时,robot_state_publisher
要订阅joint_states
话题,获取每个关节的状态值信息。
这些关节状态信息joint states
用于更新运动学树模型,进而计算出机器人各个杆件Link
的3D位姿信息Pose
robot_state_publisher的输出
对于固定关节,robot_state_publisher
将发布/tf_static
话题,类型为tf2_msgs/msg/TFMessage
对于可动关节,robot_state_publisher
发布/tf
话题,类型为tf2_msgs/msg/TFMessage
固定关节的位姿信息会在节点启动时发布到/tf_static
话题,这些信息将在历史记录中保存。而可动关节的位姿信息会在/joint_states
话题接收到相应关节状态的更新时,及时发布到/tf
话题中。
关于具体的使用例子,可以查看Gihub robot_state_publisher
图片来源:ROS WIKI robot_state_publisher
加载move_group
<!-- Run the main MoveIt executable without trajectory execution (we do not have controllers configured by default) --><include file="$(dirname)/move_group.launch" pass_all_args="true"><arg name="allow_trajectory_execution" value="true" /><arg name="info" value="true" /></include># 启动move_group.launch来加载move_group相关内容# 通过pass_all_args="true" 将demo.launch文件的所有arg参数传递给move_group.launch作为参数# 设置 allow_trajectory_execution 为 true,# 可以让 move_group 在运行过程中尝试让机器人执行这些预定义的轨迹# 但如果该参数设置为 false,则只会规划但不会执行规划的轨迹,机器人将保持静止# 此功能对于测试和调试非常有用,因为它允许操纵轨迹,而无需在机器人上实际执行它们# 它在关注安全的情况下也很有用,因为它提供了一种防止意外执行危险轨迹的方法# 如果将 info 设置为 true,则 move_group 会在控制台输出调试信息
pass_all_args="true"
是将所有的Father Launch
传入的参数都传递给Child Launch
的一个属性。
在MoveIt的demo.launch
文件中,pass_all_args="true"
被用于将Father Launch
的所有arg参数传递给Child Launch
,这意味着,Child Launch
可以获取到来自Father Launch
的所有参数,并继承它们。
在这个案例中,也就是将demo.launch
的所有arg内参传递给move_group.launch
。
注意,如果不设置pass_all_args="true"
,Child Launch
将只接收在include
标记中明确列举的参数。只传递include
标记中明确列举的参数有助于在Launch嵌套时控制参数不发生混乱。
加载RViz
<!-- Run Rviz and load the default config to see the state of the move_group node --><include file="$(dirname)/moveit_rviz.launch" if="$(arg use_rviz)"><arg name="rviz_tutorial" value="$(arg rviz_tutorial)"/><arg name="rviz_config" value="$(dirname)/moveit.rviz"/><arg name="debug" value="$(arg debug)"/></include># 当use_rviz=true时运行moveit_rviz.launch文件# 并传递参数rviz_tutorial用于选择是否使用Moveit RViz教学模式# rviz_config的值用于打开同目录下的/moveit.rviz配置文件# debug的值用来设置是否开启RViz的debug模式
加载数据库
<!-- If database loading was enabled, start mongodb as well --><include file="$(dirname)/default_warehouse_db.launch" if="$(arg db)"><arg name="moveit_warehouse_database_path" value="$(arg db_path)"/></include># 当参数db=true时,运行default_warehouse_db.launch# 向default_warehouse_db.launch传入参数moveit_warehouse_database_path,参数值为该数据库的路径
切片解析2: move_group.launch
文件名为robot_moveit_config/launch/move_group.launch
,用于启动move_group节点和相关的功能,move_group节点是MoveIt软件包中的一个关键组件,它提供了一种接口,用于执行MoveIt的各种功能,例如规划、执行、运动学计算等。
它通过与运动控制硬件和规划器交互,实现机器人运动的规划和执行。
move_group.launch
文件在panda_moveit_config/launch/demo.launch
中作为Child Launch文件被启动。
以下为Moveit官方案例的panda_moveit_config/launch/move_group.launch
完整代码:
<launch><!-- GDB Debug Option --><arg name="debug" default="false" /><arg unless="$(arg debug)" name="launch_prefix" value="" /><arg if="$(arg debug)" name="launch_prefix"value="gdb -x $(dirname)/gdb_settings.gdb --ex run --args" /><!-- Verbose Mode Option --><arg name="info" default="$(arg debug)" /><arg unless="$(arg info)" name="command_args" value="" /><arg if="$(arg info)" name="command_args" value="--debug" /><!-- move_group settings --><arg name="pipeline" default="ompl" /><arg name="allow_trajectory_execution" default="true"/><arg name="moveit_controller_manager" default="simple" /><arg name="fake_execution_type" default="interpolate"/><arg name="max_safe_path_cost" default="1"/><arg name="publish_monitored_planning_scene" default="true"/><arg name="capabilities" default=""/><arg name="disable_capabilities" default=""/><!--Other settings--><arg name="load_gripper" default="true" /><arg name="transmission" default="effort" /><arg name="arm_id" default="panda" /><arg name="load_robot_description" default="true" /><!-- load URDF, SRDF and joint_limits configuration --><include file="$(dirname)/planning_context.launch"><arg name="load_robot_description" value="$(arg load_robot_description)" /><arg name="load_gripper" value="$(arg load_gripper)" /><arg name="arm_id" value="$(arg arm_id)" /></include><!-- Planning Pipelines --><group ns="move_group/planning_pipelines"><!-- OMPL --><include file="$(dirname)/planning_pipeline.launch.xml"><arg name="pipeline" value="ompl" /><arg name="arm_id" value="$(arg arm_id)" /></include><!-- CHOMP --><include file="$(dirname)/planning_pipeline.launch.xml"><arg name="pipeline" value="chomp" /><arg name="arm_id" value="$(arg arm_id)" /></include><!-- Pilz Industrial Motion --><include file="$(dirname)/planning_pipeline.launch.xml"><arg name="pipeline" value="pilz_industrial_motion_planner" /><arg name="arm_id" value="$(arg arm_id)" /></include><!-- Support custom planning pipeline --><include if="$(eval arg('pipeline') not in ['ompl', 'chomp', 'pilz_industrial_motion_planner'])"file="$(dirname)/planning_pipeline.launch.xml"><arg name="pipeline" value="$(arg pipeline)" /><arg name="arm_id" value="$(arg arm_id)" /></include></group><!-- Trajectory Execution Functionality --><include ns="move_group" file="$(dirname)/trajectory_execution.launch.xml" pass_all_args="true" if="$(arg allow_trajectory_execution)"><arg name="moveit_manage_controllers" value="true" /></include><!-- Sensors Functionality --><include ns="move_group" file="$(dirname)/sensor_manager.launch.xml" if="$(arg allow_trajectory_execution)"><arg name="moveit_sensor_manager" value="panda" /></include><!-- Start the actual move_group node/action server --><node name="move_group" launch-prefix="$(arg launch_prefix)" pkg="moveit_ros_move_group" type="move_group" respawn="false" output="screen" args="$(arg command_args)"><!-- Set the display variable, in case OpenGL code is used internally --><env name="DISPLAY" value="$(optenv DISPLAY :0)" /><param name="allow_trajectory_execution" value="$(arg allow_trajectory_execution)"/><param name="sense_for_plan/max_safe_path_cost" value="$(arg max_safe_path_cost)"/><param name="default_planning_pipeline" value="$(arg pipeline)" /><param name="capabilities" value="$(arg capabilities)" /><param name="disable_capabilities" value="$(arg disable_capabilities)" /><!-- Publish the planning scene of the physical robot so that rviz plugin can know actual robot --><param name="planning_scene_monitor/publish_planning_scene" value="$(arg publish_monitored_planning_scene)" /><param name="planning_scene_monitor/publish_geometry_updates" value="$(arg publish_monitored_planning_scene)" /><param name="planning_scene_monitor/publish_state_updates" value="$(arg publish_monitored_planning_scene)" /><param name="planning_scene_monitor/publish_transforms_updates" value="$(arg publish_monitored_planning_scene)" /></node></launch>
GDB
<!-- GDB Debug Option --><arg name="debug" default="false" /><arg unless="$(arg debug)" name="launch_prefix" value="" /><arg if="$(arg debug)" name="launch_prefix"value="gdb -x $(dirname)/gdb_settings.gdb --ex run --args" /># GDB Debug Option:用于设置是否启用GDB调试。# 当 GDB debug模式关闭时,launch_prefix值为空# 当 GDB debug模式开启时,launch_launch_prefix为GDB相关命令
GNU symbolic debugger(GDB),是 Linux 平台下最常用的一款程序调试器。GDB 编译器通常以 gdb 命令的形式在终端(Shell)中使用。
调试工具可使被调试程序在指定代码处暂停运行,并查看当前程序的运行状态(例如当前变量的值,函数的执行结果等),也就是断点调试。
通过调试可以了解程序中出现的逻辑错误。
ubuntu是自带GDB调试工具的:
test@ubuntu:~$ gdb -v # Check the version of GDB
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
在这个代码片段中
gdb
: 是 GNU 调试器(GDB)的命令,它用于调试程序并跟踪其执行过程。
gdb_settings.gdb
包含一系列的GDB命令和调试设置,用于在调试过程中自动执行一些操作。
这些命令脚本文件可以包含启动GDB会话时要执行的初始化命令,设置断点,指定观察点,配置调试选项,执行一系列的调试操作以及其他自定义的GDB命令。通过编写调试脚本,可以自动执行一系列的调试操作,以节省手动输入命令的时间和精力。
在panda_moveit_config/launch/
文件夹下并未发现该文件,可能会自动生成或者Moveit的开发者不希望用户使用
gdb -x $(dirname)/gdb_settings.gdb
中的-x
使得gdb_settings.gdb
脚本文件被加载到GDB中,这将使GDB执行gdb_settings.gdb
脚本文件文件中定义的命令和操作。
--ex run
选项告诉 GDB 在启动调试器后立即执行 run 命令,使需要调试的程序开始运行。
--args
选项后面可以跟随要调试的程序及其参数。
在这个案例中,通过启用debug模式,使得launch_prefix为GDB相关内容,这个前缀将在 <node name="move_group" launch-prefix="$(arg launch_prefix)" pkg="moveit_ros_move_group" type="move_group" respawn="false" output="screen" args="$(arg command_args)">
中被使用,也就是在启动move_group
节点时会被作为launch-prefix
传入。
info模式
<!-- Verbose Mode Option --><arg name="info" default="$(arg debug)" /><arg unless="$(arg info)" name="command_args" value="" /><arg if="$(arg info)" name="command_args" value="--debug" /># Verbose Mode Option:用于设置是否启用详细模式。# 当开启详细模式时,move_group会在console输出更多信息,帮助用户了解move_group中发生的事情# info:用于指示是否启用详细模式的参数,默认与debug参数相同。# 当开启debug时,verbose详细模式也将被默认开启# 如果详细模式开启,则command_args参数值为--debug
在这个案例中,move_group
节点启动时将使用command_args
参数作为参数传入move_group
节点:
<node name="move_group" launch-prefix="$(arg launch_prefix)" pkg="moveit_ros_move_group" type="move_group" respawn="false" output="screen" args="$(arg command_args)">
。
info
参数在demo.launch
中作为参数被pass_all_args="true"
传入到move_group.launch
中作为参数。
pipeline
<!-- move_group settings --><arg name="pipeline" default="ompl" /># 机器人运动规划的管道。# MoveIt提供了几种规划算法,例如OMPL、SBPL等。此参数允许用户选择使用哪种算法进行运动规划。默认值为“ompl”。
关于OMPL(Open Motion Planning Library)
算法,可参考OMPL官方文档、OMPL Primer
在这个案例中,pipeline
参数在demo.launch
中作为参数被pass_all_args="true"
传入到move_group.launch
中作为参数。
allow_trajectory_execution
<arg name="allow_trajectory_execution" default="true"/># 设置 allow_trajectory_execution 为 true,# 可以让 move_group 在运行过程中尝试让机器人执行这些预定义的轨迹# 但如果该参数设置为 false,则只会规划但不会执行规划的轨迹,机器人将保持静止# 此功能对于测试和调试非常有用,因为它允许操纵轨迹,而无需在机器人上实际执行它们# 它在关注安全的情况下也很有用,因为它提供了一种防止意外执行危险轨迹的方法
在这个案例中,allow_trajectory_execution
参数在demo.launch
中作为include file="$(dirname)/move_group.launch"
的arg
参数被传入到move_group.launch
中作为参数。
moveit_controller_manager
<arg name="moveit_controller_manager" default="simple" /># moveit_controller_manager:选择控制器管理器的类型,在move_group中默认值为“simple”。# 控制器管理器用于加载和配置机器人的控制器。# MoveIt提供了几种类型的控制器管理器,包括“fake”,“simple”和“ros_control”。
MoveIt提供的控制器管理器包括以下三种类型:
-
fake
: 这种类型的控制器仅模拟运动,不与真实机器人进行通信。它通常用于快速测试和演示,对于仿真,通常使用fake控制器来模拟运动。 -
simple
: 这种类型的控制器与机器人进行通信,但仅提供了基本控制,例如直线/圆弧插值等。它适用于一些较简单的机器人。 -
ros_control
: 这是一种更灵活的控制器类型,可支持各种机器人和控制器硬件。它提供了更高级别的控制接口,例如电机控制器接口和传感器读取接口。
根据应用场景和机器人的要求,使用不同类型的控制器管理器。
在这个案例中,moveit_controller_manager
参数在demo.launch
中通过pass_all_args="true"
被传入到move_group.launch
中作为参数。
在move_group.launch
中这个参数默认为simple
,而在demo.launch
中为fake
,这是因为demo.launch
是单纯用于RViz中测试MotionPlanning
插件的,通过demo.launch
来启动move_group.launch
时,控制器的类型为fake
。
fake_execution_type
<arg name="fake_execution_type" default="interpolate"/># fake_execution_type:设置虚拟控制器的执行模式。# 如果选择“fake”控制器管理器,则使用虚拟控制器进行模拟运动。# 此参数指定用于虚拟运动的执行模式,包括“interpolate”和“step”。默认值为“interpolate”。
在Moveit官方文档中有关于fake controller
的描述,可参考Moveit1 Noetic官方文档
MoveIt提供了一系列虚拟轨迹控制器,可用于模拟。其中,虚拟控制器的配置文件位于 config/fake_controllers.yaml
。
可以根据需要调整以下控制器类型:
interpolate
: 在经过关键点时执行平稳插补,默认用于可视化。via points
: 遍历关键点,但不插补它们之间的点,用于可视化调试。last point
: 直接跳转到轨迹的最后一个点,用于离线基准测试。
虚拟控制器类型信息可在 fake_controllers.yaml
文件中配置。对于每个控制器,都需要指定名称、类型和涉及的关节。其中,频率为 rate: 10
,可用于插补控制器。但在对夹爪进行控制时,关节为空列表 []
。
示例:
rate: 10
controller_list:- name: fake_arm_controllertype: interpolatejoints:- joint_1- joint_2- joint_3- joint_4- joint_5- joint_6- name: fake_gripper_controllerjoints:[]
max_safe_path_cost
<arg name="max_safe_path_cost" default="1"/># max_safe_path_cost:最大安全路径成本,默认为1。# 作为参数sense_for_plan/max_safe_path_cost的值被传入move_group节点# 这个参数值将影响move_group路径规划的行为。# 目前没有发现该值的使用标准和方式,可以不理会。
max_safe_path_cost
参数用于设置移动组(MoveGroup)中的最大安全路径成本参数sense_for_plan/max_safe_path_cost
。这个参数定义了移动组在规划机器人路径时所能接受的最大路径成本。路径成本是基于路径上的障碍物、碰撞风险等因素计算得出的。
当进行路径规划时,MoveIt会根据给定的目标设置和约束条件尝试找到一条满足安全性要求的路径。如果生成的路径的总成本(代价)超过了max_safe_path_cost
参数指定的阈值,那么MoveIt将认为该路径不是安全的,将停止搜索更多的路径。这有助于避免规划出不安全或代价过高的路径。
较低的最大安全路径成本阈值会导致规划器更加谨慎并更多地考虑避免碰撞和障碍物,因为很容易到达最大的安全成本阈值,变得不安全。
而较高的最大安全路径成本可以帮助增加规划器生成有效路径的能力,因为有更加宽容的安全路径成本范围可供规划器去生成路径。
通过设置max_safe_path_cost
参数,可以限制规划器为机器人生成的路径选择最安全的路径。
publish_monitored_planning_scene
<arg name="publish_monitored_planning_scene" default="true"/># 是否发布监视的规划场景,默认为true。
在MoveIt的move_group.launch
中,<arg name="publish_monitored_planning_scene" default="true"/>
用于设置是否发布监视的的规划场景。
如果该参数被设置为true
,发布监视的规划场景被启用,它会将当前的规划场景发布到特定的话题,其他节点或工具可以通过订阅该话题以获取最新的规划场景信息,监视的规划场景包含有关机器人、障碍物、规划请求和其他相关信息的实时数据,
当开启时,用户或系统可以实时监视、分析和响应规划场景的变化,从而进行相应的处理,这对于可视化、调试和其他用途非常有用。
MoveIt的move_group
节点会在规划过程中发布监视的规划场景,包括planning_scene_monitor/publish_planning_scene
,planning_scene_monitor/publish_geometry_updates
,planning_scene_monitor/publish_state_updates
,planning_scene_monitor/publish_transforms_updates
。
capabilities
<arg name="capabilities" default=""/><arg name="disable_capabilities" default=""/># 用于设置运动规划组(move_group)的功能和禁用功能的选项# 无需理会
<arg name="capabilities">
用于指定在运动规划组中启用的功能。这些功能包括例如允许规划运动轨迹、执行运动轨迹、执行单个运动目标等。可以通过在<arg name="capabilities">
中设置相应的值来启用特定的功能。
<arg name="disable_capabilities">
用于禁用运动规划组中的某些功能。通过在<arg name="disable_capabilities">
中设置功能的值,可以禁用规划组中不需要的功能。这对于限制或简化运动规划组的功能很有用。
这些选项允许根据应用程序的需求灵活地配置和定制MoveIt的运动规划组的功能。
load_gripper
<!--Other settings--><arg name="load_gripper" default="true" /># 指定是否加载机器人夹爪的控制器。此参数用于加载和配置夹爪的运动控制器。默认值为true。
在这个案例中,load_gripper
由demo.launch
通过pass_all_args="true"
传入move_group.launch
transmission
<arg name="transmission" default="effort" /># 设置用于关节控制的传输类型。这个参数用来选择传输类型,例如position、velocity或effort。# 默认情况下,这个参数在move_group中被设置为"effort"
在MoveGroup中,<arg name="transmission" default="effort" />
是一个参数,用于指定机械臂的传动类型。此参数指定了机械臂控制器(controller)使用的传动系统类型,默认为"effort"(力/扭矩传动)。
传动类型的选择会影响机械臂在MoveGroup中的控制方式。具体的传动类型包括:
- Effort Transmission(力/扭矩传动):该传动类型假定机械臂的控制输入是力/扭矩,用于控制关节的扭矩或力。适用于需要对关节施加特定力或扭矩来实现精确控制和力感知的应用。
- Velocity(速度)适用于控制执行器以特定的速度运动。它可用于需要执行平滑、连续运动的任务。
- Position(位置)适用于控制执行器移动到特定位置或关节角度。它可用于需要执行准确位置控制的任务。
如果任务需要施加特定的力或扭矩,可以选择effort控制方式。
如果任务需要平滑连续的运动,可以选择velocity控制方式。
如果任务需要精确的位置控制,可以选择position控制方式
选择合适的传动类型取决于机械臂的具体配置和要求。在配置MoveGroup时,可以根据机械臂的传动系统设置相应的参数,以确保正确的控制信号传递给机械臂。
在这个案例中,transmission
由demo.launch
通过pass_all_args="true"
传入move_group.launch
,在demo.launch
中该值为空,也就是使用默认的值为effort
arm_id
<arg name="arm_id" default="panda" /># 机器人的标识符。这个参数指定在机器人有多个实现时使用哪一个。# 当多机器人协同时,标识符可以用来区分它们。默认值设置为“panda”
load_robot_description
<arg name="load_robot_description" default="true" /># 指定是否加载或覆盖机器人描述及joint_limits文件。MoveIt需要知道机器人的描述才能进行规划和控制。# 这个参数用于加载机器人的URDF文件或覆盖已有的机器人描述。默认值为true。
load_robot_description
将机器人的描述文件(通常为urdf
或sdf格式)加载到ROS参数服务器中。如果load_robot_description参数为true,则会加载或覆盖先前设置的机器人描述文件。如果为false,则使用先前已经加载了的机器人描述文件。
robot_description
的发布通过robot_state_publisher
节点来实现。该节点从参数服务器中获取机器人的描述信息,计算机器人每个联动部件的变换,并发布机器人的tf树和关节状态信息。 move_group节点接收tf和关节状态信息,用于运动规划和执行。
在这个案例中,load_robot_description
由demo.launch
通过pass_all_args="true"
传入move_group.launch
URDF/SRDF/joint_limits配置
<!-- load URDF, SRDF and joint_limits configuration --><include file="$(dirname)/planning_context.launch"><arg name="load_robot_description" value="$(arg load_robot_description)" /><arg name="load_gripper" value="$(arg load_gripper)" /><arg name="arm_id" value="$(arg arm_id)" /></include>
嵌套的include指令会调用planning_context.launch
文件,并将load_robot_description
、load_gripper
和arm_id
参数传递给它。
planning_context.launch
文件的作用是加载URDF(Unified Robot Description Format)
、SRDF(Semantic Robot Description Format)
和关节限制配置joint_limits configuration
等相关文件,为机器人的运动规划上下文planning context
创建所需的配置和环境。
运动规划管道
<!-- Planning Pipelines --><group ns="move_group/planning_pipelines"><!-- OMPL --><include file="$(dirname)/planning_pipeline.launch.xml"><arg name="pipeline" value="ompl" /><arg name="arm_id" value="$(arg arm_id)" /></include><!-- CHOMP --><include file="$(dirname)/planning_pipeline.launch.xml"><arg name="pipeline" value="chomp" /><arg name="arm_id" value="$(arg arm_id)" /></include><!-- Pilz Industrial Motion --><include file="$(dirname)/planning_pipeline.launch.xml"><arg name="pipeline" value="pilz_industrial_motion_planner" /><arg name="arm_id" value="$(arg arm_id)" /></include><!-- Support custom planning pipeline --><include if="$(eval arg('pipeline') not in ['ompl', 'chomp', 'pilz_industrial_motion_planner'])"file="$(dirname)/planning_pipeline.launch.xml"><arg name="pipeline" value="$(arg pipeline)" /><arg name="arm_id" value="$(arg arm_id)" /></include></group># 启动OMPL规划器# 启动CHOMP规划器# 启动Pilz Industrial Motion规划器# 当还有其他自定义的pipeline时,再启动自定义规划器# 自定义规划器的文件为 planning_pipeline.launch.xml# 启动的规划器包括预定义的规划器(OMPL、CHOMP和Pilz Industrial Motion)以及自定义规划器
planning_pipeline.launch.xml
这个文件用于调用对应的pipeline.launch.xml
,以下是这个文件的内容:
<launch><!-- This file makes it easy to include different planning pipelines;It is assumed that all planning pipelines are named XXX_planning_pipeline.launch --><arg name="pipeline" default="ompl" /><arg name="arm_id" default="panda" /><include ns="$(arg pipeline)" file="$(dirname)/$(arg pipeline)_planning_pipeline.launch.xml" pass_all_args="true"/></launch>
例如,当传入的pipeline
参数为ompl
时,启动对应的ompl_planning_pipeline.launch.xml
文件,这使得不同规划库的planning_pipeline.launch.xml
易于管理,通过planning_pipeline.launch.xml
来专门进行调用。
同时加载多个规划器的原因
同时启动这三个规划器的目的是为了提供多种选择和灵活性,以适应不同的运动规划需求和算法偏好。每个规划器都有其独特的算法和特点,可以在不同的场景下产生较好的规划结果。
尽管这三个规划器都被加载,但在实际使用过程中,通常只会选择其中一个规划器进行规划任务。
这是因为move_group
节点启动时,会选择默认的规划器,这个默认的规划器即是用户传入的pipeline
参数,只有与其值匹配的规划器才会真正执行规划任务。
<param name="default_planning_pipeline" value="$(arg pipeline)" />
因此,只有其中一个规划器会被激活,不会发生冲突。通过在配置文件中选择合适的规划器,并将对应的pipeline
参数设置为相应的值,可以确保只有需要的规划器被启动和使用。
这种设计让用户能够灵活选择和切换规划器,以满足其特定的需求和实际情况。
同时,对于GUI控制,通过在RViz
的MotionPlanning
插件中的Context
部分可以切换规划。
轨迹执行器
<!-- Trajectory Execution Functionality --><include ns="move_group" file="$(dirname)/trajectory_execution.launch.xml" pass_all_args="true" if="$(arg allow_trajectory_execution)"><arg name="moveit_manage_controllers" value="true" /></include># 当allow_trajectory_execution=true时,也就是允许轨迹执行时# 启动trajectory_execution.launch.xml文件# 这个文件负责运行MoveIt的轨迹执行功能# 将moveit_manage_controllers参数设置为`true`表示由MoveIt来管理控制器
文件trajectory_execution.launch.xml
用于配置MoveIt的轨迹执行器trajectory_execution
。而moveit_manage_controllers
参数用于控制MoveIt对底层机器人控制器的管理方式。
具体来说,
当moveit_manage_controllers="true"
意味着MoveIt将管理整个机器人控制系统(包括底层的控制器),并负责确保控制器在需要时启动,并在不需要时关闭。这是最常用的设置,尤其是在使用单一机器人控制器的情况下。
当moveit_manage_controllers="false"
表示MoveIt不负责底层机器人控制器的启管理工作。这意味着用户需要自行处理底层控制器的管理。这种设置适用于那些已经具有独立的控制器管理系统的用户,或者在使用多个独立控制器的复杂机器人系统中。
通过配置moveit_manage_controllers
参数,可以根据实际情况选择是让MoveIt管理机器人控制器,还是由用户自行管理。
传感器管理器
<!-- Sensors Functionality --><include ns="move_group" file="$(dirname)/sensor_manager.launch.xml" if="$(arg allow_trajectory_execution)"><arg name="moveit_sensor_manager" value="panda" /></include># 用于管理各个传感器# 当允许轨迹控制时才启动传感器管理器# 参数moveit_sensor_manager的作用是指定要使用的传感器管理器的名称或标识符# 该参数的值用于告知MoveIt系统应该使用哪个传感器管理器来处理与传感器设备的交互
moveit_sensor_manager
传感器管理器moveit_sensor_manager
是Moveit中一个负责与传感器设备通信和数据处理的组件。不同的传感器设备可能需要不同的传感器管理器来处理其数据格式、通信接口等特定要求。通过moveit_sensor_manager
,可以灵活地配置和切换传感器管理器,以适应不同的传感器设备或需求。
allow_trajectory_execution
allow_trajectory_execution
为真的情况下,才需要加载传感器管理器。
这是因为轨迹执行阶段需要使用传感器数据来监测和调整实际的运动执行过程。
如果不执行轨迹,或者不需要基于传感器数据进行实时监测和调整,那么加载传感器管理器可能是不必要的,因此使用allow_trajectory_execution
作为启动条件可以根据需要有选择地加载和使用传感器管理器。
sensor_manager.launch.xml
sensor_manager.launch.xml
的作用是管理MoveIt中的传感器,它用于配置和启动与MoveIt相关的传感器设备。这可能包括类似深度相机、激光扫描仪或其他传感器设备。该文件定义了传感器设备的参数,例如传感器的类型、发布的话题以及相关的参数设置。
在move_group.launch
中调用sensor_manager.launch.xml
的目的是允许MoveIt系统与传感器设备进行交互,以便在运动规划和执行过程中获取感知数据。通过将传感器启动文件包含到move_group.launch
中,MoveGroup节点可以与传感器节点进行通信,并使用传感器数据对运动规划和执行进行增强或调整。
move_group节点
<!-- Start the actual move_group node/action server --><node name="move_group" launch-prefix="$(arg launch_prefix)" pkg="moveit_ros_move_group" type="move_group" respawn="false" output="screen" args="$(arg command_args)"># 根据GDB调试器开关的参数作为launch-prefix# launch-prefix用于指定在启动节点时添加的前缀命令。这通常用于设置环境变量或传递特定的命令行参数# 运行moveit_ros_move_group包中的move_group文件# respawn指定节点是否在结束后重新启动。在这里设置为"false",意味着节点在结束后不会重新启动。# output指定输出打印到屏幕上,也就是终端窗口里# args="$(arg command_args)"用于传递额外的命令行参数给节点。# 此处的command_args参数值是--debug# 意味着当debug模式开启时会提供详细信息输出模式
X 服务器
X服务器(X Server
)是一个用于图形显示的软件服务,它是在Linux
和Unix
系统中实现图形用户界面(GUI)的基本组件之一。X服务器管理图形显示设备(如显示器、键盘、鼠标等),接收用户输入并将图形界面渲染到显示器上。
在现代的Linux
系统中,常用的X服务器实现是X.Org Server
,
Ubuntu
系统所使用的是Xserver - X Window System display server
X Window System
由客户端和服务端组成,服务端X Server
负责图形显示,而客户端库X Client
根据系统设置的DISPLAY
环境变量,将图形显示请求发送给相应的X Server
。
只需要在远端开启一个X Server,并在目标机器上相应的设置DISPLAY变量,即可完成图形的远程显示。
常见的应用情景是:
ssh -X username@ubuntu-server-ip
在使用ssh -X
时,通过 Secure Shell(SSH)
进行 X11转发,用户可以在远程服务器上运行图形界面程序,并将其显示到本地计算机上,而无需在本地安装图形界面软件。
这意味着用户可以通过SSH 连接到机器人上进行远程服务器管理,同时在本地计算机上查看和操作远程的图形界面程序,图形界面将通过SSH隧道和X11转发显示在使用的主计算机上。
Display
<!-- Set the display variable, in case OpenGL code is used internally --><env name="DISPLAY" value="$(optenv DISPLAY :0)" />
在ROS中,用于控制机器人的软件通常是在高级计算机上运行的,而不是边缘端,通常图像并不在边缘端显示。
当涉及到在图形界面上显示或操作时(例如可视化机器人模型、运动规划的可视化结果等),通常会使用OpenGL
库进行绘图操作。
设置DISPLAY
环境变量是为了确保move_group
节点内部的OpenGL
代码能够正确地显示图形界面。DISPLAY
环境变量指定了X Server
的地址,它告诉程序在哪里显示图形界面。
<env>
是ROS Launch文件中用来设置环境变量的标签。
optenv
是ROS Launch文件中的一个函数,用于从系统环境变量中获取值并提供默认值。
在Linux
系统中(例如Ubuntu
),DISPLAY
环境变量指示了X Server
的位置,它的格式通常是hostname:display_number.screen_number
。对于本地X Server
,一般使用:0
来表示默认的第一个显示屏。
$(optenv DISPLAY :0)
表示从系统环境变量中获取DISPLAY
的值,如果没有找到则使用默认值:0
。
在这段代码中,通过标签将DISPLAY
环境变量设置为$(optenv DISPLAY :0)
。
这样一来,当move_group节点需要在图形界面上显示结果时,它会使用设置好的DISPLAY环境变量来与X服务器进行通信,以确保OpenGL代码能够正确地渲染和显示图形界面。这样用户就可以通过图形界面来查看和操作机器人的运动规划结果。
其他参数
<param name="allow_trajectory_execution" value="$(arg allow_trajectory_execution)"/><param name="sense_for_plan/max_safe_path_cost" value="$(arg max_safe_path_cost)"/><param name="default_planning_pipeline" value="$(arg pipeline)" /><param name="capabilities" value="$(arg capabilities)" /><param name="disable_capabilities" value="$(arg disable_capabilities)" /># 以下为传入move_group节点的参数,他们在此前被介绍过# allow_trajectory_execution 允许轨迹执行# sense_for_plan/max_safe_path_cost 最大安全路径代价值# default_planning_pipeline 默认的规划流水线# capabilities 功能 无需理会# disable_capabilities 禁止功能 无需理会
发布实际机器人的规划场景
<!-- Publish the planning scene of the physical robot so that rviz plugin can know actual robot --><param name="planning_scene_monitor/publish_planning_scene" value="$(arg publish_monitored_planning_scene)" /><param name="planning_scene_monitor/publish_geometry_updates" value="$(arg publish_monitored_planning_scene)" /><param name="planning_scene_monitor/publish_state_updates" value="$(arg publish_monitored_planning_scene)" /><param name="planning_scene_monitor/publish_transforms_updates" value="$(arg publish_monitored_planning_scene)" /></node>
move_group
节点通过发布实际机器人的规划场景,使得RViz能够了解实际机器人的规划场景,需要传入move_group
节点的参数包括以下,这些参数将控制对应的话题的发布:
planning_scene_monitor/publish_planning_scene
参数用于发布当前规划场景的信息。它将当前的规划场景以消息的形式发布出去,允许其他节点(如可视化工具或运动规划器)订阅并获取当前的规划场景信息。这样可以实时地将最新的场景信息传递给其他节点,以便它们做出相应的决策。
planning_scene_monitor/publish_geometry_updates
参数,用于发布物体几何信息的更新。当物体的几何形状发生变化(例如对象被添加、移除、形状发生变化),该话题将更新的几何信息发布出去。这样其他节点可以根据几何更新来调整规划场景,使其保持最新状态。
planning_scene_monitor/publish_state_updates
参数,用于发布运动状态的更新。当机器人的状态发生变化(例如关节位置修改,联动状态更新),该话题将机器人的状态信息发布出去。其他节点可以订阅该话题以获取最新的机器人状态信息,以便做出相应的决策。
planning_scene_monitor/publish_transforms_updates
参数,用于发布坐标变换的更新。当与机器人相关的坐标变换发生改变时,该话题将变换的更新信息发布出去。其他节点可以订阅该话题以获取最新的坐标变换信息,以便在规划和执行过程中使用正确的坐标变换。
这些参数对应开启关闭的话题的使用可以实现实时的场景更新和状态反馈,使得不同节点之间可以共享和协调规划场景信息,提供更有效的运动规划和执行能力。
切片解析3: planning_context.launch
planning_context.launch
文件的作用是加载URDF(Unified Robot Description Format)
、SRDF(Semantic Robot Description Format)
和关节限制配置joint_limits configuration
等相关文件,为机器人的运动规划上下文planning context
创建所需的配置和环境。
planning_context.launch
文件在move_group.launch
中被作为嵌套的launch文件调用,并从move_group.launch
中获取了参数load_robot_description
,load_gripper
和arm_id
。
完整的代码如下:
<launch><!-- By default we do not overwrite the URDF. Change the following to true to change the default behavior --><arg name="load_gripper" default="true" /><arg name="load_robot_description" default="false"/><arg name="arm_id" default="panda" /><!-- The name of the parameter under which the URDF is loaded --><arg name="robot_description" default="robot_description"/><!-- Load universal robot description format (URDF) --><param name="$(arg robot_description)" command="xacro '$(find franka_description)/robots/panda/panda.urdf.xacro' hand:=$(arg load_gripper) arm_id:=$(arg arm_id)" if="$(arg load_robot_description)" /><!-- The semantic description that corresponds to the URDF --><param name="$(arg robot_description)_semantic" command="xacro '$(find panda_moveit_config)/config/panda.srdf.xacro' hand:=$(arg load_gripper) arm_id:=$(arg arm_id)" /><!-- Load updated joint limits (override information from URDF) --><group ns="$(arg robot_description)_planning"><rosparam command="load" file="$(find panda_moveit_config)/config/joint_limits.yaml" subst_value="true" /><rosparam command="load" file="$(find panda_moveit_config)/config/cartesian_limits.yaml" subst_value="true"/></group><!-- Load default settings for kinematics; these settings are overridden by settings in a node's namespace --><group ns="$(arg robot_description)_kinematics"><rosparam command="load" file="$(find panda_moveit_config)/config/kinematics.yaml" subst_value="true"/></group></launch>
传入参数
<!-- By default we do not overwrite the URDF. Change the following to true to change the default behavior --><arg name="load_gripper" default="true" /><arg name="load_robot_description" default="false"/><arg name="arm_id" default="panda" /># 是否加载夹爪# 是否加载URDF模型#