Репозиторий содержит основные модули для работы MetalBot как в симуляции так и на реальном роботе. Используемый навигационный стек - Navigation2.
- MetalBot
Для начала необходимо создать воркспейс и склонировать репозиторий
git clone --recurse-submodules -j4 https://github.com/FastSense/metalbot/
Если предполагается собирать образ с использованием CUDA
./nvidia-deps.sh
cd docker
# Выбрать версию докер-контейнера
source env-gazebo.sh
source env-robot.sh
source env-universal.sh
# Создание образа
./drun.sh build
# Создание контейнера
./drun.sh run
# Загрузка образа с dockerhub
./drun.sh pull
# Загрузка образа на dockerhub
./drun.sh push
docker start $container
docker attach $container
Докер содержит пространства ros1, ros2 и micro_ros
При сборке ros1 не должны быть экспортированы переменные окружения ros2, и наоборот.
Для экспорта ros1_ws существует alias r1
Для экспорта ros2_ws и micro_ros_ws существует alias r2
Переменные окружения ROS1 не должны быть экспортированы
# Basic packages (no gazebo, groot, sensors, grid_map)
cd ros2_ws
r2
cb_basic
# Build selected packages
cb_selected package_name1 package_name2 ...
# Optional packages
cb_gazebo
cb_realsense
Переменные окружения ROS2 не должны быть экспортированы
cd ros1_ws
r1
catkin_make -j4
Перед началом сборки ros1_bridge следует собрать все имеющиеся интерфейсы (сообщения, сервисы) ros1 и ros2 и экспортировать переменные окружения в порядке: ros1, ros2
# .. build all interfaces
cd ros2_ws
r1
r2
cb_bridge
cd micro_ros_ws
r2
# Update dependencies using rosdep
sudo apt update && rosdep update
rosdep install --from-path src --ignore-src -y
# Build micro-ROS tools and source ROS2 & Micro-ROS
colcon build
r2
# Download micro-ROS agent packages
ros2 run micro_ros_setup create_agent_ws.sh
# Build step
ros2 run micro_ros_setup build_agent.sh
Установливать утилиту следует в систему бортового компьютера (не в докер)
Утилита используется для программного перезапуска прошивки Teensy 4.1. Например, в случае разрыва связи с агентом Micro-ROS.
Сборка
git clone https://github.com/Koromix/tytools.git
cd tytools
mkdir -p build/linux && cd build/linux
cmake -DCMAKE_INSTALL_PREFIX=/usr/local ../..
make
make install
Базовые Команды
# Отображение информации о доступных платах Teensy
tycmd list -w
# Перезапустить выбранный контроллер
# Micro-ROS агент должен быть выключен
sudo tycmd reset
Запуск основных нод для работы с роботом
ros2 launch metalbot[_gazebo] bringup.launch.py
ros2 launch metalbot[_gazebo] nav2.launch.py
ros2 launch metalbot rviz.launch.py
# Запуск программы для визуализации Behavior Tree
ros2 run groot Groot
# Запуск ноды телеуправления с клавиатуры (wasd) (Запускается на хост машине)
ros2 launch rosbot_controller rosbot_sim_keyboard_teleop.launch.py
# Альтернативно можно воспользоваться встроенным телеопом
sudo apt update
sudo apt install ros-foxy-teleop-tools
ros2 run teleop_twist_keyboard teleop_twist_keyboard
ros2 launch fs-realsense rs_launch.py
# Запускается в скрипте bringup
ros2 launch metalbot micro_ros.launch.py
Запуск на metalbot:
ros2 launch state_estimation_2d state_estimation_metalbot.launch.py
Статические tf не пробрасываются. Нужно запускать bringup с Параметром use_tf_static = false
# Показать доступные mapping'и интерфейсов
ros2 run ros1_bridge dynamic_bridge --print-pairs
# Запуск ros2_bridge
ros2 run ros1_bridge dynamic_bridge --bridge-all-topics
Для публикации топиков из ROS2 Bag в ROS1 нужно сделать два шага:
- Записать данные из ROS2 Bag в файл hdf5 - с помощью пакета rosbag_to_hdf5:
Терминал 1
r2
cd ~/ros2_ws
colcon build --packages-select rosbag_to_hdf5
ros2 run rosbag_to_hdf5 oakd_data_recorder --ros-args -p path_to_save_hdf5:=/path/to/save.hdf5 -p verbose:=True (для данных с oakd)
ros2 run rosbag_to_hdf5 realsense_data_recorder --ros-args -p path_to_save_hdf5:=/path/to/save.hdf5 -p verbose:=True (для данных с realsense)
ros2 run rosbag_to_hdf5 rosbot_gazebo_data_recorder --ros-args -p path_to_save_hdf5:=/path/to/save.hdf5 -p verbose:=True (для данных из Gazebo)
Терминал 2
r2
ros2 bag play /path/to/rosbag
- Считать данные из hdf5 и застримить в топики ROS1 - с помощью пакета hdf5_data_publisher:
Терминал 1
r1
roscore
Терминал 2
r1
cd ~/ros1_ws
catkin_make
roslaunch hdf5_data_publisher oakd.launch path_to_hdf5:=/path/to/save.hdf5 (для данных с oakd)
roslaunch hdf5_data_publisher realsense.launch path_to_hdf5:=/path/to/save.hdf5 (для данных с realsense)
roslaunch hdf5_data_publisher rosbot_gazebo.launch path_to_hdf5:=/path/to/save.hdf5 (для данных из Gazebo)
Запуск с дефолтным конфигом (под Realsense D455):
r2
ros2 launch pointcloud_filter_cpp voxel_grid_filter.launch.py
Запуск с другим конфигом:
r2
ros2 launch pointcloud_filter_cpp voxel_grid_filter.launch.py config_file:=/path/to/config.yaml
Запуск в ROS1 с росбэга Для запуска Elevation Mapping на бэгах с Realsense в ROS1 нужно сначала перегнать данные из бэга в hdf5 (как описано в разделе Rosbag2 to ROS1. Затем запустить публикацию данных из hdf5 и Elevation Mapping с нужным конфигом:
Терминал 1
r1
roscore
Терминал 3
r1
roslaunch hdf5_data_publisher realsense_pcd_only.launch path_to_hdf5:=/path/to/realsense_data.hdf5
Терминал 4
r1
roslaunch fs_elevation_mapping metalbot_realsense.launch open_rviz:=true config_file:=metalbot_realsense_from_hdf5.yaml odom_topic:=camera/odom/sample publish_clock:=true
Запуск в ROS2 через ros1_bridge
Терминал 1
r1
roscore
Терминал 2
r1
r2
ros2 run ros1_bridge dynamic_bridge --bridge-all-topics
Терминал 3
r1
# Для запуска в Gazebo
roslaunch fs_elevation_mapping metalbot_realsense.launch open_rviz:=true config_file:=metalbot_gazebo.yaml odom_topic:=odom publish_clock:=false
# Для запуска с росбэга, записанного на роботе
roslaunch fs_elevation_mapping metalbot_realsense.launch open_rviz:=true config_file:=metalbot_realsense_rosbridge.yaml odom_topic:=camera/odom/sample publish_clock:=true
Здесь описан запуск Navigation2 с использованием одометрии с камеры Realsense T265 и локального планировщика MPPI в 2D.
Терминал 1 - bringup (в нем запускается контроллер и статические трансформы робота)
r2
ros2 launch metalbot bringup.launch.py use_tf_static:=true
Терминал 2 - realsense D455 (источник pointcloud-a)
r2
ros2 launch fs-realsense rs_launch.py
Терминал 3 - pointcloud_filter (уменьшение размера pointcloud-a и фильтрация выбросов)
r2
ros2 launch pointcloud_filter_cpp realsense_pcd_filter.launch.py
Терминал 4 - Realsense T265 (источник одометрии)
r2
ros2 launch realsense2_camera rs_t265_launch.py
Терминал 5 - трансформы от T265 к роботу
r2
ros2 launch metalbot t265_tf.launch.py
Терминал 6 - собственно Navigation2
r2
ros2 launch metalbot nav2.launch.py
Терминал 1 - rviz
export ROS_DOMAIN_ID=81
r2
ros2 run rviz2 rviz2