PX4Firmware 를 빌드하는 과정을 정리하였다.

px4/modules/PX4Firmwares 안에는 펌웨어를 빌드하는 소스들이 포함되어있다.

이 소스코드를 빌드하기 위해서는 먼저 cmake 가 있어야 한다.

그래서 다음과 같이 cmake를 설치한다.


brew install cmake


그럼 다음과 같이 설치가 진행된다.


==> Auto-updated Homebrew!
Updated Homebrew from  to .
Updated 1 tap (homebrew/core).
No changes to formulae.

==> Downloading https://homebrew.bintray.com/bottles/cmake-3.6.2.yosemite.bottle
######################################################################## 100.0%
==> Pouring cmake-3.6.2.yosemite.bottle.tar.gz
==> Caveats
Emacs Lisp files have been installed to:
  /usr/local/share/emacs/site-lisp/cmake
==> Summary
🍺  /usr/local/Cellar/cmake/3.6.2: 2,028 files, 28M



다시 make를 하면

make px4fmu-v2_default


아래와 같이 에러를 내뿜는다.

cp: /Users/********************/px4/ardupilot/modules/PX4Firmware/NuttX/.: No such file or directory
make[3]: *** [src/modules/px4iofirmware/nuttx_copy_px4io-v2.stamp] Error 1
make[2]: *** [src/modules/px4iofirmware/CMakeFiles/__nuttx_copy_px4io-v2.dir/all] Error 2
make[2]: *** Waiting for unfinished jobs....
[  5%] Generating airframes.xml
Running from the source directory
Traceback (most recent call last):
  File "dsdl_compiler/libuavcan_dsdlc", line 59, in <module>
    from libuavcan_dsdl_compiler import run as dsdlc_run
  File "/Users/*****************/px4/ardupilot/modules/PX4Firmware/src/modules/uavcan/libuavcan/libuavcan/dsdl_compiler/libuavcan_dsdl_compiler/__init__.py", line 17, in <module>
    from uavcan import dsdl
ImportError: No module named uavcan
make[3]: *** [src/modules/uavcan/libuavcan/libuavcan/CMakeFiles/libuavcan_dsdlc] Error 1
make[2]: *** [src/modules/uavcan/libuavcan/libuavcan/CMakeFiles/libuavcan_dsdlc.dir/all] Error 2
[  5%] Generating uORB topic headers
Scanning source path /Users/*****************/px4/ardupilot/modules/PX4Firmware/ROMFS/px4fmu_common/init.d
Scanning source path /Users/*****************/px4/ardupilot/modules/PX4Firmware/src
Creating XML file airframes.xml
All done!
Creating XML file parameters.xml
All done!
[  5%] Built target xml_gen
[  5%] Built target msg_gen
make[1]: *** [all] Error 2
make: *** [px4fmu-v2_default] Error 2



다시 또 검색...

https://groups.google.com/forum/#!topic/px4users/xImLJlrK1aU 


여기에서 make 하기 전에 "git submodule update --init --recursive --force" 를 해서 성공했다는 내용을 보고 다시 해본다

아마도 git 서브모듈이 없어서 그런가 본데...

이번에는 다른 에러가 나온다.

cp: /Users/kyubot_macmini2/px4/ardupilot/modules/PX4Firmware/NuttX/.: No such file or directory
make[3]: *** [nuttx_copy_px4fmu-v2.stamp] Error 1
make[2]: *** [CMakeFiles/__nuttx_copy_px4fmu-v2.dir/all] Error 2
make[2]: *** Waiting for unfinished jobs....
[  5%] Built target msg_gen
cp: /Users/kyubot_macmini2/px4/ardupilot/modules/PX4Firmware/NuttX/.: No such file or directory
make[3]: *** [src/modules/px4iofirmware/nuttx_copy_px4io-v2.stamp] Error 1
make[2]: *** [src/modules/px4iofirmware/CMakeFiles/__nuttx_copy_px4io-v2.dir/all] Error 2
Running from the source directory
[  5%] Built target libuavcan_dsdlc
make[1]: *** [all] Error 2
make: *** [px4fmu-v2_default] Error 2



