ROS2 ma'lumotlar quvurini qurish va debagging qilish

ROS2 ma'lumotlar quvurini qurish va debagging qilish

Sanoat IoT yoki robototexnika muhitida tizimni loyihalash jarayonida, mutlaqo ko'plab sensor ma'lumotlari va nazorat buyruqlarini real vaqt rejimida ishlov berish vazifasiga duch kelamiz. ROS2 (Robot Otish Tizimi 2) bunday muammolarni hal qilishda qo'llanilishi mumkin.

ROS2 nomida 'operatsion tizim (OS)' so'zi bo'lishiga qaramay, Windows yoki Linux kabi haqiqiy operatsion tizim emas, robot ilovalarini oson rivojlantirishga yordam beradigan dasturiy ta'minot ramkasi. Nomida 'robot' so'zi mavjud bo'lsa-da, uning mohiyati Kuchli asinxron tarqatilgan aloqa arxitekturasiBu, samarali sensor ma'lumotlarini yig'ishda foydalaniladigan ROS2 ning ma'lumotlar oqimini tushunganingizdan so'ng, buni qanday loyihalash va xatolarni tuzatishni o'rganamiz.

1. ROS2 aloqasi: DDS va asinxron Pub/Sub shabloni

ROS2 arxitekturasini tushunish uchun eng avvalo bilishingiz kerak bo'lgan kontseptsiyalardan biri bu DDS (Data Distribution Service) hisoblanadi. DDS tarqatilgan tizim muhitida qurilmalar orasida ma'lumotlarni tez va ishonchli almashish uchun yaratilganXalqaro sanoat standart aloqa middlewaredir.

Agar dastlabki an'anaviy veb-xizmatlar asosan mijozning so'roviga serverning javob berishiga oid sinkron REST APIga tayanadigan bo'lsa, real vaqt sensor ma'lumotlarini boshqaradigan muhitda bunday usul og'ir torayishga olib keladi. Boshqa tomondan DDS har safar ma'lumotlarni serverdan so'rash zaruriyati bo'lmagan holda, ma'lumotlar yaratilib borayotganida zarur joylarga darhol uzatishni ta'minlaydi.nashr-obunaModelni ishlatamiz. Buning orqali ko'plab sensorlar bir vaqtning o'zida to'kib chiqaradigan keng ko'lamli ma'lumotlarni kechikmasdan real vaqtda qayta ishlashimiz mumkin. DDS standartining xususiyatlari quyidagilardir.

