This post will describe how to control a GoPro camera (usually mounted on a gimbal), via a Raspberry Pi with a USB WiFi dongle.
The ideal Raspberry PI for this setup is the A+ model because it is small and has the needed single USB port for the WiFi dongle.
Parts List:
1 GoPro Camera
1 Raspberry PI (suggest A+ model, but any PI will work)
1 USB WiFi dongle (PI approved) Suggest this one: AirLink N150
2 Jumper wires or 1 servo header that can plug into 1/10th center pins (with center power pin removed)
1 APM or PixHawk board
Of course, all of this is mounted on your Quad or Plane or whatever. On my hexicopter, the PI is powered by one of the ESCs UBEC outputs, where I cut a micro-usb cable and soldered the 'red' and 'black' wires to the power output of the UBEC of the same color. The other two USB wires are not used.
Setup:
Step 1: Enable the GoPro WiFi access:
The first step in making all of this work is to configure your GoPro camera to accept a WiFi connection. The camera is actually a WiFI access point.
The details on how to setup your camera is here. If you can connect the GoPro App to the camera, then you can connect the Raspberry PI. You should verify that the GoPro WiFi is working with the GoPro App BEFORE proceeding to connect the PI. You can pick a unique access point name for your camera and use the same name in the Raspberry PI configuration when connecting to the camera with the PI.
Step 2: Connect the Raspberry PI to the GoPro Camera's WiFi:
Once you have established the camera's access point and assigned a name and password, you can make an entry in your PI's network configuration file to configure the connection.
From a shell prompt type the command: sudo nano /etc/network/interfaces
Add some lines to the file as follows:
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "mygopro"
wpa-psk "mypassword"
Reboot the PI and it should automatically connect to the GoPro.
Step 3: Communicate with the GoPro
The GoPro camera should have the standard IP address of 10.5.5.9. If you can ping this address, you have successfully connected to the GoPro so now you are ready to send it commands.
The list of commands are here. The camera is controlled by sending HTTP request commands in the form of a header string.
for example, this string turns the camera on:
http://10.5.5.9/bacpac/PW?t="wifipassword"&p=%01"
Where 'wifipassword' is the password you set when configuring your GoPro.
You can experiment with sending commands with a web browser to get familiar with how to control the camera with web requests or write your own scripts.
Step 4: Use a Python Script to Control the Camera
Attached is a sample python script that will listen for a signal on GPIO pin 5 on the PI header, and send a request to the camera to take a picture when triggered.
To use the code, start the python script after connecting to the camera with the following command:
sudo python3 gopro.py -photoMode
This will start the script with the camera set to take pictures. If you want it to trigger a video instead, leave out the '-photoMode' option.
Step 5: Configuring APM or Pixhawk to send the signal to the PI
To use this setup with the APM or PixHawk control board, you need to connect the output of the 'relay' pin (A9 on the APM), to the GPIO pin 5 on the PI (or the pin of your choice). The script is configured to use GPIO pin 5.
Here is a picture of the APM board from This link
The PI pinout is here
Connect Pin 29 (GPIO 5) on the PI to A9 (S) on the APM, and GND pin 30 on the PI, to GND A9 (-) on the APM. Check the link on the APM website for the PixHawk settings for the relay output pins as I have not used PixHawk (yet).
Step 6: Configure your Radio to Trigger the Camera
In Mission Planner, you will need to select which channel on your radio to assign to trigger the camera input.
This link describes how to configure the shutter.
Select "Relay" for the Shutter output (not RC10 as shown in the above image example).
Then set the Ch7 option to "Camera" as shown here:
This can also be set on the "Advanced Parameters" setup area.
Step 7: Start Script on Boot:
To make all of this automatic, you can configure your PI to always connect to the GoPro and start the script when the PI boots. Or you can do it manually when you want to fly.
To make it automatic, you can modify your '/etc/rc.local' file to make the script start on boot. Here is a sample rc.local file:
Once you have completed all of these steps, you should be able to trigger the camera to take a picture with a switch assigned to Ch7 on your radio.
If you want to GeoTag your images, you can follow the instructions at the ArduCopter GeoTagging page.
Happy flying.
Comments
@Patrick, I was trying to do basically the same idea that you did here but to control a servo. Do you know the dronekit python tool? If so, Do you think is possible to control a servo from a dronekit python aplication (that sends commands via radio to the Pixhawk)? Using the raspberry PI....Thanks!
@Patrick yeah....I actually just want to take a picture and send to raspberry/computer to process(opencv)....but actually, I want to build my own application to control the drone and use some information from the image. In your case, You connect the Pixhawk, raspberry and Gopro. I tried to think in the best way to do it, but I'm not sure....
@Thiago, You can't download directly to your PC on the ground unless you have a WiFi connection to the UAV. I actually do this with my setup, but the instructions provided here are for controlling the GoPro from your radio using a Raspberry PI.
If you want to control and download in flight, you need to have a separate wifi connection to your UAV. Then you can setup a port-forwarding scenario and control the camera directly from the ground station. You can also preview the camera.
@Patrick, so I can take a picture, download it to my computer just using a gopro, raspberry, USB WiFi dongle. So, I cant send that picture to my computer. Right? Can I control the camera from the computer or I need a raspberry Pi working together with the computer? Thanks!!!
@Patrick, can I control(take a picture and save the image to PC) the gopro just using a PC connected with the gopro wifi? just sending http requests....
@Thiago, You can download the images real-time from the camera to the PI, or if you have a WiFi connection to your drone using HTTP requests, or you can download to your GCS for processing. To download to your GCS, you need to setup the PI to do port forwarding of port 80 to the camera. You can then download any image on the camera, or control it from the ground. Check the gopro.py file in this blog to see how to control the camera with HTTP requests using Python.
Hey @Patrick, is it possible to control the gopro from raspberry pi 2, like in a certain moment I need to take a picture and send that picture to my computer or maybe the raspberry to do some process with openCV. I know that I can control the gopro from raspbery pi, but I dont know if I can send it to my computer. Thanks! :)
@L Michael, real-time tagging is certainly possible, and there are utilities for linux that do this from the command line, however I have not invested the time to develop this yet. If you want to give it a try and contribute to the cause, please do.
The http interface to the GoPro allows the downloading of captured images, so I would suggest the method to accomplish what you want is to download each image to the Raspberry PI, then run a command line tool that geotags the image. Here is a perl module that should work with the PI called exiftool.
I am not an expert with MavProxy, but there is probably a way to capture the gps coordinates based on the last camera trigger event, and then run a script which would get the image from the GoPro, and then run exiftool to tag the image.
You mention the post-processing method for geotagging, but if you have the Pi hooked up to the Tele ports, could you use MavProxy to pull the coordinates to geotag the photos as it takes them?
@Richard, I have not tried this with APM plane yet, but you should be able to time the pictures in the mission setup by adding a DO_SET_RELAY or DO_CAM_TRIG_DIST depending on whether you want to trigger pictures based on time or distance. 'Relay' should be RC9 I think. DO_SET_RELAY has a delay parameter you can set to your desired 2 seconds.