<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-940794078373460235</id><updated>2012-03-03T11:54:03.166Z</updated><category term='videos'/><category term='milestones'/><category term='lego'/><category term='movement'/><category term='python'/><category term='kittens'/><category term='software'/><category term='gui'/><category term='hardware'/><category term='code-snippets'/><title type='text'>Systemetric</title><subtitle type='html'>A robotics team competing in Student Robotics</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://team759.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://team759.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Eric</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-zvtGEqXEaNw/Tr2tvFebEII/AAAAAAAAAJE/jHRzALqr-Mc/s1600/logo.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-940794078373460235.post-7986926400959459005</id><published>2012-02-24T18:32:00.001Z</published><updated>2012-02-24T19:13:50.900Z</updated><title type='text'>FRC</title><content type='html'>&lt;p&gt;We've just got back to Student Robotics, after a month and a half preparing a robot for &lt;abbr title="FIRST Robotics Competition"&gt;FRC&lt;/abbr&gt;. The challenge this year was based on a game of basketball. This is what we were working on:&lt;/p&gt;&lt;div class="images"&gt; &lt;a class="image" style="width:320px" href="http://3.bp.blogspot.com/-AwcyyhgvaKU/T0fW8CcBRFI/AAAAAAAAAME/Pdazfv2op3E/s1600/WP_000001.jpg"&gt; &lt;img style="width:320px" src="http://3.bp.blogspot.com/-AwcyyhgvaKU/T0fW8CcBRFI/AAAAAAAAAME/Pdazfv2op3E/s320/WP_000001.jpg" alt="Robot"&gt;  &lt;span class="caption"&gt;The robot&lt;/span&gt; &lt;/a&gt; &lt;a class="image" style="width:180px" href="http://4.bp.blogspot.com/-6bhuRvKXlU8/T0fW6se4Y2I/AAAAAAAAAL4/3QSw2SIK20I/s1600/WP_000002.jpg"&gt;  &lt;img style="width:180px" src="http://4.bp.blogspot.com/-6bhuRvKXlU8/T0fW6se4Y2I/AAAAAAAAAL4/3QSw2SIK20I/s240/WP_000002.jpg" alt="Robot and various pieces packed up into a wooden crate"&gt;  &lt;span class="caption"&gt;Crated up&lt;/span&gt; &lt;/a&gt;&lt;/div&gt;&lt;p&gt;The robot was shipped off to NYC on Wednesday!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/940794078373460235-7986926400959459005?l=team759.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://team759.blogspot.com/feeds/7986926400959459005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://team759.blogspot.com/2012/02/frc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/7986926400959459005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/7986926400959459005'/><link rel='alternate' type='text/html' href='http://team759.blogspot.com/2012/02/frc.html' title='FRC'/><author><name>Eric</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-zvtGEqXEaNw/Tr2tvFebEII/AAAAAAAAAJE/jHRzALqr-Mc/s1600/logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-AwcyyhgvaKU/T0fW8CcBRFI/AAAAAAAAAME/Pdazfv2op3E/s72-c/WP_000001.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-940794078373460235.post-8402664530181420415</id><published>2011-12-07T21:57:00.001Z</published><updated>2011-12-11T15:22:10.759Z</updated><title type='text'>Sublime Text</title><content type='html'>&lt;p&gt;So our team was finding the IDE painful. The concept is great, and I can see it working for many people. We decided in the end that we would try to do everything off the cloud.&lt;/p&gt;&lt;h2&gt;Problems&lt;/h2&gt;&lt;dl&gt; &lt;dt&gt;Compatibility&lt;/dt&gt; &lt;dd&gt;  The IDE doesn't work in IE9 (through no fault of Student Robotics, I hasten to add). Our school uses IE9. As a result, we have to use Firefox, which technically we're not allowed to run on a school computer. It wasn't ideal, but it worked. &lt;/dd&gt; &lt;dt&gt;Speed&lt;/dt&gt; &lt;dd&gt;  Building and deploying a zip is a 20 second operation. It wasn't helped by the insistence of 50 supposed errors, all of which executed correctly on the controller. But I digress. This wass bearable, but wasted a lot of time. &lt;/dd&gt; &lt;dt&gt;Restricted git access&lt;/dt&gt; &lt;dd&gt;  Git is awesome. Git through the IDE is nothing special. We were having problems with concurrent editing of the same file, resulting in changes being overwritten without anyone knowing. Cue &lt;code&gt;git merge&lt;/code&gt;. Once again, we'd like to stress how awesome it was for &lt;a href="https://www.studentrobotics.org/docs/programming/git_repositories"&gt;Student Robotics to give direct git access&lt;/a&gt; &lt;/dd&gt;&lt;/dl&gt;&lt;h2&gt;An editor&lt;/h2&gt;&lt;p&gt;So what are we writing out code in now? &lt;a href="www.sublimetext.com/2"&gt;Sublime Text 2&lt;/a&gt;. It's a little known text editor, with some great features, including autocomplete (a programmers best friend), and a useful python plugin API. It's about on par with Notepad++, comes in a portable edition, and works on windows and linux. You can use it for free, but a license is suggested for extended use.&lt;/p&gt;&lt;h2&gt;Setting up the editor&lt;/h2&gt;&lt;ol&gt; &lt;li&gt;Install and run Sublime Text 2&lt;/li&gt; &lt;li&gt;  Install the &lt;a href="http://wbond.net/sublime_packages/package_control"&gt;Sublime Package Manager&lt;/a&gt;  &lt;ol&gt;   &lt;li&gt;Push &lt;kbd&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;'&lt;/kbd&gt;&lt;/kbd&gt; to bring up the python console&lt;/li&gt;   &lt;li&gt;Running the following in the console:    &lt;pre&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;pf&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'Package Control.sublime-package'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;ipp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sublime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;installed_packages_path&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;makedirs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ipp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ipp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ipp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;pf&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="s"&gt;'wb'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'http://sublime.wbond.net/'&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;pf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;'%20'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;   &lt;/li&gt;   &lt;li&gt;Restart Sublime Text 2 to complete the installation&lt;/li&gt;  &lt;/ol&gt; &lt;/li&gt; &lt;li&gt;  Locate the Student Robotics plugin  &lt;ol&gt;   &lt;li&gt;Push &lt;kbd&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;Shift&lt;/kbd&gt;+&lt;kbd&gt;P&lt;/kbd&gt;&lt;/kbd&gt; to bring up the Quick Panel&lt;/li&gt;   &lt;li&gt;Select "Package Control: Add Repository"&lt;/li&gt;   &lt;li&gt;Enter &lt;code&gt;https://github.com/eric-wieser/sublime-student-robotics&lt;/code&gt; into the box at the bottom&lt;/li&gt;  &lt;/ol&gt; &lt;/li&gt; &lt;li&gt;  Install plugins  &lt;ol&gt;   &lt;li&gt;Bring up the quick panel again, and select "Package Control: Install Package"&lt;/li&gt;   &lt;li&gt;Install &lt;code&gt;sublime-student-robotics&lt;/code&gt; and &lt;code&gt;sublimelint&lt;/code&gt;  &lt;/ol&gt; &lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Bringing it together&lt;/h2&gt;&lt;p&gt;So you've cloned your repository to your hard drive. Now open Sublime Text, and drag your project folder onto it - it'll open in the sidebar. You can open files by expanding the folder in the sidebar. When you're ready to deploy, open the quick panel (&lt;kbd&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;Shift&lt;/kbd&gt;+&lt;kbd&gt;P&lt;/kbd&gt;&lt;/kbd&gt;), and select "Student Robotics: Deploy Zip". That's it. The zip will go on the usb drive very quickly.&lt;/p&gt;&lt;div class="images"&gt; &lt;a class="image" style="width: 320px" href="http://3.bp.blogspot.com/-Bh09dAc9_E0/TuTInllOJgI/AAAAAAAAAK0/ZOO95jzQFDk/s1600/sublime-text-empty.png"&gt;  &lt;img height="240" width="320" src="http://3.bp.blogspot.com/-Bh09dAc9_E0/TuTInllOJgI/AAAAAAAAAK0/ZOO95jzQFDk/s320/sublime-text-empty.png" /&gt;  &lt;span class="caption"&gt;A new window&lt;/span&gt; &lt;/a&gt; &lt;a class="image" style="width: 320px" href="http://1.bp.blogspot.com/-KFXKNxEMX0Y/TuTIoOjqp-I/AAAAAAAAALA/zxWsRt_Ahvc/s1600/sublime-text-open.png"&gt;  &lt;img height="240" width="320" src="http://1.bp.blogspot.com/-KFXKNxEMX0Y/TuTIoOjqp-I/AAAAAAAAALA/zxWsRt_Ahvc/s320/sublime-text-open.png" /&gt;  &lt;span class="caption"&gt;File opened&lt;/span&gt; &lt;/a&gt; &lt;a class="image" style="width: 320px" href="http://4.bp.blogspot.com/-b4l7gMD4qTI/TuTIoR6I2kI/AAAAAAAAALQ/deEZRybzLW8/s1600/sublime-text-quickpanel.png"&gt;  &lt;img height="240" width="320" src="http://4.bp.blogspot.com/-b4l7gMD4qTI/TuTIoR6I2kI/AAAAAAAAALQ/deEZRybzLW8/s320/sublime-text-quickpanel.png" /&gt;  &lt;span class="caption"&gt;Quick Panel&lt;/span&gt; &lt;/a&gt; &lt;a class="image" style="width: 320px" href="http://2.bp.blogspot.com/-dvixWiOu_4k/TuTIo6AQrXI/AAAAAAAAALc/lo0IzE5XGEU/s1600/sublime-text-deploy.png"&gt;  &lt;img border="0" height="240" width="320" src="http://2.bp.blogspot.com/-dvixWiOu_4k/TuTIo6AQrXI/AAAAAAAAALc/lo0IzE5XGEU/s320/sublime-text-deploy.png" /&gt;  &lt;span class="caption"&gt;Deployment menu&lt;/span&gt; &lt;/a&gt;&lt;/div&gt;&lt;h2&gt;Caveats&lt;/h2&gt;&lt;p&gt;Be aware that this approach has its drawbacks. First and foremost, we cannot (yet) guarantee that the code deployed by our plugin is the most recent version. You might be running an outdated version of the Student Robotics library.&lt;/p&gt;&lt;p&gt;You've also got to be careful with git. While it gives you more freedom, it also gives you more ways to give yourself a headache. Direct git access doesn't give you total immunity to concurrent editing. We managed to screw things up horribly at the tech day&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/940794078373460235-8402664530181420415?l=team759.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://team759.blogspot.com/feeds/8402664530181420415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://team759.blogspot.com/2011/12/sublime-text.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/8402664530181420415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/8402664530181420415'/><link rel='alternate' type='text/html' href='http://team759.blogspot.com/2011/12/sublime-text.html' title='Sublime Text'/><author><name>Eric</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-zvtGEqXEaNw/Tr2tvFebEII/AAAAAAAAAJE/jHRzALqr-Mc/s1600/logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Bh09dAc9_E0/TuTInllOJgI/AAAAAAAAAK0/ZOO95jzQFDk/s72-c/sublime-text-empty.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-940794078373460235.post-5645152482467281841</id><published>2011-12-04T19:54:00.001Z</published><updated>2011-12-04T22:12:20.345Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='movement'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='code-snippets'/><title type='text'>Turning your robot into a remote control car</title><content type='html'>&lt;p&gt;Sure, writing code is fun. But sometimes, you just want to drive the thing around yourself. Well, it turns out that that's well within reach. All you need is a wireless USB keyboard. You'll need to grab the &lt;code&gt;TwoWheeledRobot&lt;/code&gt; class from &lt;a href="http://team759.blogspot.com/2011/11/driving-around.html"&gt;this post&lt;/a&gt;, and put it into a new file, "systemetric.py". Then, you can run this code:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;systemetric&lt;/span&gt;&lt;br /&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;gtk&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="n"&gt;R&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;systemetric&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TwoWheeledRobot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="c"&gt;# Monitor ALL THE KEYS!&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&lt;br /&gt;    &lt;span class="sd"&gt;"""Called whenever the state of the keyboard changes"""&lt;/span&gt;&lt;br /&gt;     &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;steer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;    &lt;span class="c"&gt;# Handle forwards / backwards&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keysyms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Up&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keysyms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Down&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;    &lt;span class="c"&gt;# Handle steering&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keysyms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;steer&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keysyms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Right&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;steer&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;    &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;steer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="c"&gt;# Define an event handler for when a key is pressend&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;key_press_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keyval&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span class="c"&gt;# And one for when it is released&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;key_release_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keyval&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="c"&gt;# Create a window, bind the event handlers to it, and show it&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WINDOW_TOPLEVEL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"key_press_event"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key_press_event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"key_release_event"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key_release_event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="c"&gt;#Show the GUI&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;When you run it on the robot, a window will pop up, obscuring the logs screen. Armed with your wireless keyboard, you can now drive your robot using the arrow keys!&lt;/p&gt;&lt;p&gt;You may have seen us at the start of the tech day driving the robot around with this. It was a lot of fun.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/940794078373460235-5645152482467281841?l=team759.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://team759.blogspot.com/feeds/5645152482467281841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://team759.blogspot.com/2011/12/turning-your-robot-into-remote-control.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/5645152482467281841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/5645152482467281841'/><link rel='alternate' type='text/html' href='http://team759.blogspot.com/2011/12/turning-your-robot-into-remote-control.html' title='Turning your robot into a remote control car'/><author><name>Eric</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-zvtGEqXEaNw/Tr2tvFebEII/AAAAAAAAAJE/jHRzALqr-Mc/s1600/logo.png'/></author><thr:total>0</thr:total><georss:featurename>University of Southampton, University Rd, Southampton, Hampshire SO17 1BJ, UK</georss:featurename><georss:point>50.9151826 -1.3996974</georss:point><georss:box>50.8751386 -1.4786614 50.9552266 -1.3207334</georss:box></entry><entry><id>tag:blogger.com,1999:blog-940794078373460235.post-6910357554963769134</id><published>2011-11-26T22:56:00.001Z</published><updated>2011-11-26T23:07:39.039Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='code-snippets'/><title type='text'>Tweaking variables while code is running</title><content type='html'>&lt;p&gt;So our robot uses a PID controller to maintain its heading. But this needs tuning. Rather than change a single number in the code, then redownload over and over again, we decided to make a GUI&lt;/p&gt;&lt;p&gt;Here's some simple(ish) code that should allow you to drive your robot forward and backwards just by using the knobs on the front of the controller:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pygtk&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;pygtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'2.0'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;gtk&lt;/span&gt;&lt;br /&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sr&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ManualControlWindow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;onChanged&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;speedRange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Adjustment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;br /&gt;            &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;br /&gt;            &lt;span class="n"&gt;lower&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br /&gt;            &lt;span class="n"&gt;upper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br /&gt;            &lt;span class="n"&gt;step_incr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;br /&gt;        &lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;	&lt;br /&gt;        &lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WINDOW_TOPLEVEL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_border_width&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class="n"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HScale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;speedRange&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_digits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_size_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;320&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'value-changed'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;adj&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;onChanged&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;speedRange&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;gtk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="n"&gt;R&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Robot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;whenSliderMovedTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;motors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;motors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;br /&gt;		&lt;br /&gt;&lt;span class="n"&gt;gui&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ManualControlWindow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Adjust robot speed'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;whenSliderMovedTo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;gui&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/940794078373460235-6910357554963769134?l=team759.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://team759.blogspot.com/feeds/6910357554963769134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://team759.blogspot.com/2011/11/tweaking-variables-while-code-is.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/6910357554963769134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/6910357554963769134'/><link rel='alternate' type='text/html' href='http://team759.blogspot.com/2011/11/tweaking-variables-while-code-is.html' title='Tweaking variables while code is running'/><author><name>Eric</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-zvtGEqXEaNw/Tr2tvFebEII/AAAAAAAAAJE/jHRzALqr-Mc/s1600/logo.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-940794078373460235.post-501050007760373836</id><published>2011-11-14T16:30:00.000Z</published><updated>2011-11-15T19:59:21.791Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='videos'/><category scheme='http://www.blogger.com/atom/ns#' term='milestones'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>First intelligent movement!</title><content type='html'>&lt;p&gt;We've got it following a cube! Check out the video:&lt;/p&gt;&lt;div class="video"&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/-CHinoO_9hw" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;Features:&lt;/p&gt;&lt;ul&gt;    &lt;li&gt;Compass-controlled robot orientation&lt;/li&gt;    &lt;li&gt;Kill switch with libkoki marker 0, seen at end of video&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/940794078373460235-501050007760373836?l=team759.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://team759.blogspot.com/feeds/501050007760373836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://team759.blogspot.com/2011/11/first-intelligent-movement.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/501050007760373836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/501050007760373836'/><link rel='alternate' type='text/html' href='http://team759.blogspot.com/2011/11/first-intelligent-movement.html' title='First intelligent movement!'/><author><name>Eric</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-zvtGEqXEaNw/Tr2tvFebEII/AAAAAAAAAJE/jHRzALqr-Mc/s1600/logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/-CHinoO_9hw/default.jpg' height='72' width='72'/><thr:total>0</thr:total><georss:featurename>Hills Road Sixth Form College</georss:featurename><georss:point>52.188125 0.1362187</georss:point><georss:box>52.168656 0.0967367 52.207594 0.1757007</georss:box></entry><entry><id>tag:blogger.com,1999:blog-940794078373460235.post-2621702197622658237</id><published>2011-11-13T09:23:00.001Z</published><updated>2011-11-13T09:24:46.572Z</updated><title type='text'>The lathe</title><content type='html'>&lt;p&gt;So during this saturdays meeting, our mentor brought in a lathe&lt;/p&gt;&lt;a href="http://4.bp.blogspot.com/-cgQBT3XrZ9s/Tr-MU_erBOI/AAAAAAAAAKk/wHeerWSZvMw/s1600/IMG_20111112_151333.jpg" imageanchor="1" style=""&gt;&lt;img border="0" height="240" width="320" src="http://4.bp.blogspot.com/-cgQBT3XrZ9s/Tr-MU_erBOI/AAAAAAAAAKk/wHeerWSZvMw/s320/IMG_20111112_151333.jpg" /&gt;&lt;/a&gt;&lt;p&gt;Lathing ensued.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/940794078373460235-2621702197622658237?l=team759.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://team759.blogspot.com/feeds/2621702197622658237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://team759.blogspot.com/2011/11/lathe.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/2621702197622658237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/2621702197622658237'/><link rel='alternate' type='text/html' href='http://team759.blogspot.com/2011/11/lathe.html' title='The lathe'/><author><name>Eric</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-zvtGEqXEaNw/Tr2tvFebEII/AAAAAAAAAJE/jHRzALqr-Mc/s1600/logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-cgQBT3XrZ9s/Tr-MU_erBOI/AAAAAAAAAKk/wHeerWSZvMw/s72-c/IMG_20111112_151333.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-940794078373460235.post-1806553891585165237</id><published>2011-11-12T21:47:00.001Z</published><updated>2011-11-12T21:48:04.405Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='code-snippets'/><title type='text'>The importance of classes, and finding tokens</title><content type='html'>&lt;p&gt;Classes are what makes code tidy, readable, and maintainable. We've been going through a cycle of writing some tests, testing the tests, fixing the tests, testing the fixed tests, then wrapping the code all up in a class. This usually prompts further testing, but it pays off in the end by making the rest of your code easier to write. Here's our most recent piece of code:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sr&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;&lt;br /&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt;&lt;br /&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;systemetricRobot&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SystemetricRobot&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;R&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SystemetricRobot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;        &lt;span class="c"&gt;# Make sure the robot is still to prevent motion blur&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class="c"&gt;#Get only the tokens&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;allMarkers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;see&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;markers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;marker&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;allMarkers&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;marker_type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;MARKER_TOKEN&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;br /&gt;        &lt;br /&gt;        &lt;span class="c"&gt;# Are there any tokens?&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;markers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;            &lt;span class="c"&gt;#Get the angle of the token&lt;/span&gt;&lt;br /&gt;            &lt;span class="n"&gt;angle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;markers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;centre&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;polar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rot_y&lt;/span&gt;&lt;br /&gt;            &lt;br /&gt;            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;"Marker seen at: "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;angle&lt;/span&gt;&lt;br /&gt;            &lt;br /&gt;            &lt;span class="c"&gt;# Turn if we're more than 5 degrees off&lt;/span&gt;&lt;br /&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fabs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;angle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;                &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rotateBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;angle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;br /&gt;            &lt;span class="c"&gt;# Drive forward almost the distance to the marker&lt;/span&gt;&lt;br /&gt;            &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;driveDistance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;markers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dist&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;"No Marker..."&lt;/span&gt;&lt;br /&gt;            &lt;br /&gt;            &lt;span class="c"&gt;# Spin 20 degrees clockwise&lt;/span&gt;&lt;br /&gt;            &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rotateBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;By defining methods such as &lt;code&gt;rotateBy&lt;/code&gt;, &lt;code&gt;driveDistance&lt;/code&gt;, and &lt;code&gt;stop&lt;/code&gt;, we've hidden the complexities of the compass code away in the background. &lt;code&gt;systemetric.Robot&lt;/code&gt;, along with &lt;code&gt;CompassRobot&lt;/code&gt;, and &lt;code&gt;TwoWheeledRobot&lt;/code&gt;, do all the "heavy" lifting.&lt;/p&gt;&lt;p&gt;All in all, lots of functionality, with minimal code.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/940794078373460235-1806553891585165237?l=team759.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://team759.blogspot.com/feeds/1806553891585165237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://team759.blogspot.com/2011/11/importance-of-classes-and-finding.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/1806553891585165237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/1806553891585165237'/><link rel='alternate' type='text/html' href='http://team759.blogspot.com/2011/11/importance-of-classes-and-finding.html' title='The importance of classes, and finding tokens'/><author><name>Eric</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-zvtGEqXEaNw/Tr2tvFebEII/AAAAAAAAAJE/jHRzALqr-Mc/s1600/logo.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-940794078373460235.post-3575245864329475866</id><published>2011-11-12T19:00:00.000Z</published><updated>2012-03-03T11:46:01.639Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='code-snippets'/><title type='text'>The kill switch</title><content type='html'>&lt;p&gt;The robot is going to do things you don't want it to do - like spin around on the spot really fast, or make a very irritating motor whine. You can turn it off with the switch, but this is boring, and also requires the controller to be restarted.&lt;/p&gt;&lt;p&gt;What if, we thought, the robot stopped when it saw a special marker? We can just stop the motors, and leave the robot in a state where we can happily pull out the USB drive, change the code, and plug it back in. How? Simply by intercepting calls to &lt;code&gt;Robot.see&lt;/code&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sr&lt;/span&gt;&lt;br /&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="n"&gt;DIE_HORRIBLY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="c"&gt;# The kill marker&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;KillableRobot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TwoWheeledRobot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;see&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;markers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Robot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;see&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;markers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;DIE_HORRIBLY&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;                &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c"&gt;#stop both the motors&lt;/span&gt;&lt;br /&gt;                &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;                &lt;br /&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;markers&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;By using &lt;code&gt;KillableRobot&lt;/code&gt; instead of &lt;code&gt;TwoWheeledRobot&lt;/code&gt;, the robot will exit if it sees the kill marker whenever the camera is used.  This makes the text-fix-redeploy cycle much faster, as there is no reboot step. If you're really lazy, you can (we did) stick the marker on a pole, so you can stop the robot without even bending down.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/940794078373460235-3575245864329475866?l=team759.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://team759.blogspot.com/feeds/3575245864329475866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://team759.blogspot.com/2011/11/kill-switch.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/3575245864329475866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/3575245864329475866'/><link rel='alternate' type='text/html' href='http://team759.blogspot.com/2011/11/kill-switch.html' title='The kill switch'/><author><name>Eric</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-zvtGEqXEaNw/Tr2tvFebEII/AAAAAAAAAJE/jHRzALqr-Mc/s1600/logo.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-940794078373460235.post-5839648046114959199</id><published>2011-11-11T23:21:00.001Z</published><updated>2011-11-12T18:26:45.355Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='kittens'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Use pretty colours!</title><content type='html'>&lt;p&gt;Why, hello there, new blog.&lt;/p&gt;&lt;p&gt;If you (the reader, being in some way related to Student Robotics) plan on writing blog entries involving some code, use syntax highlighting! Every time code is typeset in the same monotonous colour when different colours could be used, a kitten dies.&lt;/p&gt;&lt;p&gt;Note the difference in readability:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;def quicksort(l):&lt;br /&gt;    '''Do some funky recursive sorting'''&lt;br /&gt;    if len(l) &amp;lt;= 1:&lt;br /&gt;        return l&lt;br /&gt;    less = []&lt;br /&gt;    greater = []&lt;br /&gt;    pivot = l.pop(randint(1, len(l)-1))&lt;br /&gt;    for x in l:&lt;br /&gt;        if x &amp;lt;= pivot:&lt;br /&gt;            less += [x]&lt;br /&gt;        else:&lt;br /&gt;            greater += [x]&lt;br /&gt;    return quicksort(less) + [pivot] + quicksort(greater)&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;quicksort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;    &lt;span class="sd"&gt;'''Do some funky recursive sorting'''&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;less&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;greater&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;pivot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;pivot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;            &lt;span class="n"&gt;less&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;            &lt;span class="n"&gt;greater&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;quicksort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;less&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pivot&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;quicksort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;greater&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;One of the best tools I've found for this mighty task is&amp;nbsp;&lt;a href="http://pygments.org/"&gt;pygments&lt;/a&gt;. Use it. Use it for the kittens.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/940794078373460235-5839648046114959199?l=team759.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://team759.blogspot.com/feeds/5839648046114959199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://team759.blogspot.com/2011/11/use-pretty-colours.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/5839648046114959199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/5839648046114959199'/><link rel='alternate' type='text/html' href='http://team759.blogspot.com/2011/11/use-pretty-colours.html' title='Use pretty colours!'/><author><name>Louis</name><uri>http://www.blogger.com/profile/00651381729354966351</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-940794078373460235.post-5809046307274852495</id><published>2011-11-10T06:05:00.000Z</published><updated>2011-12-11T15:43:54.611Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='code-snippets'/><title type='text'>Adding a compass</title><content type='html'>&lt;p&gt;So we managed to get hold of a compass a couple of days ago. It gets us the heading of the to 0.1°. It's an I²C sensor, which the SR kit doesn't supply an interface for. Not a problem - we have an mbed!&lt;/p&gt;&lt;div class="images"&gt; &lt;a class="image" href="http://www.sparkfun.com/products/7915"&gt;  &lt;img width="240" alt="HMC 6352 Compass Sensor" src="http://1.bp.blogspot.com/-kOl0NExQt6g/Tr7z2kjWdqI/AAAAAAAAAKY/fhXjhGwUD0o/s320/07915-01%255B1%255D.jpg"&gt;  &lt;span class="caption"&gt;The compass&lt;/span&gt; &lt;/a&gt; &lt;a class="image" href="http://mbed.org/"&gt;  &lt;img style="width:240px" src="http://dlnmh9ip6v2uc.cloudfront.net/images/products/09564-05.jpg" alt="mbed microcontroller"&gt;  &lt;span class="caption"&gt;The mbed&lt;/span&gt; &lt;/a&gt;&lt;/div&gt;&lt;p&gt;Simply by connecting the compass to the mbed, and the mbed to the USB hub, we can use &lt;code&gt;pyserial&lt;/code&gt; to send the compass heading!&lt;/p&gt;&lt;p&gt;Here's the class to use the compass from python&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;serial&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Compass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'/dev/ttyACM0'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serial&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Serial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;br /&gt;            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Cannot connect to mbed'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="nd"&gt;@property&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="sd"&gt;'''Get the compass heading from the mbed'''&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;heading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'H'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;span class="n"&gt;heading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readline&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;10.0&lt;/span&gt; &lt;span class="c"&gt;#convert the int we get from the mbed into a float.&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;'Invalid reading ('&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;') from compass'&lt;/span&gt;&lt;br /&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'nan'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;#return NaN, because we don't know the heading&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;startCalibration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'C'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;stopCalibration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'C'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And here's what we're running on the mbed:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;span class="cp"&gt;#include "HMC6352.h"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="n"&gt;HMC6352&lt;/span&gt; &lt;span class="n"&gt;compass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;Serial&lt;/span&gt; &lt;span class="n"&gt;robo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;USBTX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;USBRX&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="c1"&gt;//robo.printf("1101\n");//8 byte handshake&lt;/span&gt;&lt;br /&gt;    &lt;span class="c1"&gt;//Continuous mode, periodic set/reset, 20Hz measurement rate.&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;compass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setOpMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HMC6352_CONTINUOUS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;robo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getc&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'H'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span class="n"&gt;robo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;compass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&lt;br /&gt;        &lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'C'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span class="n"&gt;compass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setCalibrationMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'E'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;span class="n"&gt;robo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getc&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;br /&gt;            &lt;span class="n"&gt;compass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setCalibrationMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'C'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;br /&gt;        &lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;    &lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Still to come - actually using the compass.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/940794078373460235-5809046307274852495?l=team759.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://team759.blogspot.com/feeds/5809046307274852495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://team759.blogspot.com/2011/11/adding-compass.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/5809046307274852495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/5809046307274852495'/><link rel='alternate' type='text/html' href='http://team759.blogspot.com/2011/11/adding-compass.html' title='Adding a compass'/><author><name>Eric</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-zvtGEqXEaNw/Tr2tvFebEII/AAAAAAAAAJE/jHRzALqr-Mc/s1600/logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-kOl0NExQt6g/Tr7z2kjWdqI/AAAAAAAAAKY/fhXjhGwUD0o/s72-c/07915-01%255B1%255D.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-940794078373460235.post-916579998098253930</id><published>2011-11-06T22:31:00.000Z</published><updated>2012-02-24T17:54:30.402Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='code-snippets'/><title type='text'>Driving Around</title><content type='html'>&lt;p&gt;Let's be honest, the SR API is not the easiest way to drive a robot around. You've got to remember which motor is 0 and which is 1, and there that &lt;code&gt;.target&lt;/code&gt;, which frankly is all you could possibly mean anyway. We decided to write a class to make things easy. This is what we're using:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sr&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TwoWheeledRobot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Robot&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="c"&gt;#Make sure the soton class is initiated, so we can connect to motors&lt;/span&gt;&lt;br /&gt;        &lt;span class="n"&gt;Robot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;        &lt;br /&gt;        &lt;span class="c"&gt;#Name the motors, for easy access&lt;/span&gt;&lt;br /&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;leftMotor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;motors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;br /&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rightMotor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;motors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;br /&gt;        &lt;br /&gt;    &lt;span class="nd"&gt;@property&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;left&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="sd"&gt;'''Property to control the speed of the left motor, without the hassle of `.target`'''&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;leftMotor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;br /&gt;        &lt;br /&gt;    &lt;span class="nd"&gt;@left.setter&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;left&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isnan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;leftMotor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;br /&gt;        &lt;br /&gt;    &lt;span class="nd"&gt;@property&lt;/span&gt;  &lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;right&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="sd"&gt;'''Property to control the speed of the right motor, without the hassle of `.target`'''&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rightMotor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;br /&gt;        &lt;br /&gt;    &lt;span class="nd"&gt;@right.setter&lt;/span&gt;    &lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;right&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isnan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rightMotor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="sd"&gt;'''Stop the robot, by setting the speed of both motors to 0'''&lt;/span&gt;&lt;br /&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;br /&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;br /&gt;        &lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;steer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="sd"&gt;'''Drive the robot forwards or backwards at a certain speed, with an optional steer'''&lt;/span&gt;&lt;br /&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;steer&lt;/span&gt;&lt;br /&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;steer&lt;/span&gt;&lt;br /&gt;        &lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;turn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="sd"&gt;'''Rotate the robot at a certain speed. Positive is clockwise'''&lt;/span&gt;&lt;br /&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt;&lt;br /&gt;        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;speed&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;How do you use this, you ask? Simple! Connect your left and right motors to motor boards 0 and 1, copy the above code into &lt;code&gt;twowheeledrobot.py&lt;/code&gt;, and then use it:&lt;/p&gt;&lt;pre class="brush:python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;twowheeledrobot&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TwoWheeledRobot&lt;/span&gt;&lt;br /&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="n"&gt;R&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TwoWheeledRobot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="c"&gt;# 50% speed forward&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;br /&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="c"&gt;# 25% speed turn clockwise&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;turn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="c"&gt;# Drive backwards at 25% power, with a slight curve to the right&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;speed&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;steer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;br /&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="c"&gt;# All the standard API calls still work&lt;/span&gt;&lt;br /&gt;&lt;span class="n"&gt;markers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;see&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note that your project will claim to contain errors in &lt;code&gt;twowheeledrobot.py&lt;/code&gt;. These are not errors - ignore them. The code will work perfectly on the controller&lt;/p&gt;&lt;p&gt;Using our code? Great! Let us know in the comments how well it's working for you.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/940794078373460235-916579998098253930?l=team759.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://team759.blogspot.com/feeds/916579998098253930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://team759.blogspot.com/2011/11/driving-around.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/916579998098253930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/916579998098253930'/><link rel='alternate' type='text/html' href='http://team759.blogspot.com/2011/11/driving-around.html' title='Driving Around'/><author><name>Eric</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-zvtGEqXEaNw/Tr2tvFebEII/AAAAAAAAAJE/jHRzALqr-Mc/s1600/logo.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-940794078373460235.post-1842150835755800785</id><published>2011-10-15T14:00:00.000+01:00</published><updated>2011-11-12T09:24:44.171Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='lego'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>A grabber design!</title><content type='html'>&lt;p&gt;We made a grabber. Out of lego.&lt;/p&gt;&lt;div class="images"&gt; &lt;a class="image" href="http://3.bp.blogspot.com/-RhAM9ItYuxo/Tr4xiZ_VDzI/AAAAAAAAAKE/VXMZZPVoyFg/s1600/IMG_20111015_144735.jpg"&gt;  &lt;img border="0" height="320" src="http://3.bp.blogspot.com/-RhAM9ItYuxo/Tr4xiZ_VDzI/AAAAAAAAAKE/VXMZZPVoyFg/s320/IMG_20111015_144735.jpg" width="240" /&gt;  &lt;span class="caption"&gt;Open&lt;/span&gt; &lt;/a&gt; &lt;a class="image" href="http://1.bp.blogspot.com/--tO5oSg4ScY/Tr4xiOME8UI/AAAAAAAAAJ0/VxyksfcYM9s/s1600/IMG_20111015_144716.jpg"&gt;  &lt;img border="0" height="320" src="http://1.bp.blogspot.com/--tO5oSg4ScY/Tr4xiOME8UI/AAAAAAAAAJ0/VxyksfcYM9s/s320/IMG_20111015_144716.jpg" width="240" /&gt;  &lt;span class="caption"&gt;Closed&lt;/span&gt; &lt;/a&gt; &lt;a class="image" href="http://1.bp.blogspot.com/-Q4aVJqYEdqg/Tr4xjaePt8I/AAAAAAAAAKM/nzxV5zYxrx0/s1600/IMG_20111015_144829.jpg"&gt;  &lt;img border="0" height="320" src="http://1.bp.blogspot.com/-Q4aVJqYEdqg/Tr4xjaePt8I/AAAAAAAAAKM/nzxV5zYxrx0/s320/IMG_20111015_144829.jpg" width="240" /&gt;  &lt;span class="caption"&gt;Lifting&lt;/span&gt; &lt;/a&gt;&lt;/div&gt;&lt;p&gt;It's a pretty awesome grabber. In one movement with one motor, it closes the claw, lifts the arm, and drops the cube at the top&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/940794078373460235-1842150835755800785?l=team759.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://team759.blogspot.com/feeds/1842150835755800785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://team759.blogspot.com/2011/10/grabber-design.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/1842150835755800785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/940794078373460235/posts/default/1842150835755800785'/><link rel='alternate' type='text/html' href='http://team759.blogspot.com/2011/10/grabber-design.html' title='A grabber design!'/><author><name>Eric</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/-zvtGEqXEaNw/Tr2tvFebEII/AAAAAAAAAJE/jHRzALqr-Mc/s1600/logo.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-RhAM9ItYuxo/Tr4xiZ_VDzI/AAAAAAAAAKE/VXMZZPVoyFg/s72-c/IMG_20111015_144735.jpg' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