1.1 Pub/Sub tuzilmasi

  • Ishlab chiqaruvchi va iste'molchini ajratish:Ma'lumotlarni yaratadigan Publisher (masalan: harorat sensori tuguni) va ma'lumotlarni iste'mol qiladigan Subscriber (masalan: ma'lumotlar bazasini saqlovchi tugun, UI rendering tuguni) bir-birining mavjudligini bilishi shart emas.

  • Moslashuvchan kengayish:Faqatgina ma'lum bir mavzuga o'rta vositachi sifatida ma'lumot yuborish va qabul qilish tufayli, tizim ishga tushganda yangi monitoring tugunlarini qo'shish yoki mavjud tugunlarni olib tashlash juda erkin. Bu Command va Query mas'uliyatlarini ajratish orqali tizimning moslashuvchanligini maksimal darajada oshirishning zamonaviy dastur arxitekturasi foydalanishlariga o'xshashdir.

1.2 QoS (Xizmat sifatiga)

DDSning yana bir kuchli jihati QoSdadir. Tarmoq holati beqaror bo'lganida ma'lumotlarni shartli ravishda yuborish yoki eng so'nggi ma'lumotlarni tezda yuborish kabi narsalarni tugun darajasida aniq sozlash mumkin bo'lib, sanoat sohasidagi talablariga moslashish imkonini beradi.

2. Sensor ma'lumotlarini modellashtirish: Biznes domenini optimallashtirish

ROS2dan foydalanish uchun eng avvalo zarur bo'lgan narsa - ma'lumotlar spetsifikatsiyasini aniqlashdir. ROS2da .msg fayllari orqali ma'lumot interfeysini belgilaydi. Ma'lumotlar tuzilmasini boshqarishda qulaylik yaratish uchun xabarlar uchun maxsus paket va bajarish mantiq paketlarini ajratish asosiydir.

2.1 Xabar paketini yaratish

Terminalda ish joyiga (masalan: ~/ros2_ws/src) o'ting va xabar uchun maxsus paket yarating. Xabar paketi odatda C++ qurilish tizimi ament_cmake orqali bog'lanishni boshqarish uchun ishlatiladi.

ros2 pkg create --build-type ament_cmake iiot_interfaces

2.2 Maxsus Xabarni aniqlash

Publisher va Subscriber o'zaro mavjud emas, lekin xabar almashganda foydalaniladigan ma'lumotlar shaklini bilishi kerak. Haqiqiy biznes sohasida foydalanish uchun deb hisoblangan metadata (qurilma ID, holat kodi va boshqalar)ni o'z ichiga olgan holda ma'lumot turini aniqlaydi.

# interfaces/msg/SensorData.msg
string device_id # 장비 고유 식별자 (예: "CNC_Machine_01")
int32 status_code # 장비 상태 코드 (0: 정상, 1: 경고, 2: 에러)
float64 temperature # 섭씨 온도
float64 vibration_hz # 진동 주파수 (Hz)

2.3 Paketni sozlash faylini yangilash

ROS2 qurilish tizimi (colcon) yangi yaratilgan .msg faylini tanishi va Python/C++ kodiga aylantirish uchun sozlash fayllarini o'zgartirish kerak.

[ package.xml ni o'zgartirish ]

<buildtool_depend>
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
</buildtool_depend>

[ CMakeLists.txt ni o'zgartirish ]

find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/SensorData.msg"
)

Keyin colcon build --packages-select iiot_interfaces buyruği yordamida avval xabar paketini quramiz.

3. Pub/Sub tugunini amalga oshirish

Ma'lumotlar spetsifikatsiyasi tayyorlandi, endi haqiqatan ham ma'lumotlarni ishlab chiqarish va iste'mol qilish uchun Python tuguni yozishimiz kerak.

3.1 Mantiqiy paketni yaratish

Yuqorida belgilangan ma'lumotlar turidan foydalangan holda haqiqiy ma'lumotlarni qayta ishlash lojiği bilan yangi Python paketi yaratish buyruğini bajaradi.

ros2 pkg create --build-type ament_python ${패키지이름} --dependencies rclpy interfaces

3.2 Publisher tuguni: Sensor ma'lumotlarini chiqarish

- sensor_pub.py Fayl yaratish: haqiqiy apparat sensoridan yoki IIoT uskunasidan (masalan, CNC mashinasi) kelayotgan ma'lumotlarni o'qiydi va ROS2 tarmoqdagi ma'lum bir mavzu bo'yicha doimo chiqarishni davom ettiradi.ni bajargan skriptdir.

import rclpy
from rclpy.node import Node
import random
from iiot_interfaces.msg import SensorData

class SensorPublisher(Node):
    def __init__(self):
        super().__init__('sensor_publisher_node')
        self.publisher_ = self.create_publisher(SensorData, '/machine_data', 10)
        timer_period = 0.5
        self.timer = self.create_timer(timer_period, self.publish_sensor_data)
        self.get_logger().info('센서 퍼블리셔 노드가 시작되었습니다.')

    def publish_sensor_data(self):
        msg = SensorData()
        msg.device_id = "CNC_Machine_01"
        msg.status_code = 0 if random.random() > 0.1 else 1
        msg.temperature = round(random.uniform(40.0, 85.0), 2)
        msg.vibration_hz = round(random.uniform(10.0, 100.0), 2)

        self.publisher_.publish(msg)

def main(args=None):
    rclpy.init(args=args)
    node = SensorPublisher()

    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        node.get_logger().info('사용자에 의해 종료되었습니다.')
    finally:
        node.destroy_node()
        rclpy.shutdown()

if __name__ == '__main__':
    main()

3.3 Subscriber tuguni: Ma'lumotlarni qabul qilish va qayta ishlash

- data_sub.py faylini yaratish: Publikator tomonidan tarmoqdagi mavzu(/machine_data) bo'yicha sabr-toqat bilan yuborilgan sensor ma'lumotlarini qabul qilish, tekshirish va foydalanish vazifasini bajaradi.

import rclpy
from rclpy.node import Node
from iiot_interfaces.msg import SensorData

class DataProcessor(Node):
    def __init__(self):
        super().__init__('data_processor_node')

        self.subscription = self.create_subscription(
            SensorData,
            '/machine_data',
            self.process_data,
            10
        )
        self.get_logger().info('데이터 프로세서 노드가 구독을 시작했습니다.')

    def process_data(self, msg):
        if msg.status_code != 0 or msg.temperature > 80.0:
            self.get_logger().warn(f'🚨 경고! [{msg.device_id}] 온도: {msg.temperature}°C (초과)')
        else:
            self.get_logger().info(f'정상: [{msg.device_id}] 온도: {msg.temperature}°C')

def main(args=None):
    rclpy.init(args=args)
    node = DataProcessor()
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        pass
    finally:
        node.destroy_node()
        rclpy.shutdown()

if __name__ == '__main__':
    main()

3.4 setup.py Kirish nuqtasi ro'yxatdan o'tkazish

Ikkita Python skriptlari bajarilishi uchun setup.py-ga ro'yxatdan o'tkazamiz va ish joyini qaytadan colcon build qilamiz.

entry_points={
    'console_scripts': [
        'sensor_pub = data_pipeline.sensor_pub:main',
        'data_sub = data_pipeline.data_sub:main',
    ],
},

4. Muammoni hal qilish va xatolarni bartaraf etish usullari

Dastur muhitida kod mukammal ko'rinishi mumkin, ammo tarmoq izolyatsiya muammosi, xabar turining mos kelmasligi kabi sabablarga ko'ra ma'lumotlar oqmasligi mumkin. ROS2 buni kuzatish uchun kuchli CLI vositalarini taklif etadi.

Bir nechta terminal ochib, har bir tugunni ishga tushirib (ros2 run data_pipeline sensor_pub, ros2 run data_pipeline data_sub) quyidagi vositalardan foydalanib tizimni tashxis qilamiz.

4.1 Tugunlar ro'yxati va ma'lumotlarni tekshirish

- ros2 node list: Hozirgi tarmoqda qaysi tugunlar faol ekanligini tasdiqlovchi buyruq.

$ ros2 node list
/sensor_publisher_node
/data_processor_node

- ros2 node info: Muayyan tugun qanday mavzularni Publish/Subscribe qilayotganini batafsil ko'rishni ta'minlaydigan buyruq. Tugun kutilmagan xatti-harakatlar qilganda, avval tekshirilishi kerak.

$ ros2 node info /sensor_publisher_node
/sensor_publisher_node
  Publishers:
    /machine_data: iiot_interfaces/msg/SensorData
  Subscribers:
    ...

4.2 Mavzu holatini tekshirish

- ros2 topic list: Ma'lumot yuborish uchun mavzu yaratildi yoki yo'qligini tekshirish uchun buyruq. (-t opsiyasi: xabar turini tekshirish mumkin)

$ ros2 topic list -t
/machine_data [iiot_interfaces/msg/SensorData]
/parameter_events [rcl_interfaces/msg/ParameterEvent]

- ros2 topic info: Ushbu topicda nechta publisher va subscriber borligini tekshiradigan buyruq. Agar ma'lumot kelmasa, bu yerda hisob 0 sifatida ko'rsatilayotganini tekshirish kerak.

$ ros2 topic info /machine_data
Type: iiot_interfaces/msg/SensorData
Publisher count: 1
Subscription count: 1

4.3 Ma'lumotlarni qabul qilishni tekshirish

- ros2 topic echo: Subscriber kodini yozishdan oldin, hozirgi topicda haqiqiy ma'lumotlar qanday oqayotganini raw ma'lumot holatini ko'rish uchun buyruq.

$ ros2 topic echo /machine_data
device_id: CNC_Machine_01
status_code: 0
temperature: 65.42
vibration_hz: 42.11
---

4.4 Diagramma orqali tushunish

- rqt_graph: Terminal oynasida rqt_graphni kiritganda GUI oynasi paydo bo'ladi. Hozirda ishlayotgan barcha tugunlar va topiclar o'rtasidagi bog'lanish holatini diagramma ko'rinishida chizadi. Tizim arxitekturasi maqsadga muvofiq qurilganligini bir qarashda tushunish uchun eng intuitiv vosita.

5. Xulosa: Taqsimlangan arxitekturaga o'tish

Hozirgacha ROS2dan foydalanish uchun maxsus xabarlar ishlab chiqdik va Python bilan Pub/Sub tugunlarini amalga oshirib, debuggingning to'liq siklini ko'rib chiqdik.

ROS2 ning asosiy tamoyili – DDS asosidagi asinxron muloqot orqali tizimning har bir modulini mustaqil qilib ajratish. Shu tarzda, sensor ma'lumotlarni yig'uvchi publisher va ularni qayta ishlovchi subscriber bir-birining holatiga bog'lanmasdan barqaror xabar almashishi mumkin.

Bunday ROS2 arxitekturasi faqat "sensor ma'lumotlarni qanday yuborish?" degan savolga javob bermasdan, kelajakda tizim kengayganda modulalarni qanday xavfsiz ajratish va kengaytirish kerakligini ko'rsatadi.

Rookie

Site footer