以NAVIO+ & Raspberry Pi 製作 4G 連線無人機

玩過用 4G 連線 Parrot DISCO,感受過無距離限制的FPV飛行後,很想以 Ardupilot 做同樣事:

  1. 以 4G 網絡連結無人機與 ground station,實時控制無人機,獲取飛行數據
  2. 以 4G 網絡傳送無人機鏡頭的實時影像
  3. 1小時或以上的飛行時間,30公里或以上的飛行距離

便在倉底找回2015年買下的NAVIO+,就以它來製作一部 4G 連線的定翼無人機,以下就是我的製作筆記。

使用的硬件


軟件設定

開始時,跟著 NAVIO 的官方文件做,由於我使用 ZeroTier 建 VPN,連結無人機與 ground station,NAVIO沒有這方面的資料,這部分設定要自己處理,以下就是軟件設定部分的筆記。

Raspberry Pi 基本設定

  1. 下載預先配置的 Raspbian image (md5),這是NAVIO廠方提供的專用 image
  2. 把下載的 image file 燒錄到 SC card,在 Mac 的 Terminal 執行以下程序(使用其他 OS 可參考官方文件):
// show the SD card disk path {diskx}
diskutil list
// unmount SD card, remember replace the {diskx}
diskutil unmountDisk /dev/{diskx}
// format SD card
sudo newfs_msdos -F 16 /dev/{diskx}
// restore image file to SD card, remember replace the {/path/of/image/xxx.dmg} to the image file path
sudo dd if={/path/of/image/xxx.dmg} of=/dev/{diskx}
  1. 把 SD card 裝入 Raspberry Pi 後啓動。在 Raspberry Pi 以預設戶口登入(注意,此 image 沒有圖型介面,所有操作都是通過 command line 進行)
user: pi
password: raspberry
  1. 跟據官方文件進行安全設定。以下是我的快速設定:
passwd // change password
sudo adduser {new-username} sudo // create new user
sudo su // make sure the new-user has been setup correctly
sudo deluser -remove-home pi // remove default user and the home directoty
sudo nano /etc/sudoers.d/010_pi-nopasswd //
{new-username} ALL=(ALL) PASSWD: ALL // Make sudo require a password
  1. 把 WiFi USB 安裝到 Raspberry Pi後,修改 WiFi config 文件
sudo pico /etc/wpa_supplicant/wpa_supplicant.conf

把這段加入(修改 your-wifi-network-name 和 your-wifi-network password)

network={
ssid="your-wifi-network-name"
psk="your-wifi-network password"
key_mgmt=WPA-PSK
}
  1. 啓動WiFi
sudo ifdown wlan0 && sudo ifup wlan0
  1. 重新啓動 Raspberry Pi
  2. 以後可以用 PC/Mac 登入 Raspberry Pi
ssh [email protected]

e.g. [email protected]


NAOVIO+, Arduplane 和 QGroundControl 設定

1. 更新 arduplane firmware:

由於廠方提供的 image 的 arduplane firmware 不是最新的,因為 image 不會像 firmware 般更新得也,最好就自己做一次更新。

sudo curl http://firmware.ardupilot.org/Plane/stable/navio/arduplane -o /opt/ardupilot/navio/arduplane-3.8/bin/arduplane
sudo chmod 775 arduplane

2. 安裝與設定 ZeroTier:

ZeroTier 提供了一個十分方便的途徑,使我們可以輕易地把無人機和 ground station 透過 4G 網絡連結,而不需自己架建 VPN。 整個設定過程包括:

  • 登記及設定 ZeroTier 戶口
  • 在 Raspberry Pi 安裝 zerotier-one 客戶端
  • 在 ground station 安裝 ZeroTier One 客戶端
  • 在 ZeroTier 戶口批准 Raspberry Pi 及 ground station 的連線

2.1 登記 ZeroTier 戶口:

到此網站登記一個新戶口(免費的):http://zerotier.com/

2.1a 登入後按 Networks,Create 建立一個新網絡:

2.1b 進入新網絡的設定頁面:

  • 記下 Network ID
  • 在 Name 下,改一個你喜歡的名稱,例如:NAVIO Network
  • 在 Managed Routes > Easy 下,選一個你覺得易記的 IP range
  • 其他的設定請如下圖一樣

2.2 安裝 zerotier-one 到 Raspberry Pi:

通過此軟件,Raspberry Pi 無人機就能自動找上我們剛剛建立的網絡,與 ground station 連線。

執行以下 shell command 下載ZeroTier:

curl -s 'https://pgp.mit.edu/pks/lookup?op=get&search=0x1657198823E52A61' | gpg --import && \ if z=$(curl -s 'https://install.zerotier.com/' | gpg); then echo "$z" | sudo bash; fi

確保 ZeroTier 在 root 上執行

sudo systemctl enable zerotier-one

執行 sudo zerotier-cli status 如果看到 200 info [ID] [version] ONLINE 就成功了。

2.2a 連結 ZeroTier 網絡,執行:

sudo zerotier-cli join [Network ID]

Network ID 是剛剛建立 ZeroTier 網絡時那個 Network ID)

2.3 安裝 Zerotier One 到 ground station:

2.3a 到此下載 ZeroTier One,安裝到 ground station。

2.3b 安裝後,選取 Join Network,輸入 Network ID:

2.4 認證 Raspberry Pi 與 ground station 的連線請求

返回 ZeroTier 的網絡設定頁面,你會看到兩行新的記錄在頁面下方。

  • 在 “Auth?” 選取
  • 在 “Name” 加入名稱方便識認
  • 記下 Raspberry Pi 與 ground station 的 “Managed IPs”

2.5 更新 arduplane 的連線設定

arduplane 需要知道如何及那裡傳送資料到 ground station,我們要修改 Raspberry Pi 裡這個文件 /etc/default/arduplane。

udo nano /etc/default/arduplane
// Add the IP of ground station:
TELEM1="-A udp:192.168.192.100:14550"

上面的意思是,把資料以 UDP 傳送到 192.168.192.100 port 14550。192.168.192.100 是 ZeroTier 裡 ground station 的 IP,14450 是 ground station 預設的 port 位。

由於 arduplane 要等待 zerotier-one 完成後提供 IP,才能把數據回傳給 ground station。我修改了 /etc/systemd/system/arduplane.service 檔以達到此要求:

sudo nano /etc/systemd/system/arduplane.service

把這兩行加入 [Unit] 之下:

After=network-online.target
Wants=network-online.target

修改後重新載入設定檔:

sudo systemctl daemon-reload

開啓 arduplane:

sudo systemctl start arduplane

讓 arduplane 在開機時能自動開啓:

sudo systemctl enable arduplane

NAVIO官方文件提供更詳細的設定解析

再深入一點,需要看 systemd 的文件。很多開機的問題(為什麼 xxx 沒有啓動?)都與它有關。

2.6 連結 Raspberry Pi 與 ground station

文章整理中…

Bellergy RC

PX4FLOW project 重新啟動,光流定位測試

( English version here )

由於APM Copter3.3的更新開始支援Optical Flow LOITER,我的PX4FLOW project也重開了。

昨天安裝了APM Copter3.3rc8 到Pixhawk中,由於還是試版,隻QAV500只可以作近距離試飛了。為的只是想早點嘗試PX4FLOW LOITER。一步步跟著文件做安裝,過程如下。

安裝:

開始時發現QAV500機底的前方有個位置很合適,又有縲絲位,就安裝在那裡了。

PX4FLOW under QAV500
PX4FLOW under QAV500

由於I2C的線長度不足問題,把PX4Flow轉了180度。x向機尾,y向左,FLOW_ORIENT_YAW必須設定為18000。(如果跟足文件,沒有旋轉,就不用改動FLOW_ORIENT_YAW)

px4flow-top

 

對焦:

你不能確定PX4Flow出廠的焦距是你所需要的,所以必須調較焦距。我用的是APM Planner,但那裡沒有可以顯示PX4Flow影像的功能,只有用QGroundControl,我連接QGroundControl的過程在這裡。看到PX4Flow影像輸出,就可以把鏡頭對著3米外的物件,鬆開鏡頭的螺絲,進行對焦。

 

效準(Flow Sensor Calibration):

跟著文件進行效準,一切順利,下載log file,得到以下的圖表:

FX4Flow Flow Sensor Calibration log flow_y
OF.floxY vs OF.bodyY

FX4Flow Flow Sensor Calibration log flow_x
OF.floxX vs OF.bodyX

以上是戶外的測試,接著我做了戶內的測試,效果差很多。

FX4Flow Flow Sensor Calibration (Indoor)
FX4Flow Flow Sensor Calibration (Indoor)

但做到Range Sensor Check就找不到數據。文件說可以在EKF5.meaRng看到距離的變化,但在log中這一項是0,不知是那裡出錯。文件說他們裝了外置的range finder,可能就是這個原因。我沒有打算為此而買一個Pulsed Light unit,就不理它去了試飛。

試飛後看到,比較GPS定位,Optical Flow定位還是不太穩定,有兩三米的移位,而且是在戶外做測試。如果要做到室內定位,一定要有厘米級的精確度,未知是否可以通過較準(calibration),或程式改良可以達到,又或者要加上雷射range finder才有改善。最起碼要買張地毯,家裡的地磚太平滑,不是很適合用來做光流定位。

Connect PX4FLOW to QGroundControl

I followed the document PX4FLOW Developer Guide, connected QGroundControl to PIXFLOW finally.

PX4FLOW data output in QGroundControl
PX4FLOW data output in QGroundControl

The picture above is output ofOPTICAL_FLOW.flow_x and flow_y

I have some questions when start:
Q: Connect Pixhawk or PX4FLOW to PC when upload firmware?
A: Connect FX4FLOW to PC using USB

Q:VIDEO_ONLY set to 1, butVideo Downlink in QGroundcontrol can’t show PXFLOW’s video output (use it to adjust focus only)
A:upgrade QGroundcontrol to version 2.2 or up

Qgroundcontrol can't show PX4FLOW video
Qgroundcontrol can’t show PX4FLOW video

Q:What is focus range PX4FLOW?
A:I did a test, the result is 0.4 – 0.8m.
( remark: document recommend to set the focus to 3m, I can do it by adjusting the lens of PX4FLOW )

 

Q:How to wiring to Pixhawk?
A:Connect PX4FLOW UART3 to Pixhawk’s serial port. Default id TELEM2


 

Finally I did a outdoor flight test, check here.