Проект для управления мобильным роботом в ROS 2 Jazzy / Isaac Sim.
Система записывает визуальные keyframes с позой робота, загружает записи в Qdrant и позволяет отправлять робота к сохраненной позе наблюдения по текстовому запросу.
odom-frame профиле.Start DB recording / Stop DB recording.Основной runtime работает в odom.
Запись сохраняет pose keyframe в odom, и Go отправляет цель в тот же frame.
Это снижает риск смешивания старой map с текущим запуском симуляции.
Практическое правило:
Start Map/Nav2.Если симуляция была перезапущена, лучше сделать новую запись или убедиться, что робот стартовал в той же позе относительно сохраненной системы координат.
web_control_panel.py Web UI и HTTP API управления runtime
semantic_nav_to_pose.py Поиск Qdrant по тексту и отправка Nav2 goal
ros_keyframe_recorder.py Запись RGB keyframes + pose metadata
qdrant_load_keyframes.py Загрузка записей в Qdrant
semantic_search_qdrant.py CLI-поиск по Qdrant
semantic_search_offline.py Offline-поиск по локальным данным
wait_for_slam_ready.py Gate перед запуском Nav2: ждет /clock, /scan, /map, TF
restart_semantic_nav.sh Полный restart web + Qdrant + Nav2
stop_all.sh Остановка runtime-процессов
launch/nav2_odom_launch.py Nav2 в odom-frame профиле
launch/slam_nav2_launch.py SLAM Toolbox + pointcloud_to_laserscan + gated Nav2
launch/localization_nav2_launch.py Saved map + AMCL localization + gated Nav2
config/nav2_odom_params.yaml
config/nav2_slam_params.yaml
config/nav2_localization_params.yaml
compose.qdrant.yml
/clock/front_stereo_camera/left/image_raw/front_3d_lidar/lidar_points/chassis/odompython3 с ROS пакетами для web/recorder/launch helper;Runtime данные Qdrant хранятся в:
qdrant_storage/
Эта директория не коммитится.
Из корня проекта:
cd /home/arman/test/diplom
source /opt/ros/jazzy/setup.bash
./restart_semantic_nav.sh
Открыть:
http://127.0.0.1:8765/
Если нужен доступ с другой машины:
HOST=0.0.0.0 ./restart_semantic_nav.sh
Потом открыть адрес VM, например:
http://<VM-IP>:8765/
/clock.ready.Start Map/Nav2.Start DB recording.Stop DB recording.Go.Записи сохраняются в:
data/recordings/run_YYYYMMDD_HHMMSS/keyframes/
Каждая запись создает Qdrant collection:
semantic_visual_memory_run_YYYYMMDD_HHMMSS
Последняя выбранная collection сохраняется локально в:
data/runtime_state.json
Gosemantic_nav_to_pose.py выполняет один mission run:
goal_frame, обычно odom./navigate_to_pose.0.25;0.26;0.8.Основные параметры semantic_nav_to_pose.py:
--collection Qdrant collection
--top-k сколько кандидатов запросить из Qdrant
--goal-frame frame для Nav2 goal, по умолчанию odom
--image-topic live camera topic
--complete-on-visual-match завершать миссию при совпадении live camera
--mission-check-period-sec период проверки live camera, по умолчанию 1.5
--arrival-spin-angle-deg угол поворота после прибытия, по умолчанию 360
--arrival-spin-angular-vel-rad-sec скорость поворота после прибытия, по умолчанию 0.45
--max-goal-distance 0 = ехать к точным координатам
--max-candidate-attempts максимум candidates за один Go, по умолчанию 3
Параметр --mission-match-threshold оставлен только для совместимости старых
команд. Фактический порог рассчитывается автоматически по текстовому запросу.
Основной режим web-панели запускает launch/nav2_odom_launch.py.
Этот профиль:
odom как рабочий frame для целей;/clock, /scan и нужный TF;/scan для остановки перед близким препятствием.Дополнительные launch-файлы оставлены для ручных проверок:
launch/slam_nav2_launch.py;launch/localization_nav2_launch.py.Когда пользователь нажимает Start DB recording, web-панель запускает:
python3 ros_keyframe_recorder.py ...
Recorder:
odom;metadata.jsonl.После остановки записи web-панель проверяет непрерывность траектории в выбранном
goal_frame. Если между соседними keyframes обнаружен скачок больше
--record-max-map-step-m (по умолчанию 5.0 m), запись не загружается в
Qdrant.
В Qdrant payload сохраняются:
memory_idrun_idЗапуск:
docker compose -f compose.qdrant.yml up -d
Остановка:
docker compose -f compose.qdrant.yml down
Web-панель может:
Полный restart runtime:
./restart_semantic_nav.sh
Остановка всего runtime:
./stop_all.sh
Ручной запуск web-панели:
source /opt/ros/jazzy/setup.bash
python3 web_control_panel.py --host 127.0.0.1 --port 8765
Логи web-интерфейса пишутся в:
logs/web/process.log
logs/web/events_YYYYMMDD_HHMMSS.log
Если перезапустить Isaac Sim, пока runtime работает:
/clock сбросится или пропадет;Extrapolation Error;Правильный порядок:
./stop_all.sh
# перезапустить Isaac Sim
./restart_semantic_nav.sh
Если симуляция или одометрия стартовали иначе, старая collection может вести робота не туда. Для стабильного теста используй collection, записанную в том же сеансе.
Go неактивнаПроверь /api/status:
curl -fsS http://127.0.0.1:8765/api/status | python3 -m json.tool
Go включается, когда:
/clock публикуется;/navigate_to_pose доступен;goal_frame -> base_link доступен;ModuleNotFoundError: rclpyНужно открыть ROS environment:
source /opt/ros/jazzy/setup.bash
Runtime слушает /scan. Если впереди в секторе 70 градусов есть препятствие
ближе 0.85 m, mission отменяет Nav2 goal и публикует ноль в /cmd_vel.
Порог можно изменить при запуске web-панели:
python3 web_control_panel.py --front-obstacle-stop-distance-m 1.0
Проверь:
Sending keyframe...;source /opt/ros/jazzy/setup.bash
ros2 run tf2_ros tf2_echo odom base_link
Параметры движения находятся в:
config/nav2_odom_params.yaml
config/nav2_slam_params.yaml
Если все еще виляет, можно снизить:
desired_linear_vel: 0.08
python3 -m py_compile \
web_control_panel.py \
ros_keyframe_recorder.py \
qdrant_load_keyframes.py \
semantic_nav_to_pose.py \
semantic_search_qdrant.py \
semantic_search_offline.py \
wait_for_slam_ready.py \
launch/slam_nav2_launch.py \
launch/localization_nav2_launch.py \
launch/nav2_odom_launch.py
bash -n restart_semantic_nav.sh stop_all.sh
source /opt/ros/jazzy/setup.bash
ros2 launch launch/nav2_odom_launch.py --show-args
Не коммитятся:
data/runtime_state.json;Это настроено в .gitignore.
Карта в data/maps/ хранится в репозитории, чтобы примерный runtime можно было
восстановить после клонирования проекта.
3 commits
Python
97.7%
Shell
2.3%
Проект для управления мобильным роботом в ROS 2 Jazzy / Isaac Sim.
Система записывает визуальные keyframes с позой робота, загружает записи в Qdrant и позволяет отправлять робота к сохраненной позе наблюдения по текстовому запросу.
odom-frame профиле.Start DB recording / Stop DB recording.Основной runtime работает в odom.
Запись сохраняет pose keyframe в odom, и Go отправляет цель в тот же frame.
Это снижает риск смешивания старой map с текущим запуском симуляции.
Практическое правило:
Start Map/Nav2.Если симуляция была перезапущена, лучше сделать новую запись или убедиться, что робот стартовал в той же позе относительно сохраненной системы координат.
web_control_panel.py Web UI и HTTP API управления runtime
semantic_nav_to_pose.py Поиск Qdrant по тексту и отправка Nav2 goal
ros_keyframe_recorder.py Запись RGB keyframes + pose metadata
qdrant_load_keyframes.py Загрузка записей в Qdrant
semantic_search_qdrant.py CLI-поиск по Qdrant
semantic_search_offline.py Offline-поиск по локальным данным
wait_for_slam_ready.py Gate перед запуском Nav2: ждет /clock, /scan, /map, TF
restart_semantic_nav.sh Полный restart web + Qdrant + Nav2
stop_all.sh Остановка runtime-процессов
launch/nav2_odom_launch.py Nav2 в odom-frame профиле
launch/slam_nav2_launch.py SLAM Toolbox + pointcloud_to_laserscan + gated Nav2
launch/localization_nav2_launch.py Saved map + AMCL localization + gated Nav2
config/nav2_odom_params.yaml
config/nav2_slam_params.yaml
config/nav2_localization_params.yaml
compose.qdrant.yml
/clock/front_stereo_camera/left/image_raw/front_3d_lidar/lidar_points/chassis/odompython3 с ROS пакетами для web/recorder/launch helper;Runtime данные Qdrant хранятся в:
qdrant_storage/
Эта директория не коммитится.
Из корня проекта:
cd /home/arman/test/diplom
source /opt/ros/jazzy/setup.bash
./restart_semantic_nav.sh
Открыть:
http://127.0.0.1:8765/
Если нужен доступ с другой машины:
HOST=0.0.0.0 ./restart_semantic_nav.sh
Потом открыть адрес VM, например:
http://<VM-IP>:8765/
/clock.ready.Start Map/Nav2.Start DB recording.Stop DB recording.Go.Записи сохраняются в:
data/recordings/run_YYYYMMDD_HHMMSS/keyframes/
Каждая запись создает Qdrant collection:
semantic_visual_memory_run_YYYYMMDD_HHMMSS
Последняя выбранная collection сохраняется локально в:
data/runtime_state.json
Gosemantic_nav_to_pose.py выполняет один mission run:
goal_frame, обычно odom./navigate_to_pose.0.25;0.26;0.8.Основные параметры semantic_nav_to_pose.py:
--collection Qdrant collection
--top-k сколько кандидатов запросить из Qdrant
--goal-frame frame для Nav2 goal, по умолчанию odom
--image-topic live camera topic
--complete-on-visual-match завершать миссию при совпадении live camera
--mission-check-period-sec период проверки live camera, по умолчанию 1.5
--arrival-spin-angle-deg угол поворота после прибытия, по умолчанию 360
--arrival-spin-angular-vel-rad-sec скорость поворота после прибытия, по умолчанию 0.45
--max-goal-distance 0 = ехать к точным координатам
--max-candidate-attempts максимум candidates за один Go, по умолчанию 3
Параметр --mission-match-threshold оставлен только для совместимости старых
команд. Фактический порог рассчитывается автоматически по текстовому запросу.
Основной режим web-панели запускает launch/nav2_odom_launch.py.
Этот профиль:
odom как рабочий frame для целей;/clock, /scan и нужный TF;/scan для остановки перед близким препятствием.Дополнительные launch-файлы оставлены для ручных проверок:
launch/slam_nav2_launch.py;launch/localization_nav2_launch.py.Когда пользователь нажимает Start DB recording, web-панель запускает:
python3 ros_keyframe_recorder.py ...
Recorder:
odom;metadata.jsonl.После остановки записи web-панель проверяет непрерывность траектории в выбранном
goal_frame. Если между соседними keyframes обнаружен скачок больше
--record-max-map-step-m (по умолчанию 5.0 m), запись не загружается в
Qdrant.
В Qdrant payload сохраняются:
memory_idrun_idЗапуск:
docker compose -f compose.qdrant.yml up -d
Остановка:
docker compose -f compose.qdrant.yml down
Web-панель может:
Полный restart runtime:
./restart_semantic_nav.sh
Остановка всего runtime:
./stop_all.sh
Ручной запуск web-панели:
source /opt/ros/jazzy/setup.bash
python3 web_control_panel.py --host 127.0.0.1 --port 8765
Логи web-интерфейса пишутся в:
logs/web/process.log
logs/web/events_YYYYMMDD_HHMMSS.log
Если перезапустить Isaac Sim, пока runtime работает:
/clock сбросится или пропадет;Extrapolation Error;Правильный порядок:
./stop_all.sh
# перезапустить Isaac Sim
./restart_semantic_nav.sh
Если симуляция или одометрия стартовали иначе, старая collection может вести робота не туда. Для стабильного теста используй collection, записанную в том же сеансе.
Go неактивнаПроверь /api/status:
curl -fsS http://127.0.0.1:8765/api/status | python3 -m json.tool
Go включается, когда:
/clock публикуется;/navigate_to_pose доступен;goal_frame -> base_link доступен;ModuleNotFoundError: rclpyНужно открыть ROS environment:
source /opt/ros/jazzy/setup.bash
Runtime слушает /scan. Если впереди в секторе 70 градусов есть препятствие
ближе 0.85 m, mission отменяет Nav2 goal и публикует ноль в /cmd_vel.
Порог можно изменить при запуске web-панели:
python3 web_control_panel.py --front-obstacle-stop-distance-m 1.0
Проверь:
Sending keyframe...;source /opt/ros/jazzy/setup.bash
ros2 run tf2_ros tf2_echo odom base_link
Параметры движения находятся в:
config/nav2_odom_params.yaml
config/nav2_slam_params.yaml
Если все еще виляет, можно снизить:
desired_linear_vel: 0.08
python3 -m py_compile \
web_control_panel.py \
ros_keyframe_recorder.py \
qdrant_load_keyframes.py \
semantic_nav_to_pose.py \
semantic_search_qdrant.py \
semantic_search_offline.py \
wait_for_slam_ready.py \
launch/slam_nav2_launch.py \
launch/localization_nav2_launch.py \
launch/nav2_odom_launch.py
bash -n restart_semantic_nav.sh stop_all.sh
source /opt/ros/jazzy/setup.bash
ros2 launch launch/nav2_odom_launch.py --show-args
Не коммитятся:
data/runtime_state.json;Это настроено в .gitignore.
Карта в data/maps/ хранится в репозитории, чтобы примерный runtime можно было
восстановить после клонирования проекта.
3 commits
Python
97.7%
Shell
2.3%