窗体顶端
-
概述
Franka 控制接口 (FCI)
FRANKA ROS笔记
笔记
franka_ros在 Windows 上不受支持。
在继续本章之前,请安装或编译 franka_ros。

封装的示意图franka_ros。
元包franka_ros集成libfranka到 ROS 和 ROS 控件中。这里我们介绍它的包,并简要介绍如何编写控制器。
本节中传递给启动文件的所有参数都带有默认值,因此如果使用默认网络地址和 ROS 命名空间,则可以省略这些参数。确保使用source工作区中的设置脚本调用该命令:
source /path/to/catkin_ws/devel/setup.sh
franka_description
该包包含我们的机器人和末端执行器在运动学、关节限制、视觉表面和碰撞空间方面的描述。碰撞空间是视觉描述的简化版本,用于提高碰撞检查的性能。根据 URDF XML 文档,这些描述基于 URDF 格式。
如果您想模拟 FR3 机器人,您可以将参数传递gazebo给 XACRO 文件。franka_description 包含 所有 Franka Robotics 机器人模型的文件。
xacro $(rospack find franka_description)/robots/fr3/fr3.urdf.xacro gazebo:=true
FER(Panda) 同样适用:
xacro $(rospack find franka_description)/robots/panda/panda.urdf.xacro gazebo:=true
碰撞体积
URDF定义了两种类型的碰撞类型:
-
精细:这些碰撞体积由凸网格构成,这些凸网格是每个链接的视觉网格 (.dae) 的近似版本,并且经过了大幅简化。精细体积应用于在Gazebo中模拟机器人碰撞
-
粗略:这些碰撞体积只是胶囊(带有两个半球形端盖的圆柱体),附在每个连杆上,并充气一定的安全距离。这些体积计算起来更高效,并在机器人内部用于自我碰撞避免。当您使用MoveIt等规划运动时,请使用这些几何体。
|
|
为了区分这两种类型的碰撞模型,在 URDF 中插入了带有后缀*_sc(表示自碰撞)的人工链接:
panda_link0
│ │ panda_link0_sc
└─ panda_link1
│ │ panda_link1_sc
└─ panda_link2
│ │ panda_link2_sc
└─ panda_link3
─ panda_link3_sc
└─ panda_link4
│ │ panda_link4_sc
└─ panda_link5
─ panda_link5_sc
└─ panda_link6
─ panda_link6_sc
└─ panda_link7
─ panda_link7_sc
└─ panda_link8
─ panda_link8_sc
└─ panda_hand
│ │ panda_leftfinger
│ ─ panda_rightfinger
│ │熊猫手
└─ panda_hand_tcp
您可以通过 XACRO 参数控制将哪个碰撞模型加载到 URDF 中gazebo:
-
xacro ... panda.urdf.xacro gazebo:=false:这将使用精细和粗糙碰撞模型。如果您完全省略参数,这也是默认设置。当您想要使用 MoveIt 时,请使用此选项
-
xacro ... panda.urdf.xacro gazebo:=true:这将仅使用精细碰撞模型。当您想要可模拟的 URDF(例如 Gazebo)时,请使用此选项。当使用粗略碰撞模型时,机器人当然会与下一个链接的胶囊不断发生碰撞。
Franka.gripper
此包实现了franka_gripper_node从 ROS 连接夹钳的功能。节点发布夹钳的状态并提供以下操作服务器:
-
franka_gripper::MoveAction(width, speed)width:移动到具有定义的 目标speed。
-
franka_gripper::GraspAction(width, epsilon_inner, epsilon_outer, speed, force):尝试width用期望的 抓住期望的 ,force同时用给定的 靠近speed。如果距离d夹爪之间的距离为: width−ϵinner<d<width+ϵouter。
-
franka_gripper::HomingAction():将夹持器归位,并根据安装的手指更新最大宽度。
-
franka_gripper::StopAction():中止正在运行的操作。这可用于在抓取后停止施加力量。
-
control_msgs::GripperCommandAction(width, max_effort):MoveIt! 识别的标准夹持器动作。如果参数max_effort大于零,夹持器将尝试抓取所需的物体width。另一方面,如果max_effort为零(max_effort<1−4),夹持器将移动到所需的位置width。
笔记
max_effort仅在抓取物体时使用该参数,否则抓取器将忽略该width参数而关闭。
您可以使用以下franka_gripper_node方式启动:
roslaunch franka_gripper franka_gripper.launch robot_ip:=<fci-ip>
暗示
从franka_ros0.6.0 开始,指定load_gripper:=truefor 也将启动 a 。roslaunch franka_control franka_control.launchfranka_gripper_node
Franka·HW
此包包含基于 API 的 ROS 控制框架的机器人硬件抽象libfranka。此包中实现了硬件类,franka_hw::FrankaHW为控制器提供了以下接口:
| 界面 | 功能 |
|---|---|
| hardware_interface::JointStateInterface | 读取联合状态。 |
| hardware_interface::VelocityJointInterface | 控制关节速度并读取关节状态。 |
| hardware_interface::PositionJointInterface | 命令关节位置并读取关节状态。 |
| hardware_interface::EffortJointInterface | 控制关节级扭矩并读取关节状态。 |
| franka_hw::FrankaStateInterface | 读取完整的机器人状态。 |
| franka_hw::FrankaPoseCartesianInterface | 命令笛卡尔摆出姿势并读取完整的机器人状态。 |
| franka_hw::FrankaVelocityCartesianInterface | 控制笛卡尔速度并读取完整的机器人状态。 |
| franka_hw::FrankaModelInterface | 读取机器人的动态和运动学模型。 |
要使用 ROS 控制接口,您必须通过名称检索资源句柄:
| 界面 | 资源句柄名称 |
|---|---|
| hardware_interface::JointStateInterface | “<arm_id>_joint1” 至 “<arm_id>_joint7” |
| hardware_interface::VelocityJointInterface | “<arm_id>_joint1” 至 “<arm_id>_joint7” |
| hardware_interface::PositionJointInterface | “<arm_id>_joint1” 至 “<arm_id>_joint7” |
| hardware_interface::EffortJointInterface | “<arm_id>_joint1” 至 “<arm_id>_joint7” |
| franka_hw::FrankaStateInterface | “<arm_id>_robot” |
| franka_hw::FrankaPoseCartesianInterface | “<arm_id>_robot” |
| franka_hw::FrankaVelocityCartesianInterface | “<arm_id>_robot” |
| franka_hw::FrankaModelInterface | “<arm_id>_robot” |
暗示
默认情况下,<arm_id> 设置为“panda”。
该类franka_hw::FrankaHW还实现控制器的启动,停止和切换。
该类FrankaHW还用作 的基类FrankaCombinableHW,这是一个硬件类,可以与其他类组合,以从单个控制器控制多个机器人。基于FrankaCombinableHW ROS 控制框架https://github.com/ros-controls/ros_control的任意数量的 Panda 机器人(数量由参数配置)的组合在 中实现。和FrankaCombinedHW之间的主要区别在于后者仅支持扭矩控制。FrankaHWFrankaCombinedHW
重要的
该类FrankaCombinableHW从 0.7.0 版本开始可用,并且仅允许扭矩/力度控制。
ROS 参数服务器用于在运行时确定在组合类中加载哪些机器人。有关如何FrankaCombinedHW在相应硬件节点中配置的示例,请参阅franka_control。
笔记
的方法FrankaHW是控制单个机器人的最佳方法。因此,我们建议仅在控制多个机器人时使用FrankaCombinableHW/FrankaCombinedHW类。
FrankaCombinableHW/类提供的接口FrankaCombinedHW如下:
| 界面 | 功能 |
|---|---|
| hardware_interface::EffortJointInterface | 控制关节级扭矩并读取关节状态。 |
| hardware_interface::JointStateInterface | 读取联合状态。 |
| franka_hw::FrankaStateInterface | 读取完整的机器人状态。 |
| franka_hw::FrankaModelInterface | 读取机器人的动态和运动学模型。 |
唯一可接受的命令接口声明是 ,EffortJointInterface它可以与任何一组只读接口(FrankaModelInterface、JointStateInterface、 FrankaStateInterface)组合使用。所有接口提供的资源句柄都按名称声明,并遵循与FrankaHW中描述的相同命名约定。 的每个实例 FrankaCombinableHW都提供完整的服务和操作接口集(参见franka_control)。
笔记
该类FrankaCombinedHW在控制节点命名空间中提供了一个额外的动作服务器来恢复所有机器人。如果任何机器人发生反射或错误,则所有机器人的控制循环都会停止,直到它们被恢复。
重要的
FrankaHW使用 ROS joint_limits_interface 来强制执行位置、速度和力度安全限制。使用的接口如下:
-
关节限制接口::PositionJointSoftLimitsInterface
-
关节限制接口::速度关节软限制接口
-
关节限制接口::EffortJointSoftLimitsInterface
接近限制将导致命令的(未经通知的)修改。
franka_control
ROS 节点franka_control_node和franka_combined_control_node是用于 ROS 控制的硬件节点,使用 中的相应硬件类franka_hw。它们提供各种 ROS 服务,以libfranka在 ROS 生态系统中公开完整的 API。提供以下服务:
-
franka_msgs::SetJointImpedance指定内部控制器的关节刚度(阻尼自动从刚度得出)。
-
franka_msgs::SetCartesianImpedance指定内部控制器的笛卡尔刚度(阻尼自动从刚度得出)。
-
franka_msgs::SetEEFrame指定从 <arm_id>_EE(末端执行器)到 <arm_id>_NE(名义末端执行器)框架的转换。从法兰到末端执行器框架的转换分为两个转换:<arm_id>_EE 到 <arm_id>_NE 框架和 <arm_id>_NE 到 <arm_id>_link8 框架。从 <arm_id>_NE 到 <arm_id>_link8 框架的转换只能通过管理员界面进行设置。
-
franka_msgs::SetKFrame指定从 <arm_id>_K 到 <arm_id>_EE 框架的转换。
-
franka_msgs::SetForceTorqueCollisionBehavior设置外部笛卡尔扳手的阈值来配置碰撞反射。
-
franka_msgs::SetFullCollisionBehavior设置笛卡尔和关节层面的外力阈值来配置碰撞反射。
-
franka_msgs::SetLoad设置外部负载来补偿(例如,抓住的物体)。
-
std_srvs::Trigger服务允许连接和断开硬件节点(从 0.8.0 开始可用)。当没有活动(命令)控制器运行时,您可以断开硬件节点,释放相应的机器人以用于非 fci 应用程序,例如基于桌面的操作。一旦您想要恢复 fci 操作,您可以调用 connect 并再次启动基于 ros_control 的控制器。
重要的
<arm_id>_EE 框架表示可配置末端执行器框架的一部分,可在运行时通过franka_ros进行调整。<arm_id>_K 框架标记内部笛卡尔阻抗的中心。它还可用作外部扳手的参考框架。<arm_id>_EE 和 <arm_id>_K 都不包含在 URDF 中,因为它们可以在运行时更改。默认情况下,<arm_id> 设置为“panda”。
末端执行器框架的概览。
要在机器人处于反射模式时从错误和反射中恢复,您可以使用 franka_msgs::ErrorRecoveryAction。这可以通过动作客户端或在动作目标主题上发布来实现。
rostopic pub -1 /franka_control/error_recovery/goal franka_msgs/ErrorRecoveryActionGoal "{}"
恢复后,franka_control_node将重新启动正在运行的控制器。这是可能的,因为当触发机器人反射或发生错误时节点不会死亡。所有这些功能均由 提供,franka_control_node可以使用以下命令启动:
roslaunch franka_control franka_control.launch \
robot_ip:=<fci-ip> # mandatory \
load_gripper:=<true|false> # default: true \
robot:=<panda|fr3> # default: panda
除了加载 之外franka_control_node,启动文件还启动一个, franka_control::FrankaStateController用于读取和发布机器人状态,包括外部扳手、可配置变换和使用 rviz 进行可视化所需的关节状态。出于可视化目的,robot_state_publisher启动了一个。
该包还实现了基于类的franka_combined_control_node硬件节点。加载的机器人集通过 ROS 参数服务器配置。这些参数必须位于硬件节点的命名空间中(请参阅franka_combined_control_node.yaml 作为参考)并如下所示:ros_controlfranka_hw::FrankaCombinedHW
robot_hardware:
- panda_1
- panda_2
# (...)
panda_1:
type: franka_hw/FrankaCombinableHW
arm_id: panda_1
joint_names:
- panda_1_joint1
- panda_1_joint2
- panda_1_joint3
- panda_1_joint4
- panda_1_joint5
- panda_1_joint6
- panda_1_joint7
# Configure the threshold angle for printing joint limit warnings.
joint_limit_warning_threshold: 0.1 # [rad]
# Activate rate limiter? [true|false]
rate_limiting: true
# Cutoff frequency of the low-pass filter. Set to >= 1000 to deactivate.
cutoff_frequency: 1000
# Internal controller for motion generators [joint_impedance|cartesian_impedance]
internal_controller: joint_impedance
# Configure the initial defaults for the collision behavior reflexes.
collision_config:
lower_torque_thresholds_acceleration: [20.0, 20.0, 18.0, 18.0, 16.0, 14.0, 12.0] # [Nm]
upper_torque_thresholds_acceleration: [20.0, 20.0, 18.0, 18.0, 16.0, 14.0, 12.0] # [Nm]
lower_torque_thresholds_nominal: [20.0, 20.0, 18.0, 18.0, 16.0, 14.0, 12.0] # [Nm]
upper_torque_thresholds_nominal: [20.0, 20.0, 18.0, 18.0, 16.0, 14.0, 12.0] # [Nm]
lower_force_thresholds_acceleration: [20.0, 20.0, 20.0, 25.0, 25.0, 25.0] # [N, N, N, Nm, Nm, Nm]
upper_force_thresholds_acceleration: [20.0, 20.0, 20.0, 25.0, 25.0, 25.0] # [N, N, N, Nm, Nm, Nm]
lower_force_thresholds_nominal: [20.0, 20.0, 20.0, 25.0, 25.0, 25.0] # [N, N, N, Nm, Nm, Nm]
upper_force_thresholds_nominal: [20.0, 20.0, 20.0, 25.0, 25.0, 25.0] # [N, N, N, Nm, Nm, Nm]
panda_2:
type: franka_hw/FrankaCombinableHW
arm_id: panda_2
joint_names:
- panda_2_joint1
- panda_2_joint2
- panda_2_joint3
- panda_2_joint4
- panda_2_joint5
- panda_2_joint6
- panda_2_joint7
# Configure the threshold angle for printing joint limit warnings.
joint_limit_warning_threshold: 0.1 # [rad]
# Activate rate limiter? [true|false]
rate_limiting: true
# Cutoff frequency of the low-pass filter. Set to >= 1000 to deactivate.
cutoff_frequency: 1000
# Internal controller for motion generators [joint_impedance|cartesian_impedance]
internal_controller: joint_impedance
# Configure the initial defaults for the collision behavior reflexes.
collision_config:
lower_torque_thresholds_acceleration: [20.0, 20.0, 18.0, 18.0, 16.0, 14.0, 12.0] # [Nm]
upper_torque_thresholds_acceleration: [20.0, 20.0, 18.0, 18.0, 16.0, 14.0, 12.0] # [Nm]
lower_torque_thresholds_nominal: [20.0, 20.0, 18.0, 18.0, 16.0, 14.0, 12.0] # [Nm]
upper_torque_thresholds_nominal: [20.0, 20.0, 18.0, 18.0, 16.0, 14.0, 12.0] # [Nm]
lower_force_thresholds_acceleration: [20.0, 20.0, 20.0, 25.0, 25.0, 25.0] # [N, N, N, Nm, Nm, Nm]
upper_force_thresholds_acceleration: [20.0, 20.0, 20.0, 25.0, 25.0, 25.0] # [N, N, N, Nm, Nm, Nm]
lower_force_thresholds_nominal: [20.0, 20.0, 20.0, 25.0, 25.0, 25.0] # [N, N, N, Nm, Nm, Nm]
upper_force_thresholds_nominal: [20.0, 20.0, 20.0, 25.0, 25.0, 25.0] # [N, N, N, Nm, Nm, Nm]
# (+ more robots ...)
笔记
确保选择唯一且一致的arm_id参数。ID 必须与关节名称中的前缀匹配,并且应符合加载到控制节点命名空间的机器人描述。
有关基于参数加载硬件类的更多信息,请参阅https://github.com/ros-controls/ros_controlcombined_robot_hw::CombinedRobotHW的 官方文档。
第二个重要参数文件(请参阅 franka_ros/franka_control/config/default_combined_controllers.yaml 作为参考)配置了一组可随硬件节点启动的默认控制器。控制器必须与启动的硬件匹配。提供的默认参数化(此处针对 2 个机器人)如下所示:
panda_1_state_controller:
type: franka_control/FrankaStateController
arm_id: panda_1
joint_names:
- panda_1_joint1
- panda_1_joint2
- panda_1_joint3
- panda_1_joint4
- panda_1_joint5
- panda_1_joint6
- panda_1_joint7
publish_rate: 30 # [Hz]
panda_2_state_controller:
type: franka_control/FrankaStateController
arm_id: panda_2
joint_names:
- panda_2_joint1
- panda_2_joint2
- panda_2_joint3
- panda_2_joint4
- panda_2_joint5
- panda_2_joint6
- panda_2_joint7
publish_rate: 30 # [Hz]
# (+ more controllers ...)
我们提供了一个启动文件来运行franka_combined_control_node用户指定的硬件和控制器配置文件,这些配置文件默认为 2 个机器人的配置。使用以下命令启动它:
roslaunch franka_control franka_combined_control.launch \
robot_ips:=<your_robot_ips_as_a_map> # mandatory
robot:=<path_to_your_robot_description> \
args:=<xacro_args_passed_to_the_robot_description> \ # if needed
robot_id:=<name_of_your_multi_robot_setup> \
hw_config_file:=<path_to_your_hw_config_file>\ # includes the robot ips!
controllers_file:=<path_to_your_default_controller_parameterization>\
controllers_to_start:=<list_of_default_controllers_to_start>\
joint_states_source_list:=<list_of_sources_to_fuse_a_complete_joint_states_topic>
此启动文件可以参数化以运行任意数量的机器人。为此,只需以 franka_control/config/franka_combined_control_node.yaml 和 franka_ros/franka_control/config/default_combined_controllers.yaml 的样式编写您自己的配置文件。
重要的
确保将机器人的正确 IP作为映射传递给franka_combined_control.launch 。这看起来像: {<arm_id_1>/robot_ip: <my_ip_1>, <arm_id_2>/robot_ip: <my_ip_2>, …}
franka_可视化
此软件包包含连接到机器人并发布机器人和夹持器关节状态以便在 RViz 中可视化的发布器。要运行此软件包,请启动:
roslaunch franka_visualization franka_visualization.launch robot_ip:=<fci-ip> \
load_gripper:=<true|false> robot:=<panda|fr3>
这纯粹是为了可视化 - 没有向机器人发送任何命令。它可以用来检查与机器人的连接。
重要的
只有一个实例franka::Robot可以连接到机器人。这意味着,例如franka_joint_state_publisher不能与并行运行franka_control_node。这也意味着您不能与运行控制器的单独程序一起执行可视化示例。
franka_example_controllers
此包中实现了一组用于通过 ROS 控制机器人的示例控制器。控制器描述了franka_hw::FrankaHW类提供的各种接口及其相应的用途。每个示例都附带一个单独的独立启动文件,用于启动机器人上的控制器并将其可视化。
要启动联合阻抗示例,请执行以下命令:
roslaunch franka_example_controllers joint_impedance_example_controller.launch \
robot_ip:=<fci-ip> load_gripper:=<true|false> robot:=<panda|fr3>
其他单个Panda示例以同样的方式启动。
展示了如何使用一个实时控制器dual_arm_cartesian_impedance_example_controller通过基于阻抗的控制方法完成笛卡尔任务来控制两个 Panda 机器人FrankaCombinedHW。示例控制器可以通过以下方式启动:
roslaunch franka_example_controllers \
dual_arm_cartesian_impedance_example_controller.launch \
robot_id:=<name_of_the_2_arm_setup> \
robot_ips:=<your_robot_ips_as_a_map> \
rviz:=<true/false> rqt:=<true/false>
该示例假设机器人配置符合dual_panda_example.urdf.xacro,其中两个 Panda 安装在一个箱子顶部,相距 1 米。您可以随意用与您的设置相匹配的机器人描述替换此机器人描述。选项rviz允许选择是否应启动可视化。使用rqt,用户可以选择启动 rqt-gui,它允许在运行时通过动态重新配置在线调整渲染的末端执行器阻抗。

