
Проблема, с которой часто встречаются разработчики, в том числе и компании, заключается в обучении дронов и роботов. До недавнего времени эту проблему позволяла решить Aerial Informatics and Robotics Platform (AirSim), и данная статья неплохо описывает это решение. Однако в 2023 году компания Microsoft объявила о закрытии данного проекта и сокращении штата, который им занимался.
Но надежда есть, и появилась компания, которая продолжила плодотворные традиции AirSim. Теперь это целая система, и называется она Scaled Foundations. Команда поняла современные тренды и не стала останавливаться на беспилотниках, а начала заниматься практически всеми возможными видами умных помощников, и соответственно моделировать для них среду, максимально приближенную к реальной.
Scaled Foundations предлагает более широкий спектр возможностей, чем AirSim, включая симуляцию различных сред, таких как города, здания и природные ландшафты. Это позволяет разработчикам тестировать и обучать своих роботов и дронов в более реалистичных условиях, что может привести к значительному улучшению их производительности и эффективности.
Кроме того, Scaled Foundations предоставляет разработчикам доступ к большому количеству инструментов и ресурсов, включая библиотеки и фреймворки, которые могут помочь им создать более сложные и реалистичные симуляции. Это может быть особенно полезно для компаний, которые работают над разработкой автономных транспортных средств, дронов и других типов роботов, которые требуют высокого уровня точности и надежности.
В целом, Scaled Foundations представляет собой перспективное решение для разработчиков, которым необходима симуляция и тестирование их роботов и дронов в реалистичной среде. Это развитие является важным шагом на пути к созданию более совершенных и автономных систем, которые могут быть эффективно использованы в различных областях, включая транспорт, логистику, строительство и другие, где точность и надежность имеют первостепенное значение.
Компания предлагает два решения: для идейных(Open Grid) и для платёжоспособных(Grid Enterprice).Разница в том что Open Grid запускается облачно и имеет определённые виды роботов, дронов, локаций, а платная версия позволяет разворачивать локально и кроме того использовать ещё дополнительные функции для более глубокого обучения и интеграции в проект.Как описывает компания бесплатная версия для небольшой команды разработчиков, а Grid Enterprice для стартапов, компаний(что и так понятно из названия)
Рассмотрим функционал Open Grid
Сначала регистрируемся на сайте, не переживайте что долго не приходит подтверждение, это нормально.

Переходим в главное меню и здесь у нас появляется выбор.

-
Robot: Здесь вы выбирайте и настраивайте роботизированную платформу.
-
Scene: Выбираете и настраиваете виртуальную среду, максимально приближенную к реальной.Соответственно как вы можете заметить здесь есть примерные тест-кейсы которые позволяют поместить робота в боевую среду.
-
Sensors: Настраивайте параметры камеры, чтобы получить желаемые виды и параметры для моделирования и настройте датчики вашего робота для обнаружения и взаимодействия в данной среде.
-
AI models: Предварительно настройте модели искусственного интеллекта, которые будут использоваться в моделировании.

Перейдём к практике
Заполним нужные параметры и переходим уже в "среду разработки"
-
Инициализируйте среду: Начните с запуска шаблонного кода для инициализации API Airgen и загрузки необходимых весов для модели Grounded SAM.

-
Управление автомобилем: Используйте API setCarTargetSpeed() (документация CarClient) для перемещения автомобиля вперед, а затем захватите изображения с помощью API getImages(). Следующий блок кода демонстрирует, как расположить автомобиль и захватить изображение.

Сегментация изображений с помощью Grounded SAM:
-
Сегментация дороги: Примените модель Grounded SAM для сегментирования дороги на только что полученном изображении. Визуализируйте результат с помощью модуля повторного выполнения. Мы выполним приведенный ниже код для сегментирования дороги.
road = seg_gsam_0.run(image[0][0], "road")

-
Альтернативный вид камеры: Попробуйте захватить и сегментировать изображение с камеры "back_center", чтобы посмотреть на ситуацию с другой стороны. Следующий блок кода захватывает изображение с задней камеры.
image_new = client.getImages("back_center", [0])
rr.log("Car", rr.Image(image_new[0][0]))
Теперь давайте сегментируем изображение, полученное с задней камеры.
car = seg_gsam_0.run(image_new[0][0], "car")

Навигация по сцене
-
Переместим на определенную позицию: Переместим автомобиль в положение x = -120 метров с помощью следующего кода.
client.setCarTargetSpeed(5)
while True:
if client.simGetVehiclePose().position.x_val <= -120:
client.setCarTargetSpeed(0)
break
print(client.simGetVehiclePose().position) -
Выполнение поворота влево: Чтобы выполнить левый поворот, установите рулевое управление на 1,0 для резкого поворота, а затем медленно перемещайте автомобиль для завершения маневра.
controls = client.getCarControls()
controls.is_manual_gear = False
controls.steering = 1.0
client.setCarControls(controls)
client.setCarTargetSpeed(2.1)
time.sleep(3)
client.setCarTargetSpeed(0) -
Вернитесь к прямолинейному движению: Сбросьте значение рулевого управления до 0,0, чтобы возобновить прямолинейное движение.
controls.steering = 0.0
client.setCarControls(controls)
client.setCarTargetSpeed(2)
time.sleep(3)
client.setCarTargetSpeed(0)
Работа с данными LiDAR
-
Создаем объект точек: Используйте API getLidardata() (документация LiDAR) для получения данных LiDAR. В приведенном ниже фрагменте кода показано, как преобразовать исходные данные в список точек с соответствующими преобразованиями координат.
def get_lidar_data(client):
lidar_data = client.getLidarData()
if len(lidar_data.point_cloud) < 3:
print("No points received from Lidar")
else:
points = np.array(lidar_data.point_cloud, dtype=np.float32)
points = np.reshape(points, (int(points.shape[0] / 3), 3))
points_xyz = np.zeros_like(points)
points_xyz[:, 0] = points[:, 0]
points_xyz[:, 1] = points[:, 1]
points_xyz[:, 2] = -points[:, 2] + 1
print("Got LiDAR Data")
return points_xyz
-
Визуализируем: С помощью Matplotlib расставьте данные облака точек LiDAR и сохраните график в виде изображения. Вы можете найти каталог сессии через переменную GRID_USER_SESSION_BLOB_DIR. Ниже показано, как будет выглядеть вкладка хранилища после сохранения данных LiDAR.
%matplotlib inline
import os
from grid import GRID_USER_SESSION_BLOB_DIR
import numpy as np
import matplotlib.pyplot as plt
points = get_lidar_data(client)
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
for point in points:
ax.scatter(point[0], point[1], point[2])
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
save_path = os.path.join(GRID_USER_SESSION_BLOB_DIR, "pcl.png")
plt.savefig(save_path, bbox_inches='tight')
print("Saved!")


Бонус! Компания будет проводить мастер класс 17 марта 2025 на котором покажут как разрабатывать реальные решения.Рекомендую!Будет очень полезно если вы только вкатывайтесь.
Подводя итоги
Итак, в данной вводной статье моя задача была показать вам что есть такое мощное и практичное решение которое поможет разработчикам сэкономить время и повысить эффективность работы.На мой взгляд, ключевым преимуществом Scaled Foundations является возможность создания систем, способных функционировать в реальных условиях.Не бойтесь экспериментировать, творить и учиться на ошибках — этот продукт станет вашим надежным помощником на пути к достижению целей!
Спасибо за внимание!
Автор: dmitr3mart