본문 바로가기
관심

MQTT와 로봇 통신

by 너의고래 2024. 8. 28.

로봇통신에 자주 사용된다는 MQTT에 대해 알아보려 한다. 사실 MQTT에 대하여는 처음 접하게되었는데, 어떤점이 MQTT가 로봇 통신에 많이 사용되도록 할까?

 

MQTT란?

MQTT는 경량 메시지 전송 프로토콜로, 주로 저전력 장치, 불안정한 네트워크 환경에서 데이터를 효율적으로 주고받기 위해 설계되었다. 이는 사물 인터넷(IoT) 환경에서 자주 사용되며, 퍼블리셔/구독자 모델(Publish/Subscribe Model)을 기반으로 동작한다.

  • 퍼블리셔/구독자 모델 : MQTT는 퍼블리셔가 특정 토픽(topic)에 메시지를 게시하면, 해당 토픽을 구독한 구독자들이 그 메시지를 수신하는 구조
    ex) 로봇이 특정 센서 데이터를 "topic/sensor"라는 토픽에 게시하면, 이를 구독한 서버나 다른 장치가 그 데이터를 받음
  • 경량성 : MQTT는 매우 가볍고 데이터 오버헤드가 적기 때문에, 제한된 네트워크 대역폭이나 전력 자원이 부족한 로봇 시스템에서 매우 유용

 

로봇 제어에서의 MQTT 역할

로봇 관제 시스템에서 MQTT는 로봇과 관제 서버, 그리고 다른 로봇 간의 통신을 효율적으로 관리하는 데 큰 역할을 한다. 특히, 로봇이 다양한 센서 데이터를 실시간으로 관제 서버로 전송하거나, 서버가 로봇에게 명령을 전달하는 과정에서 빠르고 안정적인 통신이 필요하다.

  1. 실시간 센서 데이터 전송 : 로봇은 온도, 위치, 속도 등 다양한 센서를 통해 수집한 데이터를 관제 서버로 주기적으로 전송. MQTT는 이 데이터를 신속하게 전달할 수 있으며, 네트워크가 불안정한 환경에서도 데이터를 안전하게 보내는 것이 강점
  2. 원격 명령 전송 : 관제 서버에서 로봇에게 특정 명령을 내릴 때, 예를 들어 "전진", "후진", "회전"과 같은 명령을 빠르게 전달 가능. QoS(Quality of Service) 설정을 통해 메세지가 로봇에게 잘 도달했는지도 확인 가능
  3. 장비 간 통신 : 여러 로봇이 같은 네트워크 상에서 동작할 경우, MQTT를 통해 서로의 상태나 데이터를 공유 가능. 로봇끼리 협업이 필요한 상황에서 MQTT는 실시간 데이터 교환을 가능하게 함

 

3. 로봇 관제 시스템에서의 MQTT의 중요성

  1. 실시간 통신 : 로봇은 실시간으로 데이터를 주고받으며 빠르게 반응해야 한다. MQTT는 저지연 통신이 가능해 로봇이 즉각적으로 반응할 수 있도록 해준다.
  2. 경량성 : 로봇 시스템은 때때로 저전력 장치에서 동작한다. MQTT는 다른 프로토콜에 비해 훨씬 가벼워 전력 소비를 줄이고, 대역폭을 최소화할 수 있다.
  3. 네트워크 복원력 : 로봇이 실시간으로 데이터를 주고받는 중간에 네트워크 연결이 불안정해도, MQTT는 자동으로 재연결하고, 데이터를 안전하게 전달하려고 노력한다.

 

4. 간단한 MQTT를 이용한 로봇 제어

간단한 Typescript 코드를 통해 MQTT를 사용해 로봇 제어 명령을 보내는 예시

 

1) 로봇 제어 명령을 발행하는 퍼블리셔 코드

- 퍼블리셔는 로봇제어 명령을 MQTT 브로커에 publish하는 역할을 하고, 명령이 전송된 후 연결을 종료

import mqtt from 'mqtt';

// MQTT 브로커에 연결
const client = mqtt.connect('mqtt://test.mosquitto.org');

// 연결 성공 시 실행
client.on('connect', () => {
  console.log('Connected to MQTT broker');

  // 로봇 제어 명령 전송 (예: 전진 명령)
  client.publish('robot/control', 'move_forward', () => {
    console.log('Message sent: move_forward');
    client.end(); // 메시지 전송 후 연결 종료
  });
});

 

2) 로봇이 구독하는 구독자 코드

- 구독자는 로봇 제어 명령을 포함한 특정 토픽을 subscribe하여 메세지를 수신하고, 명령에 따라 로봇이 어떻게 반응할지를 정의

import mqtt from 'mqtt';

// MQTT 브로커에 연결
const client = mqtt.connect('mqtt://test.mosquitto.org');

// 메시지 수신 시 실행되는 콜백 함수
client.on('message', (topic: string, message: Buffer) => {
  const command = message.toString();
  console.log(`Received command: ${command}`);

  // 명령에 따른 로봇 제어 동작
  if (command === 'move_forward') {
    console.log('Moving forward...');
  } else if (command === 'move_backward') {
    console.log('Moving backward...');
  }
});

// 연결 성공 시 구독 설정
client.on('connect', () => {
  console.log('Connected to MQTT broker');

  // 특정 토픽 구독
  client.subscribe('robot/control', () => {
    console.log('Subscribed to robot/control');
  });
});

 

 

 

MQTT에 대해 처음으로 공부하며 정리해보았다. 우선, 퍼블리셔 구독자 모델의 작동 개념이 기존 공부했던 Redis pub/sub과 유사하여 이해하는데 도움이 많이 되었다. 실시간 통신, 경량성, 네트워크 복원력 등의 장점도 매력적으로 느껴졌다. 조금 더 알아보며 그동안 프로젝트에 이용했던 socket과 redis pub/sub과는 어떤 점들이 다를지 알아보는 재미가 있을것 같다!

댓글