Скрипт visualize_franka.sh з franka_description використовує GUI joint state publisher, який має графічний інтерфейс, що постійно публікує стани суглобів:
Хоча це чудовий інструмент для інтерактивного встановлення позицій суглобів, оскільки він постійно публікує стани суглобів, він блокує будь-яке інше програмне забезпечення від публікації станів суглобів у ту саму тему. Хоча ви можете публікувати стани суглобів у ту саму тему, GUI просто перезапише ваш стан суглоба своїм власним.
Модифікація franka_description для прийому зовнішніх станів суглобів
Щоб обійти це, нам потрібно модифікувати launch/visualize_franka.launch.py, щоб не запускати GUI joint state publisher. Robot state publisher усе одно підписуватиметься на /joint_states, тож ви можете просто вставляти власні стани суглобів у цю тему.
Простий спосіб зробити це — клонувати мій форк, у якому модифікацію вже виконано і який базується на моєму порту jazzy для franka_description:
git clone -b external_joint_state https://github.com/ulikoehler/franka_description.gitВи також можете модифікувати launch/visualize_franka.launch.py самостійно: просто видаліть виклик Node(), який запускає GUI joint state publisher. Наступний 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: []видно, що в нашому випадку він очікує 8 записів у полі name та 8 записів у полі position. Поля velocity та effort порожні.
Публікація власних станів суглобів
Тепер ми можемо використати скрипт із нашої публікації Python-скрипт ROS2 для публікації користувацьких станів суглобів, щоб публікувати власні стани суглобів у тему /joint_states.
Запустивши скрипт із тої публікації:
./publish_custom_joint_states.pyми можемо побачити, що робот рухається відповідно до синусоїдальних станів суглобів, які ми публікуємо:


