نظرًا لقدراتها، تُعد لوحة NVIDIA Jetson منصة مثالية لتثبيت بيئة ROS (نظام تشغيل الروبوت). ومع ذلك، قد يمثل إعداد ROS على اللوحة تحديات، مثل التبعيات النظامية المفقودة، وبطء بناء الحزم، والحاجة إلى تحسين الأجهزة. في هذا المقال، سأرشدك عبر درس تعليمي حول تحضير بيئة ROS مخصصة على لوحة NVIDIA Jetson، مع معالجة هذه المشكلات وتقديم تعليمات خطوة بخطوة للتثبيت.

لماذا NVIDIA Jetson لـ ROS؟

لوحة Jetson هي سلسلة من منصات الحوسبة المدمجة التي طورتها NVIDIA. صُممت هذه اللوحات خصيصًا لتشغيل تطبيقات الذكاء الاصطناعي والتعلم العميق في بيئات محدودة الموارد. تدمج لوحات Jetson وحدات معالجة رسومات قوية ووحدات معالجة مركزية متعددة النوى ومسرّعات ذكاء اصطناعي مخصصة لتوفير قدرات حوسبة عالية الأداء في تصميم مدمج. وتُعرف بقدرتها على معالجة وتحليل بيانات المستشعرات بكفاءة، وأداء مهام الرؤية الحاسوبية، وتنفيذ خوارزميات الذكاء الاصطناعي المعقدة. وبالتالي، تُستخدم عادةً فيالروبوتات، المركبات ذاتية القيادة، الطائرات بدون طيار، والأتمتة الصناعية، وتطبيقات الحوسبة الطرفية الأخرى.

ما هي التحديات الرئيسية في إعداد بيئة ROS؟

قد يواجه المطورون بعض المشكلات الشائعة عند إعداد ROS على لوحات Jetson، مثل ما يلي:

  1. يحتوي ROS على عدة تبعيات نظام يجب تثبيتها قبل أن تتمكن من استخدامه. إذا واجهت أخطاء في المترجم عند بناء حزم ROS، فمن المحتمل أنك تفتقد تبعية نظام، أو أن هناك عدم تطابق في الإصدارات. أفضل طريقة لاكتشاف تعارض الحزم وأخطاء البناء هي استخدام ملفات docker وإنشاء بيئة معزولة للتطوير وسهولة الصيانة.
  2. يُعد بناء الحزم مباشرةً على لوحة Jetson عملية بطيئة إلى حد كبير، وهو يتطلب في معظم الحالات اتصالاً بالإنترنت لتنزيل الحزم التابعة. ويمكن حل ذلك من خلال إنشاء صور على جهاز مضيف أكثر قوة بكثير وكتابتها مباشرةً على بطاقة SD التي ستُستخدم بعد ذلك على لوحة Jetson.
  3. لتحسين أداء الأجهزة على لوحة Jetson، ينبغي لنا تحسين تطبيقات البرمجيات لتشغيلها بكفاءة أكبر. قد يتضمن ذلك تعديل الكود، أو استخدام حزم أكثر كفاءة، أو تقليل عبء العمل على اللوحة من خلال تجنب تثبيت وظائف غير ضرورية، مثل واجهة المستخدم الرسومية لنظام Linux.

تثبيت بيئة ROS على لوحة Jetson في ثلاث خطوات

في هذا المقال، سأركز على إعداد شائع إلى حد كبير: إصدار ROS1 Melodic (أوبونتو 18.04) داخل لوحة NVIDIA Jetson Nano. سنستخدم Linux4Tegra، وهو نظام تشغيل مخصص لبيئة Jetson ARM64 يحتوي على نصوص برمجية يمكننا إعادة استخدامها لإنشاء ملفات IMG.

الخطوة 1. إنشاء ملفات ROS docker

أولاً، يجب علينا إعداد بيئة بناء ARM64 على جهازنا المضيف. من المحتمل أنك ستستخدم بنية AMD64 القياسية (على سبيل المثال، ubuntu 22.04)؛ للقيام بذلك، تحتاج إلى تثبيت أداة QEMU. المستوى الرئيسي الذي نخزّن فيه إعدادنا المخصص سيكون ملف docker (لنسمّه Dockerfile.eg)، حيث نحدد إصدار نظام L4T، ونثبّت حزم ROS المطلوبة، على سبيل المثال:

# تثبيت الحزم الأساسية
RUN apt-get update \
    && apt-get install -y \
    lsb-core \
    cmake \
    git \
    ninja-build \
    curl

