## For instruction on writing tutorials
## http://www.ros.org/wiki/WritingTutorials
####################################
##FILL ME IN
####################################
## for a custom note with links:
## note =
## for the canned note of "This tutorial assumes that you have completed the previous tutorials:" just add the links 
## note.0= 
## descriptive title for the tutorial
## title = Raspberry Pi Setup
## multi-line description to be displayed in search 
## description = This tutorial shows how to setup a Raspberry Pi and connect it to !AscTec MAVs' !HighLevel Processors. 
## the next tutorial description (optional)
## next =
## links to next tutorial (optional)
## next.0.link=
## next.1.link=
## what level user is this tutorial for 
## level= BeginnerCategory
## keywords = raspberrypi, asctec, pelican, firefly, autopilot, onboard computer, quadcopter, hexacopter
####################################

<<IncludeCSTemplate(TutorialCSHeaderTemplate)>>

<<TableOfContents(4)>>

== Overview ==

This tutorial shows how to setup the Raspberry Pi on !AscTec MAVs, connecting it to the !HighLevel Processor. We assume that there is a !WiFi network where the Pi can connect to.  

== Setting up the Raspberry Pi ==

Get a current Raspbian Image from the [[http://www.raspberrypi.org/downloads|Raspberry Pi download page]] (a "raw" Raspbian image) and flash it to an SD card as described there.
Boot the Pi with the SD card, in the `raspi-config`, expand to the full file system, give the Pi a suitable Hostname (`Advanced Options -> Hostname`) and change the password for the `pi` user away from `raspberry`. Configure your !WiFi using the `WiFi Config` tool located on the desktop (`startx`), you need a !WiFi dongle for that.
Afterwards, you can conveniently putty/ssh to the Pi.

== Installing ROS ==

'''We do not intent to run a "full" ROS on the Raspberry Pi, but rather install some basic packages along with the dependencies for the asctec_mav_Framework!''' If you need more of the ROS packages, you may install them, though.

The easiest way to install ROS is to use the (experimental groovy) repository that is described [[http://www.ros.org/wiki/groovy/Installation/Raspbian|here]] and [[https://groups.google.com/forum/#!msg/ros-sig-embedded/fxgu5CB4nd4/dFutvb8z7cQJ|here]]. Add it to your repositories by using these commands:
{{{
sudo echo "deb http://64.91.227.57/repos/rospbian wheezy main" >> /etc/apt/sources.list
wget http://64.91.227.57/repos/rospbian.key -O - | sudo apt-key add - 
sudo apt-get update
}}} 
A list of available packages in this repository is to be found [[http://64.91.227.57/repos/rospbian/debbuild/groovy.html|here]].
Install a ROS backbone (roscore, roscpp, rospy, ...) by calling:
{{{
sudo apt-get install ros-groovy-ros-comm
}}}
As you may imagine, this takes a while.

Source the groovy path at every startup by invoking:
{{{
echo "source /opt/ros/groovy/setup.bash" >> ~/.bashrc 
~/.bashrc
}}}

The basic ROS commands should work now. You can check this by calling:
{{{
export | grep ROS
}}}

== Installing the asctec_mav_framework ==

=== Preparations ===
Now, add a workspace (here: in your home folder):
{{{
mkdir -p ~/workspace_groovy/src 
cd ~/workspace_groovy/src 
catkin_init_workspace 
echo "source ~/workspace_groovy/devel/setup.bash" >> ~/.bashrc 
echo "export ROS_PACKAGE_PATH=~/workspace_groovy:$ROS_PACKAGE_PATH" >> ~/.bashrc
~/.bashrc
}}}

And download additional dependencies of the framework:
{{{
sudo apt-get install ros-groovy-tf ros-groovy-dynamic_reconfigure libeigen3-dev ros-groovy-actionlib* ros-groovy-diagnostic-updater
cd ~/workspace_groovy 
rosdep init 
rosdep update
}}}

For us, the `rosdep update` threw two errors, probably due to the ROS repositories not knowing the "Raspbian Wheezy" OS. The further steps did work, anyways.

=== Download and install additional ROS packages ===
The ethzasl_sensor_fusion and asctec_mav_framework are not (yet) part of the repository. They need to be downloaded separately:
{{{
cd ~/workspace_groovy
git clone git://github.com/ethz-asl/ethzasl_sensor_fusion.git ethzasl_sensor_fusion
git clone git://github.com/ethz-asl/asctec_mav_framework.git asctec_mav_framework
}}}

Make ethzasl_sensor_fusion by calling:
{{{
rosmake ethzasl_sensor_fusion
}}}
This, too, takes some time. To give you an idea:
 * sensor_fusion_comm compiles around 3minutes 
 * ssf_core compiles around 15 minutes with 6 warnings) 
 * ssf_update compiles around 15 minutes

And then the make asctec_mav_framework:
{{{
rosmake asctec_mav_framework
}}}
Again, some compile times:
 * asctec_hl_comm (~5minutes) 
 * asctec_hl_gps (~12 minutes, 3 warnings) 
 * asctec_hl_interface (~40 minutes, 23 warnings)

Configure `fcu_parameters.yaml` like this:
{{{
serial_port:            /dev/ttyAMA0
...
state_estimation:       HighLevel_SSDK
position_control:       HighLevel
}}}
Adapt the other values as they seem fit or leave them as they are.

Specify the reference frame and tracked frame in the `ssdk_parameters.yaml` as they fit.

=== Configuring ROS to use a different host ===
In order for the ROS nodes running on the Pi to connect to a `roscore` on a different machine, you will have to export some variables:
{{{
export ROS_MASTER_URI=http://[Master IP]:11311
export ROS_HOSTNAME=[Pi's IP/`localhost`]
export ROS_IP=[Pi's IP/`localhost`]
}}}
You may also add this to your local `~/.bashrc` so that this configuration gets done on each startup.

By default, the master's variables should be configured like this:
{{{
export ROS_MASTER_URI=http://[Master IP/`localhost`]:11311
export ROS_HOSTNAME=[Master IP/`localhost`]
export ROS_IP=[Master IP/`localhost`]
}}}
If you encounter communication problems, check this first.

== Configure the GPIO serial interface ==
`/dev/ttyAMA0` was mentioned above - this is a serial interface available at the GPIO pins. By default, it is configured to serve as a terminal interface. In order to deactivate the login prompt, comment out the last line (`T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100`) from `/etc/inittab` by inserting a `#` before it.
{{{
sudo nano /etc/inittab
}}}
In order to suppress booting messages from this interface, change the content of `/boot/cmdline.txt` from 
{{{
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
}}}
to
{{{
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
}}}
That is, remove all occurences of `ttyAMA0`:
{{{
sudo nano /boot/cmdline.txt
}}}

You need to reboot your system for these changes to take effect:
{{{
sudo shutdown -r now
}}}

This information stems from [[http://www.hobbytronics.co.uk/raspberry-pi-serial-port|here]]. There is also a nice way to test whether the interface works behind that link.

== Wiring ==
=== Serial ===
The Pin layout of the GPIO Pins at the Pi can be seen [[http://lavalink.com/2012/03/raspberry-pi-serial-interfacing/|here]]. The layout on the other end of the wire needed can be seen in [[http://www.asctec.de/downloads/manuals/AscTec-Autopilot-Manual-v10.pdf|AscTec's AutoPilot Manual]] in section 4.1. Keep in mind that the Rx and Tx lines need to be swapped in between and pull the CTS line to ground. This will result in a non-twisted cable with a fork. As of our understanding, this is no standard cable and you will need to crimp/solder it yourself.

=== Power ===

The Pi needs 5V input power via a micro-USB plug. !Asctec's !PowerBoard offers 5V, so you will need to solder the VCC/GND cables of a micro-USB cable to the +/- ports at the !PowerBoard. The Layout of that board is to be found in the [[http://www.asctec.de/downloads/manuals/AscTec-Autopilot-Manual-v10.pdf|AutoPilot Manual]], section 1.1.2; USB specs can be found [[http://www.usb.org/developers/docs/usb_20_040413.zip|here]]. As the resulting cable will offer higher currents than USB usually does, we suggest shorting the D+/D- wires, which is usually done for micro-USB chargers.

== Performance ==

The serial port was tested for baud rates up to 921k6, which proved working.

We ran the `hl_node` with standard packet rates defined in `ssdk_parameters.yaml` on a Pi model B with a CPU load of 50-55%, which could be reduced to ~40% when using only 1Hz data. This information is based on information obained from `top` while vicon data was available at 100Hz.

== See also ==

This tutorial was written after the suggestion in [[http://asctec-users.986163.n3.nabble.com/asctec-hl-interface-on-Raspberry-Pi-ARM-td4024394.html#a4024404|this thread]].

## AUTOGENERATED DO NOT DELETE 
## TutorialCategory
## FILL IN THE STACK TUTORIAL CATEGORY HERE