위 에러는 PX4Firmware 폴더 안에 NuttX 소스가 없어서 발생하는 에러였다.

NuttX를 가져오기 위해 https://github.com/PX4/NuttX 로 가서 git clone 할 주소를 찾는다.


sudo git clone https://github.com/PX4/NuttX.git ./NuttX


명령어를 입력하면 해당 Repository에서 NuttX 를 다운받기 시작한다.

Cloning into '/NuttX'...
remote: Counting objects: 232592, done.
remote: Total 232592 (delta 0), reused 0 (delta 0), pack-reused 232591
Receiving objects: 100% (232592/232592), 66.45 MiB | 1.98 MiB/s, done.
Resolving deltas: 100% (189334/189334), done.
Checking connectivity... done
Checking out files: 100% (7241/7241), done.



이렇게 나오면 성공

이제 다시 make px4fmu-v2_default 를 해봤더니....

/Users/XXXXXXXXXX/px4/ardupilot/modules/PX4Firmware/src/drivers/oreoled/oreoled.cpp: In constructor 'OREOLED::OREOLED(int, int, bool, bool)':
/Users/XXXXXXXXXX/px4/ardupilot/modules/PX4Firmware/src/drivers/oreoled/oreoled.cpp:144:12: error: 'OREOLED::_num_inboot' will be initialized after [-Werror=reorder]
  uint8_t   _num_inboot;     ///< number of LEDs in bootloader
            ^
compilation terminated due to -Wfatal-errors.
cc1plus: all warnings being treated as errors
make[3]: *** [src/drivers/oreoled/CMakeFiles/drivers__oreoled.dir/oreoled.cpp.obj] Error 1
make[2]: *** [src/drivers/oreoled/CMakeFiles/drivers__oreoled.dir/all] Error 2
make[2]: *** Waiting for unfinished jobs....
[ 52%] Building CXX object src/modules/mavlink/CMakeFiles/modules__mavlink.dir/mavlink_ftp.cpp.obj
[ 52%] Linking CXX static library libmodules__navigator.a
[ 52%] Built target modules__navigator
[ 53%] Building CXX object src/modules/mavlink/CMakeFiles/modules__mavlink.dir/mavlink_log_handler.cpp.obj
[ 54%] Linking CXX static library libdrivers__px4flow.a
[ 54%] Built target drivers__px4flow
[ 54%] Linking CXX static library libmodules__mavlink.a
[ 54%] Built target modules__mavlink
make[1]: *** [all] Error 2
make: *** [px4fmu-v2_default] Error 2



이렇게 나오면서 컴파일 에러가 뜬다...


2016/10/5

문제 해결 방법을 드디어 찾았다.

사실 너무 기초적인 부분인데 놓치고 있었던 부분이다. PX4Firmware는 Mission Planner의 버전과는 전혀 다른 펌웨어였던 것이다.

http://ardupilot.org/dev/docs/building-px4-with-make-on-mac.html 이 링크에 설명된 설치 빌드 방법은 말 그대로 Ardupilot 기반의 px4 펌웨어를 빌드하기 위한 방법이고

PX4Firmware는 전혀 별개로 QGroundControl 혹은 QGC에서 사용하는 펌웨어인것이다.

따라서 PX4Firmware는 

https://github.com/PX4/Firmware 에 있는 펌웨어를 빌드해야 된다.

여기에 있는 서브모듈에는 NuttX가 포함되어 있다. 따라서 이 Repository 를 Checkout 해야된다.

다음 명령어로 Git Clone을 수행한다.


<수정 16/10/18>

git clone https://github.com/PX4/Firmware.git ./PX4Firmware

