상세 컨텐츠

본문 제목

[드론 만들기] uORB 새 토픽 추가하기

만들기/드론

by kwangpil 2022. 12. 3. 14:43

본문

 

이전 글...

 

드론 만들기

  

   하드웨어

      기본부품

         비행 제어기(FC)

            Pixhawk 시리즈

               Pixhawk의 GPS

               Pixhawk의 텔레메트리(Telemetry)              

               Pixhawk의 변속기(ESC)

                  QGroundControl에서 변속기(ESC) 교정하기     

               Pixhawk 4의 Power Management Board              

               Pixhawk 4

                  QGroundControl에서 Pixhawk 4 펌웨어 설치

                  QGroundControl에서 Pixhawk 4 설정하기 1/2

                  QGroundControl에서 Pixhawk 4 설정하기 2/2       

         모터

         배터리

            리튬 폴리머 배터리 팩

         변속기 (ESC)

         프로펠러 (Propeller)

         파워 분배기(PDB, Power Distribution Board)

         조종기(Radio Control)          

 

   소프트웨어

      MissionPlanner와 QGroundControl

      QGroundControl 설치

         QGroundControl 사용방법 1/4

         QGroundControl 사용방법 2/4

         QGroundControl 사용방법 3/4      

         QGroundControl 사용방법 4/4 

         QGroundControl에서 Pixhawk 4 펌웨어 설치

         QGroundControl에서 Pixhawk 4 설정하기 1/2

         QGroundControl에서 Pixhawk 4 설정하기 2/2

         QGroundControl에서 Pixhawk 파라미터 변경하기  

      VMware Workstation Pro 설치하기

         VMware Workstation Player에 Virtaul Machine 만들기

         VMware Workstation Player에 Ubuntu 설치하기

            Ubuntu(우분투) 터미널 명령어

            Ubuntu(우분투) 주요 디렉터리

            Ubuntu(우분투) 기초용어 

   

   조립

      모터, 변속기에 커넥터 연결하기

      Power Management Board에 커넥터 연결하기

      변속기(ESC)와 Power Management Board 연결하기

      모터와 변속기(ESC) 연결하기

      QGroundControl에서 변속기(ESC) 교정하기        

      GPS, Telemetry Pixhawk 4에 연결하기

  

   통신

     uORB

         uORB 새 토픽 추가하기   

     MAVLink

         MAVLink 설치하기

         MAVLink 라이브러리 생성하기

 

   개발

      드론 비행 시뮬레이터(Simulator)         

         툴체인(toolchain) 설치하기

            jMAVSim 사용하기 1/2

            jMAVSim 사용하기 2/2

            Gazebo 사용하기 1/4

            Gazebo 사용하기 2/4

            Gazebo 사용하기 3/4

            Gazebo 사용하기 4/4     

      내장된 응용 프로그램 생성 및 실행하기

      PX 시스템의 구성        

 

   비행

      쿼드콥터(Quadcopter) 비행 원리      

 

   문제해결

      Pixhawk와 Emax ESC(변속기) 호환문제 해결방법

 

   기타

      비행금지구역

      비행 시 주의 사항   

      멀티콥터 종류

      커넥터(connector)

      용어

 


 


완전 초짜의 드론 만들기 도전! 도전! 도전~!입니다.
맨땅에 헤딩~

 

※ 아래 내용은 픽스호크 홈페이지 내용을 기반으로 작성한 것으로 틀린 내용을 다수 포함하고 있을 수도 있습니다.

※ 정확한/상세한 내용은 Pixhawk 홈페이지 참조하세요.

※ 사용하는 운영체제는 우분투(Ubuntu) 18.04 또는 20.04이며 특별한 언급이 없을 경우 우분투(Ubuntu) 18.04입니다.


 

 

앞서 uORB란 무엇인가에서 uORB에 대해서 간략하게 알아보았다.

 

여기서는 새로운 메시지/토픽을 추가한 후 모듈 사이에서 토픽을 발행하고 구독하는 과정을 알아본다.

 

사실 픽스호크 소스코드를 다운로드 받은 디렉토리 PX4-Autopilot> msg를 보면 알겠지만  PX4에서는 내장된 센서 뿐만 아니라 외부에 장착가능한 대부분의 센서에 대한 표준 메시지를 기본으로 제공하고 있다. 따라서 간단한 드론을 만드는데 메시지를 추가하고 새로운 토픽을 발행하는 일은 거의 없을 것 같다.

 

