Skip to content

如何使用游戏手柄远程操控机械臂

本指南将介绍如何使用游戏手柄移动 Panda 机械臂。

确保你的工作区已安装所需的包,并且你有一个受 ROS 2 joy 支持的游戏手柄。可以先启动一个 joy 节点,然后运行 ros2 topic echo /joy 来测试游戏手柄是否能被 joy 检测到。

  • Ubuntu 22.04
  • ROS 2 Humble
  • MoveIt 2
  • MoveIt 2 Tutorials
  • ROS2 joy
  1. 构建 MoveIt 2 工作区

    首先,cd 到 moveit2 工作区的根目录(如果你按照入门指南操作,这将是 ~/ws_moveit/)。

    然后,运行 colcon build。

  2. 插入你的游戏手柄。

  3. 加载 install 脚本并运行 moveit_servo 示例文件。

    运行 source install/setup.bash,然后运行 ros2 launch moveit_servo servo_example.launch.py

  4. 按照下图作为参考来移动机械臂。

    Xbox 游戏手柄按键映射示意图

    drawio 文档可以在这里查看。

本节解释启动文件以及将游戏手柄输入转换为运动指令的节点。

启动此示例的文件是 ws_moveit2/src/moveit2/moveit_ros/moveit_servo/launch/servo_example.launch.py

该启动文件不仅启动了 Panda 机械臂规划所需的一切,还启动了 joy 节点和 JoyToServoPub 节点(下文将解释)。

最值得注意的是启动 joy 和 JoyToServoPub 节点的代码部分。它们都被创建为 ComposableNode。关于 ComposableNode 的更多信息可以在这里和这里找到。

ComposableNode(
package="moveit_servo",
plugin="moveit_servo::JoyToServoPub",
name="controller_to_servo_node",
),
ComposableNode(
package="joy",
plugin="joy::Joy",
name="joy_node",
)

将游戏手柄输入转换为运动指令的节点是 ws_moveit2/src/moveit2/moveit_ros/moveit_servo/src/teleop_demo/joystick_servo_example.cpp

该节点订阅 joy 节点发布的游戏手柄状态消息,并发布 TwistStamped 消息、JointJog 消息和 PlanningScene 消息。

PlanningScene 消息只在 JoyToServoPub 首次构造时发布一次,用于向规划场景中添加一些障碍物。

JointJog 和 TwistStamped 消息的区别在于:TwistStamped 消息定义的是末端执行器的运动,由逆运动学求解器据此计算各关节的运动;而 JointJog 消息则是直接控制各个关节的运动。

当有消息发布到 joy 话题时,会调用 joyCB 函数,将游戏手柄的按键输入转换为机械臂的指令。如果同一时刻的输入同时触发了 JointJog 和 TwistStamped 消息,则只发布 JointJog 消息。