After much chasing, and testing, I have found this to be an efficient way of getting low latency high quality HD video out of an Aircraft. The latency is around 0.4 seconds at worst which would be OK for an FPV with an APM doing the hard work.
I will continue to search for methods to drop the latency down further, but this is a lot better than the 6-12 seconds I was getting on my first attempts.
Any comment (with useful instructions) would be appreciated.
For the wireless link, I am using two UBIQUITY ROCKET M 900 with Australian ACMA approved firmware, at the base station, I am using a tracking (yet to built the tracker...) 1.5 meter long X and Y polarised Yagi, and on the plane, two RF Design flexible strip antennas, placed at right angles to each other.
but how you do that bit is up to you.....
the critical bit is getting the Raspberry Pi's to chat to each other.
I have tried to make this as user friendly as possible... good luck.
Setting up IP video for Raspberry Pi 1080p video (FPV)
You will need 2 B model Raspberry Pi's and 1 Pi Camera. (Element 14, or RS components)
Preparing your Raspberry Pi for first boot…
Follow the instructions at http://www.raspberrypi.org/wp-content/uploads/2012/04/quick-start-guide-v2_1.pdf
Install the prepared SD card in the Pi and boot.
Setting up your Pi
Connect the Pi to your router with a network cable.
On Start-up it will resize the FAT partition and present you with a menu.
Set your language, and keyboard layout.
Select Raspbian… then click install.
After this has extracted (will take a while….) it will reboot into the configuration screen (again will take a while for this first boot.)
The important things to change here are
- Enable the camera
- In advance options…..
- Set the host name (camera, for the camera end, receiver, for the viewing end)
- Memory split, set the memory for the GPU to 256
- Enable SSH ( will come in handy later, as you may need to talk to the Pi in the air.....
Then finish and reboot.
First login
Username: pi
Password: raspberry
Setting up the required programs for video streaming
Install the dependencies by running the following in a terminal:
sudo apt-get install mplayer netcat
cd /opt/vc/src/hello_pi
make –C libs/ilclient
make –C libs/vgfont
cd /opt/vc/src/hello_pi/hello_video
make
cd ~
Now repeat this for the other Pi….
Streaming…
First set up the receiver….
Ensure the receiver is connected to your network and run
ifconfig
after you press enter, you can find your ip Address. Note this down.
Then run the following.
mkfifo buffer
nc -p 5001 -l > buffer | /opt/vc/src/hello_pi/hello_video/hello_video.bin buffer
the Pi will now wait for the feed.
On the Camera Pi
Ensure camera is connected to the Pi
Ensure Pi is connected to the network (you can confirm this with ifconfig)
(see instructions at http://www.raspberrypi.org/camera for how to connect the camera)
In the following command, replace the ip address with the one you just noted down.
raspivid -t 0 -fps 15 -o - | nc 192.168.1.85 5001
if all goes well you should be streaming 1080P video at 15fps with less than 0.5seconds of delay..
now add your wireless bridge between the two, and away you go J
This information has come from the Raspberry Pi foundation website, and other sources, tested and proven by myself..
Comments
@Paul, Does the qx 10 stream live HD?
Patrick, thanks a lot for the sharing, want to connect my qx 10
@Paul Meier,
Here's the shell script to run to port forward to control the GoPro. Ports 80, 8080, and 8554 need to be forwarded, with 8554 being the video preview.
wlan0 is the Nano M5 connection from the ground station, and wlan1 is the WiFi dongle connected to the GoPro's access point. The IP address of the GoPro is a static IP of 10.5.5.9, this is the default, but check your camera.
On my system, the UAV's IP address is 192.168.1.2, and the GCS is 192.168.1.1. Change accordingly to your setup.
To preview video, use ffplay with this command:
ffplay -i http://192.168.1.2/live/amba.m3u8
#!/bin/sh
sudo iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE
sudo iptables -A FORWARD -i wlan1 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o wlan1 -j ACCEPT
sudo iptables -t nat -A PREROUTING -p tcp -i wlan0 --dport 8080 -j DNAT --to-destination 10.5.5.9:8080
sudo iptables -t nat -A POSTROUTING -p tcp -d 10.5.5.9 --dport 8080 -j SNAT --to-source 192.168.1.2
sudo iptables -t nat -A PREROUTING -p tcp -i wlan0 --dport 80 -j DNAT --to-destination 10.5.5.9:80
sudo iptables -t nat -A POSTROUTING -p tcp -d 10.5.5.9 --dport 80 -j SNAT --to-source 192.168.1.2
sudo iptables -t nat -A PREROUTING -p udp -i wlan1 --dport 8554 -j DNAT --to-destination 192.168.1.1:8554
@Robert, correct, you would not need the dongle with the PI3.
Patrick, would you share to port forwarding thing?
I'm just thinking of ways to reduce weight in this potential setup
@Patrick
Correct me if i'm wrong, but wouldn't the built in wifi from the pi3 make the need for a usb wifi dongle redundant?
@Robert, I have done what you are suggesting with the GoPro and the Raspberry PI. I can control the GoPro and preview it remotely via the M5 by installing a USB wifi dongle in the PI, and then forward the necessary ports from the M5 link to the Wifi link to the GoPro. You can then use the GoPro App, or a 3rd party tool to access and control the camera.
Hi, i've been reading this thread with interest, and have a question:
Using the M5s as a wireless bridge to extend range is a great idea. Now i'm wondering, can we extend this to more than just transmitting video data i.e. say we had a camera with wireless capabilities on the drone end, and a mobile phone with a wireless app on the other. Normally the camera will make itself a wireless access point so the phone can connect, and using the smartphone app control the camera.
Is it possible to use the wireless bridge to effectively extend the wireless range of the smartphone and camera so that control can still occur? so the smartphone would have to connect to one end of the M5, M5s bridge, so then the other side of the bridge is effectively just an extension of the phone, hence can just connect directly to the wireless accesspoint created by the camera?