그럼에도 불구하고... 여기서는 드론의 비행 높이만을 단순 측정하는 임의의 거리측정 센서를 새로 장착했다고 가정한 후 드론의 현재 높이를 측정하는 단순한 메시지를 추가하고 토픽을 발행/구독하는 것에 대해서 알아본다.

 

이 과정은 아래와 같은 단계로 진행된다.

- 새로운 메시지 파일 생성
- CmakeList.txt 파일에 생성한 메시지 파일 추가하기
- 토픽 발행/구독하기

 

 

1. 새로운 메시지 파일 생성

 

새로운 메시지 파일은 픽스호크 소스코드를 다운로드한 디렉터리인 PX4-Autopilot> msg에 추가하거나 또는 트리 외부(out-of-tree) 메시지 정의 내에 추가할 수 있다.

 

여기서는 PX4-Autopilot> msg에 새로운 메시지 파일을 추가하며 트리 외부에 uORB 메시지를 추가하는 것은 여기를 참조한다.

 

새로운 메시지는 텍스트 편집기에서 작성한 후 확장자명을 'msg'로 한 후 msg 디렉터리에 저장하면 된다.

 

아래는 새로 추가할 메시지 파일로, 드론의 현재 높이와 정확도 변수만을 가지고 있다.


uint64 timestamp   # time since system start (microsenconds)

 

float32 height        # 현재 높이

float32 accuracy   # 정확도


이 메시지 파일의 이름을 nowHeight.msg라고 한 후 PX4-Autopilot> msg 디렉터리에 저장한다.

 

 

2. CMakeLists.txt에 추가

 

메시지 파일 작성이 완료되면 새로 생성된 메시지 파일을 PX4-Autopilot> msg 디렉토리에 있는 CMakeLists.txt 목록에 추가해야 한다.

 

추가하는 방법은 간단하다. 

CMakeLists.txt  파일에서 set(msg_files 아래에 나열되어 있는 메시지 파일에 nowHeight.msg을 추가한 후 저장하면 된다.

 

<CMakeLists.txt에 메시지 파일 추가하기>

 

이렇게 새로 추가된 메시지 파일은 빌드 시 C/C++ 구조체로 변환/생성된다.

 

새로 만든 메시지 파일이 잘 생성되었는지 NSH 셸에서 리스너(listener) 명령어로 확인 가능하다.

 

QGroundControl(QGC)에서 NSH 셸에 접속하고자 할 경우에는 먼저 변경사항을 픽스호크에 업로드해야 한다. 

 

Pixhawk를 노트북에 연결한 후 pixhawk 4를 사용하는 경우 아래와 같은 명령어로 업로드한다.

(다른 픽스호크를 사용하고 있을 경우 여기를 참조한다.)

 

make px4_fmu-v5_default upload

 

<펌웨어 업로드>

 

업로드가 완료되면 QGC을 실행한 후 NSH 셸(MAVLink Console)에 접속하고 아래와 같이 리스너 (listener) 명령어를 사용해서 작성한 메시지 상태를 확인할 수 있다.

 

listener nowHeight

 

(리스너 명령어는 토픽/메시지 값과 센서가 발행한 현재 값을 점검하기 위해서 QGroundControl MAVLink Console에서 사용할 수 있다.)

 

<MAVLink Console>

 

'never published'라고 응답이 출력되는데 이것은 입력한 토픽아 존재는 하지만 발행된 적은 없다는 의미이다.

 

 

3. 토픽 발행/구독하기

 

새로운 메시지 추가가 완료되었으면 이제는 토픽을 발행하고 구독하는 새로운 프로그램을 작성해야 한다.

 

여기서는 간단하게 한 개의 프로그램 내에서 nowHeight 토픽을 발행한 후 다시 nowHeight 토픽을 구독하고 출력하는 프로그램을 작성한다. 그 후 PX4-Autopilot> src> example 디렉터리에 작성한 프로그램을 저장한 후 SITL과 NSH 셸에서 프로그램을 실행해본다.


#include <px4_platform_common/px4_config.h>

#include <px4_platform_common/posix.h>

 

#include <unistd.h>

#include <stdio.h>

#include <poll.h>

#include <string.h>

 

#include <uORB/uORB.h>

#include <uORB/topics/nowHeight.h>  //새로 만든 메시지 파일에서 자동으로 변환/생성된 head 파일

 

extern "C" __EXPORT int how_high_vehicle_main(int argc, char *argv[]);

 

int how_high_vehicle_main(int argc, char *argv[]) {

       PX4_INFO("how high is the vehicle now?");

 

        /* nowHeight 토픽 발행 */
       // 데이터를 저장할 구조체 선언
       struct nowHeight_s nowHeigt;

       // 선언한 구조체의 메모리 초기화
       memset(&nowHeight, 0, sizeof(nowHight));

       // 토픽 광고
       orb_advert_t nowHeight_pub = orb_advertise(ORB_ID(nowHeight), &nowHeight));

       // 여기서는 가상으로 설정한 거리 센서 측정값을 임의로 할당        
       nowHeight.height = 231.132;
       nowHeight.accuracy = 92.123;

 

       // 토픽 발행
       orb_publish(ORB_ID(nowHeight), nowHeight_pub, &nowHeight); 

 

       /* nowHeight 토픽 구독 */

      //구독 토픽 핸들러

       int sensor_sub_fd = orb_subscribe(ORB_ID(nowHeight));    

 

       // 토픽 복사

       struct nowHeight_s copy_nowHeight; // 데이터를 복사할 구조체 선언

       orb_copy(ORB_ID(nowHeight), sensor_sub_fd, &copy_nowHeight); //데이터 복사

 

       // 데이터 출력

        PX4_INFO("The Vehicle is: \t%8.4f  [m] \n", copy_nowHeight.height);

        PX4_INFO("The accuracy is: \t%8.4f [%%]\n ", copy_nowHeight.accuracy);

       

       PX4_INFO(" exiting");

 

       return 0;

}               


