Внедрете играта на живота на Conway, като използвате ROS 2 OccupancyMap и rviz2 за визуализация.

Като забавен проект, който да ми помогне да се запозная със съобщението ROS 2 OccupancyMap, кодирах алгоритъма Game of Life на Conway, използвайки OccupancyMap за моделиране на света на клетъчните автомати. В тази статия описвам детайлите от високо ниво на моята реализация на Game of Life.

Програмата е реализирана с помощта на TypeScript и пакета Nodejs rclnodejs. ROS 2 rviz2 се използва за визуализиране на публикуваните от програмата карти на заетостта. Ако искате да преминете направо към изграждането и стартирането на моята версия, изходният код е достъпен тук.

Правила на играта на живота

Играта на живота на Конуей, известна още като Живот, е клетъчен автомат, разработен от математика Джон Конуей през 1970 г. Животът се състои от 2D мрежа от клетки, като всяка клетка има състояние на жива или мъртва. Състоянието на клетката може да се променя от едно поколение на следващо според три прости правила.

  1. Всяка жива клетка с две или три съседни (съседни клетки) оцелява до следващото поколение.

2. Всяка мъртва клетка с трима съседи става жива клетка в следващото поколение.

3. Всички други живи клетки умират в следващото поколение. По същия начин всички други мъртви клетки остават мъртви.

Вижте раздела Ресурси по-долу за повече информация относно Game of Life на Conway.

Съобщение на OccupancyMap

Вече споменах, че програмата използва ROS 2 OccupancyMap за моделиране на клетъчния свят. Нека да разгледаме дефиницията на OccupancyMap, която е дефинирана като част от пакета nav_msgs.

Обърнете внимание на полето info от typeMapMetaData. MapMetaData (показано по-долу) определя размерите на мрежата в полето data, както и ориентацията и мащаба на клетката.

Подробности за проекта

Проектът ще се състои от следното:

  • ROS 2 възел, наречен /ros2_js_examples/game_of_life
  • ROS 2 100x100 OccupancyMap ще представя клетъчния свят
  • ROS 2 Timer ще осигури тик на всеки 500 милисекунди (2 Hz), който инициира прехода на текущия свят към следващото поколение
  • Издателят на ROS 2 ще излъчи актуализираната OccupancyMap за всяко поколение, тема = game_of_life
  • rviz2 ще осигури визуализация на клетъчния свят
  • Тази програма е внедрена като Nodejs приложение, кодирано с помощта на TypeScript и ROS 2 rclnodejs JavaScript клиентска библиотека.

Код

Създайте папката на проекта и сменете директорията в нея:

mkdir -p src/example4
cd src/example4

Проектът се състои от 2 TypeScript файла: index.ts и game-of-life.ts. За да сведа до минимум излишното разказване на кода, се опитах да включа либерални коментари в целия код, както е показано по-долу.

Някои ключови неща, които трябва да забележите в кода:

  • Състоянията на клетката на картата за заетост са ЖИВ = 100, МЪРТВ = 0.
  • Използва се ROS2 Timer вместо по-разпространената JavaScript функция setInterval(). Това е така, защото таймерът ROS2 се основава на часовника на родителския възел, който може да бъде конфигуриран да използва симулирано време и да се контролира външно.
  • За минимизиране на паметта програмата използва само 2 масива от данни: масив за съхранение на предишното поколение състояния на клетката и масив за съхраняване на текущото поколение състояния на клетката. Също така един екземпляр на картата на заетостта се създава и актуализира при всяко ново поколение с текущото поколение данни за състоянието на клетката.

index.ts

игра-на-живота.ts

Изграждане

От основната папка на проекта стартирайте компилатора на TypeScript. Резултатът ще се появи в папката dist/example4.

tsc

Течаща игра на живота

Нашата програма за игра на живот се изпълнява в 2 процеса, които ще стартираме индивидуално.

Първо стартирайте възела game-of-life от командна обвивка:

node dist/example4/index.js

След като програмата стартира, трябва да видите съобщения, които се движат към stdout с информация за номера на текущото поколение и броя на живите клетки.

След това изпълнете rviz2, за да видите картите на заетостта, публикувани от възела game-of-life:

rviz2 -d src/example4/game-of-life.rviz

Трябва да видите прозорец на rviz2, подобен на следния:

Ако трябва да преконфигурирате rviz2 дисплея или да използвате ros2 CLI инструменти, ще ви трябва следната информация:

NODE_NAME = ‘game_of_life_node’;
NODE_NAMESPACE = ‘ros2_js_examples’;
TOPIC = ‘game_of_life’;
FRAME_ID = ‘game_of_life_frame’;

Обобщение

Надявам се, че сте се забавлявали, разработвайки вашата версия на Game of Life на Conway. Може да обмислите допълнителни подобрения на вашата версия, като например параметризиране на размера на картата на заетостта или използване на предварително дефинирана решетка от клетки вместо произволни състояния на клетки.

Препратки

  1. Уикипедия — Играта на живота на Конуей

2. Изходен код

Моля, помислете дали да не харесате този урок и да ме следвате тук и в Twitter @ros2jsguy