Як запустити ROS2 visualize_franka.sh із зовнішнім входом /joint_state

Скрипт visualize_franka.sh з franka_description використовує GUI joint state publisher, який має графічний інтерфейс, що постійно публікує стани суглобів:

GUI видавця станів суглобів

Хоча це чудовий інструмент для інтерактивного встановлення позицій суглобів, оскільки він постійно публікує стани суглобів, він блокує будь-яке інше програмне забезпечення від публікації станів суглобів у ту саму тему. Хоча ви можете публікувати стани суглобів у ту саму тему, GUI просто перезапише ваш стан суглоба своїм власним.

Модифікація franka_description для прийому зовнішніх станів суглобів

Щоб обійти це, нам потрібно модифікувати launch/visualize_franka.launch.py, щоб не запускати GUI joint state publisher. Robot state publisher усе одно підписуватиметься на /joint_states, тож ви можете просто вставляти власні стани суглобів у цю тему.

Простий спосіб зробити це — клонувати мій форк, у якому модифікацію вже виконано і який базується на моєму порту jazzy для franka_description:

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

Ви також можете модифікувати launch/visualize_franka.launch.py самостійно: просто видаліть виклик Node(), який запускає GUI joint state publisher. Наступний 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 без типових станів суглобів

Яких саме станів суглобів очікує 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: []

видно, що в нашому випадку він очікує 8 записів у полі name та 8 записів у полі position. Поля velocity та effort порожні.

Публікація власних станів суглобів

Тепер ми можемо використати скрипт із нашої публікації Python-скрипт ROS2 для публікації користувацьких станів суглобів, щоб публікувати власні стани суглобів у тему /joint_states.

Запустивши скрипт із тої публікації:

run_publish_custom_joint_states.sh
./publish_custom_joint_states.py

ми можемо побачити, що робот рухається відповідно до синусоїдальних станів суглобів, які ми публікуємо:

Власні стани суглобів Franka


Дивіться схожі статті за категоріями: ROS Робототехніка Python