如何使用外部 /joint_state 输入运行 ROS2 visualize_franka.sh

来自 franka_descriptionvisualize_franka.sh 脚本使用 joint state publisher GUI,它有一个图形界面,不断发布关节状态:

Joint State Publisher GUI

虽然这是一个交互式设置关节位置的好工具,但由于它不断发布关节状态,它会阻止其他软件向同一主题发布关节状态。虽然你可以向同一主题发布关节状态,但 GUI 会用自己的关节状态覆盖你的关节状态。

修改 franka_description 以接受外部关节状态

要解决此问题,我们需要修改 launch/visualize_franka.launch.py,使其启动 joint state publisher GUI。机器人状态发布者无论如何都会订阅 /joint_states,所以你可以直接向该主题注入你自己的关节状态。

简单的方法是克隆我的 fork,它已经完成了修改,并且基于我对 franka_descriptionjazzy 移植

ros2_visualize_franka.sh
git clone -b external_joint_state https://github.com/ulikoehler/franka_description.git

你也可以自己修改 launch/visualize_franka.launch.py:只需删除启动 joint state publisher GUI 的 Node() 调用。以下 diff 显示了要删除哪些行(以 - 为前缀的行)。

visualize_franka_launch_diff.py
             robot_state_publisher_spawner_opaque_function,
-            Node(
-                package="joint_state_publisher_gui",
-                executable="joint_state_publisher_gui",
-                name="joint_state_publisher_gui",
-            ),
             Node(
                 package="rviz2",
                 executable="rviz2",

运行修改后的脚本

像往常一样运行 visualize_franka.sh

run_visualize_franka.sh
./scripts/visualize_franka.sh arm_id:=fr3

注意,一开始看起来会很奇怪,因为 rviz2 不知道任何默认关节状态。这是正常的和预期的:

RViz2 no default joint state

robot_state_publisher 期望哪些确切的关节状态?

首先,我使用以下命令记录了 /joint_states 主题

record_joint_states.sh
ros2 topic echo /joint_states > joint_states.txt

基于输出:

joint_states_example.yaml
---
header:
  stamp:
    sec: 1736718274
    nanosec: 6300566
  frame_id: ''
name:
- fr3_joint1
- fr3_joint2
- fr3_joint3
- fr3_joint4
- fr3_joint5
- fr3_joint6
- fr3_joint7
- fr3_finger_joint1
- fr3_finger_joint2
position:
- -2.7437
- 0.8697321200000001
- 0.8121960000000001
- -2.2966916299999998
- -0.6359528999999999
- 2.9597191999999994
- 0.32752674000000015
- 0.038372
- 0.038372
velocity: []
effort: []

你可以看到,在我们的情况下,它期望 name 字段中有 8 个条目,position 字段中有 8 个条目。velocityeffort 字段为空。

发布你自己的关节状态

现在我们可以使用我们文章发布自定义关节状态的 ROS2 Python 脚本中的脚本,向 /joint_states 主题发布我们自己的关节状态。

通过运行该文章中的脚本:

run_publish_custom_joint_states.sh
./publish_custom_joint_states.py

我们可以看到机器人根据我们发布的正弦关节状态移动:

Franka Custom Joint States


Check out similar posts by category: ROS, Robotics, Python