위 방법은 가장 최신의 master 로부터 소스를 다운받는데 빌드하여 적용한 결과 Arming/Safety Switch에 약간의 Bug 가 있는듯 하여 안정성이 검증된 Stable 브렌치로 받는걸 추천한다.

방법은 다음과 같다.


git clone -b stable https://github.com/PX4/Firmware.git ./myPX4


</수정 16/10/18>


<추가 16/10/16 >

새로 생성된 폴더에 들어가서 다음을 수행한다.


git submodule init

git submodule update


</추가 16/10/16>



이제 간단히 아래 명령어를 실행하여 빌드한다.


make px4fmu-v2_default


다음과 같이 아무런 문제없이 빌드가 될것이다.

[100%] Building C object src/modules/systemlib/CMakeFiles/modules__systemlib.dir/up_cxxinitialize.c.obj
[100%] Building CXX object src/modules/uavcan/CMakeFiles/modules__uavcan.dir/sensors/gnss.cpp.obj
[100%] Building C object src/modules/systemlib/CMakeFiles/modules__systemlib.dir/hx_stream.c.obj
[100%] Building CXX object src/modules/uavcan/CMakeFiles/modules__uavcan.dir/sensors/mag.cpp.obj
[100%] Linking CXX static library libmodules__systemlib.a
[100%] Built target modules__systemlib
[100%] Building CXX object src/modules/uavcan/CMakeFiles/modules__uavcan.dir/sensors/baro.cpp.obj
[100%] Linking CXX static library libmodules__uavcan.a
[100%] Built target modules__uavcan
Scanning dependencies of target firmware_nuttx
[100%] Building C object src/firmware/nuttx/CMakeFiles/firmware_nuttx.dir/builtin_commands.c.obj
[100%] Linking CXX executable firmware_nuttx
[100%] Built target firmware_nuttx
Scanning dependencies of target build_firmware_px4fmu-v2
[100%] Generating nuttx-px4fmu-v2-default.px4
[100%] Built target build_firmware_px4fmu-v2


이제 보드에 업로드를 하기 위해 다음 명령을 수행한다.


make px4fmu-v2_default upload


100%가 뜨고 USB커넥터를 보드에 연결하면 펌웨어를 다운로드하기 시작한다.


Loaded firmware for 9,0, size: 1023964 bytes, waiting for the bootloader...
If the board does not respond within 1-2 seconds, unplug and re-plug the USB connector.
Found board 9,0 bootloader rev 4 on /dev/tty.usbmodem1
50583400 00ac2600 00100000 00ffffff ffffffff ffffffff ffffffff ffffffff 47ec3b0c e8d261a2 2ed0636a cd1743c3 2019a208 d29d10c8 9eb3b46d 81981251 6287223e 280bd062 87f672b1 2dab8b7b 5438385e a7b19042 cee6035d 0e696c21 57b39769 701d3d25 8720e20a 5aff58bf 7d0dc680 386c0451 3d1b6f15 aa8f64fb 68b3f90f 46547f92 3dd9a6ad bc11d751 7ebcf038 0600292f 0627b65b e0f21ec6 ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff type: PX4
idtype: =00
vid: 000026ac
pid: 00000010
coa: R+w7DOjSYaIu0GNqzRdDwyAZogjSnRDInrO0bYGYElFihyI+KAvQYof2crEtq4t7VDg4XqexkELO5gNdDmlsIVezl2lwHT0lhyDiClr/WL99DcaAOGwEUT0bbxWqj2T7aLP5D0ZUf5I92aatvBHXUX688DgGACkvBie2W+DyHsY=

sn: 002400233034510636353832

Erase  : [====================] 100.0%
Program: [====================] 100.0%
Verify : [====================] 100.0%
Rebooting.

[100%] Built target upload


이제 모든 설치가 완료되었다.

이번에 빌드한 펌웨어는 Mission Planner에서 사용할 수 없고 QGC에서 설정해야 한다.


이상....


+ Recent posts