Franka Robot 独占控制权限设计
Franka Emika机器人通过其libfranka
库和Franka Control Interface (FCI)实现了一种独占的权限控制机制,确保在任何时候只能有一个程序能够控制机器人。这种机制通过权限cookie(permission cookie)来实现。
权限控制机制
-
唯一连接限制:
libfranka
库设计为一次只能有一个实例连接到Franka机器人。- 当一个程序创建
franka::Robot
对象并成功连接到机器人时,其他尝试连接的实例会被拒绝。
-
权限Cookie:
- 权限cookie是一个独占的控制权限标识。
- 当一个程序通过
libfranka
连接到机器人时,FCI会检查当前是否已有一个活跃的连接。如果没有,它会生成并分配一个权限cookie给该连接请求。 - 拥有权限cookie的程序获得了对机器人的独占控制权。
-
连接管理:
- 持有权限cookie的程序可以发送控制命令、读取机器人状态,并执行其他操作。
- 如果已有程序持有权限cookie,新的连接请求会被拒绝,确保机器人控制的唯一性。
-
释放权限:
- 当持有权限cookie的程序关闭连接或崩溃时,权限cookie会被释放。
- 这允许新的连接请求获得控制权。
示例代码
以下是一个简单的示例,展示了如何通过libfranka
连接到Franka机器人,并处理权限cookie机制:
#include <franka/exception.h> #include <franka/robot.h> #include <iostream> int main() { try { // 尝试与Franka机器人建立连接 franka::Robot robot("your_robot_ip"); // 连接成功后,程序获得权限cookie franka::RobotState state = robot.readOnce(); std::cout << "Connected to the robot successfully!" << std::endl; // 打印一些状态信息 std::cout << "Robot state: " << state.q[0] << std::endl; // 在这里可以添加更多的控制逻辑 } catch (const franka::Exception& e) { std::cerr << "Failed to connect to the robot: " << e.what() << std::endl; // 如果连接失败,可能是因为权限cookie被其他程序持有 } return 0; }
应用场景举例
-
单一控制程序:
- 在典型应用中,只有一个控制程序(如控制器或状态监视程序)通过
libfranka
连接到Franka机器人,并持有权限cookie。 - 该程序可以独占地控制机器人,而其他程序的连接请求会被拒绝。
- 在典型应用中,只有一个控制程序(如控制器或状态监视程序)通过
-
开发和调试:
- 在开发或调试过程中,开发者应确保同一时间只有一个程序实例连接到机器人。
- 如果需要切换控制程序,开发者应显式地关闭当前连接以释放权限cookie,然后再启动新的程序。
-
ROS集成:
- 在ROS环境中,通常只有一个ROS节点(如
franka_control_node
)通过libfranka
连接到机器人并持有权限cookie。 - 其他节点通过ROS的消息机制与该节点进行通信,从而间接获取机器人的状态或发送控制命令。
- 在ROS环境中,通常只有一个ROS节点(如
ROS集成示例
假设你有两个ROS节点:一个是franka_control_node
,另一个是franka_joint_state_publisher
。franka_control_node
直接与机器人连接并持有权限cookie,而franka_joint_state_publisher
通过订阅话题获取状态信息。
franka_control.launch(启动文件示例)
<launch> <node name="franka_control_node" pkg="franka_control" type="franka_control_node" output="screen"> <param name="robot_ip" value="your_robot_ip"/> </node> </launch>
your_state_publisher.launch(启动文件示例):
<launch> <node name="franka_joint_state_publisher" pkg="your_package" type="your_state_publisher_node" output="screen"/> </launch>
启动命令:
roslaunch franka_control franka_control.launch robot_ip:=your_robot_ip
roslaunch your_package your_state_publisher.launch
通过这种方式,franka_control_node
直接与机器人进行通信并持有权限cookie,而franka_joint_state_publisher
通过订阅和发布ROS话题来获取和传播机器人状态信息。这种架构确保了只有一个进程直接与机器人交互,从而避免了连接冲突和控制冲突。