franka_gazebo
此软件包允许您在Gazebo中模拟我们的机器人。这是可能的,因为 Gazebo 能够使用 gazebo_ros软件包集成到 ROS 控制框架中。
重要的
此软件包从 0.8.0 开始可用
拾取和放置示例
让我们深入模拟将一块石头从 A 运送到 B。运行以下命令,使用 Panda 和示例世界启动 Gazebo。
roslaunch franka_gazebo panda.launch x:=-0.5 \
world:=$(rospack find franka_gazebo)/world/stone.sdf \
controller:=cartesian_impedance_example_controller \
rviz:=true
这将打开 Gazebo GUI,您可以在其中看到带有石头和 RViz 的环境,您可以使用它们来控制机器人的末端执行器姿势。

Gazebo GUI(左)和 RViz(右)的拾取和放置示例
要打开夹持器,只需向move动作发送一个目标,类似于真实franka_gripper 工作方式。让我们将夹持器移动到8cm手指之间10cms:
rostopic pub --once /franka_gripper/move/goal franka_gripper/MoveActionGoal "goal: { width: 0.08, speed: 0.1 }"
由于我们使用来自franka_example_controllers的笛卡尔阻抗控制器启动了机器人 ,因此我们可以使用 RViz 中的交互式标记小工具移动末端执行器,就像在现实中一样。移动机器人,使白色石头位于夹持器的手指之间,随时可以被拾起。
笔记
如果机器人用肘部做出奇怪的动作,这是因为笛卡尔阻抗示例控制器的默认零空间刚度设置为低。启动动态重新配置 并根据需要进行panda调整。cartesian_impedance_example_controllernullspace_stiffness
为了拿起物体,我们grasp这次使用了动作,因为我们想在抓握后施加一个力,以免物体掉落。石头在3cm宽阔和50g沉重。让我们抓住它5N:
rostopic pub --once /franka_gripper/grasp/goal \
franka_gripper/GraspActionGoal \
"goal: { width: 0.03, epsilon:{ inner: 0.005, outer: 0.005 }, speed: 0.1, force: 5.0}"
笔记
在 Gazebo 的顶部菜单中,转到“视图” > “联系人”以可视化接触点和力
如果抓取成功,手指现在会将石头固定在原位。如果没有,可能是目标公差(内和外 epsilon)太小,导致操作失败。现在将物体轻轻移到红色落下区域。

