franka_hw 和 franka_control 是 ROS 中两个不同但相关的软件包,它们共同为 Franka Emika 的 Panda 机器人提供控制功能。
franka_hw:
- 这个软件包负责与 Panda 机器人的硬件进行底层接口。
- 它提供了 franka_hw_node 节点,用于建立与 Panda 机器人的通信,并发布机器人的状态信息。
- franka_hw 处理原始的硬件交互,如读取传感器数据、发送控制命令等。
franka_control:
- 这个软件包提供了更高层次的机器人控制功能。
- 它建立在 franka_hw 之上,提供了诸如关节控制、力控制、卡尔曼滤波等功能。
- franka_control 包含了 franka_control_node,负责接收来自上层应用的控制指令,并将其转换为发送给 franka_hw 的低级命令。
franka_hw 负责与 Panda 机器人硬件的直接交互,而 franka_control 则构建在此基础之上,提供更高级别的控制功能。
在使用 Panda 机器人时,通常需要同时启动 franka_hw_node 和 franka_control_node,以便上层应用程序可以利用完整的控制栈。这种分层设计使得开发和使用 Panda 机器人控制更加灵活和可扩展。
具体而言:
与 libfranka 库进行交互的是 franka_hw
软件包。
-
libfranka
是 Franka Emika 提供的一个 C++ 库,用于与 Panda 机器人进行底层通信和控制。 -
franka_hw
软件包内部使用了libfranka
库,并在其之上提供了一个 ROS 接口。 -
franka_hw_node
就是通过调用libfranka
库,与 Panda 机器人的硬件进行交互的 ROS 节点。它负责:- 建立与 Panda 机器人的网络连接
- 读取机器人的状态信息
- 向机器人发送控制命令
-
其他需要访问 Panda 机器人的 ROS 节点,比如
franka_control
中的franka_control_node
,都会通过franka_hw
软件包间接调用libfranka
库的功能。
总之,franka_hw
软件包充当了 libfranka
库与 ROS 环境之间的桥梁,为上层 ROS 应用程序提供了一个标准化的接口来访问 Panda 机器人的底层硬件。这种分层设计有利于提高代码的可重用性和可维护性。
上位机指令下发后, 具体会经过哪些节点,详细交互过程:
franka_msgs::SetJointImpedance
指令下发后,会经过以下几个节点,最终影响 Panda 机器人的关节阻抗控制:
-
上层应用节点:
- 这个节点发送
franka_msgs::SetJointImpedance
服务请求,设置期望的关节�impedance参数。
- 这个节点发送
-
franka_control_node:
- 这个节点接收来自上层应用的
franka_msgs::SetJointImpedance
服务请求。 - 它会解析请求中的关节阻抗参数,并将其转换为
libfranka
库能够理解的格式。 - 然后,它会调用
franka_hw
提供的服务接口,将这些参数设置到 Panda 机器人上。
- 这个节点接收来自上层应用的
-
franka_hw_node:
- 这个节点实现了
franka_hw
中的服务接口,用于设置 Panda 机器人的关节阻抗参数。 - 当接收到
franka_control_node
的服务请求时,它会调用libfranka
库中的相应函数,将阻抗参数下发到 Panda 机器人的底层驱动器。
- 这个节点实现了
-
libfranka 库:
franka_hw_node
内部会使用libfranka
库提供的 API,向 Panda 机器人发送控制命令,包括设置关节阻抗参数。libfranka
库会负责构造正确格式的网络数据包,并通过网络协议将其发送到 Panda 机器人的驱动器上。
-
Panda 机器人驱动器:
- Panda 机器人的底层驱动器会接收来自
libfranka
库的数据包,并将关节阻抗参数应用到实际的关节控制中。 - 驱动器会根据这些阻抗参数,调整关节电机的扭矩输出,从而影响关节的刚度和阻尼特性。
- Panda 机器人的底层驱动器会接收来自
总之,franka_msgs::SetJointImpedance
指令会经过上层应用、franka_control_node
、franka_hw_node
、libfranka
库,最终影响到 Panda 机器人驱动器中的关节阻抗控制。这个过程体现了 ROS 中分层控制的设计思想。