RUN sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

RUN curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | apt-key add -

# تثبيت حزم ROS - يُرجى إضافة الحزم التالية في النهاية عند الحاجة
RUN apt-get update \
    && apt-get install -y \
    ros-melodic-ros-base \
    ros-melodic-navigation \
    ros-melodic-robot-localization \
    ros-melodic-tf2-ros \
    ros-melodic-rviz \
    python-catkin-pkg \
    python-catkin-tools \
    python-rosdep \
    python-rosinstall \
    python-rosinstall-generator

يمكننا حقن مستودعاتنا وإعادة بنائها للحصول على بيئة تشغيل جاهزة بالكامل. في الكود أدناه، يُعدّ السطر التاسع مفيداً جداً لتجنب الأخطاء الناتجة عن تبعيات الحزم المطلوبة وتثبيتها مسبقاً قبل بدء ماكرو catkin_make.

# تثبيت وبناء مستودعات git الخاصة بك RUN mkdir -p /catkin_ws/src \ && cd /catkin_ws/src \ && git clone https://github.com/<myRepo>.git \ && git clone https://github.com/<myRepo1>.git \ && git clone https://github.com/<myRepo2>.git \ && cd /catkin_ws/ \ && . /opt/ros/melodic/setup.sh \ && rosdep install --from-paths src -y --ignore-src \ catkin_make_isolated --use-ninja --cmake-args -DCMAKE_BUILD_TYPE=Release

يمكننا إضافة ملفات أو أدلة الموارد إلى صورة docker إذا لزم الأمر. بالإضافة إلى ذلك، يمكننا إنشاء خدمة نظامنا، على سبيل المثال، roscoreinit.service لتفعيل roscore عند كل بدء تشغيل لنظام L4T:

[Unit] Description=Init roscore After=remote-fs.target After=syslog.target [Service] ExecStart=/root/init_roscore.sh Restart=on-abort [Install] WantedBy=multi-user.target

سكربت مخصص init_roscore.sh:

#!/bin/bash source /catkin_ws/devel_isolated/setup.bash roscore

أضف تفعيل roscoreinit.service و init_roscore.sh داخل ملف dockerfile:

COPY roscoreinit.service /lib/systemd/system/roscoreinit.service COPY init_roscore.sh /root/init_roscore.shRUN systemctl enable roscoreinit

الخطوة 2. بناء الصورة

لبناء docker وتصديره إلى ملف، نستدعي الأوامر أدناه:

docker build --build-arg --network=host . -f Dockerfile.eg -t myImage docker export "$(docker create --name nano-rootfs --platform linux/arm64 myImage)" -o myImage.tar

بعد ذلك، نحتاج إلى فك ضغط نظام الملفات الجذري (Rootfs) من الخطوة السابقة، وباستخدام حزمة دعم اللوحة Linux4Tegra، سننشئ صورة Jetson Nano يمكن تثبيتها مباشرة على بطاقة SD:

# BSP 32.7.2 يمكن العثور على مزيد من التفاصيل هنا: https://developer.nvidia.com/embedded/linux-tegra-r3272
L4T_PACKAGE=https://developer.nvidia.com/embedded/l4t/r32_release_v7.2/t210/jetson-210_linux_r32.7.2_aarch64.tbz2
L4T_PACKAGE_BUILD_DIR=l4t_bsp
wget --no-check-certificate -qO- $L4TPackage | tar -jxpf - -C $L4T_PACKAGE_BUILD_DIR
ROOTFS_L4T_DIR=/tmp/l4t/rootfs
mkdir -p $ROOTFS_L4T_DIR
tar --same-owner -xf myImage.tar -C $ROOTFS_L4T_DIR
# هنا يمكننا تعديل نواة Linux، وهي خطوة اختيارية موصوفة في القسم التالي
# إنشاء ملف IMG
ROOTFS_DIR=$ROOTFS_L4T_DIR $L4T_PACKAGE_BUILD_DIR/Linux_for_Tegra/tools/jetson-disk-image-creator.sh \
    -o myImage.img -b jetson-nano -r 300

ملف الإخراج myImage.img هو الصورة النهائية التي يمكن كتابتها مباشرة على بطاقة SD، على سبيل المثال، باستخدام أدوات balenaEtcher.

الخطوة 3، اختيارية. أعد بناء نواة Linux من المصدر

