04. PX4와 Raspberry Pi 3 b plus 연동 - pineland/px4 GitHub Wiki
아래의 그림과 같이 픽스호크의 TELEM2 포트를 라즈베리파이의 Ground, TX 및 RX 핀에 연결한다. 이때 라즈베리파이는 픽스호크로부터 전원을 공급받는다.
16GB 이상의 SD 카드를 구입하여 아래의 운영체제 이미지 중에서 한가지를 선택하여 설치한다.
2.1.1 APSync 설치
- 윈도우 상에서 firmware.ardupilot.org를 방문하여 "apsync-rpi"로 시작하는 최신 이미지를 다운로드한다.
- 이미지 압축을 푼다.
- Win32DiskImager를 이용하여 이미지를 SD카드에 굽는다.
- 해당 SD카드를 라즈베리파이에 꼽는다.
업그레이드 필요
핫스팟 등 모든 모듈을 일일이 설정 필요
픽스호크와 지상국(예: 미션 플래너)을 연결하고 지상국에서 다음의 매개 변수를 설정한다. 미션 플래너의 경우, 상단 메뉴 중 CONFIG/TUNING > Full Parameter List에서 설정할 수 있다.
- SERIAL2_PROTOCOL = 1 ☜ TELEM2(직렬 포트)에서 MAVLink를 활성화한다.
- SERIAL2_BAUD = 921 ☜ 픽스호크가 라즈베리파이와 921600 baud로 통신할 수 있게 한다.
- LOG_BACKEND_TYPE = 3 ☜ APSync를 사용하여 dataflash 로그 파일을 라즈베리파이로 스트리밍하는 경우에 설정한다.
다음 방법 중 하나를 사용하여 라즈베리파이를 로컬 네트워크에 연결한다.
처음에 부팅하면, 나라가 설정이 안되어 WiFi를 사용하지 못한다라는 메시지가 나온다. WiFi에 연결하는 방법은 다음과 같이 2가지가 있다.
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev country=us update_config=1 network={ ssid="AndroidHotspot0507" psk="패스워드" key_mgmt=WPA-PSK } |
- raspi-config를 실행하여 5. Interfacing Options > SSH 를 선택 후 SSH server enable에 '예'를 선택한 후 재부팅한다.
- 또는, /boot 디렉토리에 touch 명령어를 사용하여 ssh 파일을 만들어준 후 재부팅한다.
- 제어판 > 네트워크 및 공유 센터(또는 인터넷) - 어댑터 옵션 변경 > 현재 인터넷을 사용하고 있는 랜카드 (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 접속 설정과 동일하다.
/sbin/ifconfig 명령을 사용하여 정한다.
4.3 PuTTY를 이용하여 라즈베리파이에 접속한다.
$ ping google.com 또는 ping 173.194.126.196
$ 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
$ 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에게 직렬장치에 엑세스할 수 있도록 접근권한 변경
# 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
Raspberry Pi 구성 유틸리티(raspi-config)를 사용하여 아래와 같이 설정한다.
sudo raspi-config
5. Interfacing Options > P6. Serial 에 접속 후, serial login shell은 disable하고 serial interface은 enable한다음 재부팅한다.
Raspberry Pi 3B +의 경우, 블루투스 모듈이 uart 직렬 포트를 점유하여 통신하고 있기 때문에 블루투스를 stop해야 정상적으로 uart를 사용할 수 있다. 이를 위해서 다음의 사항을 실행한다.
dtoverlay = pi3-disable-bt
enable_uart = 1
sudo systemctl disable hciuart
sudo reboot now
/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
라즈베리파이가 부팅될 때 콘솔의 외관을 바꾸거나 로딩할 커널을 지정하는 등의 리눅스 커널에 전달되는 옵션들을 담고 있는 파일.
- 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 모듈이 활성화되면 직렬 메시지가 나타날 수 있는 직렬 콘솔에 부팅 메시지가 나타나지 않는다.
그 외의 옵션들은 일반 리눅스와 동일하다.
권한으로 인한 오류 방지를 위해 다음 명령을 입력하면 모든 파일이 해당 계정(Pi)에 속하도록 한다.
sudo chown -R apsync:apsync $HOME
라즈베리파이와 픽스호크를 ON 시킨 다음, 라즈베리파이에서 아래와 같이 실행한다.
sudo -s mavproxy.py --master=/dev/ttyAMA0 --baudrate 921600 --aircraft MyCopter
# 결과가 Saved 828 parameters to MyCopter/logs/2019-11-22/flight1/mav.parm 이 출력된다.
–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 |
/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 -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 종료 |
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 |
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을 선택하면, 연결되는 것을 볼 수 있다.
chown apsync:apsync ~/.Xauthority (또는 rm ~/.Xauthority)
sudo apt-get install lxsession