将石头从蓝色移到红色
stop将其轻轻地放在红色垫上后,通过夹持器的动作停止抓取:
rostopic pub --once /franka_gripper/stop/goal franka_gripper/StopActionGoal {}
注意,由于不再施加力,接触力现在消失了。或者,您也可以使用动作move。
定制
启动文件franka_gazebo包含许多参数,您可以使用这些参数自定义模拟的行为。例如,要在一次模拟中生成两只熊猫,您可以使用以下命令:
<?xml version="1.0"?>
<launch>
<include file="$(find gazebo_ros)/launch/empty_world.launch" >
<!-- Start paused, simulation will be started, when Pandas were loaded -->
<arg name="paused" value="true"/>
<arg name="use_sim_time" value="true"/>
</include>
<group ns="panda_1">
<include file="$(find franka_gazebo)/launch/panda.launch">
<arg name="arm_id" value="panda_1" />
<arg name="y" value="-0.5" />
<arg name="controller" value="cartesian_impedance_example_controller" />
<arg name="rviz" value="false" />
<arg name="gazebo" value="false" />
<arg name="paused" value="true" />
</include>
</group>
<group ns="panda_2">
<include file="$(find franka_gazebo)/launch/panda.launch">
<arg name="arm_id" value="panda_2" />
<arg name="y" value="0.5" />
<arg name="controller" value="force_example_controller" />
<arg name="rviz" value="false" />
<arg name="gazebo" value="false" />
<arg name="paused" value="false" />
</include>
</group>
</launch>
笔记
要查看支持哪些参数,请使用:roslaunch franka_gazebo panda.launch --ros-args
FrankaHWSim
默认情况下,Gazebo ROS 只能使用“标准”硬件接口(如关节状态接口 和关节命令接口)来模拟关节。然而,我们的机器人与这种架构完全不同!除了这些关节专用接口外,它还支持机器人专用接口(如FrankaModelInterface(参见 franka_hw)。当然,默认情况下,gazebo 不理解这些自定义硬件接口。这就是FrankaHWSim插件的作用所在。
为了使您的机器人能够支持 Franka 接口,只需robotSimType在 URDF 中声明一个自定义:
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>${arm_id}</robotNamespace>
<controlPeriod>0.001</controlPeriod>
<robotSimType>franka_gazebo/FrankaHWSim</robotSimType>
</plugin>
<self_collide>true</self_collide>
</gazebo>
当您使用模型生成器生成此机器人时,此插件将被加载到 Gazebo 节点中。它将扫描您的 URDF 并尝试查找支持的硬件接口。到目前为止,仅支持franka_hw提供的一些接口:
| 界面 | 功能 | |
|---|---|---|
| ✔ | hardware_interface::JointStateInterface | 读取联合状态。 |
| ✔ | hardware_interface::EffortJointInterface | 控制关节级扭矩并读取关节状态。 |
| ✔ | hardware_interface::VelocityJointInterface | 控制关节速度并读取关节状态。 |
| ✔ | hardware_interface::PositionJointInterface | 命令关节位置并读取关节状态。 |
| ✔ | franka_hw::FrankaStateInterface | 读取完整的机器人状态。 |
| ✔ | franka_hw::FrankaModelInterface | 读取机器人的动态和运动学模型。 |
| ✘ | franka_hw::FrankaPoseCartesianInterface | 命令笛卡尔摆出姿势并读取完整的机器人状态。 |
| ✘ | franka_hw::FrankaVelocityCartesianInterface | 控制笛卡尔速度并读取完整的机器人状态。 |
重要的
这意味着您只能模拟声明这些受支持接口的控制器,而不能模拟其他任何接口!例如,可以模拟笛卡尔阻抗示例控制器,因为它只需要 - EffortJoint、FrankaState- 和FrankaModelInterface。但是无法模拟联合阻抗示例控制器,因为它需要 ,FrankaPoseCartesianInterface而目前尚不支持。
除了实时硬件接口之外,该插件还支持franka_controlFrankaHWSim支持的一些非实时命令:
| 服务类型 | 解释 | |
|---|---|---|
| ✘ | set_joint_impedance/ 设置关节阻抗 | Gazebo 不模拟内部阻抗控制器,而是直接设置指令扭矩 |
| ✘ | set_cartesian_impedance/ 设置笛卡尔阻抗 | Gazebo 不模拟内部阻抗控制器,而是直接设置指令扭矩 |
| ✔ | set_EE_frame/ 设置EEFrame | 设置NETEE 即从名义末端执行器到末端执行器的同质变换。您也可以通过设置 ROS 参数来初始化它/<arm_id>/NE_T_EE。通常您可以设置 FTNE在 Desk 中,但franka_gazebo如果没有指定夹持器或定义围绕 Z 轴的旋转,则假定为恒等式45° 以及偏移量10.34cm(与手的 Desk 相同)。您可以随时通过/<arm_id>/NE_T_EE手动设置 ROS 参数来覆盖此值。 |
| ✔ | set_K_frame/ 设置 KFrame | 设置EETK即从末端执行器到刚度框架的均匀变换。 |
| ✔ | set_force_torque_collision_behavior/ 设置力矩碰撞行为 | 设置阈值,超过该阈值,外部扳手将被视为接触和碰撞。 |
| ✘ | set_full_collision_behavior/ 设置全碰撞行为 | 尚未实现 |
| ✔ | set_load/ 设置加载 | /<arm_id>/{m_load,I_load,F_x_load} 设置外部负载以补偿其重力,例如抓取物体的重力。您还可以通过分别设置负载的质量、惯性张量和质心的ROS 参数来初始化它。 |
| ✔ | set_user_stop/ std_srvs::SetBool (自 0.9.1 起) | 这是仅在 中可用的特殊服务,franka_gazebo 用于模拟用户停止。按下用户停止(即true通过此服务发布)将断开 来自 ROS 控制器的所有命令信号以将其馈送到关节。要再次连接它们,请调用该error_recovery 操作。 |
FrankaGripperSim
此插件模拟了Gazebo 中的franka_gripper_node。这是作为两个手指关节的 ROS 控制器,带有位置和力控制器。它提供与真实夹持器节点相同的五个动作:
-
/<arm_id>/franka_gripper/homing
-
/<arm_id>/franka_gripper/stop
-
/<arm_id>/franka_gripper/move
-
/<arm_id>/franka_gripper/grasp
-
/<arm_id>/franka_gripper/gripper_action
重要的
该动作有一个错误,即如果目标宽度让手指张开grasp,该动作将不会成功或中止。这是因为缺少关节限制接口,该接口允许手指在其极限处摆动。目前仅使用该动作来闭合 手指!grasp
假设 URDF 包含两个可以进行力控制的手指关节,即 EffortJointInterface声明了相应的传动。此控制器在其命名空间中需要以下参数:
-
type (字符串,必需):应该是franka_gazebo/FrankaGripperSim
-
arm_id (字符串,必需):熊猫手臂的 ID,用于推断手指关节的名称
-
finger1/gains/p(双精度,必需):第一根手指的位置-力控制器的比例增益
-
finger1/gains/i(双精度,默认值:0):第一根手指的位置力控制器的积分增益
-
finger1/gains/d(双精度,默认值:0):第一根手指的位置力控制器的微分增益
-
finger2/gains/p(双精度,必需):第二根手指的位置-力控制器的比例增益
-
finger2/gains/i(双精度,默认值:0):第二根手指的位置力控制器的积分增益
-
finger2/gains/d(双精度,默认值:0):第二根手指的位置力控制器的微分增益
-
move/width_tolerance(双精度,默认5mm): 当手指宽度低于此阈值时,移动操作成功
-
grasp/resting_threshold(双精度,默认1mms):低于该速度时应检查目标宽度以中止或成功执行抓取动作
-
grasp/consecutive_samplesresting_threshold(双精度,默认值:3):在评估抓握之前,速度必须连续低于多少次
-
gripper_action/width_tolerance(双精度,默认5mm):当手指宽度低于此阈值时,夹持动作成功
-
gripper_action/speed(双精度,默认10cms): 夹持动作时使用的速度
联合国家接口
为了能够从 ROS 控制器访问关节状态接口,您只需在 URDF 中的任何传输标签中声明相应的关节即可。然后关节状态接口将自动可用。通常,您会为命令接口(如 EffortJointInterface )声明传输标签。
笔记
对于任何命名的关节<arm_id>_jointN(以 N 为整数),FrankaHWSim 将自动补偿其重力以模仿 libfranka 的行为。
努力联合接口
为了能够从控制器向关节发送努力命令,您只需在 URDF 中使用相应的硬件接口类型为关节声明一个传输标签:
<transmission name="${joint}_transmission">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${joint}">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
</joint>
<actuator name="${joint}_motor">
<hardwareInterface>${transmission}</hardwareInterface>
</actuator>
</transmission>
<gazebo reference="${joint}">
<!-- Needed for ODE to output external wrenches on joints -->
<provideFeedback>true</provideFeedback>
</gazebo>
笔记
如果您希望能够读取外力或扭矩(例如来自碰撞),请确保将标签设置 <provideFeedback>为true。
FrankaState接口
这是一个机器人专用接口,因此与普通硬件接口略有不同。为了能够从控制器访问 franka 状态接口,请在 URDF 中声明所有七个关节的以下传输标签:
<transmission name="${arm_id}_franka_state">
<type>franka_hw/FrankaStateInterface</type>
<joint name="${arm_id}_joint1"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
<joint name="${arm_id}_joint2"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
<joint name="${arm_id}_joint3"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
<joint name="${arm_id}_joint4"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
<joint name="${arm_id}_joint5"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
<joint name="${arm_id}_joint6"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
<joint name="${arm_id}_joint7"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></joint>
<actuator name="${arm_id}_motor1"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
<actuator name="${arm_id}_motor2"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
<actuator name="${arm_id}_motor3"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
<actuator name="${arm_id}_motor4"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
<actuator name="${arm_id}_motor5"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
<actuator name="${arm_id}_motor6"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
<actuator name="${arm_id}_motor7"><hardwareInterface>franka_hw/FrankaStateInterface</hardwareInterface></actuator>
</transmission>
当您的控制器通过访问机器人状态FrankaStateInterface时,它可以模拟以下值:
| 场地 | 评论 | |
|---|---|---|
| ✔ | O_T_EE | |
| ✘ | O_T_EE_d | 尚不支持运动生成,字段将仅包含零 |
| ✔ | F_T_EE | 可以通过参数F_T_NE和NE_T_EE/或服务调用进行配置set_EE_frame |
| ✔ | NE_T_EE | 可以通过参数NE_T_EE和/或服务调用进行配置set_EE_frame |
| ✔ | EE_T_K | 可以通过参数EE_T_K和/或服务调用进行配置set_K_frame |
| ✔ | m_ee | 如果可以找到手,则将从 URDF 的惯性标签中的质量中设置,否则为零。可以通过参数覆盖m_ee |
| ✔ | I_ee | 如果发现手,将从 URDF 的惯性标签中的惯性中设置,否则为零。可以通过参数覆盖I_ee |
| ✔ | F_x_Cee | 如果可以找到手,将从 URDF 惯性标签中的原点设置,否则为零。可以通过参数覆盖F_x_Cee |
| ✔ | m_load | 可以通过参数m_load和/或服务调用 进行配置set_load |
| ✔ | I_load | 可以通过参数I_load和/或服务调用 进行配置set_load |
| ✔ | F_x_Cload | 可以通过参数F_x_Cload和/或服务调用 进行配置set_load |
| ✔ | m_total | |
| ✔ | I_total | |
| ✔ | F_x_Ctotal | |
| ✘ | elbow | |
| ✘ | elbow_d | |
| ✘ | elbow_c | |
| ✘ | delbow_d | |
| ✘ | delbow_c | |
| ✔ | tau_J | 直接来自 Gazebo |
| ✔ | tau_J_d | 您的努力控制器发送的值。否则为零。 |
| ✔ | dtau_J | 的数值导数tau_J |
| ✔ | q | 直接来自 Gazebo |
| ✔ | q_d | 使用位置接口时最后命令的关节位置。与使用速度接口时相同q。但是,使用力度接口时不会更新该值。 |
| ✔ | dq | 直接来自 Gazebo |
| ✔ | dq_d | 使用速度接口时最后命令的关节速度。与使用位置接口时相同dq。但是,使用力接口时该值将为零。 |
| ✔ | ddq_d | 使用位置或速度接口时的当前加速度。但是,使用力接口时该值将为零。 |
| ✔ | joint_contact | ∣τ^ext∣>threshlower可以通过调用以下方法设置阈值set_force_torque_collision_behavior |
| ✔ | joint_collision | ∣τ^ext∣>threshupper可以通过调用以下方法设置阈值set_force_torque_collision_behavior |
| ✔ | cartesian_contact | ∣KF^K,ext∣>threshlower可以通过调用来设置阈值set_force_torque_collision_behavior |
| ✔ | cartesian_collision | ∣KF^K,ext∣>threshupper可以通过调用来设置阈值set_force_torque_collision_behavior |
| ✔ | tau_ext_hat_filtered | τ^ext即估计末端执行器的外部扭矩和力,用指数移动平均滤波器 (EMA) 进行过滤。这种过滤α可以通过 ROS 参数配置。此字段不包含任何重力,即 τext=τJ−τJd−τgravity |
| ✔ | O_F_ext_hat_K | OF^K,ext=JO⊤+⋅τ^ext |
| ✔ | K_F_ext_hat_K | KF^K,ext=JK⊤+⋅τ^ext |
| ✘ | O_dP_EE_d | |
| ✔ | O_ddP_0 | 与 ROS 参数相同gravity_vector。默认情况下为 {0,0,-9.8} |
| ✘ | O_T_EE_c | |
| ✘ | O_dP_EE_c | |
| ✘ | O_ddP_EE_c | |
| ✔ | theta | 与 相同q,因为我们不在 Gazebo 中模拟软关节 |
| ✔ | dtheta | 与 相同dq,因为我们不在 Gazebo 中模拟软关节 |
| ✘ | current_errors | 完全是假的,反射系统尚未实现 |
| ✘ | last_motion_errors | 完全是假的,反射系统尚未实现 |
| ✔ | control_command_success_rate | 始终为 1.0 |
| ✘ | robot_mode | 机器人模式开关和反射系统尚未实现 |
| ✔ | time | 模拟中的当前 ROS 时间,来自 Gazebo |
Franka模型接口
这是一个机器人专用接口,因此与普通硬件接口略有不同。为了能够从控制器访问 franka 模型接口,请在 URDF 中使用运动链的根(例如panda_joint1)和尖端(例如)声明以下传输标签:panda_joint8
<transmission name="${arm_id}_franka_model">
<type>franka_hw/FrankaModelInterface</type>
<joint name="${root}">
<role>root</role>
<hardwareInterface>franka_hw/FrankaModelInterface</hardwareInterface>
</joint>
<joint name="${tip}">
<role>tip</role>
<hardwareInterface>franka_hw/FrankaModelInterface</hardwareInterface>
</joint>
<actuator name="${root}_motor_root"><hardwareInterface>franka_hw/FrankaModelInterface</hardwareInterface></actuator>
<actuator name="${tip}_motor_tip" ><hardwareInterface>franka_hw/FrankaModelInterface</hardwareInterface></actuator>
</transmission>
模型函数本身是用KDL实现的。它采用来自 URDF 的运动结构和惯性特性来计算模型特性,如雅可比矩阵或质量矩阵。
摩擦
为了使物体之间(如手指和物体)具有适当的摩擦力,您需要在 URDF 中调整一些 Gazebo 参数。对于链接panda_finger_joint1,panda_finger_joint2我们建议设置以下参数:
<gazebo reference="${link}">
<collision>
<max_contacts>10</max_contacts>
<surface>
<contact>
<ode>
<!-- These two parameter need application specific tuning. -->
<!-- Usually you want no "snap out" velocity and a generous -->
<!-- penetration depth to keep the grasping stable -->
<max_vel>0</max_vel>
<min_depth>0.003</min_depth>
</ode>
</contact>
<friction>
<ode>
<!-- Rubber/Rubber contact -->
<mu>1.16</mu>
<mu2>1.16</mu2>
</ode>
</friction>
<bounce/>
</surface>
</collision>
</gazebo>
笔记
请参阅Gazebo 摩擦力文档
franka_msgs
此软件包包含消息、服务和操作类型,主要用于软件包 franka_hw和franka_control发布机器人状态或在 ROS 生态系统中公开 libfranka API。有关此软件包中提供的服务和操作的更多信息,请参阅franka_control。
panda_moveit_config
笔记
该软件包已被移至ros_planning repos。
欲了解更多详细信息、文档和教程,请参阅 MoveIt!教程网站。
编写自己的控制器
示例控制器包中的所有示例控制器均派生自该类controller_interface::MultiInterfaceController,该类允许在一个控制器实例中声明最多四个接口。您的类的声明如下所示:
class NameOfYourControllerClass : controller_interface::MultiInterfaceController <
my_mandatory_first_interface,
my_possible_second_interface,
my_possible_third_interface,
my_possible_fourth_interface> {
bool init (hardware_interface::RobotHW* hw, ros::NodeHandle& nh); // mandatory
void update (const ros::Time& time, const ros::Duration& period); // mandatory
void starting (const ros::Time& time) // optional
void stopping (const ros::Time& time); // optional
...
}
可用的接口在franka_hw部分中描述。
重要的
请注意,可声明的命令接口组合受到限制,因为例如同时命令关节位置和笛卡尔姿势是没有意义的。只读接口(如 JointStateInterface 、 FrankaStateInterface或FrankaModelInterface )始终可以声明,并且不受限制。
对命令接口的可能声明包括:
| franka_hw::FrankaHW | franka_combinable_hw::FrankaCombinableHW |
|---|---|
|
|
提供EffortJointInterface与运动生成器接口组合的想法是向用户公开内部运动生成器。 与运动生成器命令相对应的计算出的所需关节姿势在一个时间步后可在机器人状态中使用。 此组合的一个用例是使用您自己的关节级扭矩控制器遵循笛卡尔轨迹。 在这种情况下,您将声明组合EffortJointInterface + FrankaCartesianPoseInterface,将您的轨迹流式传输到FrankaCartesianPoseInterface,并根据从机器人状态得到的所需关节姿势 (q_d) 计算您的关节级扭矩命令。 这允许使用机器人的内置逆运动学,而不必自己解决它。
要实现功能齐全的控制器,您必须至少实现继承的虚拟函数init和update。初始化(例如启动姿势)应在函数中完成, starting因为starting在重新启动控制器时会调用该函数,而init加载控制器时只会调用一次。该stopping方法应包含与关闭相关的功能(如果需要)。
重要的
在关闭控制器之前,务必命令缓慢减速。使用速度接口时,不要简单地命令 中的零速度stopping。由于它可能在机器人仍在移动时调用,因此这相当于命令速度跳跃,从而导致非常高的关节级扭矩。在这种情况下,最好保持相同的速度并停止控制器,而不是发送零并让机器人处理减速。
您的控制器类必须正确导出,pluginlib需要添加:
#include <pluginlib/class_list_macros.h>
// Implementation ..
PLUGINLIB_EXPORT_CLASS(name_of_your_controller_package::NameOfYourControllerClass,
controller_interface::ControllerBase)
在文件末尾.cpp。此外,您还需要定义一个plugin.xml包含以下内容的文件:
<library path="lib/lib<name_of_your_controller_library>">
<class name="name_of_your_controller_package/NameOfYourControllerClass"
type="name_of_your_controller_package::NameOfYourControllerClass"
base_class_type="controller_interface::ControllerBase">
<description>
Some text to describe what your controller is doing
</description>
</class>
</library>
通过添加以下内容导出:
<export>
<controller_interface plugin="${prefix}/plugin.xml"/>
</export>
到您的 package.xml。此外,您至少需要将控制器名称与控制器类型组合加载到 ROS 参数服务器。此外,您还可以包含所需的其他参数。示例 configuration.yaml 文件如下所示:
your_custom_controller_name:
type: name_of_your_controller_package/NameOfYourControllerClass
additional_example_parameter: 0.0
# ..
controller_spawner现在,您可以使用ROS 控制中的节点或通过 提供的服务调用来启动控制器hardware_manager。只需确保 和 都 controller_spawner在franka_control_node同一个命名空间中运行。有关更多详细信息,请查看 franka_example_controllers 包中的控制器或 ROS 控制教程。
更多参考:
-
最低系统和网络要求
-
兼容版本
-
在 Linux 上安装
-
在 Windows 上安装
-
入门
-
自由Franka
-
libfranka 变更日志
-
弗兰卡罗斯
-
拾取和放置示例
-
定制
-
FrankaHWSim
-
FrankaGripperSim
-
联合国家接口
-
努力联合接口
-
FrankaState接口
-
Franka模型接口
-
摩擦
-
碰撞体积
-
franka_description
-
弗兰卡·格里珀
-
Franka·HW
-
franka_control
-
franka_可视化
-
franka_example_controllers
-
franka_gazebo
-
franka_msgs
-
panda_moveit_config
-
编写自己的控制器
-
-
franka_ros 更新日志
-
franka_ros2
-
franka_ros2 更新日志
-
Franka MATLAB 工具箱
-
Franka MATLAB 工具箱更新日志
-
机器人和接口规格
-
FR3 认证备注
-
故障排除
-
常问问题
© 版权所有 2023,Franka Robotics GmbH。
使用 Read the Docs 提供的主题通过Sphinx 构建。
Franka控制接口(FCI)-ROS笔记介绍

737

被折叠的 条评论
为什么被折叠?



