analogcoding

react - ROSLIB 사용기 본문

Be well coding/Mine

react - ROSLIB 사용기

be well 2020. 4. 17. 10:05

로봇 엔지니어분과 비전처리 엔지니어 분과 소통할 일이 생겼습니다.

 

카메라가 읽은 값을 프론트엔드 단에 전달하고 프론트에서 입력 받은 값을 로봇으로 전달하는 실시간 통신을

구현해야 했습니다.

 

python 기반 백엔드와 socket.io 를 이용해 통신했지만 소켓 통신을 제대로 사용해본 적이 없어서 헤매이다가

ROS 통신을 하자는 말이 나와 example 코드를 참조하며 구현했습니다.

 

socket.io -> ROSLIB 으로 변경

통신 부분 소스 코드

// GET

useEffect(() => {
    const ROSConnect = () => {
      try {
        ros.on("connection", () => {
          console.log("Connected to websocket server.");

          ROSGet(ros);

        });
        ros.on("error", () => {
          const error = "Error connecting to websocket server.";
          console.log(error);
          alert({ error });
        });
        ros.on("close", () => {
          console.log("Connection to websocket server closed.");
        });
      } catch {
        const error = "Failed to construct websocket. The URL is invalid.";
        console.log(error);
        alert({ error });
      }
    };
    ROSConnect();
  }, []);

 

ROSGet 함수에 인자로 ros 를 인자로 받고 name 과 messageType 을 지정해주면 listener.subscribe 에 message 로 서버로 부터 받는 메세지가 들어옵니다.

  const ROSGet = (ros: any) => {
    let listener = new ROSLIB.Topic({
      ros: ros,
      name: "/frontend_socket",
      messageType: "std_msgs/String",
    });

    listener.subscribe((message) => {
      // to do message
    });
  };

RosPost 함수도 ros 에 publish 인자로 data 라는 key 에 값으로 원하는 메세지를 전송합니다.

// POST
const ROSPost = () => {
    let published = new ROSLIB.Topic({
      ros: ros,
      name: "/frontend_socket",
      messageType: "std_msgs/String",
    });

    const postData = new ROSLIB.Message({ data: 'do something' });
    published.publish(postData);
  };

ROS란?

ROS 는 로봇용 공개소스 메타 운영체제입니다. ROS는 일반 운영체제에서 제공하는 하드웨어 추상화, 저수준 기기 제어, 빈번히 사용되는 기능들이 구현되어 있으며, 프로세스간 메시지 전달, 패키지 관리 기능 등을 제공합니다. 또한, ROS는 여러 컴퓨터 시스템 작동하는 코드를 얻어오고, 빌드하고, 작성하고, 실행하기 위한 도구 및 라이브러리를 제공합니다. ROS는 Player, YARP, Orocos, CARMEN, Orca, MOOS, Microsoft Robotics Studio와 같은 '로봇 프레임웍'들과 어떤 측면에서는 비슷합니다.

ROS runtime "graph"(역자주: graph가 ROS 문맥내에서 특별한 의미로 쓰이기 때문에 번역하지 않고 graph라는 용어를 그대로 옮깁니다)란 ROS 통신 기반구조를 사용해 느슨하게 결합된 프로세스간 동등 수준의 망입니다. ROS는 몇가지 다른 형태의 통신 방법을 제공합니다. 이것에는 service를 통한 동기화된 RPC 형태, topic을 통한 비동기적 데이터 스트리밍 형태, Parameter Server에 저장된 데이터 형태가 포함됩니다. 이 개념들에 대해서는 개념 설명 페이지에 더 상세히 설명되어 있습니다.

ROS는 실시간 프레임웍이 아니지만, 실시간 코드와 통합하여 구현할 수 있습니다. Willow Garage PR2 로봇은 pr2_etherCAT라는 시스템을 사용하는데, 이를 통해 실시간 프로세스와 ROS 메시지를 주고 받습니다. 또한, ROS는 Orocos 실시간 도구모음과 ROS간 통합 모듈을 포함하고 있습니다.

 

위키 출저

 

 

 

Comments