PX4-Autopilot> src> example> 디렉터리에  'how_high_vehicle' 디렉터리를 생성한 후 새로 작성한 프로그램을 'how_high_vehichle.cpp'로 저장한다.

 

이어서 아래와 같이 CmakeLists.txt 파일을 작성하고 동일한 폴더에 저장한다.


px4_add_module(

       MODULE examples__how_high_vehicle

       MAIN how_high_vehicle

      STACK_MAIN 2000

       SRCS

              how_high_vehicle.cpp

       DEPENDS

)


그다음 아래와 같이 텍스트 파일을 작성한 후 확장자 없이 Kconfig이라는 파일명으로 PX4-Autopilot> src> example> how_high_vehicle 디렉터리에 저장한다.

 

menuconfig EXAMPLES_HOW_HIGH_VEHICLE
bool "how_high_vehicle"
default n
---help---
     Enable how_high_vehicle

 

이어서 Kconfig key 추가한다.

 

디렉터리  PX4-Autopilot> boards> px4> sitl과 Pixhawk 4를 사용할 경우 PX4-Autopilot> boards> px4> fmu-v5에서 default.px4board 열고 아래와 같이 새로 만든 응용 프로그램을 위한 Kconfig key 추가한다.

 

CONFIG_EXAMPLES_HOW_HIGH_VEHICLE=y

 

(설정 방법은 내장된 응용프로그램 생성 및 실행하기 참조)

 

작성한 프로그램의 결과는 SITL(jMAVSim) 또는 NSH 셸에서 확인 가능하다.

 

 

3.1 SITL

 

픽스호크 소스코드를 다운로드한 디렉터리인 PX4-Autopilot에서 jMAVSim을 실행한다.  

 

 

그 후 how_high_vehicle를 실행하면 아래와 같이 구독한 토픽의 데이터가 출력된다.

 

<jMAVSim에서 예제 실행하기>

 

3.2 NSH 셸

 

먼저 변경사항을 '2. CMakeLists.txt에 추가'에서처럼 픽스호크에 업로드 한다. 

 

그 후 QGC를 실행한 후 MAVLink Console에서  아래의 명령어를 입력하면 작성한 프로그램/모듈을 실행된다.

 

how_high_vehicle &

 

<NSH 셸에서 예제 실행하기>


지금까지 간단하게 새로운 토픽을 추가하고 발행/구독하는 과정을 알아보았다.

 

위에서는 프로그램을 매우 단순화해서 작성했는데 더 상세한 프로그램 코드는 픽스호크 홈페이지 Writing your first application을 참조하면 될 것 같다.

관련글 더보기

댓글 영역