تتيح لك إعادة بناء النواة من المصدر اختيار الميزات التي تحتاجها فقط. وقد يؤدي ذلك إلى أداء نظام أكثر رشاقة وسرعة واستقراراً. في بعض الأحيان نحتاج إلى تغيير إعدادات نواة Linux بشكل كبير لدعم الأجهزة المطلوبة. ولأغراض مزامنة المستشعرات، يمكننا تمكين وظائف متنوعة مثل نبضة في الثانية (PPS) أو بروتوكول التوقيت الدقيق (PTP)، بحيث يمكن لعُقد ROS العمل في بيئة مستقرة. ثم نحتاج إلى إيجاد إصدار GCC متوافق للمترجم المتقاطع ومصادر النواة. في سيناريو حالتنا، نتحقق من صفحة NVIDIA أدناه التي تصف إصدار L4T 32.7.2:

https://developer.nvidia.com/embedded/linux-tegra-r3272

بعد إعادة بناء النواة الجديدة، تحتاج إلى تثبيت كتل شجرة الأجهزة في بناء حزمة L4T المذكورة في قسم بناء الصورة:

cp <build_from_sources_kernel>/arch/arm64/boot/Image $L4T_PACKAGE_BUILD_DIR/Linux_for_Tegra/kernel cp -r <build_from_sources_kernel>/arch/arm64/boot/dts/* $L4T_PACKAGE_BUILD_DIR/Linux_for_Tegra/kernel/dtb

إذا كانت لوحة NVIDIA Jetson Nano لديك مزوّدة ببطاقة وسائط متعددة مدمجة، فستحتاج أيضًا إلى مزامنة النواة الجديدة مع eMMC عند بدء تشغيل محمّل الإقلاع للمرة الأولى. أما في لوحة Jetson Nano التي لا تحتوي على eMMC، فسيتم تهيئة النواة من بطاقة SD خارجية أو وحدة تخزين USB حيث يتم تثبيت صورة L4T مباشرةً.

بشكل عام، يمكن أن توفر إعادة بناء نواة Linux من المصدر مرونة وتحكمًا أكبر في النظام، مما يجعلها مسعى جديرًا بالاهتمام للمطورين المتقدمين.

الملخص

تطوير ونشر بيئة ROS على لوحة NVIDIA Jetson يمكن أن يحزم تطبيقك وتبعياته بسهولة في صورة حاوية.

عند إنشاء صورة Jetson، يوفر Docker بيئة موحّدة وقابلة لإعادة الإنتاج تضمن الاتساق عبر عمليات البناء المختلفة. وهذا مهم بشكل خاص عند العمل مع الأنظمة المدمجة مثل Jetson، حيث تكون التوافق مع الأجهزة والتحسين أمرًا بالغ الأهمية. كما يتيح لك Docker مشاركة صورة Jetson الخاصة بك مع الآخرين بسهولة، مما يقلل الوقت والجهد المطلوبين للإعداد والتهيئة. كما يسهّل بناء جانب التكامل المستمر.

باختصار، يوفر استخدام Docker في إنشاء صورة Jetson بيئة موحدة وقابلة لإعادة الإنتاج تضمن الاتساق عبر عمليات البناء وتبسط المشاركة والتعاون.

هل تبحث عن متخصصين في الروبوتات؟

تعرّف على كيفية دعمنا لمنتجك القادم – اطّلع علىخدمات الروبوتات، ولا تتردد في التواصل معنا في حال وجود أي أسئلة.

الأسئلة الشائعة

تتيح لك بيئة ROS المخصصة تخصيص التبعيات وتحسين الأداء وضمان التوافق مع أجهزة وحالات استخدام محددة. وهذا مهم بشكل خاص على أجهزة Jetson، حيث تختلف الموارد والبنية عن إعدادات سطح المكتب القياسية.

يكون الإعداد المخصص مفيدًا عندما لا تلبي توزيعات ROS الافتراضية متطلبات المشروع، على سبيل المثال عند العمل مع مكتبات محددة، أو عمليات تكامل الأجهزة، أو قيود الأداء على المنصات المدمجة مثل Jetson.

تشمل التحديات الشائعة إدارة التبعيات، والتوافق مع معمارية ARM، وضمان عمل جميع المكونات المطلوبة معاً بشكل صحيح. يساعد بناء بيئة مخصصة في معالجة هذه المشكلات لكنه يتطلب إعداداً دقيقاً.

arrow_circle_right جدول المحتويات

Mariusz Szczepanik

Mariusz Szczepanik

رئيس تطوير برمجيات الروبوتات، مهندس برمجيات أول C++