<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://gicl.cs.drexel.edu/wiki-data/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://gicl.cs.drexel.edu/wiki-data/api.php?action=feedcontributions&amp;user=Jryan&amp;feedformat=atom</id>
		<title>GICLWiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://gicl.cs.drexel.edu/wiki-data/api.php?action=feedcontributions&amp;user=Jryan&amp;feedformat=atom"/>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/Special:Contributions/Jryan"/>
		<updated>2013-06-18T07:39:29Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.18.2</generator>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/Robot_Lab_(Spring_2012)</id>
		<title>Robot Lab (Spring 2012)</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/Robot_Lab_(Spring_2012)"/>
				<updated>2012-06-19T03:47:27Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* Student Pages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Classes]]&lt;br /&gt;
== Class Resources ==&lt;br /&gt;
=== Mailing List ===&lt;br /&gt;
* [http://mail.cs.drexel.edu/pipermail/robotlab/ Archive]&lt;br /&gt;
* [https://mail.cs.drexel.edu/mailman/listinfo/robotlab Management]&lt;br /&gt;
=== Git Repository ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone ssh://&amp;lt;USER&amp;gt;@tux.cs.drexel.edu/~taw38/repos/robotlab.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Where &amp;lt;tt&amp;gt;&amp;lt;USER&amp;gt;&amp;lt;/tt&amp;gt; is your Tux user name.&lt;br /&gt;
&lt;br /&gt;
== Project Notes ==&lt;br /&gt;
* [[ROS (Robot Operating System)]] - general stuff, interfacing with the robot&lt;br /&gt;
* [[Navigation]] &lt;br /&gt;
* [[Motion and Path Planning]]&lt;br /&gt;
== Student Pages ==&lt;br /&gt;
How-to's and what we've learned:&lt;br /&gt;
* [[User:jryan]]&lt;br /&gt;
* [[User:aeh84]]&lt;br /&gt;
* [[User:aps43]]&lt;br /&gt;
* [[USer:Ws342]]&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:45:47Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* What Next? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page for history's sake; I'm not sure how long the repository will stay online.&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===Overview===&lt;br /&gt;
I had to fix p2os (the pioneer's ROS package) a few times during the term. The repository as it was, was not working with telop and was not working with fuetre when ROS released it. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
Fixes any of the telop errors that have to do with hash problems.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Updates p2os for ROS fuetre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Install Scripts==&lt;br /&gt;
===Overview===&lt;br /&gt;
Install ROS and setups our robot's stack from our repository. Made to work on Ubuntu 11.04.&lt;br /&gt;
===How To===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===Code===&lt;br /&gt;
setup-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tricks=&lt;br /&gt;
==General Tips==&lt;br /&gt;
* DO NOT use ROS on anything other than what it was made for: whatever version Ubuntu they are on. It's a REAL pain, and waste of time to do it any other way.&lt;br /&gt;
* DO NOT use VirtualBox of Ubuntu if you're going to use a Kinect (doesn't work).&lt;br /&gt;
* DO NOT push the pioneer robot manually, it's bad for the motor!&lt;br /&gt;
* DO read all the documentation for ROS: http://www.ros.org/wiki/. Read each section and you'll thank yourself later.&lt;br /&gt;
&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
=What Next?=&lt;br /&gt;
Next would be to integrate all the parts the team had together into a functioning robot. It would include mostly work with ROS.&lt;br /&gt;
Also, try taking the robot outside and testing the GPSs properly.&lt;br /&gt;
&lt;br /&gt;
=What would I do differently?=&lt;br /&gt;
Have more well-defined goals for each team member and for the entire group.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:45:16Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* What would I do differently? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page for history's sake; I'm not sure how long the repository will stay online.&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===Overview===&lt;br /&gt;
I had to fix p2os (the pioneer's ROS package) a few times during the term. The repository as it was, was not working with telop and was not working with fuetre when ROS released it. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
Fixes any of the telop errors that have to do with hash problems.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Updates p2os for ROS fuetre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Install Scripts==&lt;br /&gt;
===Overview===&lt;br /&gt;
Install ROS and setups our robot's stack from our repository. Made to work on Ubuntu 11.04.&lt;br /&gt;
===How To===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===Code===&lt;br /&gt;
setup-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tricks=&lt;br /&gt;
==General Tips==&lt;br /&gt;
* DO NOT use ROS on anything other than what it was made for: whatever version Ubuntu they are on. It's a REAL pain, and waste of time to do it any other way.&lt;br /&gt;
* DO NOT use VirtualBox of Ubuntu if you're going to use a Kinect (doesn't work).&lt;br /&gt;
* DO NOT push the pioneer robot manually, it's bad for the motor!&lt;br /&gt;
* DO read all the documentation for ROS: http://www.ros.org/wiki/. Read each section and you'll thank yourself later.&lt;br /&gt;
&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
=What Next?=&lt;br /&gt;
Next would be to integrate all the parts the team had together into a functioning robot. It would include mostly work with ROS.&lt;br /&gt;
=What would I do differently?=&lt;br /&gt;
Have more well-defined goals for each team member and for the entire group.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:44:59Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* Tips and Tricks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page for history's sake; I'm not sure how long the repository will stay online.&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===Overview===&lt;br /&gt;
I had to fix p2os (the pioneer's ROS package) a few times during the term. The repository as it was, was not working with telop and was not working with fuetre when ROS released it. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
Fixes any of the telop errors that have to do with hash problems.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Updates p2os for ROS fuetre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Install Scripts==&lt;br /&gt;
===Overview===&lt;br /&gt;
Install ROS and setups our robot's stack from our repository. Made to work on Ubuntu 11.04.&lt;br /&gt;
===How To===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===Code===&lt;br /&gt;
setup-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tricks=&lt;br /&gt;
==General Tips==&lt;br /&gt;
* DO NOT use ROS on anything other than what it was made for: whatever version Ubuntu they are on. It's a REAL pain, and waste of time to do it any other way.&lt;br /&gt;
* DO NOT use VirtualBox of Ubuntu if you're going to use a Kinect (doesn't work).&lt;br /&gt;
* DO NOT push the pioneer robot manually, it's bad for the motor!&lt;br /&gt;
* DO read all the documentation for ROS: http://www.ros.org/wiki/. Read each section and you'll thank yourself later.&lt;br /&gt;
&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
=What Next?=&lt;br /&gt;
Next would be to integrate all the parts the team had together into a functioning robot. It would include mostly work with ROS.&lt;br /&gt;
=What would I do differently?=&lt;br /&gt;
* Have more well-defined goals for each team member and for the entire group.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:43:24Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page for history's sake; I'm not sure how long the repository will stay online.&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===Overview===&lt;br /&gt;
I had to fix p2os (the pioneer's ROS package) a few times during the term. The repository as it was, was not working with telop and was not working with fuetre when ROS released it. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
Fixes any of the telop errors that have to do with hash problems.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Updates p2os for ROS fuetre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Install Scripts==&lt;br /&gt;
===Overview===&lt;br /&gt;
Install ROS and setups our robot's stack from our repository. Made to work on Ubuntu 11.04.&lt;br /&gt;
===How To===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===Code===&lt;br /&gt;
setup-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tricks=&lt;br /&gt;
==General Tips==&lt;br /&gt;
* DO NOT use ROS on anything other than what it was made for: whatever version Ubuntu they are on. It's a REAL pain, and waste of time to do it any other way.&lt;br /&gt;
* DO NOT use VirtualBox of Ubuntu if you're going to use a Kinect (doesn't work).&lt;br /&gt;
* DO NOT push the pioneer robot manually, it's bad for the motor!&lt;br /&gt;
* DO read all the documentation for ROS: http://www.ros.org/wiki/. Read each section and you'll thank yourself later.&lt;br /&gt;
&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:42:31Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page for history's sake; I'm not sure how long the repository will stay online.&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===Overview===&lt;br /&gt;
I had to created patches to fix p2os (the pioneer's ROS package). The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
Fixes any of the telop errors that have to do with hash problems.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Updates p2os for ROS fuetre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Install Scripts==&lt;br /&gt;
===Overview===&lt;br /&gt;
Install ROS and setups our robot's stack from our repository. Made to work on Ubuntu 11.04.&lt;br /&gt;
===How To===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===Code===&lt;br /&gt;
setup-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tricks=&lt;br /&gt;
==General Tips==&lt;br /&gt;
* DO NOT use ROS on anything other than what it was made for: whatever version Ubuntu they are on. It's a REAL pain, and waste of time to do it any other way.&lt;br /&gt;
* DO NOT use VirtualBox of Ubuntu if you're going to use a Kinect (doesn't work).&lt;br /&gt;
* DO NOT push the pioneer robot manually, it's bad for the motor!&lt;br /&gt;
* DO read all the documentation for ROS: http://www.ros.org/wiki/. Read each section and you'll thank yourself later.&lt;br /&gt;
&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:42:13Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page for history's sake; I'm not sure how long the repository will stay online.&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===Overview===&lt;br /&gt;
I had to created patches to fix p2os (the pioneer's ROS package). The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
Fixes any of the telop errors that have to do with hash problems.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Updates p2os for ROS fuetre.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Install Scripts==&lt;br /&gt;
===Overview===&lt;br /&gt;
Install ROS and setups our robot's stack from our repository. Made to work on Ubuntu 11.04.&lt;br /&gt;
===How To===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===Code===&lt;br /&gt;
setup-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tricks=&lt;br /&gt;
==General Tips==&lt;br /&gt;
* DO NOT use ROS on anything other than what it was made for: whatever version Ubuntu they are on. It's a REAL pain, and waste of time to do it any other way.&lt;br /&gt;
* DO NOT use VirtualBox of Ubuntu if you're going to use a Kinect (doesn't work).&lt;br /&gt;
* DO NOT push the pioneer robot manually, it's bad for the motor!&lt;br /&gt;
* DO read all the documentation for ROS: http://www.ros.org/wiki/. Read each section and you'll thank yourself later.&lt;br /&gt;
&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:41:32Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page for history's sake; I'm not sure how long the repository will stay online.&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===Overview===&lt;br /&gt;
I had to created patches to fix p2os (the pioneer's ROS package). The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
Fixes any of the telop errors that have to do with hash problems.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Install Scripts==&lt;br /&gt;
===Overview===&lt;br /&gt;
Install ROS and setups our robot's stack from our repository. Made to work on Ubuntu 11.04.&lt;br /&gt;
===How To===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===Code===&lt;br /&gt;
setup-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tricks=&lt;br /&gt;
==General Tips==&lt;br /&gt;
* DO NOT use ROS on anything other than what it was made for: whatever version Ubuntu they are on. It's a REAL pain, and waste of time to do it any other way.&lt;br /&gt;
* DO NOT use VirtualBox of Ubuntu if you're going to use a Kinect (doesn't work).&lt;br /&gt;
* DO NOT push the pioneer robot manually, it's bad for the motor!&lt;br /&gt;
* DO read all the documentation for ROS: http://www.ros.org/wiki/. Read each section and you'll thank yourself later.&lt;br /&gt;
&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:40:56Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page for history's sake; I'm not sure how long the repository will stay online.&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===Overview===&lt;br /&gt;
I had to created patches to fix p2os (the pioneer's ROS package). The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Install Scripts==&lt;br /&gt;
===Overview===&lt;br /&gt;
Install ROS and setups our robot's stack from our repository. Made to work on Ubuntu 11.04.&lt;br /&gt;
===How To===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===Code===&lt;br /&gt;
setup-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tricks=&lt;br /&gt;
==General Tips==&lt;br /&gt;
* DO NOT use ROS on anything other than what it was made for: whatever version Ubuntu they are on. It's a REAL pain, and waste of time to do it any other way.&lt;br /&gt;
* DO NOT use VirtualBox of Ubuntu if you're going to use a Kinect (doesn't work).&lt;br /&gt;
* DO NOT push the pioneer robot manually, it's bad for the motor!&lt;br /&gt;
* DO read all the documentation for ROS: http://www.ros.org/wiki/. Read each section and you'll thank yourself later.&lt;br /&gt;
&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:38:00Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* General Tips */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===Overview===&lt;br /&gt;
I had to created patches to fix p2os (the pioneer's ROS package). The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Install Scripts==&lt;br /&gt;
===Overview===&lt;br /&gt;
Install ROS and setups our robot's stack from our repository. Made to work on Ubuntu 11.04.&lt;br /&gt;
===How To===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===Code===&lt;br /&gt;
setup-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tricks=&lt;br /&gt;
==General Tips==&lt;br /&gt;
* DO NOT use ROS on anything other than what it was made for: whatever version Ubuntu they are on. It's a REAL pain, and waste of time to do it any other way.&lt;br /&gt;
* DO NOT use VirtualBox of Ubuntu if you're going to use a Kinect (doesn't work).&lt;br /&gt;
* DO NOT push the pioneer robot manually, it's bad for the motor!&lt;br /&gt;
* DO read all the documentation for ROS: http://www.ros.org/wiki/. Read each section and you'll thank yourself later.&lt;br /&gt;
&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:36:57Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* Tips and Tutorials */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===Overview===&lt;br /&gt;
I had to created patches to fix p2os (the pioneer's ROS package). The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Install Scripts==&lt;br /&gt;
===Overview===&lt;br /&gt;
Install ROS and setups our robot's stack from our repository. Made to work on Ubuntu 11.04.&lt;br /&gt;
===How To===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===Code===&lt;br /&gt;
setup-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tricks=&lt;br /&gt;
==General Tips==&lt;br /&gt;
* DO NOT use ROS on anything other than what it was made for: whatever version Ubuntu they are on. It's a REAL pain, and waste of time to do it any other way.&lt;br /&gt;
* DO NOT use VirtualBox of Ubuntu if you're going to use a Kinect (doesn't work).&lt;br /&gt;
* DO read all the documentation for ROS: http://www.ros.org/wiki/. Read each section and you'll thank yourself later.&lt;br /&gt;
&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:36:36Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* Tips */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===Overview===&lt;br /&gt;
I had to created patches to fix p2os (the pioneer's ROS package). The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Install Scripts==&lt;br /&gt;
===Overview===&lt;br /&gt;
Install ROS and setups our robot's stack from our repository. Made to work on Ubuntu 11.04.&lt;br /&gt;
===How To===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===Code===&lt;br /&gt;
setup-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Tips==&lt;br /&gt;
* DO NOT use ROS on anything other than what it was made for: whatever version Ubuntu they are on. It's a REAL pain, and waste of time to do it any other way.&lt;br /&gt;
* DO NOT use VirtualBox of Ubuntu if you're going to use a Kinect (doesn't work).&lt;br /&gt;
* DO read all the documentation for ROS: http://www.ros.org/wiki/. Read each section and you'll thank yourself later.&lt;br /&gt;
&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:36:09Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* Tips and Tutorials */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===Overview===&lt;br /&gt;
I had to created patches to fix p2os (the pioneer's ROS package). The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Install Scripts==&lt;br /&gt;
===Overview===&lt;br /&gt;
Install ROS and setups our robot's stack from our repository. Made to work on Ubuntu 11.04.&lt;br /&gt;
===How To===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===Code===&lt;br /&gt;
setup-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Tips==&lt;br /&gt;
* DO NOT use ROS on anything other than what it was made for: whatever version Ubuntu they are on. It's a REAL pain, and waste of time to do it any other way.&lt;br /&gt;
* DO NOT use VirtualBox of Ubuntu if you're going to use a Kinect (doesn't work).&lt;br /&gt;
* DO read all the documentation for ROS: http://www.ros.org/wiki/. Read each section, you'll thank yourself later.&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:33:46Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* ros install scripts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===Overview===&lt;br /&gt;
I had to created patches to fix p2os (the pioneer's ROS package). The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Install Scripts==&lt;br /&gt;
===Overview===&lt;br /&gt;
Install ROS and setups our robot's stack from our repository. Made to work on Ubuntu 11.04.&lt;br /&gt;
===How To===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===Code===&lt;br /&gt;
setup-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:32:43Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===Overview===&lt;br /&gt;
I had to created patches to fix p2os (the pioneer's ROS package). The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:32:31Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===Overview===&lt;br /&gt;
I had to created patches to fix p2os (the pioneer's ROS package). The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:32:17Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix p2os (the pioneer's ROS package). The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:31:54Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* How To */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:31:40Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* How To */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|Wiki page]] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:31:30Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* How To */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the [[ROS_(Robot_Operating_System)|Wiki page] I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:31:03Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* How To */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors:&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the [[ROS_(Robot_Operating_System)|main page]].&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:29:51Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* How To */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors:&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the main page:&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:29:30Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* How To */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors:&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the main page.&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:29:18Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* How To */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors:&lt;br /&gt;
* ROS_(Robot_Operating_System)&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the main page.&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:26:56Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* ros */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the main page.&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:26:35Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* what not to do */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the main page.&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===What Not To Do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:26:08Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* pros and cons */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the main page.&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
&lt;br /&gt;
===Pros and Cons===&lt;br /&gt;
====Pros====&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
====Cons====&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:25:36Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* How To */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the main page.&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
# [http://maketecheasier.com/enable-3d-acceleration-in-virtualbox/2009/05/21 Enabled 3D acceleration if using rviz].&lt;br /&gt;
&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:24:32Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* howto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the main page.&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
# &amp;lt;pre&amp;gt;$ sudo apt-get install virtualbox&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Run virtualbox.&lt;br /&gt;
# [http://www.psychocats.net/ubuntu/virtualbox Install Ubuntu in virtual box].&lt;br /&gt;
&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:23:09Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the main page.&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===Overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:22:49Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the main page.&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to setup ROS on so it didn't mess with our computers.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:21:44Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* Documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the main page.&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* [[ROS_(Robot_Operating_System)]]&lt;br /&gt;
* [[Navigation]]&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to work inside of so ROS didn't mess with our computers. There were some advantages as well as some drawbacks.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:21:14Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* Documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the main page.&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
* http://gicl.cs.drexel.edu/wiki/ROS_(Robot_Operating_System)&lt;br /&gt;
* http://gicl.cs.drexel.edu/wiki/Navigation&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to work inside of so ROS didn't mess with our computers. There were some advantages as well as some drawbacks.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:20:58Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* Documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the main page.&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
http://gicl.cs.drexel.edu/wiki/ROS_(Robot_Operating_System)&lt;br /&gt;
http://gicl.cs.drexel.edu/wiki/Navigation&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to work inside of so ROS didn't mess with our computers. There were some advantages as well as some drawbacks.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:20:03Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* ros patches */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the main page.&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Patches==&lt;br /&gt;
===overview===&lt;br /&gt;
I had to created patches to fix the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are included in the repository apply these patches automatically.&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to work inside of so ROS didn't mess with our computers. There were some advantages as well as some drawbacks.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:19:11Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* ROS Launch Script= */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script==&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the main page.&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros patches==&lt;br /&gt;
===overview===&lt;br /&gt;
These patches to fixes the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are include apply these patches automatically.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to work inside of so ROS didn't mess with our computers. There were some advantages as well as some drawbacks.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:18:55Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* ros launch scripts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ROS Launch Script===&lt;br /&gt;
===Overview===&lt;br /&gt;
A [http://ros.org/wiki/roslaunch ROS launch] script that starts p2os, and rviz.&lt;br /&gt;
===How To===&lt;br /&gt;
Follow the instructions on the main page.&lt;br /&gt;
===Code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros patches==&lt;br /&gt;
===overview===&lt;br /&gt;
These patches to fixes the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are include apply these patches automatically.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to work inside of so ROS didn't mess with our computers. There were some advantages as well as some drawbacks.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:17:46Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* How To */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Copy the code below and put it into a file called &amp;lt;tt&amp;gt;kalman.py&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros launch scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
A project that launches Unicorn.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros patches==&lt;br /&gt;
===overview===&lt;br /&gt;
These patches to fixes the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are include apply these patches automatically.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to work inside of so ROS didn't mess with our computers. There were some advantages as well as some drawbacks.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:17:25Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* howto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===How To===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros launch scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
A project that launches Unicorn.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros patches==&lt;br /&gt;
===overview===&lt;br /&gt;
These patches to fixes the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are include apply these patches automatically.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to work inside of so ROS didn't mess with our computers. There were some advantages as well as some drawbacks.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:16:57Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* gps on the side */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==GPS with Kalman Filter==&lt;br /&gt;
===Overview===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
===howto===&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
===Code===&lt;br /&gt;
kalman.py:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros launch scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
A project that launches Unicorn.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros patches==&lt;br /&gt;
===overview===&lt;br /&gt;
These patches to fixes the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are include apply these patches automatically.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to work inside of so ROS didn't mess with our computers. There were some advantages as well as some drawbacks.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/ROS_(Robot_Operating_System)</id>
		<title>ROS (Robot Operating System)</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/ROS_(Robot_Operating_System)"/>
				<updated>2012-06-19T03:15:23Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* rviz */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We used [http://www.ros.org ROS] so we could take advantage of the large amount of packages it provides. This is so we don't have to reinvent the wheel.&lt;br /&gt;
== p2os ==&lt;br /&gt;
p2os is the ROS stack for communicating with the pioneer robot.&lt;br /&gt;
An example of the pioneer robot using ROS and the navigation system: http://youtu.be/f3Iu2t0d3xo.&lt;br /&gt;
&lt;br /&gt;
=== Installing ===&lt;br /&gt;
Open up a terminal.&lt;br /&gt;
Clone the git repository into your home directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone &amp;lt;USER&amp;gt;@tux.cs.drexel.edu:~taw38/repos/robotlab.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enter the repository:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd ~/robotlab&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then run the ros setup script.&lt;br /&gt;
&amp;lt;pre&amp;gt;./ros/bin/setup-ros.bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait for passwords, until you get the done prompt.&lt;br /&gt;
&lt;br /&gt;
=== Control with Keyboard ===&lt;br /&gt;
After starting the p2os driver and everything, you can control the robot via keyboard with: &lt;br /&gt;
&amp;lt;pre&amp;gt;$ roslaunch p2os_launch teleop_keyboard.launch&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== rviz ===&lt;br /&gt;
Just launch the robot's rviz launch with (robot lab is the git repository root):&lt;br /&gt;
&amp;lt;pre&amp;gt;$ cd robotlab/ros/stacks/unicorn&lt;br /&gt;
$ roslaunch unicorn.launch&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/ROS_(Robot_Operating_System)</id>
		<title>ROS (Robot Operating System)</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/ROS_(Robot_Operating_System)"/>
				<updated>2012-06-19T03:14:22Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We used [http://www.ros.org ROS] so we could take advantage of the large amount of packages it provides. This is so we don't have to reinvent the wheel.&lt;br /&gt;
== p2os ==&lt;br /&gt;
p2os is the ROS stack for communicating with the pioneer robot.&lt;br /&gt;
An example of the pioneer robot using ROS and the navigation system: http://youtu.be/f3Iu2t0d3xo.&lt;br /&gt;
&lt;br /&gt;
=== Installing ===&lt;br /&gt;
Open up a terminal.&lt;br /&gt;
Clone the git repository into your home directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone &amp;lt;USER&amp;gt;@tux.cs.drexel.edu:~taw38/repos/robotlab.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enter the repository:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd ~/robotlab&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then run the ros setup script.&lt;br /&gt;
&amp;lt;pre&amp;gt;./ros/bin/setup-ros.bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait for passwords, until you get the done prompt.&lt;br /&gt;
&lt;br /&gt;
=== Control with Keyboard ===&lt;br /&gt;
After starting the p2os driver and everything, you can control the robot via keyboard with: &lt;br /&gt;
&amp;lt;pre&amp;gt;$ roslaunch p2os_launch teleop_keyboard.launch&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== rviz ===&lt;br /&gt;
Just launch the robot's rviz launch with:&lt;br /&gt;
&amp;lt;pre&amp;gt;$ roslaunch unicorn.launch&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/ROS_(Robot_Operating_System)</id>
		<title>ROS (Robot Operating System)</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/ROS_(Robot_Operating_System)"/>
				<updated>2012-06-19T03:10:25Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We used [http://www.ros.org ROS] so we could take advantage of the large amount of packages it provides. This is so we don't have to reinvent the wheel.&lt;br /&gt;
== p2os ==&lt;br /&gt;
p2os is the ROS stack for communicating with the pioneer robot.&lt;br /&gt;
An example of the pioneer robot using ROS and the navigation system: http://youtu.be/f3Iu2t0d3xo.&lt;br /&gt;
&lt;br /&gt;
=== Installing ===&lt;br /&gt;
Open up a terminal.&lt;br /&gt;
Clone the git repository into your home directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone &amp;lt;USER&amp;gt;@tux.cs.drexel.edu:~taw38/repos/robotlab.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enter the repository:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd ~/robotlab&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then run the ros setup script.&lt;br /&gt;
&amp;lt;pre&amp;gt;./ros/bin/setup-ros.bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait for passwords, until you get the done prompt.&lt;br /&gt;
&lt;br /&gt;
==== Control with Keyboard ====&lt;br /&gt;
After starting the p2os driver and everything, you can control the robot via keyboard with: &lt;br /&gt;
&amp;lt;pre&amp;gt;$ roslaunch p2os_launch teleop_keyboard.launch&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/ROS_(Robot_Operating_System)</id>
		<title>ROS (Robot Operating System)</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/ROS_(Robot_Operating_System)"/>
				<updated>2012-06-19T03:05:09Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We used ROS so we could take advantage of the large amount of packages it provides. This is so we don't have to reinvent the wheel:&lt;br /&gt;
[http://www.ros.org/wiki/ ROS Wiki]&lt;br /&gt;
== p2os ==&lt;br /&gt;
The ROS stack for hooking up to the pioneer.&lt;br /&gt;
Here is an example of our robot using ROS and the navigation system:&lt;br /&gt;
http://youtu.be/f3Iu2t0d3xo&lt;br /&gt;
=== Installing ===&lt;br /&gt;
Open up a terminal.&lt;br /&gt;
Clone the git repository into your home directory:&lt;br /&gt;
&amp;lt;pre&amp;gt;git clone &amp;lt;USER&amp;gt;@tux.cs.drexel.edu:~taw38/repos/robotlab.git&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enter the repository:&lt;br /&gt;
&amp;lt;pre&amp;gt;cd ~/robotlab&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then run the ros setup script.&lt;br /&gt;
&amp;lt;pre&amp;gt;./ros/bin/setup-ros.bash&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait for passwords, until you get the done prompt.&lt;br /&gt;
&lt;br /&gt;
==== Control with Keyboard ====&lt;br /&gt;
After starting the p2os driver and everything, you can control the robot via keyboard with: &lt;br /&gt;
&amp;lt;pre&amp;gt;$ roslaunch p2os_launch teleop_keyboard.launch&amp;lt;/pre&amp;gt;&lt;br /&gt;
To get p2os_teleop working:&lt;br /&gt;
http://answers.ros.org/question/11417/datatypemd5sum-error-with-p2os_teleop&lt;br /&gt;
&lt;br /&gt;
== rviz ==&lt;br /&gt;
To get rviz to work put this in your .bashrc:&lt;br /&gt;
&amp;lt;pre&amp;gt;export OGRE_RTT_MODE=FBO&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:02:28Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* howto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===How To===&lt;br /&gt;
Start with the Wiki pages I created for setting up our robot. The pages also tell you how to start the 3D simulation for the robot's sensors.&lt;br /&gt;
&lt;br /&gt;
==gps on the side==&lt;br /&gt;
===overview===&lt;br /&gt;
An example of a Kalman Filter, filtering GPS coordinates.&lt;br /&gt;
&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
&lt;br /&gt;
==ros launch scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
A project that launches Unicorn.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros patches==&lt;br /&gt;
===overview===&lt;br /&gt;
These patches to fixes the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are include apply these patches automatically.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to work inside of so ROS didn't mess with our computers. There were some advantages as well as some drawbacks.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:01:06Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* screenshot/video? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===Screenshots===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
==gps on the side==&lt;br /&gt;
===overview===&lt;br /&gt;
An example of a Kalman Filter, filtering GPS coordinates.&lt;br /&gt;
&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
&lt;br /&gt;
==ros launch scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
A project that launches Unicorn.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros patches==&lt;br /&gt;
===overview===&lt;br /&gt;
These patches to fixes the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are include apply these patches automatically.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to work inside of so ROS didn't mess with our computers. There were some advantages as well as some drawbacks.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T03:00:52Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===Overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===screenshot/video?===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
==gps on the side==&lt;br /&gt;
===overview===&lt;br /&gt;
An example of a Kalman Filter, filtering GPS coordinates.&lt;br /&gt;
&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
&lt;br /&gt;
==ros launch scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
A project that launches Unicorn.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros patches==&lt;br /&gt;
===overview===&lt;br /&gt;
These patches to fixes the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are include apply these patches automatically.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to work inside of so ROS didn't mess with our computers. There were some advantages as well as some drawbacks.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T02:59:29Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* howto */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===screenshot/video?===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
==gps on the side==&lt;br /&gt;
===overview===&lt;br /&gt;
An example of a Kalman Filter, filtering GPS coordinates.&lt;br /&gt;
&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
# Install gpsd. (sudo apt-get install gpsd)&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
&lt;br /&gt;
==ros launch scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
A project that launches Unicorn.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros patches==&lt;br /&gt;
===overview===&lt;br /&gt;
These patches to fixes the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are include apply these patches automatically.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to work inside of so ROS didn't mess with our computers. There were some advantages as well as some drawbacks.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T02:58:49Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. [http://www.ros.org/wiki/rviz rviz] is used to listen to the ROS topics, and then visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the [http://www.ros.org/wiki/navigation navigation] package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===screenshot/video?===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
==gps on the side==&lt;br /&gt;
===overview===&lt;br /&gt;
An example of a Kalman Filter, filtering GPS coordinates.&lt;br /&gt;
&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
&lt;br /&gt;
==ros launch scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
A project that launches Unicorn.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros patches==&lt;br /&gt;
===overview===&lt;br /&gt;
These patches to fixes the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are include apply these patches automatically.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to work inside of so ROS didn't mess with our computers. There were some advantages as well as some drawbacks.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T02:56:42Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===overview===&lt;br /&gt;
[http://www.ros.org/wiki/p2os p2os] was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. rviz is used to listen to the ROS topics and visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the navigation package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===screenshot/video?===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
==gps on the side==&lt;br /&gt;
===overview===&lt;br /&gt;
An example of a Kalman Filter, filtering GPS coordinates.&lt;br /&gt;
&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
&lt;br /&gt;
==ros launch scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
A project that launches Unicorn.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros patches==&lt;br /&gt;
===overview===&lt;br /&gt;
These patches to fixes the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are include apply these patches automatically.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to work inside of so ROS didn't mess with our computers. There were some advantages as well as some drawbacks.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	<entry>
		<id>http://gicl.cs.drexel.edu/wiki/User:Jryan</id>
		<title>User:Jryan</title>
		<link rel="alternate" type="text/html" href="http://gicl.cs.drexel.edu/wiki/User:Jryan"/>
				<updated>2012-06-19T02:56:09Z</updated>
		
		<summary type="html">&lt;p&gt;Jryan: /* overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Robot Lab Spring 2012.&lt;br /&gt;
I worked on robot localization, applying kalman filters to GPS measurements, and ROS setup.&lt;br /&gt;
Code is included in-line in this Wiki page and at the bottom in a tar.&lt;br /&gt;
&lt;br /&gt;
=What I Did=&lt;br /&gt;
==Localization with the Pioneer==&lt;br /&gt;
===overview===&lt;br /&gt;
p2os was used to control and receive data from the robot. p2os publishes odometery and pose information from the robot over [http://www.ros.org/wiki/Topics ROS topics]. rviz is used to listen to the ROS topics and visualize the odometery and pose information in a 3D simulation. Integration with rviz also allows future expansion to use other ROS packages and topics. For instance, the navigation package, which would allow the user to provide goals to the robot, or also visualize the map or other SLAM sensors.&lt;br /&gt;
&lt;br /&gt;
===screenshot/video?===&lt;br /&gt;
Going to the lab tomorrow to take some screen shots.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
==gps on the side==&lt;br /&gt;
===overview===&lt;br /&gt;
An example of a Kalman Filter, filtering GPS coordinates.&lt;br /&gt;
&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;# Code adapted from:&lt;br /&gt;
# Kalman filter example demo in Python&lt;br /&gt;
&lt;br /&gt;
# A Python implementation of the example given in pages 11-15 of &amp;quot;An&lt;br /&gt;
# Introduction to the Kalman Filter&amp;quot; by Greg Welch and Gary Bishop,&lt;br /&gt;
# University of North Carolina at Chapel Hill, Department of Computer&lt;br /&gt;
# Science, TR 95-041,&lt;br /&gt;
# http://www.cs.unc.edu/~welch/kalman/kalmanIntro.html&lt;br /&gt;
&lt;br /&gt;
# by Andrew D. Straw&lt;br /&gt;
&lt;br /&gt;
class KalmanFilter:&lt;br /&gt;
    def __init__(self, obs_func):&lt;br /&gt;
        self.Q = 1e-5        # process variance&lt;br /&gt;
        self.xhat=[0.0]      # a posteri estimate of x&lt;br /&gt;
        self.P=[1.0]         # a posteri error estimate&lt;br /&gt;
        self.xhatminus=[0.0] # a priori estimate of x&lt;br /&gt;
        self.Pminus=[0.0]    # a priori error estimate&lt;br /&gt;
        self.K=[0.0]         # gain or blending factor&lt;br /&gt;
        self.R = 0.5**2      # estimate of measurement variance, change to see effect&lt;br /&gt;
        self.obs_func = obs_func&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # time update&lt;br /&gt;
        self.xhatminus.append(self.xhat[-1])&lt;br /&gt;
        self.Pminus.append(self.P[-1]+self.Q)&lt;br /&gt;
        # measurement update&lt;br /&gt;
        self.K.append(self.Pminus[-1]/( self.Pminus[-1]+self.R))&lt;br /&gt;
        self.xhat.append(self.xhatminus[-1]+self.K[-1]*(self.obs_func()-self.xhatminus[-1]))&lt;br /&gt;
        self.P.append((1-self.K[-1])*self.Pminus[-1])&lt;br /&gt;
        return self.xhat[-1]&lt;br /&gt;
&lt;br /&gt;
class LocationKalmanFilter():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;This makes the assumption that x and y are independent.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, x_func, y_func):&lt;br /&gt;
        self.x_filter = KalmanFilter(x_func)&lt;br /&gt;
        self.y_filter = KalmanFilter(y_func)&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        return (self.x_filter.next_step(), self.y_filter.next_step())&lt;br /&gt;
&lt;br /&gt;
class GpsKalmanFilter(LocationKalmanFilter):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        LocationKalmanFilter.__init__(self, self.get_long, self.get_lat)&lt;br /&gt;
        import gps&lt;br /&gt;
        self.session = gps.gps()&lt;br /&gt;
&lt;br /&gt;
    def get_long(self):&lt;br /&gt;
        return self.session.fix.longitude&lt;br /&gt;
&lt;br /&gt;
    def get_lat(self):&lt;br /&gt;
        return self.session.fix.latitude&lt;br /&gt;
&lt;br /&gt;
    def next_step(self):&lt;br /&gt;
        # a = altitude, d = date/time, m=mode,  &lt;br /&gt;
        # o=postion/fix, s=status, y=satellites&lt;br /&gt;
        self.session.query('admosy')&lt;br /&gt;
        LocationKalmanFilter.next_step()&lt;br /&gt;
 &lt;br /&gt;
# example&lt;br /&gt;
import pylab&lt;br /&gt;
import random&lt;br /&gt;
import time&lt;br /&gt;
x=[]&lt;br /&gt;
y=[]&lt;br /&gt;
&lt;br /&gt;
xhat = []&lt;br /&gt;
yhat = []&lt;br /&gt;
kf = GpsKalmanFilter()&lt;br /&gt;
# take 40 measurements&lt;br /&gt;
for i in xrange(0, 40):&lt;br /&gt;
    xh,yh = kf.next_step()&lt;br /&gt;
    xhat.append(xh)&lt;br /&gt;
    yhat.append(yh)&lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
# graph&lt;br /&gt;
pylab.figure()&lt;br /&gt;
pylab.plot(x,y, 'k+',label='observations',color='y')&lt;br /&gt;
pylab.plot(xhat, yhat, 'b-',label='a posteri estimate',color='b')&lt;br /&gt;
pylab.legend()&lt;br /&gt;
pylab.show()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
This script takes a GPS and runs a Kalman filter over the data. The Kalman filter provides a more accurate and less erratic measurement.&lt;br /&gt;
# Plug in the gps via usb,&lt;br /&gt;
# Start gpsd (&amp;lt;tt&amp;gt;man gpsd&amp;lt;/tt&amp;gt; to see how to use gpsd).&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;xgps&amp;lt;/tt&amp;gt; and wait for a signal.&lt;br /&gt;
# Run &amp;lt;tt&amp;gt;python kalman.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Going to lab tomorrow to take screenshots.&lt;br /&gt;
&lt;br /&gt;
==ros launch scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
A project that launches Unicorn.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;launch&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_driver&amp;quot; type=&amp;quot;p2os&amp;quot; name=&amp;quot;p2os&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;p2os_dashboard&amp;quot; type=&amp;quot;p2os_dashboard&amp;quot; name=&amp;quot;p2os_dashboard&amp;quot; output=&amp;quot;screen&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;rosparam&amp;gt;port: /dev/ttyUSB0&amp;lt;/rosparam&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
  &amp;lt;node pkg=&amp;quot;rviz&amp;quot; type=&amp;quot;rviz&amp;quot; name=&amp;quot;rviz&amp;quot; output=&amp;quot;screen&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/launch&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros patches==&lt;br /&gt;
===overview===&lt;br /&gt;
These patches to fixes the pioneer's ROS package. The repository as it was, was not working. The ROS setup scripts that are include apply these patches automatically.&lt;br /&gt;
===howto===&lt;br /&gt;
===code===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 478)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -145,7 +145,7 @@&lt;br /&gt;
 	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
-    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
+    deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
 &lt;br /&gt;
     if (!deadman_)&lt;br /&gt;
     	return;&lt;br /&gt;
@@ -154,20 +154,20 @@&lt;br /&gt;
 		last_recieved_joy_message_time_ = ros::Time::now();&lt;br /&gt;
 &lt;br /&gt;
     // Base&lt;br /&gt;
-    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
+    running_ = (((unsigned int)run_button &amp;lt; joy_msg-&amp;gt;buttons.size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[run_button]);&lt;br /&gt;
     double vx = running_ ? max_vx_run : max_vx;&lt;br /&gt;
     double vy = running_ ? max_vy_run : max_vy;&lt;br /&gt;
     double vw = running_ ? max_vw_run : max_vw;&lt;br /&gt;
 &lt;br /&gt;
-    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vx &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vx) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vx = joy_msg-&amp;gt;axes[axis_vx] * vx;&lt;br /&gt;
     else&lt;br /&gt;
       req_vx = 0.0;&lt;br /&gt;
-    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vy &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vy) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
     	req_vy = joy_msg-&amp;gt;axes[axis_vy] * vy;&lt;br /&gt;
     else&lt;br /&gt;
       req_vy = 0.0;&lt;br /&gt;
-    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;get_axes_size()))&lt;br /&gt;
+    if((axis_vw &amp;gt;= 0) &amp;amp;&amp;amp; (((unsigned int)axis_vw) &amp;lt; joy_msg-&amp;gt;axes.size()))&lt;br /&gt;
       req_vw = joy_msg-&amp;gt;axes[axis_vw] * vw;&lt;br /&gt;
     else&lt;br /&gt;
       req_vw = 0.0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Index: p2os_teleop/manifest.xml&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/manifest.xml	(revision 457)&lt;br /&gt;
+++ p2os_teleop/manifest.xml	(working copy)&lt;br /&gt;
@@ -9,7 +9,7 @@&lt;br /&gt;
 	&amp;lt;review status=&amp;quot;unreviewed&amp;quot; notes=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;url&amp;gt;http://ros.org/wiki/p2os_teleop&amp;lt;/url&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;roscpp&amp;quot;/&amp;gt;&lt;br /&gt;
-	&amp;lt;depend package=&amp;quot;joy&amp;quot;/&amp;gt;&lt;br /&gt;
+	&amp;lt;depend package=&amp;quot;sensor_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;depend package=&amp;quot;geometry_msgs&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/package&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Index: p2os_teleop/src/p2os_teleop.cc&lt;br /&gt;
===================================================================&lt;br /&gt;
--- p2os_teleop/src/p2os_teleop.cc	(revision 457)&lt;br /&gt;
+++ p2os_teleop/src/p2os_teleop.cc	(working copy)&lt;br /&gt;
@@ -52,7 +52,7 @@&lt;br /&gt;
 #include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;math.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;ros/ros.h&amp;quot;&lt;br /&gt;
-#include &amp;quot;joy/Joy.h&amp;quot;&lt;br /&gt;
+#include &amp;quot;sensor_msgs/Joy.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;geometry_msgs/Twist.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 class TeleopBase &lt;br /&gt;
@@ -142,7 +142,7 @@&lt;br /&gt;
 		passthrough_cmd = *pass_msg;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
-	void joy_cb(const joy::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
+	void joy_cb(const sensor_msgs::Joy::ConstPtr&amp;amp; joy_msg)&lt;br /&gt;
 	{&lt;br /&gt;
         &lt;br /&gt;
     deadman_ = (((unsigned int)deadman_button &amp;lt; joy_msg-&amp;gt;get_buttons_size()) &amp;amp;&amp;amp; joy_msg-&amp;gt;buttons[deadman_button]);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==ros install scripts==&lt;br /&gt;
===overview===&lt;br /&gt;
Install ROS and setup our robot's files from our repository.&lt;br /&gt;
===howto===&lt;br /&gt;
Unzip the provided tar, it's a git repository with the entire classes' work. Go to robotlab/ros/ and run setup-ros.bash.&lt;br /&gt;
===code===&lt;br /&gt;
setup-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# if ros is not setup, install it&lt;br /&gt;
if [[ -z /etc/apt/sources.list.d/ros-latest.list || &amp;quot;$1&amp;quot; == '-r' ]]&lt;br /&gt;
then&lt;br /&gt;
	sudo sh -c 'echo &amp;quot;deb http://packages.ros.org/ros/ubuntu oneiric main&amp;quot; &amp;gt; /etc/apt/sources.list.d/ros-latest.list'&lt;br /&gt;
	wget http://packages.ros.org/ros.key -O - | sudo apt-key add -&lt;br /&gt;
	sudo apt-get update -y&lt;br /&gt;
	sudo apt-get install ros-fuerte-desktop-full ros-fuerte-joystick-drivers -y&lt;br /&gt;
	sudo apt-get install python-pip -y&lt;br /&gt;
	sudo pip install -U rosinstall vcstools rosdep&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# setup local ros env if it's not setup already&lt;br /&gt;
grep &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; ~/.bashrc || echo &amp;quot;source ~/robotlab/ros/bin/setup-ros-env.bash&amp;quot; &amp;gt;&amp;gt; ~/.bashrc&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
# install stacks&lt;br /&gt;
. $DIR/setup-unicorn-stacks.bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-ros-env.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
setup-unicorn-stacks.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
. /opt/ros/fuerte/setup.bash&lt;br /&gt;
export ROS_PACKAGE_PATH=~/robotlab/ros/stacks:$ROS_PACKAGE_PATH&lt;br /&gt;
# to make rviz work in a vm&lt;br /&gt;
export OGRE_RTT_MODE=FBO&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat setup-unicorn-stacks.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
upgrade-ros.bash&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
DIR=&amp;quot;$( cd &amp;quot;$( dirname &amp;quot;$0&amp;quot; )&amp;quot; &amp;amp;&amp;amp; pwd )&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# install p2os with our patches&lt;br /&gt;
echo &amp;quot;Checking out usc-ros-pkg from svn repo...&amp;quot;&lt;br /&gt;
rm -rf $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
svn co http://usc-ros-pkg.svn.sourceforge.net/svnroot/usc-ros-pkg/trunk/ $DIR/../stacks/usc-ros-pkg&lt;br /&gt;
echo &amp;quot;Applying patch...&amp;quot;&lt;br /&gt;
pushd $DIR/../stacks/usc-ros-pkg/p2os&lt;br /&gt;
	patch -p0 -i ../../unicorn/p2os-teleop-fix.patch&lt;br /&gt;
	patch -p0 -i ../../unicorn/fuerte-update.patch&lt;br /&gt;
popd&lt;br /&gt;
echo &amp;quot;Building...&amp;quot;&lt;br /&gt;
rospack profile &amp;amp;&amp;amp; rosstack profile&lt;br /&gt;
set +e&lt;br /&gt;
sudo rosdep init&lt;br /&gt;
set -e&lt;br /&gt;
rosdep update&lt;br /&gt;
rosdep install p2os &amp;amp;&amp;amp; rosmake p2os&lt;br /&gt;
rosmake register_pointclouds &lt;br /&gt;
echo &amp;quot;Done.&amp;quot;&lt;br /&gt;
jryan@ros:~/robotlab/ros/bin$ cat upgrade-ros.bash &lt;br /&gt;
#!/bin/bash -e&lt;br /&gt;
&lt;br /&gt;
# problem with ~/.pip from the first script&lt;br /&gt;
sudo rm -rf ~/.pip&lt;br /&gt;
&lt;br /&gt;
./setup-ros.bash $@&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Documentation ==&lt;br /&gt;
I added these pages to the wiki to help the class install/setup ROS.&lt;br /&gt;
&lt;br /&gt;
=Tips and Tutorials=&lt;br /&gt;
==Virtual Box==&lt;br /&gt;
===overview===&lt;br /&gt;
Most of the class used a Virtual Box to work inside of so ROS didn't mess with our computers. There were some advantages as well as some drawbacks.&lt;br /&gt;
&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
Pros:&lt;br /&gt;
# Isolated from host system.&lt;br /&gt;
# Easy to delete and start over.&lt;br /&gt;
Cons:&lt;br /&gt;
# Slower on some machines. New machines it was good.&lt;br /&gt;
# rviz (3D robot visualizer) had some issues (window black spots, had to debug it first to get it to work)&lt;br /&gt;
# Kinect does NOT work through a VirtualBox.&lt;br /&gt;
&lt;br /&gt;
===what not to do===&lt;br /&gt;
If you're using a kinect with ros, as of June 2012, do NOT use VirtualBox.&lt;br /&gt;
&lt;br /&gt;
==ros==&lt;br /&gt;
===overview===&lt;br /&gt;
===howto===&lt;br /&gt;
===pros and cons===&lt;br /&gt;
===what not to do===&lt;/div&gt;</summary>
		<author><name>Jryan</name></author>	</entry>

	</feed>