Spresense를 ROS로 Unity에 연결

7027 단어 GNSSROSSpresenseUnity

오늘의 목적



Spresense의 L1S에서의 측위 결과를 Unity에서 취득한다.

Spresense에서 L1S 포지셔닝



Spresense 은 Sony가 내놓은 마이크로 컴퓨터 보드입니다. Arduino와 Sony 독점 임베디드 OS 환경에서 프로그래밍할 수 있습니다.
특징적인 기능으로 GPS가 마이크로 컴퓨터 보드에 내장되어 있으며, 준 천정 위성 미치비키의 L1S라는 보정 신호를 수신하여보다 정밀한 측위를 할 수 있습니다.
(그 밖에도 특징적인 기능은 있어, 전체적으로 매우 재미있는 마이컴 보드입니다만, 여기에서는 GNSS에 대해서만 씁니다.)
먼저 Arduino 개발 환경에서 L1S를 얻고 직렬로 전송하는 프로그램을 만듭니다.

그렇다고 해도, 잘 생긴 샘플 코드를 공식이 공개하고 있으므로, 이번은 를 조금만 변경해 사용합니다.

변경점은 다음 사용하는 위성의 설정 부분입니다.
/* Set this parameter depending on your current region. */
static enum ParamSat satType =  eSatGpsQz1cQz1S;

이제 GPS와 QZSS의 L1C/A와 L1S를 수신하여 측위하게 됩니다.

Raspberry Pi Zero WH로 직렬 수신하고 ROS로 메시지 보내기



위의 프로그램을 Arduino IDE에서 컴파일하고 쓰면 USB 시리얼에 포지셔닝 관련 메시지가 흐릅니다.
pi@raspberrypi:~/ros_catkin_ws $ cat /dev/ttyUSB0
SpGnss : begin in
SpGnss : begin out
SpGnss : start in
  mode = COLD_START
SpGnss : start out
Gnss setup OK
1980/01/06 00:00:01.000498, numSat: 0, No-Fix, No Position
1980/01/06 00:00:02.000519, numSat: 1, No-Fix, No Position
1980/01/06 00:00:03.000508, numSat: 1, No-Fix, No Position
1980/01/06 00:00:04.000498, numSat: 1, No-Fix, No Position

이런 느낌입니다.
실제로 사용할 때는 NMEA 당 형식으로 보내는 것이 좋을까라고 생각합니다만, 이번은 이대로 ROS 경유로 Unity에 가져가 보겠습니다.

이전에 만든 ROS의 Publisher 프로그램을 다음과 같이 변경했습니다.

ros_gnss_test_node.cpp
#include <stdio.h>
#include <stdlib.h>
#include "ros/ros.h"
#include "ros_gnss_test/MsgGNSS.h"

int main(int argc, char **argv)
{
  FILE *fp;
  char buffer[1024];

  fp = fopen("/dev/ttyUSB0", "r");
  if(fp == NULL) {
    printf("ERROR fopen");
    exit(0);
  }

  ros::init(argc, argv, "ros_gnss_test");
  ros::NodeHandle nh;

  ros::Publisher ros_gnss_test_pub = nh.advertise<ros_gnss_test::MsgGNSS>("ros_gnss_msg", 100);
  ros::Rate loop_rate(10);

  ros_gnss_test::MsgGNSS msg;

  while(ros::ok())
  {
    for(int i = 0; i< 1024; i++) buffer[i] = 0;
    if(fgets(buffer, 1024, fp) != NULL){
      msg.data = buffer;
      msg.stamp = ros::Time::now();

      ROS_INFO("send msg = %s", msg.data);

      ros_gnss_test_pub.publish(msg);

      loop_rate.sleep();
    }
  }

  fclose(fp);

  return 0;
}

Unity에서 ROS 메시지 수신



마지막 프로젝트를 그대로 사용하여 메시지를 받았습니다.



어색했지만 GPS 정보를 Unity에 가져올 수있었습니다.
제대로 만들면 여러가지 편리할 것 같습니다.

좋은 웹페이지 즐겨찾기