如何使用外部 /joint_state 输入运行 ROS2 visualize_franka.sh
来自 franka_description 的 visualize_franka.sh 脚本使用 joint state publisher GUI,它有一个图形界面,不断发布关节状态:

虽然这是一个交互式设置关节位置的好工具,但由于它不断发布关节状态,它会阻止其他软件向同一主题发布关节状态。虽然你可以向同一主题发布关节状态,但 GUI 会用自己的关节状态覆盖你的关节状态。
修改 franka_description 以接受外部关节状态
要解决此问题,我们需要修改 launch/visualize_franka.launch.py,使其不启动 joint state publisher GUI。机器人状态发布者无论如何都会订阅 /joint_states,所以你可以直接向该主题注入你自己的关节状态。
简单的方法是克隆我的 fork,它已经完成了修改,并且基于我对 franka_description 的 jazzy 移植:
git clone -b external_joint_state https://github.com/ulikoehler/franka_description.git你也可以自己修改 launch/visualize_franka.launch.py:只需删除启动 joint state publisher GUI 的 Node() 调用。以下 diff 显示了要删除哪些行(以 - 为前缀的行)。
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:
./scripts/visualize_franka.sh arm_id:=fr3注意,一开始看起来会很奇怪,因为 rviz2 不知道任何默认关节状态。这是正常的和预期的:

robot_state_publisher 期望哪些确切的关节状态?
首先,我使用以下命令记录了 /joint_states 主题
ros2 topic echo /joint_states > joint_states.txt基于输出:
---
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 个条目。velocity 和 effort 字段为空。
发布你自己的关节状态
现在我们可以使用我们文章发布自定义关节状态的 ROS2 Python 脚本中的脚本,向 /joint_states 主题发布我们自己的关节状态。
通过运行该文章中的脚本:
./publish_custom_joint_states.py我们可以看到机器人根据我们发布的正弦关节状态移动:
