04. PX4와 Raspberry Pi 3 b plus 연동 - pineland/px4 GitHub Wiki

1. 픽스호크와 라즈베리파이(Raspberry Pi 3 b+) 간의 물리적인 선 연결

아래의 그림과 같이 픽스호크의 TELEM2 포트를 라즈베리파이의 Ground, TX 및 RX 핀에 연결한다. 이때 라즈베리파이는 픽스호크로부터 전원을 공급받는다.

2. 라즈베리파이 설정

2.1 운영체제 설치

16GB 이상의 SD 카드를 구입하여 아래의 운영체제 이미지 중에서 한가지를 선택하여 설치한다.

2.1.1 APSync 설치

  • 윈도우 상에서 firmware.ardupilot.org를 방문하여 "apsync-rpi"로 시작하는 최신 이미지를 다운로드한다.
  • 이미지 압축을 푼다.
  • Win32DiskImager를 이용하여 이미지를 SD카드에 굽는다.
  • 해당 SD카드를 라즈베리파이에 꼽는다.

(옵션)2.1.2 Rasbian 버전(RPi 3 b 지원용) 설치

업그레이드 필요

(옵션)2.1.3 Rasbian Stretch 버전(RPi 3 b+ 지원용) 설치

핫스팟 등 모든 모듈을 일일이 설정 필요

3. 픽스호크 설정

픽스호크와 지상국(예: 미션 플래너)을 연결하고 지상국에서 다음의 매개 변수를 설정한다. 미션 플래너의 경우, 상단 메뉴 중 CONFIG/TUNING > Full Parameter List에서 설정할 수 있다.

  • SERIAL2_PROTOCOL = 1 ☜ TELEM2(직렬 포트)에서 MAVLink를 활성화한다.
  • SERIAL2_BAUD = 921 ☜ 픽스호크가 라즈베리파이와 921600 baud로 통신할 수 있게 한다.
  • LOG_BACKEND_TYPE = 3 ☜ APSync를 사용하여 dataflash 로그 파일을 라즈베리파이로 스트리밍하는 경우에 설정한다.

4. SSH / Telnet 클라이언트를 사용하여 라즈베리파이에 접속

4.1 라즈베리파이를 로컬 네트워크에 연결

다음 방법 중 하나를 사용하여 라즈베리파이를 로컬 네트워크에 연결한다.

4.1.1 WiFi 접속 설정 (라즈베리파이 보드에서 USB 동글을 사용)

4.1.1.1 Apsync를 사용하는 경우

처음에 부팅하면, 나라가 설정이 안되어 WiFi를 사용하지 못한다라는 메시지가 나온다. WiFi에 연결하는 방법은 다음과 같이 2가지가 있다.

4.1.1.1.1 (추천) /etc/wpa_supplicant/wpa_supplicant.conf 파일에 다음을 넣어준다음, 재부팅한다.

    

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
country=us
update_config=1
network={
     ssid="AndroidHotspot0507"
     psk="패스워드"
     key_mgmt=WPA-PSK
}
4.1.1.1.2 raspi-config > network > WiFi에서 Country, SSID, Password를 입력한다.
4.1.1.1.3 ssh 접속 설정
  • raspi-config를 실행하여 5. Interfacing Options > SSH 를 선택 후 SSH server enable에 '예'를 선택한 후 재부팅한다.
  • 또는, /boot 디렉토리에 touch 명령어를 사용하여 ssh 파일을 만들어준 후 재부팅한다.

(옵션)4.1.2 라즈베리파이와 데스크탑(또는 노트북) 컴퓨터 사이에 Ethernet LAN 케이블을 연결

  • 제어판 > 네트워크 및 공유 센터(또는 인터넷) - 어댑터 옵션 변경 > 현재 인터넷을 사용하고 있는 랜카드 (WiFi 또는 Remote NDIS based Internet Sharing Device(테더링 시)) > 오른쪽 클릭 후 [속성] > 공유 탭 선택
    -> "다른 컴퓨터가 이 컴퓨터의 인터넷 연결을 통해 연결하도록 허용"을 선택
    -> 홈 네트워킹 연결 : "로컬 영역 연결" -> "이더넷"으로 변경
  • 제어판 > 네트워크 및 공유 센터(또는 인터넷) - 어댑터 옵션 변경 > 이더넷 (☞Rpi에 연결된 어뎁터) > 오른쪽 클릭 후 설정 > IPv4 클릭 후 [속성] 선택
    -> 이더넷 랜카드의 IP가 192.168.137.1 로 고정되어있는 것 확인
  • 라즈베리파이의 IP를 192.168.137.2 ~ 254 대역 안에서 임의적으로 하나 지정
    -> Raspbian을 설치한 마이크로 SD카드에서 "cmdline.txt" 파일을 편집하여 행 마지막에 아래와 같이 IP 추가
    예) ip=192.168.137.10
  • ssh 접속 설정은 위 4.1.1 WiFi 접속설정의 ssh 접속 설정과 동일하다.

(옵션)4.1.3 라즈베리파이 보드에서 Ethernet 라우터로 Ethernet LAN 케이블을 연결

4.2 라즈베리파이의 IP 주소를 정한다.

4.2.1 라즈베리파이의 터미널 화면에 액세스 할 수 있는 경우 (예: 화면, 키보드, 마우스가 연결된 경우)

/sbin/ifconfig 명령을 사용하여 정한다.

(옵션)4.2.2 Ethernet 라우터에 웹 인터페이스가 있는 경우 연결된 모든 장치의 IP 주소가 표시 될 수 있다.

4.3 PuTTY를 이용하여 라즈베리파이에 접속한다.

5. 라즈베리파이에 필요한 패키지 설치

5.1 인터넷 연결상태 점검

$ ping google.com 또는 ping 173.194.126.196

5.2 MavProxy 패키지 설치

5.2.1 python 2.x

$ sudo apt-get update
$ sudo apt-get install screen python-wxgtk2.8 python-matplotlib python-opencv python-pip python-numpy python-dev libxml2-dev libxslt-dev python-lxml
$ sudo pip install future
$ sudo pip install pymavlink
$ sudo pip install mavproxy 

5.2.2 python 3.x

$ sudo apt-get update  
$ sudo apt-get install python3-dev python3-opencv python3-wxgtk3.0 python3-pip python3-matplotlib python3-pygame python3-lxml python3-yaml libxml2-dev
# 위에 문제 발생 , 다음의 명령어 실행한다.
# $ sudo apt-get install python-dev python-opencv python-wxgtk3.0 python-pip python-matplotlib python-pygame python-lxml python-yaml
$ sudo pip install Pypi
$ sudo pip install MAVProxy
$ echo "export PATH=$PATH:$HOME/.local/bin" >> ~/.bashrc  
$ sudo adduser apsync dialout      # apsync에게 직렬장치에 엑세스할 수 있도록 접근권한 변경

[참고] Miniconda를 설치하여 이용할 경우

# Setup Ubuntu
sudo apt update --yes
sudo apt upgrade --yes

# Get Miniconda and make it the main Python interpreter
wget http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-armv7l.sh
chmod +x Miniconda3-latest-Linux-armv7l.sh
./Miniconda3-latest-Linux-armv7l.sh   # $HOME/miniconda3/bin 패스를 설정하면, 여기의 python3.4를 python 명령어가 link함.
rm ~/Miniconda3-latest-Linux-armv7l.sh

# Test
conda create -n python34 python=3.4
source activate python34

6. 직렬 포트 환경설정

6.1 직렬 포트의 OS 제어 비활성화

Raspberry Pi 구성 유틸리티(raspi-config)를 사용하여 아래와 같이 설정한다.
sudo raspi-config
5. Interfacing Options > P6. Serial 에 접속 후, serial login shell은 disable하고 serial interface은 enable한다음 재부팅한다.

6.2 블루투스 모듈 비활성화

Raspberry Pi 3B +의 경우, 블루투스 모듈이 uart 직렬 포트를 점유하여 통신하고 있기 때문에 블루투스를 stop해야 정상적으로 uart를 사용할 수 있다. 이를 위해서 다음의 사항을 실행한다.

6.2.1 /boot/config.txt 끝에 아래 사항을 추가

dtoverlay = pi3-disable-bt
enable_uart = 1

6.2.2 블루투스가 Serial을 사용하지 않도록 disable

sudo systemctl disable hciuart  
sudo reboot now  

6.2.3 콘솔정보를 serial로 나가는 것을 중지

/boot/cmdline.txt의 내용을 다음과 같이 편집한다.

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2(자동설정 그대로 놓는 것을 권장) rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
<참고> /boot/cmdline.txt (부트로더 설정파일)의 옵션들

라즈베리파이가 부팅될 때 콘솔의 외관을 바꾸거나 로딩할 커널을 지정하는 등의 리눅스 커널에 전달되는 옵션들을 담고 있는 파일.

  • dwg_otg.lpm_enable : 라즈베리파이의 USB 컨트롤러로 하여금 OTG(On-The-Go) 모드를 비활성화하도록한다. 운영체제의 적절한 지원 없이 해당 기능이 활성화 되면 문제가 발생할 수 있어 대부분의 라즈베리파이 리눅스 배포판들은 이 모드를 비활성화(0) 한다.
  • console : tty1 장치를 생성한다. 이 장치는 라즈베리파이가 부팅될 때 보게 되는 텍스트가 가득찬 화면이다.
  • root : 리눅스 커널에게 시스템이 동작하는데 필요한 모든 파일들과 디렉터리들을 담고 있는 루트 파일 시스템이 어디에 있는지를 알려준다. 기본 데비안 배포판의 경우 루트파일 시스템은 SD 카드의 두 번째 파티션(디바이스 mmcblk0p2)으로 지정되어 있다.
  • rootfstype : 커널에게 루트 파일 시스템의 파티션 포맷을 알려준다. 데비안 배포판이 사용하는 EXT4 파일 시스템을 지정해주었다.
  • elevator : 사용할 I / O 스케줄러를 지정한다. elevator = deadline은 커널이 모든 I/O 작업에 최종 기한을 적용하여 Request starvation을 방지한다는 의미이다.
  • quiet : 부팅하는 동안 각종 메시지들이 화면에 보여지지 안는다.
  • splash : 부팅시 Plymouth(리눅스용 boot splash) 모듈을 통해 splash 화면을 사용하도록 한다.
  • plymouth.ignore-serial-consoles: 일반적으로 Plymouth 모듈이 활성화되면 직렬 메시지가 나타날 수 있는 직렬 콘솔에 부팅 메시지가 나타나지 않는다.

그 외의 옵션들은 일반 리눅스와 동일하다.

7. 연결 테스트

7.1 관련 파일 owner confirm

권한으로 인한 오류 방지를 위해 다음 명령을 입력하면 모든 파일이 해당 계정(Pi)에 속하도록 한다.

sudo chown -R apsync:apsync $HOME

7.2 MAVProxy start & ARMING_CHECK

라즈베리파이와 픽스호크를 ON 시킨 다음, 라즈베리파이에서 아래와 같이 실행한다.

sudo -s mavproxy.py --master=/dev/ttyAMA0 --baudrate 921600 --aircraft MyCopter
# 결과가 Saved 828 parameters to MyCopter/logs/2019-11-22/flight1/mav.parm 이 출력된다.
<참고> mavproxy.py 옵션들
–master : UAV가 통신하는 포트 (직렬, USB 또는 네트워크 주소 / 포트)를 지정   
–baudrate : --master 및 --out 포트의 전송 속도를 지정. 직렬 링크에만 해당.  
–aircraft : 비행중인 항공기의 이름. 사용하는 경우 로그 파일은 /Logs/AircraftName/Date/flightNumber/flight.tlog에 저장.  
–out : MAVLink 패킷을 원격 장치 (직렬, USB 또는 네트워크 주소 / 포트)로 전달. 일반적으로 포트 14550을 사용.  
–sitl : SITL 시뮬레이터의 APM 소프트웨어으로부터의 입력. 일반적으로 --sitl = 127.0.0.1 : 5501  
–streamrate : MAVLink 스트림 속도.  
–speech : 텍스트 음성 변환. Linux에서 음성 소프트웨어가 필요.  
–cmd : MAVProxy에서 실행할 초기 명령. ; 로 구분.  
–map : 시작시 이동 맵을 모듈을 로드한다.  

MAVProxy가 시작되면, 다음 명령을 입력하여 ARMING_CHECK 매개 변수 값을 표시 할 수 있어야 한다.
    

param show ARMING_CHECK
param set ARMING_CHECK 0
arm throttle

8. MAVProxy가 항상 실행되도록 환경구성

/etc/rc.local 파일의 마지막 'exit 0' 앞에 아래의 내용을 추가해준다.
    

(
date
echo $PATH
PATH=$PATH:/bin:/sbin:/usr/bin:/usr/local/bin
export PATH
cd $HOME
screen -d -m -s /bin/bash mavproxy.py --master=/dev/ttyAMA0 --baudrate 921600 --aircraft MyCopter
) > /tmp/rc.log 2>&1

라즈베리파이가 Pixhawk에 연결될 때마다 아래의 3개의 파일이 /home/pi/MyCopter/logs/YYYY-MM-DD 디렉토리에 생성된다.

  • mav.parm : Pixhawk의 모든 매개 변수 값이 있는 텍스트 파일
  • flight.tlog : 미션 플래너 (및 기타 여러 도구)를 사용하여 열 수 있는 드론의 고도, 자세 등을 포함한 텔레메트리 로그
  • flight.tlog.raw : 위에서 언급 한 .tlog의 모든 데이터와 Pixhawk으로부터 받은 다른 직렬 데이터 (시작 문자열 또는 디버그 출력과 같은 비 MAVLink 형식 메시지를 포함 할 수 있음)

자동으로 시작된 MAVProxy 응용 프로그램에 연결하려면 라즈베리파이에 로그인하여 다음을 실행한다.

sudo screen -x  
<참고> screen 옵션 사용법

  

screen -list : screen 목록 보기
screen -S [세션이름] : screen 세션 이름을 지정하여 실행
screen -r [세션이름] : 실행중인(Detached) screen 세션으로 재 진입
screen -x [세션이름] : 실행중인(Attached) screen 세션으로 재 진입
Ctrl+a, c : 새창 띄우기
Ctrl+a, d : screen 세션을 유지한 상태에서 나오기
Ctrl+a, n : 다음 창으로 이동
Ctrl+a, p: 이전 창으로 이동
Ctrl+a, #(숫자) : # 번째 창으로 이동
$ exit : screen 종료

9. 라즈베리파이에 DroneKit 설치(여기 지침은 권장하지 않음)

Linux에 DroneKit 설치에 대한 최신 지침은 DroneKit-Python 설명서에 있다. 여기의 정보는 요약 정보이며 최신 정보가 아닐 수 있다.

DroneKit-Python dependancies (대부분 MAVProxy를 설치할 때 이미 설치됨)을 설치하고 MAVProxy가 시작될 때 DroneKit을 로드하도록 다음을 실행한다.     

sudo apt-get install python-pip python-dev python-numpy python-opencv python-serial python-pyparsing python-wxgtk2.8 libxml2-dev libxslt-dev
sudo pip install droneapi
echo "module load droneapi.module.api" >> ~/.mavinit.scr

그런 다음 DroneKit 스크립트가있는 위치에서 MAVProxy 터미널을 열고 예제를 시작한다.     

STABILIZE> module load droneapi.module.api
STABILIZE> api start vehicle_state.py

10. 미션 플래너와의 연결

Pixhawk은 Telemetry 1 및 Telemetry 2 포트 (이 페이지 상단의 이미지 참조)를 통해 수신 된 MAVLink 명령에 응답하여 RPi와 일반 지상국 (예 : Mission planner 등)을 모두 연결할 수 있다. 또한 미션 플래너를 SITL에서 수행되는 방식과 유사하게 라즈베리파이에서 실행되는 MAVProxy 애플리케이션에 연결할 수 있다.
아래와 같이 MAVProxy를 실행한다.

sudo -s mavproxy.py --master=/dev/ttyAMA0 --out <미션 플래너를 실행하는 PC의 주소>:14550 --baudrate 921600 --aircraft MyCopter  

그런 다음, PC의 미션플래너에서 UDP를 선택, CONNECT 버튼을 누르고 Listern port에 14550을 선택하면, 연결되는 것을 볼 수 있다.

<참고> 라즈베리파이 GUI 데스크톱 화면 부팅 방법 (Login loop 방지)

chown apsync:apsync ~/.Xauthority (또는 rm ~/.Xauthority)
sudo apt-get install lxsession 
⚠️ **GitHub.com Fallback** ⚠️