Sam Burden

Postdoc in EECS at Berkeley

skype: sburden
desk:  #13 in 337 Cory Hall
mail:  University of California at Berkeley
       205 Cory Hall
       Berkeley, CA 94720-1772
CV | Calendar | Papers | Talks | Code | Outreach

Brief bio

Sam Burden is a postdoc in EECS at UC Berkeley. He studies sensorimotor control with applications to robotics, neuromechanics, and human motor control.

Loading full site . . .

You must have JavaScript enabled.
Sam Burden - Postdoc in EECS at UC Berkeley; Asst Prof in EE at UW Seattle
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

Also see [[AdvancedOptions]]
<div class='header' role='banner' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
<div id='mainMenu' role='navigation' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' role='navigation' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' role='complementary' refresh='content' force='true' tiddler='SideBarTabs'></div>
<div id='displayArea' role='main'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected {color:[[ColorPalette::PrimaryDark]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
.readOnly {background:[[ColorPalette::TertiaryPale]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:alpha(opacity=60);}
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0; top:0;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0 3px 0 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0; padding-bottom:0;}

.fieldsetFix {border:0; padding:0; margin:1px 0px;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox where print preview displays the noscript content */
<div class='toolbar' role='navigation' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
The title of this post ought to be //Applying for a ''~Tenure-Track'' Faculty Position, ''in Control'', ''at a Research University in the USA''//.  My experience could be completely irrelevant if any of those modifiers don't apply to you.

I was recently hired in a tenure-track faculty position at an [[RU/VH university|]].  The application, interview, negotiation, and decision processes were each incredibly difficult.  I am very grateful for the extraordinary mentoring and assistance I received, and feel extremely fortunate for the outcome.  This post, analogous to my [[Applying-to-Grad-School]] brain dump, catalogues my experiences and summarizes my advice.

There are five basic steps in the process, as described in [[any|]] [[number|]] of [[similar|]] [[posts|]]:
# prepare materials
# apply to jobs
# prepare job talk
# interview
# negotiate
What this list fails to capture are the other tasks you should be completing in the year prior to applying; my version of the timeline looks more like:

-4. choose references
-3. attend job talks, get strategic advice about research trends
-2. line up post-doc / back-up plan 
-1. clear schedule from January through June 
0. network 
1. prepare materials 
2. apply to jobs
3. prepare job talk 
4. prepare for & execute interviews 
 . wait (patiently!)
5. negotiate 
 . decide (taking into account myriad factors)

Unintentionally, I did a "dry run" of steps (-4.) through (1.) in the year before I actually applied.  Personal circumstances were driving me toward an earlier-than-planned graduation, so I prepared a research and teaching statement, confirmed my list of letter writers, and compiled a spreadsheet of open faculty positions.  Fortunately my personal situation changed in October of that year and I aborted the application process.  Looking back, my materials wouldn't have had any traction on the job market.

However, the effort was not wasted: the experience dramatically improved my prospects by forcing me to focus over the next year on the most significant deficiencies in my application.  Specifically, I submitted two journal papers, thought critically about my research program in the context of the broader community, and took every available opportunity to network with people in my field (e.g. conferences, seminars, and grant meetings).  I suspect these efforts had a significant influence on obtaining interviews.

One of the most important factors in your career is who you work with.  Although, as I've heard some say, "big ideas do not arise in distributed brains", most of us benefit tremendously from our mentors and collaborators.  By the time you begin seriously considering your prospects on the academic track, you've probably already committed to an advisor, who will be your primary letter writer and the person others associate you most closely with in their minds.  But if you have even one or two years remaining in your ~PhD, you can still exert some influence over your final list of letter writers.  Remember:
Science is a sociological phenomenon.
Therefore your social connections will have a significant influence on your ability to conduct impactful science.  Expectations for letters vary by discipline, but for each application you'll need 3-5 letters.  You'd prefer that all five are well-known and well-regarded (not the same things) tenured faculty with whom you've published a journal paper.  Even better if at least one is outside your discipline (e.g. a collaborator on an application domain) and at least one is outside your university (particularly as a fresh ~PhD, this will help convince hiring committees that you have potential outside your current position).  Serendipity aside, to satisfy all these criteria you'll need to plan your ideal list of references years in advance, and take specific actions to ensure you've published with the right folks.  To choose between references (e.g. to select 3 of the 5 for an application that limits the number of letters), I'd defer to substantial interactions related to education or outreach.

Talk to everyone you can.  Ask about their trajectory, ask for their advice, and ask if they're happy.  

''Why do you want this job?''
Think hard about why you want a faculty position; people ''will'' ask, and they expect a better answer than "I like doing research".  The single best criteria in my opinion is the following:
Seek a faculty position if and only if you are convinced that your research community is missing a critical element that you are uniquely qualified to provide.
This is a bold statement, and requires a degree of arrogance I'm not typically comfortable owning.  When it was first presented to me in the 4th year of my ~PhD, I felt too insecure in my contributions and perspective to satisfy it.  Yet as I reflected on it while reading papers and attending talks, my confidence grew.  It turns out that arrogance, like all other skills, can be learned.  So long as you don't let this sense of superiority affect how you interact with others, I think cultivating this feeling can help you prepare psychologically for the rigors of academic life (rejection, rivalry, repetition, etc.).

''Where is your field going?''
Though it is possible to have impact through singular, //sui generis// contributions, most of us toil in crowded sub-sub-sub-fields.  Therefore to be successful, you will need to be aware of and responsive to trends, both in research and teaching.  This doesn't mean you must mindlessly track every fad.  But demonstrating (particularly willful) ignorance of where your field is headed is a sure way to eliminate your candidacy.  Also, for your own sake, you should be excited about ''some'' trends, otherwise you may find yourself isolated from your community in the future.

One of the best pieces of advice I received while preparing to apply for academic jobs:
Get a faculty position, then defer and do a post-doc.
You'll need a back-up plan in the event that you don't receive an appealing offer anyway.  Plus, there are many reasons that deferring an appealing position can be advantageous, particularly for a fresh ~PhD:
* publish your thesis work (and finish your thesis if needed!)
* write grant proposals
* plan your research program
It can also help smooth this major transition for your life and that of your family.  One major issue with meshing your career with that of your significant other is the high degree of uncertainty about where you'll end up and the abrupt transition when you get an offer.  If you're lucky enough to get a position, it may still be wise to take extra time if you need it; by all accounts you won't get a similar break until after tenure.

In my experience, institutions were completely open to a January start, and up to a year deferral (i.e. start the subsequent Fall) was workable.  Note as well that the tenure clock for most places is determined by the //calendar// year (not the //academic// year) when you start, so be aware of this when requesting your start date.  Ask about the possibility of obtaining a no-cost "affiliate" or "visiting" faculty position during the deferral period.  This may (or may not) grant you the ability to:
* submit grant proposals as a PI
* recruit ~PhD students
* spend your startup on equipment, furniture, renovations, travel, etc.

An important piece of advice I wish I'd taken more seriously:
Clear your schedule from January through June.  No deadlines, vacations, thesis drafts, life events, etc.
If you're invited for even a handful of interviews, easily two months of your life will be consumed by preparation and execution.  I met someone who went on ''18 interviews''!  They literally had one or two interviews per week from January through April.  I interviewed at six schools from February through April, and I found the schedule so grueling that I barely accomplished anything resembling research for that entire time interval.  Apologize to your friends and family in advance for your exhaustion and lack of availability.

I had a weeklong family vacation in mid-April that had been scheduled months in advance.  In hindsight it probably would have been more convenient to skip that trip, but it actually provided a nice rumination and rejuvenation period for both me and my wife.  I'd advise taking your vacations in December or June, but April did work out for me.

There's only one rule for building your professional network:
Take EVERY opportunity to meet and discuss your research with people in your field, whether at a conference, grant meeting, departmental colloquium, brown-bag lunch, group meeting, or chance encounter on an elevator/train/airplane/etc.
I cannot emphasize this point enough; it is absolutely critical that you invest substantial time and effort cultivating relationships within and around your field.  To be clear, your science must be rock-solid and your results impactful to be considered for a faculty position.  But the next highest-priority predictor of whether you are invited for an interview is if you personally know someone in the department who will advocate for your candidacy.  In my case, I knew of an advocate at every place I interviewed; if it wasn't someone I had met before, they were close with one of my letter writers.

In my first few years as a grad student, I was very aggressive about introducing myself to more senior people (grad students, post-docs, and faculty) whose work excited me.  This wasn't met with the overwhelmingly positive response I naïvely expected, so I assumed people were just not very friendly.  A few years later, when I finally worked up the courage to start introducing myself and announcing I was on the job market, the response was markedly different.  Everyone was friendly, willing to talk, and encouraging about applying to any open position in their department or school.

In hindsight, I realize that people aren't eager to take on an advising role for some random ~PhD student from another university.  They are, however, happy to receive one more high-quality application for any relevant position open in their university.  Therefore I believe a transition occurs 1-2yrs before earning your ~PhD, when people realize you may be a viable candidate; be conscious of when you cross this threshold, and squeeze it for all it's worth.

The structure and quality of application materials varies wildly.  
Read examples of “successful” application materials. Then forget almost everything about them.
Those applying as ~PhD students should invest more time and effort here, since there will typically be less of a track record (publications, successful projects) to refer to.  Regardless of the reality of the role your advisor or other senior collaborators played in guiding or conducting research with you, people (particularly outside your field) default to attributing the ideas and results to the most senior author on the paper.  You may hope that your letters of recommendation elucidate your contribution, but (i) you can't know that message is conveyed and (ii) the committee could remain unconvinced.  The application materials provide a critical opportunity to distinguish yourself from your research mentor(s) by proposing a novel and compelling research program.

Some other guidelines:
The committee will be more concerned with "what" you're trying to accomplish and "why"; it's usually obvious "how".
Try to focus more on the potential impact (on the field or society) than the technical approach.  Convince the reader (a) the program you're proposing is needed and (b) you're the right person to accomplish it.
This is a persuasive document; it's more convincing if you "show" rather than "tell".  
Don't "tell" the reader a particular technique or solution concept is important/useful/etc.  Instead, paint a picture that "shows" them its necessity.
Particularly as a fresh ~PhD, it's critical to establish yourself as an independent thinker with fresh ideas.
Be sure to propose "Future Work" or "Future Directions" that are clearly distinct from each of your letter writers.

It is surprisingly difficult to find relevant open positions.
There are many "job board" websites: some are multidisciplinary ([[AJO|]], [[Chronicle|]]), others are run by professional organizations ([[IEEE|]], [[ASME|]]), and there's a lot of redundancy across the sites, but in my case no single one of them had more than a third of the relevant positions I ultimately applied for.  To make matters worse, some schools won't advertise on these pages, so you also need to check individual University / College / Department websites.  The final confounding factor is that the advertisements are typically poor indications of what kind of researcher will ultimately fill the position.  Therefore it's ideal if you have an advocate inside every department you wish to apply to.  I avoided wasting time sending applications for several completely inappropriate positions simply by pinging a contact.

''A warning about multi-department / interdisciplinary / "experimental" positions:''
My work is interdisciplinary, bridging control theory, robotics, and biomechanics.  I eagerly sought positions that mirrored this diversity, for instance in cross-college institutes or joint appointments between applied math and engineering.  There are many variations on this theme, and they seem to be increasing in popularity.  There is one key question to answer about any "experimental" position: who grants tenure?  Unlike most departments, the answer to this question may be undecided or ill-defined.  I had the good fortune of interviewing for two positions at one school: one for a traditional position in a single department, and one for an "experimental" position.  Before the interviews, I was drawn to the "experimental" position.  Once I'd learned that this was the first position of its kind and the criteria for tenure hadn't been clearly defined or tested, I strongly preferred the traditional position.  Keep in mind that it is usually trivial to gain affiliation with interdisciplinary initiatives or programs once you have tenure in a home department.

!!!Job talk
There are many different strategies one can adopt when structuring the job talk. The particular style best suited to you will depend on the breadth and depth of your results, your research program, and your vision for the future. Therefore there is only one general piece of advice I can give.
Prepare a fantastic talk.
Also: build momentum early, and end on a high note; demonstrate your technical virtuosity, as well as your ability to engage an audience; be fanatical and fastidious about every detail; know your audience, and make them feel smart. 

Frustrated yet? The reality is that preparing and delivering technical presentations is a skill that, like any other, must be cultivated through dedicated effort. The amount of time and effort required will depend to an extent on innate ability, but everyone can always improve. Therefore my real advice is to prepare every talk as if it was a job talk.
Practice preparing fantastic talks well before your career depends on it.
Solicit honest feedback from your colleagues every time you give a talk. Experiment with different structures and delivery styles. Reflect on the structure and style of others.  Find ways to make yourself seem comfortable and sound natural.

Ideally, you will have several weeks to prepare for an interview and know well in advance who you will meet during your visit.  In reality, you will typically have 1 or 2 weeks to prepare for an interview and receive your final schedule 1 or 2 days in advance.  Spend as much time as you can researching potential collaborators, relevant laboratories / programs / initiatives / curriculum across campus, and tailoring your job talk to the audience.
Read several papers from every potential collaborator at the university.
It is critical that you are very familiar with the work of every potential collaborator within your department.  Not only is this information important for your decision should you receive an offer, demonstrating ignorance of someone with closely-related interests could easily kill your candidacy.  It is almost equally important that you are aware of the work of every potential collaborator from other departments at the university.   Strong interdisciplinary connections attract talent and funding, and furthermore this provides another opportunity for you to demonstrate your genuine enthusiasm for the prospect of joining the university.

Expect that on a typical interview day, you will be occupied from breakfast around 7:30am through the end of dinner around 10:30pm.
EVERY interaction is part of the interview.
The vast majority of my conversations were collegial, and seemed to be driven by genuine interest directed at learning more about me and my research program. Occasionally, someone would interject obvious interview-type questions that were overly specific or unreasonably adversarial. If you find yourself forced into a disagreement, do not cave simply to seem agreeable. You know what you are talking about, and if you hold your position it will leave an impression.  In these situations, I think it matters less what you say and more how you say it; remain calm and continue to convey confidence and enthusiasm. Most people will advise you not to drink anything; I didn't abstain entirely, though I was very conscientious about imbibing. 

In my year and in my area, I heard about offers going out as early as February and as late as June.  However, in my experience most offers come in March or April.  Although you are eager to consider any offer, you don't want any particular offer too early.
Push back the decision deadline as long as is reasonable.
Typically, you will initially be asked to give a final response within two weeks.  The Chair may be willing to push that deadline back by several weeks, but this cannot be guaranteed.  There may be less deadline pressure if the department is hiring multiple positions, but you cannot know the department's timing constraints.

I don't consider myself a skilled negotiator.  Fortunately, I found the "negotiation" process for academic jobs to be straightforward.  The Chair should already have a good idea of your needs from the interview; once the offer is extended, their job is to prepare details of an offer that sets you up to succeed in the department.
ALWAYS remain positive.  Get EVERYTHING in writing.
My preferred approach was to follow up every phonecall with a summary email comprised of phrases like "my understanding is that $X and Y sq. ft. will be available from my start date ..." and a clear next step / list of action items for both parties.  Though pedantic, this gives you a written record of the whole process, and (should) help quickly resolve any misunderstanding.

If you are fortunate enough to receive more than one job offer (academic or otherwise), you may have an incredibly difficult decision to make. I won't presume to provide advice about how to weigh the overwhelming array of personal and professional factors that contribute to this extremely important decision.  Good luck; I don't envy you!
After an extensive application/visit/decision process, I cataloged some of the information I gathered about the graduate school application process.  Toward the end of grad school, I took another look at this document.  Overall the advice seems sound in hindsight, but I've inserted some important edits and revisions.  I'm guessing there will be something here for everyone applying to ~PhD programs in engineering, and for those considering other types of programs (master's, or degrees in the physical sciences or humanities) to a lesser extent.

Ideally, you began thinking about graduate school during your freshman or sophomore year.  You chose to take hard courses, you got involved in research (and obtain funding for your work), and you performed well.  If you are lacking in one of these areas, it will hurt your application.  This is not because graduate programs expect you to possess a specific set of skills, but simply because you need to demonstrate exceptional interest and ability in academics to be considered at top programs.  There are incompetent people accepted and competent people rejected from good graduate programs; admissions committees make imperfect decisions using imperfect information.  //Your goal should be to give them no reason to throw your application away.//

A successful application contains the following components, in (roughly) increasing order of importance.  Items 1 through 4 are used principally to screen the majority of applicants.  Items 5 and 6 are used to decide among the remaining applicants.
* ''School-specific application.''  Each school's application is a little different, and it takes a surprising amount of time to enter the basic information into each.  Budget upwards of one hour per school to sign up and fill in this information.
* ''GRE Scores.''  Everyone has to take the general GRE, and it's fairly inconsequential.  Buy a study book and read it simply so you know the logistics of the exam (what material will be covered, what types of questions will be asked, how many of each type of section you will see.  Chances are you'll get a perfect 800 on the quantitative portion), since 20% of EE grad students do.  The verbal is trickier, and your time is best spent learning vocabulary.  If your programs require a particular subject test (e.g. Mathematics, Chemistry), you ought to study hard for it; scoring well will result in automatic or early admission to many programs and increase the likelihood that you will be awarded a fellowship.  Note that the subject tests are only administered a few times per year, and that desirable test times for the general exam will fill up well in advance of the test date, so schedule your exam as early as possible.  Ideally, you would take the subject test over the summer and the general exam in early fall.  Note that if you take the general exam after November, your score will not be considered for the NSF or NDSEG fellowships.
* ''Official Transcripts.''  Order these early, and if they're cheap, just send them to every school and fellowship you're considering.  It's not worth being rejected due to late transcripts.  As I mentioned earlier, you ought to have taken hard courses and performed well.
* ''Curriculum Vitae.''  If you've been applying for scholarships and research grants, you should already have this document.  Be more explicit and technical about any research or project experience.  Give full citations for any publications, including a URL if possible.  Specifically highlight any peer-reviewed publications.  LaTeX it for extra points.
* ''Personal Statement.''  If you've been applying for scholarships and grants, you should be relatively proficient at writing these.  It's best if you revise this document multiple times, and get many people to read it.  It's also best if you tailor the document to each program you apply to (''EDIT:'' specifically mention individual faculty and research projects you are particularly interested in).  It won't break your application if you don't do these things, but if you have any other weak points in your application, then you must have an extremely polished personal statement that addresses your weaknesses.  Your statement should be no longer than 2 pages and should address the following.
** What area do you want to get a ~PhD in?
** Why do you want to get a ~PhD in that area?
** Why do you want to get a ~PhD at this school?
** What makes you particularly well-suited and well-prepared to study in that field at that school?
* ''Letters of Recommendation.''  This is easily the most important component of your application.  You should have three letters from faculty who know you well.  Ideally, you have a letter from three leading professors in your field whom you have written papers with.  More realistically, you have one letter from a professor you have written a paper with, one letter from a professor or post-doc you have completed a project with (through a class or through research), and one letter from a professor you have had substantial interactions with (many classes, relevant extracurricular activities, teaching assistantship).  It will severely hurt your application if you do not have three strong letters, so diversify your efforts as an undergraduate:
** talk to many professors
** get involved in a variety of projects
** pursue collaborations with your current research
** apply for summer research programs at other universities
If you are applying to sufficiently varied programs (e.g. some Computer Engineering and some Bioengineering), it may be worthwhile to get different collections of professors to submit letters to different programs.

''Selecting Programs''
You should apply to as many programs as you can afford.  I applied to 10, I had a friend who applied to 11, and I've met a person who applied to 20.  I think 8 is a good number to aim for.  To select the programs, call upon your cumulative experience in your field.  Who are the leaders in your field?  Where have breakthroughs occurred in the past?  What programs are declining?  What programs are up-and-coming?  If you are applying to ~PhD programs in engineering, then four of the top five programs in your specific field are probably at MIT, Caltech, Berkeley, and Stanford, so plan to apply to those schools.  Even if you currently don't think you would want to go there, it's worthwhile to apply simply to visit, because these schools have almost certainly generated and harbored some of the preeminent thinkers in your discipline.  It's worth your time to have conversations with these people.

At this point, you may know what other programs you should apply to.  If not, consider your letter writers.  Where did they earn their ~PhD?  Where have they sent students recently?  Where are their colleagues?  Where have they recently given invited talks?  Apply the same reasoning to other top researchers in your field.  Give preference to the careers of younger faculty, as the programs that were good several decades ago may have declined in quality.

As a last effort, talk to other people.  It's best if you enter these conversations with a good idea about which programs you want to apply to, so you can avoid repetitive conversations ("Have you considered MIT?"; "MIT?  No, I've never even heard of it.  Is it a good school?").  Current graduate students can give you good personal information (how much each program pays, whether the neighboring city is fun to live in, how hard the students are expected to work) while faculty can give you good career information (who sends students to good faculty positions, who is close to retirement, who is likely to move, who is headed for administration, who has stopped going to conferences, who has stopped taking students).  However, you should realize that any information you obtain second-hand is inherently biased.  If you talk to enough people, you will surely be given conflicting information.

Note that you will have one (or at most two) faculty (co-)advisor(s) for your ~PhD. Consequently, you should select programs that have at least one faculty member you could see yourself working with.  If you want to apply to a particular school but don't see faculty with compatible research interests in your department, check the other departments.

''Selecting Fellowships''
If you are an engineer, you should apply for the NSF, NDSEG, and possibly the Hertz.  The NSF and NDSEG applications are essentially identical, except the NSF is due approximately one month before the NDSEG and generally two weeks before the first round of school applications.  Fill out these applications even if you don't have a strong research statement: the essays can be modified to become your personal statement for grad apps, and the process will make you more articulate when you talk to faculty during visit weekends.

''A word about the NSF''
It was not clear to me when I read the essay requirements, but "Broader Impacts" should constitute roughly half your proposal.  In my feedback from the NSF, I received top marks for the content of my research proposal, but poor ratings for my Broader Impacts statement.  If you want the fellowship, you will need to present strong arguments that your research will benefit (a) minority groups, (b) younger students, (c) society at large, and (d) the scientific community in general.  (''EDIT:'' I reworked my essay by devoting a much larger portion to "Broader Impacts" and received the fellowship as a first-year graduate student.)

''A word about the Hertz''
I would not recommend applying for the Hertz unless you are extremely confident in your abilities as a researcher.  I gave a terrible interview for the Hertz, and it was the most demoralizing part of my graduate application experience.  You are probably capable of earning a ~PhD at a top program, but if you botch an interview with a brilliant scientist, you may will be discouraged about your prospects for doing graduate-level research.  Since a significant portion of a ~PhD is earned through sheer determination, this is an unnecessarily challenging experience to have as you embark on graduate study.

Applying to graduate programs is expensive, particularly if you are simultaneously paying tuition and living expenses.  Anticipate paying \$100 per school (including the application fee, official transcripts, and GRE score reporting), in addition to \$150 per GRE exam.

With any luck, you will be admitted to many of the programs you apply to.  It is unlikely you will be admitted to every program, as there are many qualified applicants competing for a small number of positions.  But if you are admitted, you are typically guaranteed generous funding and invited to travel to the school on a (maybe partially) subsidized visit weekend.  These trips are your best opportunity to gather gut-level information about the school, so you should attend as many trips as is feasible.  There are certain kinds of information you can spend time gathering during a visit that will be more useful than others, so learn as much as you can about a program before visiting.  For instance, you can read about teaching, coursework, and qualifying exam requirements online, whereas you cannot so easily learn whether a particular professor is surly or frequently unavailable without talking to their students.

''Gathering Information''
Here is a list of the kind of information you should try to learn on a visit:
* Is the professor you want to work with accepting students?  Do their students perceive them as being readily available?  What kind of active grants do they have?  Is their advising style compatible with what you (think you) want?
* How often do students leave the program due to lack of funding?  Due to failing qualifying or preliminary exams?
* Where would you spend most of your time (i.e. after you are done with coursework)?  
Here is the kind of information you should know before you go on a visit:
* What are the coursework, teaching, and qualifying exam requirements?

''Faculty Conversations''
If the program is conscientious, they will schedule half-hour conversations between you and 4-8 faculty with similar interests to yours.  It is unlikely you will have one of these meetings with anyone known to the general public (henceforth referred to as //famous//), but you may be lucky enough to rope them into conversation over lunch or dinner.  I could not discern a recipe for making these conversations productive, except that I generally enjoyed conversations with faculty outside my field the most.  I found it more useful to read a faculty's review papers than their journal papers in advance of the conversations.  If you have a personal connection with a particular person (through your advisor, or through a particular project), bring it up.  The best conversations I had involved the faculty either telling me about current, unpublished, risky research, or candidly discussing other researchers in the field.  Keep in mind that these people will have dozens of conversations similar to the one they have with you, so anything you can do to make the conversation unique will be beneficial for both parties.  Finally, note that in engineering programs you've already been accepted to the program and the faculty are trying to recruit //you//, so most will try to convince you that their university provides the best and most interdisciplinary academic environment and that their city is the most exciting to live in.

Fortunately you should be reimbursed for the majority of your travel expenses, especially if you are visiting top programs at top schools.  Unfortunately this means you will need upwards of $2,000 to bankroll the trips.  If you are visiting a top program at an overall mediocre state school, be prepared to pay for your travel expenses.  Purchase refundable tickets if possible, as you may want to change your travel plans (for instance, if you are admitted to a more prestigious program after you buy the ticket).

There are many factors to consider when choosing which school you will attend, ranging from the critical to the fanciful:  research topics; research style; collaboration possibilities; relationship with your advisor; relationship with your peers; career potential; where you will live; who you will live with; what you will do for fun; weather; proximity to civilization; proximity to nature; proximity to family; proximity to your significant other; proximity to Europe; prestige of the program; prestige of your advisor; culture; East Coast versus West Coast; availability of good coffee or beer or sushi or ballet or bluegrass; average time to graduate; difficulty of qualifying exams; opportunities to teach, take courses, participate in intramural sports, or join clubs; quality of undergraduate program; quality of other graduate programs; architecture on campus; strength of campus athletics; school mascot and color palette.

The vast majority of these factors did not contribute to my final decision.  I made my decision by thinking about which research opportunity I was most excited about, and thought had the greatest potential for real progress and impact.  I currently believe that the most important factor that determines whether you will be a successful ~PhD student is your passion for research.  I claim that most other factors (the city you live in, the other people in your lab, your program requirements, even your research advisor) will have a smaller effect on your overall happiness than your satisfaction with the work you'll be doing.  I warn the reader that this perspective likely stems from the particulars of my personality and consequently I cannot recommend it for general consumption.  (''EDIT:'' Although I still endorse this attitude overall, in hindsight I will admit that while choosing I was in the fortunate position where the best research opportunities were also in areas with exceptionally high quality-of-life for graduate students.  The impact this had on my happiness and productivity during my ~PhD is significant.)

This section is provided as a reference for the time-sensitive information contained above.  Almost all graduate applications are due between December 15th and January 15th.  You need to take the GRE (general and, as applicable, subject) before December begins to have your scores considered for the NSF fellowship.  With any luck, you will travel nearly every weekend between late February and early April to visit schools; take a light courseload during Winter quarter to make this as painless as possible.  Your final decision must be rendered before April $15^{th}$; this is a common deadline for all ~PhD programs I am aware of.
* ''Summer'' Study for and take your GRE subject test.
* ''Sep.'' Secure your letter writers.
* ''Oct.'' Study for and take the GRE general exam.
* ''Nov.'' Select the schools you wish to apply to, write your NSF essays.
* ''Dec. 1'' Submit your NSF and Hertz applications, write your grad essays.
* ''Dec. 15'' Begin submitting school applications.
* ''Jan. 1'' Submit your NDSEG application.
* ''Jan.'' Sign up for a light courseload to make travel less taxing.
* ''Feb.'' Wait to hear back from your programs.
* ''March'' Visit your programs.
* ''April 15'' Make your final decision.
List of coursework completed & TA'd at Berkeley.

Helpful info & documents for ~PhD students preparing for the qual.
|''Description:''|Very incomplete BibTeX implementation to work with bibliographic references|
|''Author:''|Paulo Soares; some tweaks by sburden|
|''Documentation:''|[[BibTeXPlugin Documentation|BibTeXPluginDoc]]|
|''License:''|[[Creative Commons Attribution-Share Alike 3.0 License|]]|
if(!version.extensions.BibTeXPlugin) { //# ensure that the plugin is only installed once
version.extensions.BibTeXPlugin = {installed: true};

(function($) {
config.macros.cite = {
  noReference: "(??)",
  refreshTiddler: Story.prototype.refreshTiddler

config.macros.cite.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
  var pos, cmb = config.macros.bibliography;
  if(params.length==0) return;
  var entry = params[0];
  var args = paramString.parseParams(null,null,false);
  var title = getParam(args,"bibliography",null);
  if(title) {
    this.biblioTiddler = title;
  } else {title = this.biblioTiddler;}
  title = getParam(args,"thisBibliography",title);
  var format = getParam(args,"format",null);
  if(format) {
    this.format = format;
  } else {format = this.format;}
  format = getParam(args,"thisFormat",format);
  var argsArray = paramString.readMacroParams();
  var showAll = ($.inArray('showAll',argsArray) > -1);
  if(title && store.tiddlerExists(title)) var bib = cmb.extractEntry(title, entry);
  if(bib.content) {
    var entries = this.entries;
    if($.inArray(entry, entries)==-1) this.entries.push(entry);
    entries = this.entries;
    pos = $.inArray(entry, entries)+1;
    var author = cmb.processNames(bib.content.extract("author"), showAll);
    var year = bib.content.extract("year");
    var citation = format.replace("author", author);
    citation = citation.replace("year", year);
    citation = citation.replace("number", pos);
    wikify(citation, place);
  } else {
    wikify(this.noReference, place);

Story.prototype.refreshTiddler = function(title,template,force){
  config.macros.cite.biblioTiddler = null;
  config.macros.cite.format = "author (year)";
  config.macros.cite.entries = [];
  var tiddler = config.macros.cite.refreshTiddler.apply(this,arguments);
  return tiddler;

config.macros.bibliography = {
   article: {fields: ["author", "year", "title", "journal", "volume", "pages"], format: "author. title. //journal// volume:pages, (year)."}, 
   book: {fields: ["author", "year", "title", "publisher"], format: "author (year). //title//. publisher."},
   inproceedings: {fields: ["author", "year", "title", "booktitle"], format: "author. title. //booktitle//, year."},
   incollection: {fields: ["author", "year", "title", "editor", "booktitle", "pages", "publisher"], format: "author (year). title. In editor //booktitle//, pages. publisher."},
   techreport: {fields: ["author", "year", "title", "institution"], format: "author. title. institution, year."},
   manual: {fields: ["author", "year", "title", "organization"], format: "author (year). //title//. organization."},
   unpublished: {fields: ["author", "year", "title"], format: "author (year). //title//. Unpublished."}

config.macros.bibliography.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
        var cmc = config.macros.cite;
	var title = (cmc.biblioTiddler) ? cmc.biblioTiddler : params[0];
	if(!title || !store.tiddlerExists(title)) return;
        var argsArray = paramString.readMacroParams();
	var i, entryText;
	var entries = [];
	if($.inArray('showAll',argsArray) > -1) {
		entryText = this.extractAllEntries(title);
		for(i=0; i<entryText.length; i++) {
			entries[entries.length] = this.processEntry(entryText[i], i);
	} else if ( argsArray.length > 1 ) {
          for ( i=0; i < argsArray.length; i++) {
            entryText = this.extractEntry(title, argsArray[i]);
            if(entryText) {
              entries[entries.length] = this.processEntry(entryText, i);

        } else {
		for(i=0; i<cmc.entries.length; i++){
			entryText = this.extractEntry(title, cmc.entries[i]);
			if(entryText) {
                                entries[entries.length] = this.processEntry(entryText, i);
        wikify(entries[0] , place);
	for (i=1; i < entries.length; i++) {
		wikify("\n\n" + entries[i] , place);
	return true;

config.macros.bibliography.processNames = function(names, showAll) {
	var i, authors = names.split(" and ");
	var entry = authors[0];
	var numAuthors = authors.length;
	var fullEntry = entry;
	if (numAuthors==2) {
		entry += " and " + authors[1];
		fullEntry = entry;
	if (numAuthors>2) {
		fullEntry = entry;
		for (i=1; i < numAuthors; i++) {
			if (i==numAuthors-1) {fullEntry += " and "} else {fullEntry += ", "};
			fullEntry += authors[i];
		if(showAll) {entry = fullEntry;} else {entry += " et al.";}
	return entry;

config.macros.bibliography.processEntry = function(entry, pos) {
  var field, text=entry.content;
  var fields={};
  fields.number = pos+1;
  var type = this[entry.type];
  var output = type.format;
  for(var i=0; i<type.fields.length; i++){
    field = type.fields[i];
    case "author": = this.processNames(text.extract("author"), true);
    case "title":
      var url = text.extract("url");
      fields.title = text.extract("title");
      fields.title = (url=='') ? fields.title : "[[" + fields.title + "|" + url + "]]";
    case "editor":
      var editor = text.extract("editor");
      fields.editor = (editor=='') ? editor : this.processNames(editor,true) + " (Eds.), ";
      fields[field] = text.extract(field);
    output = output.replace(field, fields[field]);
  return output;

config.macros.bibliography.extractEntry = function(title,entry) {
    var bib = {type: null, content: null};
    var text = store.getTiddlerText(title);
    var re = new RegExp('\\s*@(\\w+?)\\{\\s*' + entry + '\\s*,\\s*(.[^@]+)\\}','mi');
    var field = text.match(re);
    if(field) {
        bib.type = field[1].toLowerCase();
        bib.content = field[2];
    return bib;

config.macros.bibliography.extractAllEntries = function(title) {
    var bib, field, entries = [];
    var text = store.getTiddlerText(title);
    var bibs = text.match(/\s*@(\w+?)\{\s*(.[^@]+)\}/mgi);
    for(var i=0; i<bibs.length; i++){
        bib = {type: null, content: null};
        if(field) {
            bib.type = field[1].toLowerCase();
            bib.content = field[2];
            if(bib.type!='string' && bib.type!='preamble' && bib.type!='comment') entries.push(bib);
    return entries;

config.macros.bibliography.extractField = function(field) {
    var text = "";
    var re = new RegExp('\\s*'+field+'\\s*=\\s*[\\{|"]\\s*(.+?)\\s*[\\}|"]','mi');
    var fieldText = this.match(re);
        text = fieldText[1].replace(/\{|\}/g,'');
        if(field!='url') text = text.replace(/-+/g,"—");
    return text;

String.prototype.extract = config.macros.bibliography.extractField;

config.shadowTiddlers.BibTeXPluginDoc="The documentation is available [[here.|]]";

[<img[Sam Burden|img/sam_burden_.png]]
!!!Sam Burden
I am currently a postdoc in Electrical Engineering and Computer Sciences at UC Berkeley.  In the Fall of 2015 I'll start as an Assistant Professor in Electrical Engineering at UW Seattle.

I study sensorimotor control in dynamic and dexterous robots, neuromechanics, and cyber-human systems. My postdoc advisor is (and PhD advisor was) [[Shankar Sastry|]], and I actively collaborate with [[Bob Full|]], [[Shai Revzen|]], [[Dan Koditschek|]], [[Aaron Johnson|]], and [[Aaron Hoover|]] on a [[variety of projects| Collaborations]]. I currently contribute to ONR's [[Embedded Humans|]] MURI, NSF [[Forces|]], and ARL's Robotics CTA.

As a graduate student, I was funded by an [[NSF fellowship|]] and the [[MAST|]] project.  I helped run a [[K-12 engineering outreach| Outreach]] program in Bay Area schools together with [[Matt Spencer|]], and I presented to large groups of high school students at [[UW MathDay|]] in Seattle.

My academic career started at a [[math camp|]] at the University of Washington, where I have had the honor of [[teaching robotics| Outreach]].

As an undergraduate at [[UW|]], I worked with [[Eric Klavins|]] in the [[Self-Organizing Systems|]] lab and spent a summer at [[Penn|]] working with [[Dan Koditschek|]] and [[Jonathan Clark|]] in [[KodLab|]].

|''desk:''|#13 in 337 Cory Hall|
|''mail:''|University of California at Berkeley<br />205 Cory Hall<br />Berkeley, CA 94720-1772|

[[Google Scholar|]], [[LinkedIn|]], [[ResearchGate|]]
!!!Brief Bio
Sam Burden earned his BS with Honors in Electrical Engineering from the University of Washington in Seattle.  He earned his PhD in Electrical Engineering and Computer Sciences from the University of California in Berkeley, where he is presently a postdoc.  In the Fall of 2015, he'll start as an Assistant Professor in Electrical Engineering at the University of Washington in Seattle.  He is broadly interested in discovering and formalizing principles of sensorimotor control.  Specifically, he focuses on applications in dynamic & dexterous robotics, neuromechanics, and cyber-human systems.  In his spare time, he teaches robotics to students of all ages in K-12 classrooms, Maker Fairs, and campus events.
!!!Research program
The Department of Electrical Engineering at the University of Washington in Seattle, WA, USA was kind enough to record and post a video of the colloquium talk I gave on February 18, 2014.  Check it out for an overview of my research program.

<iframe width="640" height="360" src="" frameborder="0" allowfullscreen></iframe>

slides: [[Reduction and Identification for Models of Locomotion: an Emerging Systems Theory for Neuromechanics| talks/2014-uw-ee.pdf]]
[[All blog entries| index.html#tag:blog]]

!!![[Folk Theorems|]]
[[Logitech M570]]
!!!Dec 3, 2012
This evening [[Dorsa Sadigh|]], [[Sam Coogan|]] and I visited [[Boost! Oakland|]], a non-profit 1-on-1 K-5 tutoring program.  Consider [[volunteering with them|]] if you'd like to mentor a student!
!!![[Numerical Integration of Hybrid Dynamical Systems via Domain Relaxation| pubs/BurdenGonzalez2011.pdf]]
To generate the schematic and plots in the paper:
$ hg clone cdc2011
$ cd cdc2011/simulation
$ matlab
>>> dpsch
>>> dpplots

{{{mercurial matlab}}}

!!![[Dimension Reduction Near Periodic Orbits of Hybrid Systems| pubs/BurdenRevzen2011.pdf]]
To generate the schematic and plots in the paper:
$ hg clone cdc2011
$ cd cdc2011/reduction
$ ipython 
ipy$ run

Links: [[slides| talks/2011cdc.pdf]], [[paper| pubs/BurdenRevzen2011.pdf]]

{{{mercurial python ipython numpy scipy matplotlib}}}
I co-organized a workshop on [[Control Systems in the Open World|]] at [[CDC 2012|]] in Maui, HI, USA.  A video of my talk and the accompanying slides are available below.

<iframe width="640" height="360" src="" frameborder="0" allowfullscreen></iframe>
[[Reduction and Robustness via Intermittent Contact| talks/2012cdc.pdf]]
<iframe src=";mode=WEEK&amp;height=600&amp;wkst=1&amp;bgcolor=%23FFFFFF&amp;;color=%23125A12&amp;;color=%23853104&amp;;color=%23AB8B00&amp;;color=%23333333&amp;;color=%232F6309&amp;;color=%2329527A&amp;;color=%238C500B&amp;;color=%235229A3&amp;;color=%23691426&amp;;color=%235229A3&amp;ctz=America%2FLos_Angeles" style=" border-width:0 " width="800" height="600" frameborder="0" scrolling="no"></iframe>
|Author|Eric Shulman|
|Description|Add checkboxes to your tiddler content|
This plugin extends the TiddlyWiki syntax to allow definition of checkboxes that can be embedded directly in tiddler content.  Checkbox states are preserved by:
* by setting/removing tags on specified tiddlers,
* or, by setting custom field values on specified tiddlers,
* or, by saving to a locally-stored cookie ID,
* or, automatically modifying the tiddler content (deprecated)
When an ID is assigned to the checkbox, it enables direct programmatic access to the checkbox DOM element, as well as creating an entry in TiddlyWiki's config.options[ID] internal data.  In addition to tracking the checkbox state, you can also specify custom javascript for programmatic initialization and onClick event handling for any checkbox, so you can provide specialized side-effects in response to state changes.
>see [[CheckboxPluginInfo]]
2008.01.08 [*.*.*] plugin size reduction: documentation moved to [[CheckboxPluginInfo]]
2008.01.05 [2.4.0] set global "" to current checkbox element when processing checkbox clicks.  This allows init/beforeClick/afterClick handlers to reference RELATIVE elements, including using "story.findContainingTiddler(place)".  Also, wrap handlers in "function()" so "return" can be used within handler code.
|please see [[CheckboxPluginInfo]] for additional revision details|
2005.12.07 [0.9.0] initial BETA release
version.extensions.CheckboxPlugin = {major: 2, minor: 4, revision:0 , date: new Date(2008,1,5)};
config.checkbox = { refresh: { tagged:true, tagging:true, container:true } };
config.formatters.push( {
	name: "checkbox",
	match: "\\[[xX_ ][\\]\\=\\(\\{]",
	lookahead: "\\[([xX_ ])(=[^\\s\\(\\]{]+)?(\\([^\\)]*\\))?({[^}]*})?({[^}]*})?({[^}]*})?\\]",
	handler: function(w) {
		var lookaheadRegExp = new RegExp(this.lookahead,"mg");
		lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			// get params
			var checked=(lookaheadMatch[1].toUpperCase()=="X");
			var id=lookaheadMatch[2];
			var target=lookaheadMatch[3];
			if (target) target=target.substr(1,target.length-2).trim(); // trim off parentheses
			var fn_init=lookaheadMatch[4];
			var fn_clickBefore=lookaheadMatch[5];
			var fn_clickAfter=lookaheadMatch[6];
			var tid=story.findContainingTiddler(w.output);  if (tid) tid=tid.getAttribute("tiddler");
			var srctid=w.tiddler?w.tiddler.title:null;
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
} );
config.macros.checkbox = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		if(!(tiddler instanceof Tiddler)) { // if no tiddler passed in try to find one
			var here=story.findContainingTiddler(place);
			if (here) tiddler=store.getTiddler(here.getAttribute("tiddler"))
		var srcpos=0; // "inline X" not applicable to macro syntax
		var target=params.shift(); if (!target) target="";
		var defaultState=params[0]=="checked"; if (defaultState) params.shift();
		var id=params.shift(); if (id && !id.length) id=null;
		var fn_init=params.shift(); if (fn_init && !fn_init.length) fn_init=null;
		var fn_clickBefore=params.shift();
		if (fn_clickBefore && !fn_clickBefore.length) fn_clickBefore=null;
		var fn_clickAfter=params.shift();
		if (fn_clickAfter && !fn_clickAfter.length) fn_clickAfter=null;
		var refresh={ tagged:true, tagging:true, container:false };
	create: function(place,tid,srctid,srcpos,defaultState,id,target,refresh,fn_init,fn_clickBefore,fn_clickAfter) {
		// create checkbox element
		var c = document.createElement("input");
		c.srctid=srctid; // remember source tiddler
		c.srcpos=srcpos; // remember location of "X"
		c.container=tid; // containing tiddler (may be null if not in a tiddler)
		c.tiddler=tid; // default target tiddler 
		c.refresh = {};
		c.refresh.container = refresh.container;
		c.refresh.tagged = refresh.tagged;
		c.refresh.tagging = refresh.tagging;
		// set default state
		// track state in config.options.ID
		if (id) {; // trim off leading "="
			if (config.options[]!=undefined)
		// track state in (tiddlername|tagname) or (fieldname@tiddlername)
		if (target) {
			var pos=target.indexOf("@");
			if (pos!=-1) {
				c.field=pos?target.substr(0,pos):"checked"; // get fieldname (or use default "checked")
				c.tiddler=target.substr(pos+1); // get specified tiddler name (if any)
				if (!c.tiddler || !c.tiddler.length) c.tiddler=tid; // if tiddler not specified, default == container
				if (store.getValue(c.tiddler,c.field)!=undefined)
					c.checked=(store.getValue(c.tiddler,c.field)=="true"); // set checkbox from saved state
			} else {
				var pos=target.indexOf("|"); if (pos==-1) var pos=target.indexOf(":");
				if (pos==0) c.tag=target.substr(1); // trim leading "|" or ":"
				if (pos>0) { c.tiddler=target.substr(0,pos); c.tag=target.substr(pos+1); }
				if (!c.tag.length) c.tag="checked";
				var t=store.getTiddler(c.tiddler);
				if (t && t.tags)
					c.checked=t.isTagged(c.tag); // set checkbox from saved state
		// trim off surrounding { and } delimiters from init/click handlers
		if (fn_init) c.fn_init="(function(){"+fn_init.trim().substr(1,fn_init.length-2)+"})()";
		if (fn_clickBefore) c.fn_clickBefore="(function(){"+fn_clickBefore.trim().substr(1,fn_clickBefore.length-2)+"})()";
		if (fn_clickAfter) c.fn_clickAfter="(function(){"+fn_clickAfter.trim().substr(1,fn_clickAfter.length-2)+"})()";
		c.init=true; c.onclick(); c.init=false; // compute initial state and save in tiddler/config/cookie
	onClickCheckbox: function(event) {;
		if (this.init && this.fn_init) // custom function hook to set initial state (run only once)
			{ try { eval(this.fn_init); } catch(e) { displayMessage("Checkbox init error: "+e.toString()); } }
		if (!this.init && this.fn_clickBefore) // custom function hook to override changes in checkbox state
			{ try { eval(this.fn_clickBefore) } catch(e) { displayMessage("Checkbox onClickBefore error: "+e.toString()); } }
		if (
			// save state in config AND cookie (only when ID starts with 'chk')
			{ config.options[]=this.checked; if (,3)=="chk") saveOptionCookie(; }
		if (this.srctid && this.srcpos>0 && (! ||,3)!="chk") && !this.tag && !this.field) {
			// save state in tiddler content only if not using cookie, tag or field tracking
			var t=store.getTiddler(this.srctid); // put X in original source tiddler (if any)
			if (t && this.checked!=(t.text.substr(this.srcpos,1).toUpperCase()=="X")) { // if changed
				if (!story.isDirty(t.title)) story.refreshTiddler(t.title,null,true);
		if (this.field) {
			if (this.checked && !store.tiddlerExists(this.tiddler))
				store.saveTiddler(this.tiddler,this.tiddler,"",config.options.txtUserName,new Date());
			// set the field value in the target tiddler
			// DEBUG: displayMessage(this.field+"@"+this.tiddler+" is "+this.checked);
		if (this.tag) {
			if (this.checked && !store.tiddlerExists(this.tiddler))
				store.saveTiddler(this.tiddler,this.tiddler,"",config.options.txtUserName,new Date());
			var t=store.getTiddler(this.tiddler);
			if (t) {
				var tagged=(t.tags && t.tags.indexOf(this.tag)!=-1);
				if (this.checked && !tagged) { t.tags.push(this.tag); store.setDirty(true); }
				if (!this.checked && tagged) { t.tags.splice(t.tags.indexOf(this.tag),1); store.setDirty(true); }
			// if tag state has been changed, update display of corresponding tiddlers (unless they are in edit mode...)
			if (this.checked!=tagged) {
				if (this.refresh.tagged) {
					if (!story.isDirty(this.tiddler)) // the TAGGED tiddler in view mode
					else // the TAGGED tiddler in edit mode (with tags field)
				if (this.refresh.tagging)
					if (!story.isDirty(this.tag)) story.refreshTiddler(this.tag,null,true); // the TAGGING tiddler
		if (!this.init && this.fn_clickAfter) // custom function hook to react to changes in checkbox state
			{ try { eval(this.fn_clickAfter) } catch(e) { displayMessage("Checkbox onClickAfter error: "+e.toString()); } }
		// refresh containing tiddler (but not during initial rendering, or we get an infinite loop!) (and not when editing container)
		if (!this.init && this.refresh.container && this.container!=this.tiddler)
			if (!story.isDirty(this.container)) story.refreshTiddler(this.container,null,true); // the tiddler CONTAINING the checkbox
		return true;
	refreshEditorTagField: function(title,tag,set) {
		var tagfield=story.getTiddlerField(title,"tags");
		if (!tagfield||tagfield.getAttribute("edit")!="tags") return; // if no tags field in editor (i.e., custom template)
		var tags=tagfield.value.readBracketedList();
		if (tags.contains(tag)==set) return; // if no change needed
		if (set) tags.push(tag); // add tag
		else tags.splice(tags.indexOf(tag),1); // remove tag
		for (var t=0;t<tags.length;t++) tags[t]=String.encodeTiddlyLink(tags[t]);
		tagfield.value=tags.join(" "); // reassemble tag string (with brackets as needed)
*Fall 2008
**EE 221: Linear Systems
**EE 226: Stochastic Processes
*Spring 2009
**EE 222: Nonlinear Systems
**EE 291E: Hybrid Systems
**BIO 135L: Mechanics of Organisms Laboratory
*Fall 2009
**EE 227A: Convex Optimization
**MATH 214: Differential Geometry
**(TA) EE 221: Linear Systems with Prof. Claire Tomlin
*Spring 2010
**MATH 240: Riemannian Geometry
*Fall 2010
**MATH 202A: Real Analysis
**MATH 219: Dynamical Systems
*Spring 2011
**MATH 202B: Real Analysis
*Fall 2011
**(TA) EE 125/215: Introduction to Robotics with Prof. Ruzena Bajcsy
*Spring 2013
**CS 294P: Active Perception
**~CogSci 290Q: Computational Models of Cognition
!!![[All code| index.html#tag:code]]
!!!Nov 21, 2013
[[Sam Coogan|]], Aaron Bestick, and I visited [[Coliseum College Prep Academy|]] in East Oakland to teach Mrs. Sawczuk's 10th grade Chemistry classes about the relationship between electricity, magnetism, and motion.

!!!Nov 20, 2013
Jessica Lee and I visited [[Coliseum College Prep Academy|]] in East Oakland to teach Mrs. Sawczuk's 8th grade Physical Science classes about designing biologically-inspired robots.

!!!Nov 2, 2012
[[Dorsa Sadigh|]], Dan Calderone, Sana Vaziri, [[Robert Matthew|]] and I visited [[Coliseum College Prep Academy|]] in East Oakland.  We presented to a whopping 10 classes of ~30 6th-12th graders!

!!!March 3, 2012
[[Kevin Peterson|]], Andre Zeumault and I visited [[Coliseum College Prep Academy|]] in East Oakland.  We presented to 6 classes of ~30 9th-12th graders!
!!!Probing neuromechanical control architecture in running cockroaches
''Participants:'' [[Prof. Robert Full|]], [[Prof. Shai Revzen|]], and [[Talia Moore|]]

''Press:'' [[UMich press release|]] featured in [[ScienceDaily|]], [[Discovery News|]], [[Wired UK|]], [[Popular Science|]]

<<bibliography inprep.bib MooreBurden2013>>

<<bibliography journal.bib RevzenBurden2013>>

<<bibliography conference.bib BurdenRevzen2013 MooreRevzen2010>>

!!!Bio-inspired design and control of a minimally-actuated milliscale hexapedal robot
''Participants:'' [[Prof. Aaron Hoover|]]

<<bibliography conference.bib HooverBurden2010>>

!!!Robust limit cycles in hybrid systems with simultaneous transitions
''Participants:'' [[Prof. Daniel Koditschek|]], [[Prof. Shai Revzen|]]

<<bibliography inprep.bib BurdenRevzen2013multi>>

!!!Numerical Methods for Hybrid Dynamical Systems
''Participants:'' [[Prof. Humberto Gonzalez|]], [[Dr. Ram Vasudevan|]]

<<bibliography submitted.bib BurdenGonzalezVasudevan2013>>

<<bibliography conference.bib BurdenGonzalez2011>>
|>|>|SiteTitle - SiteSubtitle|
|~|~|<<tiddler Configuration.SideBarTabs>>|

''StyleSheet:'' StyleSheetColors - StyleSheetLayout - StyleSheetPrint



Extensive StartupParameters to control the startup beahviour of ~TiddlyWiki through specially crafted ~URLs
Revived for Fall semester 2013, this 1-unit series (CCN 25779) will focus on theory and applications of control. Specific areas of interest include robotics, civil infrastructure, computer vision, verification, networked and hybrid systems, and game theory.  

More information is [[available online|]]. We encourage interested graduate students to enroll in the seminar and welcome attendees from across campus.
Control Theory Seminar (EE 298 P 004, CCN 25779)
Prof’s Arcak, Bajcsy, Sastry, and Tomlin
Mon 4 -- 5pm in 540AB Cory
!!!Grade Option
Satisfactory / Unsatisfactory
<iframe src=";mode=AGENDA&amp;height=600&amp;wkst=1&amp;bgcolor=%23FFFFFF&amp;;color=%2328754E&amp;ctz=America%2FLos_Angeles" style=" border-width:0 " width="400" height="600" frameborder="0" scrolling="no"></iframe>
While helping organize a [[workshop at CDC2012|]] in Maui, I helped [[Shai Revzen|]] collect some specimens of  native Hawaiian crab.  The animals exhibit fast and robust locomotion over highly fractured, slippery terrain -- a fact that makes them very interesting to study, but difficult to capture.  This page documents our experience in the hopes that it may assist other intrepid researchers.

!!!a'ama crab
[img[a'ama crab| aama/DSC00021.JPG]][img[a'ama on water's edge| aama/DSC00065.JPG]][img[a'ama on slippery cliff| aama/DSC00051.JPG]]
The a'ama crab (//[[Grapsus tenuicrustatus|]]//?) is native to the rocky intertidal shores of Hawaii.  The terrain is extremely challenging to traverse -- hard, slippery, and highly fractured. 

<html><iframe width="560" height="315" src="" frameborder="0" allowfullscreen></iframe></html>
As illustrated in the video, the a'ama crabs nimbly negotiate this complex environment at high speed, sprinting across uneven surfaces to avoid potential predators while ocean waves crash over them.

We found the crab species on essentially every part of Maui we visited regardless of whether the area was inhabited by humans.  Most of our video was collected at the volcanic rock field on La Perouse Bay just south of [[Ahihi Kinau|]], where there was an abundance of rock outcroppings with severe inclines.  The specimens that were shipped back to Ann Arbor were all collected near our hotel in Wailea.

<iframe width="425" height="300" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src=";msid=210136531334088769950.0004d681f0744c019579c&amp;gl=us&amp;hl=en&amp;ie=UTF8&amp;ll=20.764004,-156.417724&amp;spn=0.8,0.9&amp;t=m&amp;output=embed"></iframe><br /><small>View <a href=";msid=210136531334088769950.0004d681f0744c019579c&amp;gl=us&amp;hl=en&amp;ie=UTF8&amp;ll=20.764004,-156.417724&amp;spn=0.332027,0.538083&amp;t=m&amp;source=embed" style="color:#0000FF;text-align:left">A'ama crabbing locations</a> in a larger map</small>

The locals informed us that a'ama are edible and make good bait for larger fish, and they have [[techniques|]] to capture the animals using poles, hooks, and possibly bait.  However, these methods generally damage the animals, hence they were not appropriate for our purposes.

As suggested both by local fishermen and [[online|]], we successfully caught intact animals using a bright flashlight at night.  Our technique:
# Quietly crawl to the edge of the rocky coast in the dark.  
# Slowly stand up and hold the flashlight above your head.  
# Turn on the light and watch for crabs darting away.  
# Choose one animal to chase, ideally away from the water's edge.  
# Once cornered and blinded with the flashlight, the crab will usually freeze in place, allowing you to:
## slowly bring your hand near; then 
## quickly snatch it.
equipment photo
equipment: [[rubberized gloves|]]; plastic bucket; [[head-mounted flashlight|]]

As anticipated by the local fishermen, the first batch of crabs we caught performed poorly in captivity.  In fact, they died within hours of being captured.  Folk wisdom suggested the animals secrete a chemical that poisons them.  We hypothesized that the toxic chemical was ammonia from the  animals' urine, so we tried packing the second batch with pellets designed to fix ammonia in aquariums.  The crabs traveled safely for nearly 48 hours from Maui, HI to Ann Arbor, MI.  Our preparation:
# Cut circular respiration holes in the plastic container.
# Fill the bottom of the container with a single layer of ammonia fixation pellets.
# Fill the rest of the container with peat moss.
# Close the lid and submerge the container in fresh (i.e. aerated) seawater.
# Open the lid and transfer the crab on top of the bed of peat moss.
# Place a piece of food (e.g. calamari) inside the container in front of the animal's mouth.
preparation photo
equipment: perforated [[plastic containers|]]; seawater-soaked [[peat moss|]]; [[ammonia fixation pellets|]]

(instructions from Olivia)
For the uninitiated:
A digital object identifier (DOI) is a character string (a "digital identifier") used to uniquely identify an object such as an electronic document.
> [[Wikipedia|]]
Given a DOI, say 10.1007/s00422-012-0545-z, simply navigate to [[|]]; you will be redirected to the official website for the article.

Filipe Fernandes has a [[great script|]] for fetching a ~BibTeX entry using a DOI.  This is far superior to the alternative (navigating journals' aggravatingly cryptic websites, selecting `Export to ~BibTeX' from a drop-down menu, downloading and opening a file), and it has worked for me in cases where the journal itself doesn't provide ~BibTeX!

You'll need some extra Python libraries; using ~MacPorts:
sudo port install py27-httplib2 py27-beautifulsoup
[[carpal tunnel|]]
[[focal dystonia|]]

[[Logitech M570|]] wireless ball mouse
[[Goldtouch|]] adjustable keyboard
[[external monitor|]]
[[small, light computer|]]
[[| ]]
(if you see raw LaTeX rather than formulas below, you need [[MathJax|]])

I recently had a great deal of trouble solving what I regarded as a fairly simple physics problem that required transforming forces through a change of coordinates.  The solution is straightforward once we recognize that ''forces are [[covariant|]]''.

If $p = \phi(q)$, then the chain rule yields $\dot{p} = D\phi(q) \dot{q}$ where $D\phi(q)$ is the Jacobian linearization of the coordinate transformation $\phi$ (in manifold lingo, $D\phi:TQ\rightarrow TP$ is the pushforward).  Since the instantaneous power $F^T \dot{p}$ associated with a force $F$ represented in the $p$ coordinates is frame-invariant, direct substitution yields $F^T \dot{p} = F^T D\phi(q) \dot{q}$.  Since $\dot{p}$ is arbitrary, the equivalent force represented in the $q$ coordinates must be $F^T D\phi(q)$.  In differential-geometric terms, if we regard forces as covectors so that $F\in T^*P$, this is simply the pullback $\phi^* F\in T^*Q$.  Therefore ''forces are (naturally) covariant''.

One potential point of confusion: if the coordinate change is an isometry, i.e. $\phi(q) = R q + a$ for some orthogonal matrix $R$ and vector $a$, then forces can also be transformed by the pushforward of the inverse transformation.  Specifically, let $\psi(p) = R^T(p - a)$ so that $\phi\circ\psi = \text{id} = \psi\circ\phi$.  Then $D\phi = R$, and $D\psi = R^T = (R)^{-1} = (D\phi)^{-1}$.  Therefore $F^T D\phi = (D\psi F)^T$, so in this case $F$ may be "pushed forward" and it appears that forces are [[contravariant|]].  I cannot emphasize enough that ''this formula does not hold unless $\phi$ is an isometry''.
|''bold''|{{{''bold''}}} - two single-quotes, not a double-quote|
|''//bold italics//''|{{{''//bold italics//''}}}|
|{{{plain text}}}|{{{ {{{PlainText No ''Formatting''}}} }}}|
|/%this text will be invisible%/hidden text|{{{/%this text will be invisible%/}}}|
I finally put [[all my code on github|]].

!!!Acquiring code
!!!!Clone the repositories
cd ~/your/src/dir
mkdir sburden && cd sburden
git clone
git clone
git clone
git clone
git clone
git clone
!!!!Add sburden directory to PYTHONPATH
echo "export PYTHONPATH=~/your/src/dir/sburden:$PYTHONPATH" >> ~/.bash_profile
!!!!Import code in ipython shell
$ ipython
ipy$ import opt,rbt,sim,uk,util,vid

!!!uk: Unscented Kalman filtering
A few simple tests are included with the code to illustrate its application to track rigid bodies and particles using either motion capture (mocap) data or camera observations from multiple (calibrated) cameras.
$ cd ~/your/src/dir/sburden/uk
$ ipython
ipy$ run body
ipy$ run pts
This is the PRE-RELEASE build of ~TiddlyWiki v<<version>>, and incorporates all changes currently committed to the [[TiddlyWiki source repository|]], including several enhancements to key functions and objects, as well as an internal update to use a newer revision of jQuery (now v1.8.1)

~TiddlyWiki "Classic" uses ~TiddlyWiki5-based tools to assemble and output the core system, rather than the Ruby-based ginsu/cook utilities that were previously used.  The ability of ~TiddlyWiki5 to directly create ~TiddlyWiki Classic documents ensures a robust and reliable future for the existing "installed base" of ~TiddlyWiki, even as the community migrates to using the new power and flexiblity of ~TiddlyWiki5.

You can view/download versions of ~TiddlyWiki from the following locations:
|current release of ~TiddlyWiki Classic||
|latest pre-release of ~TiddlyWiki Classic||
|latest pre-release of ~TiddlyWiki5||
At [[IFAC 2014|]] in Cape Town, South Africa, I presented on [[Adaptive piecewise-affine inverse modeling of hybrid dynamical systems| papers/ElhamifarBurden2014ifac.pdf]], co-authored with [[Ehsan Elhamifar|]].  My [[slides are available| talks/2014ifac.pdf]].  The identification algorithm is based on Ehsan's [[Dissimilarity-based Sparse Subset Selection|]], and the [[code is available|]] for that algorithm.
!!!April 3, 2013
This evening [[Dorsa Sadigh|]], Duncan Haldane and I visited Science Night at Joaquin Miller Elementary in the Oakland Hills.  It was a large and stimulating crowd, with many exciting demonstrations!
!!!Installation via MacPorts
Start with [[rubber|]], which will also install TeXLive:
sudo port install rubber
Then get some extra packages:
sudo port install texlive texlive-bibtex-extra texlive-common texlive-latex texlive-math-extra texlive-science texlive-latex-extra texlive-fonts-extra

I use the wonderful [[atchange|]] to automatically recompile my LaTeX document using the equally wonderful [[rubber|]] and have the .pdf document reload in [[Skim|]] any time my .tex, .bib, or figures change.  

Save the following in a file called ''auto'':
  bibtex doc
  rubber --pdf doc.tex

  bibtex doc
  rubber --pdf doc.tex

  bibtex doc
  rubber --pdf doc.tex
Then in the same directory execute the following on the commandline:
atchange auto
When you save changes to ''doc.tex'', any ''.bib'' file, or any ''.pdf'' figure in the ''fig/'' directory, your document will recompile automatically.

My preferred tool for illustrations is [[Inkscape|]].  In addition to being [[FOSS|]], it is drivable from the command line!  For instance, to export a .pdf,.pdf_tex pair on OSX:
/Applications/ fig/fig.svg --export-pdf=fig.pdf --export-latex --export-area-page --without-gui

!!!Spell check
For LaTeX--sensitive spell checking from the commandline:
aspell --mode=tex -c yourfile.tex

!!!Duplicate labels
From [[Walt Mankowski|]]:
perl -nE 'say $1 if /(\\label[^}]*})/' *.tex | sort | uniq -c | sort -n

!!!Font Begone
I use ''.pdf''+''.pdf_tex'' pairs for illustrations in LaTeX documents.  To export the compiled figure (e.g. for inclusion in a poster), I found [[FontBegone|]], an OSX .app that re-exports the pdf using [[GhostScript|]] and [[ps2pdf|]].  The .app didn't work for me, but the script it is based on can be saved and added to your ''$PATH'':
gs -sDEVICE=pswrite -dNOCACHE -sOutputFile=- -q -dbatch -dNOPAUSE -dQUIET "$1" -c quit | ps2pdf - "`echo $1 | cut -f1 -d'.'`"-nofont.pdf

Although ~FontBegone yielded a vector graphics file with outlined fonts, importing the output into Inkscape gave an un-editable mess.  Subsequent searching turned up [[pdf2svg|]], which is a more direct route.  It yields a gross rasterized version of the illustration, but the fonts are correctly outlined, so I can now composite my original ''.svg'' with the output of ''pdf2svg''.
10am Mon -- Thu the week of July 23 -- 26 in 337 Cory.

!!!Recommended Reading / Prerequisites
Working knowledge of [[topology|]] and [[analysis|]] on the level of MATH 202A/B.

Familiarity with basic [[finite-dimensional optimization theory|]], for instance from [[convex optimization|]] or EE 227.

The lecture material will be drawn largely from [[Prof. Polak's book|]].
Aggravatingly, after two years the left-click button on my [[wireless trackball mouse|]] began behaving erratically: inserting extra clicks, failing to maintain contact during a click-and-drag, etc.  A cursory search turned up [[a forum post|]] that suggested a fix: simply unplug the battery and click the buttons for a minute or so.  This (so the theory goes) relieves built-up charge on capacitors.  Worked for me so far.

[[CV| cv.pdf]][[Bio]][[Papers]][[Talks]][[Code]][[Blog]][[Outreach]][[Mentees]][[Calendar]]<<tiddler ToggleRightSidebar##show with: {{config.options.chkShowRightSidebar?'►':'◄'}}>>
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />

<style type="text/css">#contentWrapper {display:none;}</style>
<style type="text/css">
body { margin:0;padding:10px; }
a { color: #fff; font-weight:bold; }
#SplashScreen {width:600px; text-align:left; font-family:monospace; background-color:#666; color:#fff; padding:10px; position:center; display:block; margin: 50px auto;}
<div id="SplashScreen">
<img src="img/sam_burden_.png" style="border:2px solid #000;float:left; margin-right:10px;" />
<h1 style="margin:0">Sam Burden</h1>
<h4 style="margin:0">Postdoc in EECS at Berkeley</h4>
skype: sburden
desk:  #13 in 337 Cory Hall
mail:  University of California at Berkeley
       205 Cory Hall
       Berkeley, CA 94720-1772

<a href="cv.pdf">CV</a> | 
<a href="sch.html">Calendar</a> | 
<a href="papers/">Papers</a> | 
<a href="talks/">Talks</a> |
<a href="">Code</a> |
<a href="">Outreach</a>

<br /><br /><br />
<h4 style="margin:0">Brief bio</h4>
Sam Burden is a postdoc in EECS at UC Berkeley. He studies sensorimotor control with applications to robotics, neuromechanics, and human motor control.

<br /><br /><br />
<h4 style="margin:0;text-align:left">Loading full site <blink>. . .</blink></h5>
You must have JavaScript enabled.

|''Description:''|Enable LaTeX formulas for TiddlyWiki|
|''Date:''|Feb 11, 2012|
|''Author:''|Guy Rutenberg|
|''License:''|[[BSD open source license]]|
!! Changelog
!!! 1.0.1 Feb 11, 2012
* Fixed interoperability with TiddlerBarPlugin
!! How to Use
Currently the plugin supports the following delemiters:
* """\(""".."""\)""" - Inline equations
* """$$""".."""$$""" - Displayed equations
* """\[""".."""\]""" - Displayed equations
!! Demo
This is an inline equation \(P(E)   = {n \choose k} p^k (1-p)^{ n-k}\) and this is a displayed equation:
\[J_\alpha(x) = \sum_{m=0}^\infty \frac{(-1)^m}{m! \, \Gamma(m + \alpha + 1)}{\left({\frac{x}{2}}\right)}^{2 m + \alpha}\]
This is another displayed equation $$e=mc^2$$
!! Code
config.extensions.MathJax = {
  mathJaxScript : "",
  // uncomment the following line if you want to access MathJax using SSL
  // mathJaxScript : "",
  displayTiddler: function(TiddlerName) {
    config.extensions.MathJax.displayTiddler_old.apply(this, arguments);
    MathJax.Hub.Queue(["Typeset", MathJax.Hub]);
jQuery.getScript(config.extensions.MathJax.mathJaxScript, function(){
      tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]},
      extensions: ["tex2jax.js"],
      "TML-CSS": { scale: 100 }
    config.extensions.MathJax.displayTiddler_old = story.displayTiddler;
    story.displayTiddler = config.extensions.MathJax.displayTiddler;
	name: "mathJaxFormula",
	match: "\\\\\\[|\\$\\$|\\\\\\(",
	//lookaheadRegExp: /(?:\\\[|\$\$)((?:.|\n)*?)(?:\\\]|$$)/mg,
	handler: function(w)
		switch(w.matchText) {
		case "\\[": // displayed equations
			this.lookaheadRegExp = /\\\[((?:.|\n)*?)(\\\])/mg;
		case "$$": // inline equations
			this.lookaheadRegExp = /\$\$((?:.|\n)*?)(\$\$)/mg;
		case "\\(": // inline equations
			this.lookaheadRegExp = /\\\(((?:.|\n)*?)(\\\))/mg;
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			w.nextMatch = this.lookaheadRegExp.lastIndex;
!!!Evelyn (Fifi) Yeung (Summer 2013 -- Present, [[KodLab|]], University of Pennsylvania)
''now:'' Picking up where Mike Choi left off, Fifi is running gait tuning experiments on the [[X-RHex|]] class of robots.
!!!Michael Kling (Summer 2013, Autonomous Systems Lab, UC Berkeley)
''then:'' Encouraged by his older sister's experience working in our lab, Michael contacted me as a rising High School Senior to request a summer research internship in our group.  I mentored him on a project involving [[humanoid robots|]] instructing each other to perform Tai Chi exercises.
''now:'' pursuing a BS in Computer Science at the University of British Columbia
!!!Justin Starr (Spring 2013, [[KodLab|]], University of Pennsylvania)
''then:'' As a Sophomore studying Electrical and Systems Engineering, Justin implemented and tested modifications to gait controllers for the [[X-RHex|]] class of robots.
''now:'' pursuing a BS in Electrical and Systems Engineering at the University of Pennsylvania
!!!Mike Choi (Fall 2012 -- Summer 2013, [[KodLab|]], University of Pennsylvania)
''then:'' As a Sophomore studying Mechanical Engineering, Mike ran gait tuning experiments on the [[X-RHex|]] class of robots.
''now:'' pursuing a BS in Mechanical Engineering at the University of Pennsylvania
!!!Ashley Kling (Summer 2011, Autonomous Systems Lab, UC Berkeley)
''then:'' As a rising High School Senior, Ashley precociously contacted my ~PhD advisor, [[Dean Shankar Sastry|]], to request a summer research internship in our group.  I mentored her on a project involving pursuit-evasion between a [[humanoid robot|]] and a [[small legged robot|]].
''now:'' pursuing a BS in Computer Science at Columbia University
!!!Jonathan Glidden (Fall 2010 -- Summer 2011, Autonomous Systems Lab, UC Berkeley)
''then:'' I recruited Jonathan during the 2010/2011 academic year while he was a Senior Mathematics major studying Linear Systems Theory in the graduate course I TA'd as a third year ~PhD student at Berkeley, to study differential geometry, dynamical systems, robotics, and computer vision in the Autonomous Systems Lab.
''now:'' Statistician at [[salesforce|]]
!!![[Talia Moore|]] (Spring 2009 -- Summer 2010, [[Poly-PEDAL Lab|]], UC Berkeley)
''then:'' I mentored Talia on digitization and analysis of biomechanical data collected in an experiment probing the neuromechanical response to lateral perturbations in rapidly-running cockroaches.
''now:'' pursuing a ~PhD in Evolutionary Biology at Harvard University
!!!Alex Leone (Fall 2007 -- Summer 2008, [[SOSLab|]], University of Washington)
''then:'' I recruited Alex while he was a Freshman Electrical Engineering major studying calculus and differential equations in the honors mathematics sequence I TA'd as a Senior at UW to study self-assembly of robots and E. coli in the [[SOSLab|]].
''now:'' Software Engineer at [[ExtraHop Networks|]]
I discovered [[tiddlyWiki|]] earlier this week, and quickly became so enamored that I decided to rewrite my web page using the tool -- if you're reading this, you have witnessed the results.

I can whole-heartedly recommend the tool for building an academic web page (with support for [[blogging| #tag:blog]] and [[RSS| index.xml]]) and maintaining an electronic lab notebook; for instance, check out [[BibTeXPlugin]] and [[MathJaxPlugin]] to see how easy it is to integrate citations and equations.  [[CheckboxPlugin]] makes it perfect for to-do lists.
Install & configuration notes for [[NPSOL|]].  Note that [[I abandoned Matlab|]] long ago, so I didn't try to build the ''.mex'' wrapper.

First, ensure you have a FORTRAN compiler.  Using Macports:
sudo port install gcc46 +gfortran
Add the following to your ''~/.bash_profile'':
export F2C="/opt/local/"
Then, add a symbolic link to ''f77'':
sudo ln -s /opt/local/bin/gfortran-mp-4.6 /opt/local/bin/f77
To build only the examples and libraries, modify the ''~GNUMakefile'' entry for ''libraries'':
libraries: $(OSDIR)/optimized
	cd src; \
	cd csrc; \
	cd examples; \
	$(MAKE) LIBDIR=$</lib EXEDIR=$</examples   FFLAGS="$(FFLAGS_G)"
By default the library will be installed in ''~/npsol''; I modified the value of ''NPDIR'' in ''~GNUMakefile'':
NPDIR = $(HOME)/cloud/src/npsol
Now follow the instructions in ''README.install'':
cd npsol
gmake libraries > npsol.out
If you run into problems, compare with my [[npsol.out| npsol/npsol.out]].

Then you can follow the instructions in ''README.install'' to run the examples.  On my machine:
cd examples
./run lsmain /Users/sburden/cloud/src/npsol/Darwin-x86_64/optimized/examples/
./run npmain /Users/sburden/cloud/src/npsol/Darwin-x86_64/optimized/examples/
./run nlmain /Users/sburden/cloud/src/npsol/Darwin-x86_64/optimized/examples/
Compare with my [[lsmain.out| npsol/lsmain.out]], [[npmain.out| npsol/npmain.out]], and [[nlmain.out| npsol/nlmain.out]].
May 2015: attended [[ICRA|]] in Seattle, WA, USA and spoke at a workshop on [[Robotics-inspired biology|]] (and bio-inspired robotics).  My first student, [[Bora Banjanin|]], presented his work during the interactive session!

May 2015: presented at the Kavli Futures Workshop on ~Neuroscience-Inspired Computing on [[dynamic inverse models in cyber-human systems| talks/20150512-kavli.ppt]].

April 2015: attended [[CPSWeek|]] in Seattle, WA, USA and participated in an NSF Early Career Investigator [[Workshop on Smart Cities|]].

Feb 2015: pre-print of manuscript on [[hybrid models for (self-)manipulation systems|]], co-authored with [[Aaron Johnson|]], now available.  This paper bridges hybrid dynamical systems theory with complementarity principles in classical mechanics to yield a unified framework for modeling dynamic and dexterous robots; we are preparing this paper for archival submission, so feedback is welcome!

Jan 2015: unpaid consultant for colleagues on the academic job market: [[Sam Coogan|]], [[Aaron Johnson|]], [[Chen Li|]], [[Lillian Ratliff|]], and [[Insoon Yang|]].  Hire them!

Dec 2014: presented to the [[FORCES|]] group on [[metrization, simulation, and first-order approximation for networked CPS| talks/20141208-forces.pdf]].

Nov 2014: two preprints posted to the arXiv: one on [[approximation algorithms for optimization of combinatorial dynamical systems|]], co-authored with [[Insoon Yang|]]; and the other on [[characterization of local Nash equilibria in continuous games|]], co-authored with [[Lillian Ratliff|]].  Both Insoon and Lily are on the job market this year -- you should hire them!

Oct 2014: presented at the [[UW CSE Robotics Colloquium|]] in Seattle, WA on [[Hybrid Models for Dynamic and Dexterous Robots| talks/20141024uw.pdf]].  Thanks to [[Maya Cakmak|]] for inviting me and [[Vikash Kumar|]] for hosting!

Sep 2014: earned my PhD!

Aug 2014: presented at [[IFAC2014]] in Cape Town, South Africa on [[Adaptive piecewise-affine inverse modeling of hybrid dynamical systems| papers/ElhamifarBurden2014ifac.pdf]] co-authored with [[Ehsan Elhamifar|]].

July 2014: pre-print of manuscript on [[discontinuous vector fields that yield piecewise-differentiable flows|]] now available.  This draft provides the theoretical foundation for our [[ongoing|]] [[attempts|]] to answer the question: why trot?  We are currently preparing this paper for archival submission, so feedback is quite welcome!

June 2014: participated in all-hands meetings for NSF's [[FORCES|]] (CPS Frontiers) and ONR's [[Embedded Humans|]] (MURI) in Berkeley, CA, USA

May 2014: attended the [[IEEE Women in Engineering International Leadership Conference|]] in San Francisco, CA, USA; see my [[blog post about the WIE ILC| Women-in-Engineering]]

March 2014: to appear in [[IFAC 2014|]]: [[Adaptive piecewise-affine inverse modeling of hybrid dynamical systems| papers/ElhamifarBurden2014ifac.pdf]], co-authored with [[Ehsan Elhamifar|]]

Feb 2014: to appear in [[ACC 2014|]]: [[Genericity and Structural Stability of Non-Degenerate Differential Nash Equilibria| papers/RatliffBurden2014acc.pdf]], co-authored with [[Lillian Ratliff|]]

Jan 2014: presented a unified approach to [[optimization for models of legged locomotion| talks/2014sicb.pptx]] applicable to parameter estimation, gait synthesis, and experiment design at [[SICB|]] in Austin, TX, USA.  As a bonus, [[Shai Revzen|]] presented our joint work attempting to answer the question [[why trot?|]]

Dec 2013: attended [[CDC 2013|]] in Florence, Italy; [[Insoon Yang|]] presented our paper on infinitesimal interconnection variation in nonlinear networked systems ([[paper| | papers/YangBurden2013.pdf]]).

Nov 2013: led a variety of [[science outreach lessons| Outreach]] around Oakland: bio-inspired robotics at [[Coliseum College Prep Academy]]; electromagnetism at [[Bentley School|]] and [[Coliseum College Prep Academy]]; and the physics of sound at [[Lincoln Elementary|]].

Oct 2013: presented at the Robotics seminar at the University of Maryland in College Park, MD, USA ([[announcement| UMD2013]]) ([[slides| talks/20131024umd.pdf]]).  Thanks to [[Sarah Bergbreiter|]] for inviting me, and to all the UMD folks for exciting conversations and provocative questions!

Oct 2013: attended [[Allerton 2013|]] in Monticello, IL, USA; [[Lillian Ratliff|]] presented our paper on characterization and computation of local Nash equilibria in continuous games ([[paper| papers/RatliffBurden2013.pdf]]) ([[slides| talks/2013allerton.pdf]]) ([[code|]]).

Sep 2013: I started maintaining a [[list of the students I have mentored| Mentees]] (former mentees:  please keep me updated as your careers progress!)

Sep 2013: the [[Control Theory Seminar]] has been revived for Fall 2013, co-organized by [[Sam Coogan |]] and myself -- we meet at 4pm on Mondays in 540AB Cory.

Aug 2013: pre-print on model reduction for rhythmic hybrid phenomena available (arXiv: [[1308.4158|]]) ([[pdf| papers/BurdenRevzen2013.pdf]]).  This is the archival manuscript corresponding to a conference paper that appeared at [[CDC2011]], and provides the theoretical foundation for the parameter identification work I presented at [[SysID2012]], as well as the presentations I gave at [[SICB2013]], [[SPIE2013]], and [[Dynamic Walking 2013|]].

July 2013: accepted to [[CDC 2013|]]: [[Infinitesimal interconnection variation in nonlinear networked systems| papers/YangBurden2013.pdf]], co-authored with [[Insoon Yang|]]

June 2013: presented on [[reducing templates to anchors|]] in the 2013 [[Dynamic Walking|]] meeting at CMU in Pittsburgh, PA, USA.  As a bonus, [[Shai Revzen|]] presented our joint work on [[robust stability arising from simultaneous transitions in hybrid systems|]]

May 2013: presented invited paper on [[reduction and identification of hybrid dynamical models for terrestrial locomotion| SPIE2013]] at [[ARL|]] in Adelphi, MD, USA and [[SPIE DSS|]] in Baltimore, MD, USA ([[slides| talks/2013spie.pdf]]) ([[paper| papers/BurdenSastry2013.pdf]]); thanks to Chris Kroninger and Will Nothwang for organizing the invited session and hosting the group at ARL!

April 2013: [[featured maker| Open Make]] of tiny tech at the [[Lawrence Hall of Science|]] ([[photos|]])

March 2013: presented at the Controls seminar at the University of Michigan in Ann Arbor, MI, USA ([[slides| talks/20130322umich.pdf]]); thanks to [[Shai Revzen|]] for inviting me, and all the ~U-M folks for stimulating conversations!

Feb 2013: pre-print on metrization and simulation of hybrid control systems available (arXiv: [[1302.4402|]]) ([[pdf| papers/BurdenGonzalezVasudevan2013.pdf]])

Feb 2013: article investigating neuromechanical response of running cockroaches to large lateral perturbations to appear in Biological Cybernetics (doi: [[10.1007/s00422-012-0545-z|]]) ([[pdf| papers/RevzenBurden2013.pdf]]); [[UMich press release|]] featured in [[ScienceDaily|]], [[Discovery News|]], [[Wired UK|]], [[Popular Science|]], [[NSF Science360|]]

Jan 2013: presented a technique for [[using reduced-order models to study dynamic legged locomotion| SICB2013]] at [[SICB|]] in San Francisco, CA, USA

Dec 2012: co-organized and [[presented| CDC2012]] at a workshop on [[Control Systems in the Open World|]] at [[CDC|]] in Maui, HI, USA
Minor tweaks and bugfixes for OSX.
!!!Disable Adobe Updater
I have tried many different "solutions" with varying degrees of success:

!!!![[This blog|]]
cd ~/Library/LaunchAgents
launchctl remove `basename com.adobe.ARM.* .plist`
rm com.adobe.ARM.*

!!!![[Adobe Itself|]]
Make a file called  com.adobe.~AdobeUpdater.Admin.plist  with the following text:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "">
<plist version="1.0">
then save it to /Library/preferences.
!!![[Force font smoothing on non-Apple monitors|]]
defaults -currentHost write -globalDomain AppleFontSmoothing -int 2

Available [[here|]]
!!!Nov 9, 2012
I visited the honors chemistry class at [[Oakland Technical High School|]] in East Oakland.  We had a great discussion about the defining properties of robots -- information processing, physical embodiment, and mechanical work -- I look forward to returning!
The [[Lawrence Hall of Science|]] partnered with the [[Maker Education Initiative|]] to run a series of "Open Make" events targeting young makers.  After seeing the [[press coverage|]] for our [[Biological Cybernetics paper|]], they invited me to be a "featured maker" and teach kids how to build robotic cockroaches.

[[Photos from the event|]] are available; here are a few featuring my demonstration:
<a href="" title="DSC_9082 by LHS Ingenuity Lab, on Flickr"><img src="" width="400" height="267" alt="DSC_9082"></a>
<a href="" title="DSC_9081 by LHS Ingenuity Lab, on Flickr"><img src="" width="400" height="267" alt="DSC_9081"></a>

Video discussing the motivation for the event:
<html><iframe width="560" height="315" src="" frameborder="0" allowfullscreen></iframe></html>
Command-line server for streaming 2D data from [[OptiTrack Camera SDK|]] over a socket.  Python script provided to save & load data.
hg clone

{{{mercurial OptiTrackCameraSDK python numpy}}}
To download and test the optimization code:
$ git clone
$ cd opt
$ mkdir ex
$ cp ex/
$ ipython
ipy$ run opt ex/
The file '''' specifies the cost function, parameters, and initial guess for the minimizer.
I am dedicated to broadening awareness of and participation in engineering, science, and mathematics.  

[[Link to all outreach activities| index.html#tag:outreach]]

!!![[Open Make @ the Hall| Open Make]]
2013/04/20: Thanks to the [[Maker Education Initiative|]] and the [[Lawrence Hall of Science|]] for inviting me to be a featured maker at [[Open Make: Tiny Tech|]]!  
<a href="" title="DSC_9082 by LHS Ingenuity Lab, on Flickr"><img src="" width="400" height="267" alt="DSC_9082"></a>
<a href="" title="DSC_9081 by LHS Ingenuity Lab, on Flickr"><img src="" width="400" height="267" alt="DSC_9081"></a>

!!!K-12 Classrooms
Together with [[Kevin Peterson|]] and the [[EEGSA Outreach|]] organization I designed a ~1hr robotics activity for K-12 classrooms that combines [[lecture material| talks/or/2012robotics.pdf]] with hands-on robot design.

2013/11/21: [[Coliseum College Prep Academy]] in East Oakland, CA

2013/11/20: [[Coliseum College Prep Academy]] in East Oakland, CA

2013/11/13: [[Lincoln Elementary|]] in Oakland, CA

2013/11/06: [[Bentley School|]] in Oakland, CA

2013/10/12: [[Lawrence Hall of Science|]] in Berkeley, CA

2013/04/03: [[Joaquin Miller Elementary School]] in Oakland, CA

2012/12/03: [[Boost!]] in West Oakland, CA

2012/11/27: [[Pittsburg High School]] in Pittsburg, CA

2012/11/09: [[Oakland Technical High School]] in North Oakland, CA

2012/11/02: [[Coliseum College Prep Academy]] in East Oakland, CA

2012/03/22: [[Coliseum College Prep Academy]] in East Oakland, CA

!!![[Summer Institute for Mathematics at the University of Washington|]]
I regularly run a [[short course in robotics| talks/or/2009simuw.pdf]] at the [[Summer Institute for Mathematics at the University of Washington|]].  This is a particular pleasure since I participated in the inaugural (2003) cohort of this program.

!!![[UW MathDay|]]
From 2009 -- 2012 I delivered a [[robotics presentation| talks/or/2012mathday]] at the University of Washington's huge [[MathDay|]], an annual event that draws thousands of high school students to campus.
<div class='header'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>

<div id='topMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
<<bibliography submitted.bib showAll>>

<<bibliography journal.bib showAll>>

<<bibliography conference.bib showAll>>
[img[Sam Burden, PhD|thesis/phinished.jpg]]
!!A Hybrid Dynamical Systems Theory for Legged Locomotion

([[dissertation pdf|]]) ([[EECS tech report|]])  ([[dissertation talk| thesis/talk.pdf]]) ([[dissertation "chalk talk"| thesis/chalk-talk.pdf]])

Legged locomotion arises from intermittent contact between limbs and terrain. Since it emerges from a closed-loop interaction, reductionist study of body mechanics and terrestrial dynamics in isolation have failed to yield comprehensive strategies for forward- or reverse-engineering locomotion. Progress in locomotion science stands to benefit a diverse array of engineers, scientists, and clinicians working in robotics, neuromechanics, and rehabilitation. Eschewing reductionism in favor of a holistic study, we seek a systems-level theory tailored to the dynamics of legged locomotion.

Parsimonious mathematical models for legged locomotion are hybrid, as the system state undergoes continuous flow through limb stance and swing phases punctuated by instantaneous reset at discrete touchdown and liftoff events. In their full generality, hybrid systems can exhibit properties such as nondeterminism and orbital instability that are inconsistent with observations of organismal biomechanics. By specializing to a class of intrinsically self-consistent dynamical models, we exclude such pathologies while retaining emergent phenomena that arise in closed-loop studies of locomotion.

Beginning with a general class of hybrid control systems, we construct an intrinsic state-space metric and derive a provably-convergent numerical simulation algorithm. This resolves two longstanding problems in hybrid systems theory: non-trivial comparison of states from distinct discrete modes, and accurate simulation up to and including Zeno events. Focusing on models for periodic gaits, we prove that isolated discrete transitions generically lead the hybrid dynamical system to reduce to an equivalent classical (smooth) dynamical system. This novel route to reduction in models of rhythmic phenomena demonstrates that the closed-loop interaction between limbs and terrain is generally simpler than either taken in isolation. Finally, we show that the non-smooth flow resulting from arbitrary footfall timing possesses a non-classical (Bouligand) derivative. This provides a foundation for design and control of multi-legged maneuvers. Taken together, these contributions yield a unified analytical and computational framework -- a hybrid dynamical systems theory -- applicable to legged locomotion.
!!!Nov 27, 2012
Sana Vaziri, [[Kevin Peterson|]] and I visited 2 robotics and 2 architectural design classes at [[Pittsburg High School|]].  These students devised several unique designs, including a sideways wall-follower!
When, upon my graduation and departure from UW EE, my [[undergraduate research advisor and mentor|]] gave me Stephen Jay Gould's memoir about (one of) his biggest scientific achievement(s), I was perplexed. I felt that Eric and I bonded over many shared intellectual interests, but the historical development of evolutionary paleobiology was not one of them. Where was the obscure mathematics textbook on Morse theory? Or the seemingly far more apt pop sci bio-inspiration book by Vogel?

Needless to say, I didn't finish the book that summer. I was overwhelmed by Gould's florid academese, but mostly //I didn't get it//. It wasn't until 5 years later, having read [[Kuhn's classic essay| Structure-of-Scientific-Revolutions]] and struggled most of the way through a ~PhD, that I returned to the book and realized what a gem it really is.

!!!For the uninitiated
Eldredge and Gould presented a now-seminal paper in an annual paleobiology meeting touting the ubiquitous stasis of species in the paleontological record as strong evidence against the view (dating back to Darwin himself) that evolution is a continual gradual process. Controverting this paradigm of phyletic gradualism, Eldredge and Gould argued that species persist in equilibrium for long spans of geological time, undergoing (relatively) rapid periods of punctuational change. Contrary to the prevailing view that the apparent stasis of species was merely symptomatic of an incomplete paleontological record, they asserted that “stasis //is// data”, and that the burden of proof for phyletic gradualism now rested on its proponents.

!!!A case study in //paradigm shift//
The dissemination and adoption of punctuated equilibrium, as documented in Gould's 2007 book, is a classic example of Kuhn's theory of punctuational change characterizing scientific progress (//paradigm shift// being Kuhn's term). In addition to four solid chapters spent motivating, articulating, and defending the scientific theory, Gould devotes a final chapter and appendix to broader interpretations and implications for punctuational modes of change, as well as an anecdotal and subjective account of the less-than-scientific resistance and critique rendered by his colleagues in the 30+ years that elapsed between the original conference paper and this monograph.

!!!Lessons for revolutionaries
Although [[normal science|]] can be rewarding, I posit that the majority of scientists (a label I surreptitiously ascribe to engineering researchers as well as the biologists and physicists I collaborate with) are in this game for the revolutions. Specifically: I would venture that most of us dream of someday (soon) finding ourselves at the tempestuous vortex of serendipity and insight resulting in an impulsive, lurching shift of conceptual inertia that defines a scientific epoch. [[Black swans|]] are rare, but they are not chimeras; one should prepare to readily identify the errant bird. 

I derive the following lessons from Gould's example:
# question assumptions, particularly the most obvious
# read broadly (across disciplines), and ask experts naïve questions
# do not be afraid to be tenacious, and stubborn, and (ultimately) annoying
# accept all scientific criticism; reject ad hominem attacks

<<bibliography gould.bib showAll>>
First, [[install MacPorts|]].  Then:
sudo port install python27 py27-ipython py27-numpy py27-scipy py27-matplotlib

If you're recovering from [[Matlab|]], note that there isn't a standard IDE for Python.  Instead, you'll open an [[IPython|]] shell that is more flexible and informative than the Matlab shell, generate superior 2D plots using [[Matplotlib|]], and easily modify source files using [[your favorite text editor|]].

I prefer the following default options for the [[IPython|]] shell:
alias ipython="ipython --automagic --pdb --no-confirm-exit --no-banner"
Put this in your ~/.bash_profile to make the settings permanent.

By enabling the Python debugger (''pdb'' flag, above), you can insert janky breakpoints by putting 
(that's right, a divide-by-zero) into your code.

By default, IPython doesn't reload modules.  This can generate confusion in the following use case: imports; changes are made to, but the effects do not appear when running until either (i) the IPython session is restarted or (ii) the command ''reload(two)'' is issued on the IPython terminal.  I find this annoying; to fix this, make the following change to your '''' in ''~/.ipython/profile_default'':
c = get_config()
c.InteractiveShellApp.exec_lines = []
c.InteractiveShellApp.exec_lines.append('%load_ext autoreload')
c.InteractiveShellApp.exec_lines.append('%autoreload 2')

To ensure output .pdf and .eps files conform to IEEE and arXiv standards, add the following to ~/.matplotlib/matplotlibrc:
pdf.fonttype : 42
text.usetex : True

To support animations and enable easy window manipulation (see tk post below), also add:
backend : TkAgg
interactive : True

!!!Tk figure size & position
[[Shai Revzen|]] showed me these great functions for manipulating figure position and size (note that you likely need the TkAgg backend for these to work):
import pylab as plt

def get_geom(fig=None,n=None):
  Get figure geometry string. 
  if fig is None:
    if n is None:
      fig = plt.gcf()
      fig = plt.figure(n)
  # Access the Tk interface for the canvas
  win = fig.canvas.manager.window
  return win.geometry()

def fig_geom(geom="WxH+0+0",fig=None,n=None):
  Set figure geometry.
  The magical constants W and H can be used for screen width and height
    fig -- Figure object or None to use current figure
    geom -- Tk window geometry string
  if fig is None:
    if n is None:
      fig = plt.gcf()
      fig = plt.figure(n)
  # Access the Tk interface for the canvas
  win = fig.canvas.manager.window
  wid = win._w
  Tk =
  # Get screen and window dimensions
  if "W" in geom:
    geom = geom.replace("W",str(Tk("winfo","screenwidth",wid)))
  if "H" in geom:
    geom = geom.replace("H",str(Tk("winfo","screenheight",wid)))

Here are some instructions for profiling Python code collated from a [[few|]] [[posts|]] on [[stackoverflow|]].

To generate a text summary sorted by time:
python -m cProfile -s time arg1 arg2 > test.txt
To save a .pstats file from within Python:
import cProfile as profile"test()", "test.pstats")
To save a .pstats file from the command line:
python -m cProfile -o test.pstats arg1 arg2
To generate a graph in .svg format:
{{{ -f pstats test.pstats | dot -Tsvg -o test.svg
(this will require [[graphviz|]] and [[Gprof2dot|]]; using macports on OSX you can run:
sudo port install graphviz
git clone ~/src/gprof2dot
ln -s ~/src/gprof2dot/ ~/bin/
to get these packages)
[[Materials| talks/qual/]]
For the uninitiated, [[Radiolab|]] is a fantastic science podcast.  As I work my way through [[their free back-catalog|]] I'll highlight some of my favorites.

!!![[A 4-Track Mind|]]
Focusing on `national treasure' [[Bib Milne|]]'s ability to play several pieces of music simultaneously (both manually and mentally), there are some striking connections with the memory segment of the [[Limits|]] podcast.

!!![[A War We Need|]]
Though the drama is a little overwrought, imagining the incredible complexity & importance of the life of [[phytoplankton|]] was very compelling.

Possibly one of my favorite episodes -- fascinating anecdotes about limits on mind & body.  I especially enjoyed thinking about [[Steve Strogatz's|]] concern that we may (soon? eventually?) reach the limit on our ability to obtain scientific insight.

Fascinating anecdotes about the role of psychology in medicine.

!!![[Unraveling Bolero|]]
It's a bit of a reach when they retroactively diagnose Ravel with a very specific neurological disorder, but the vignettes in this podcast emphasize the dominion the language centers in the brain have over our consciousness.
I have been using the [[Rosetta Stone|]] software for the past few months to start learning Spanish. My goals include expanding my [[outreach|]] efforts to [[ESL|]] students, comfortably traveling in Latin America, and reading --[[the Quixote|]]-- --[[2666|]]--  any Spanish book written above a fifth grade reading level.

Having only studied [[ASL|]] in high school to satisfy the “foreign language” requirement for college admissions, I am starting from no experience learning to speak another language. Though many debate the [[efficacy|]] / [[price|]] ratio of the software,  I have found it to be a useful tool to begin learning vocabulary, pronunciation, and listening skills (the latter two of which are notoriously difficult to learn without a human instructor). 

Since I found very little information online describing how to use Rosetta Stone (RS) in an effective and comprehensive self-study program, I will post my techniques here.

RS divides its course into multiple Levels, each comprised of four Units, which are themselves comprised of four main Lessons and multiple reinforcement lessons spaced out (logarithmically?) between the main lessons. Devoting 30 -- 60  minutes per day, I was easily able to get through one Unit per week, and hence Levels 1 -- 3 ([[bundled together|]] for ~$400) in approximately 3 months.

I am in full agreement with [[this YouTube video|]] -- it is very difficult to learn grammar from RS. After the first few Levels you will start to intuit when a verb must be conjugated, but I am still unable to consistently recall the correct conjugation. I think an effective strategy is to buy the workbook from a first-year college-level Spanish course and do the exercises in parallel with RS.

RS eases you into every new word & phrase gradually, so the lessons can quickly become tedious and repetitive. To make the Listening exercises more challenging, I close my eyes, visualize what is being said,  and try to repeat it aloud before looking at the screen. This practice also seems to help me directly connect the Spanish language to my cognitive states, i.e. I do not need to first translate Spanish to English to understand what is being said.
!!Presentation Information
<<bibliography conference.bib BurdenRevzen2013>>

Links: [[slides| talks/2013sicb.pptx]], [[abstract|]]

As a one-sentence summary to anyone who missed the talk: we propose a computationally-tractable nonlinear regression algorithm to estimate unknown parameters and states in reduced-order dynamic models from empirical time-series data (e.g. body or limb kinematic data collected from high-speed video or motion capture).

!!Theoretical and Computational Tools
The underlying approach appeared in two control theory conference publications: one describing the `smoothing' construction for piecewise-defined (or //hybrid//) dynamical models, and the other applying the construction to enable implementation of first-order (gradient descent) algorithms to estimate unknown model parameters and states.

The notation will be somewhat dense to someone outside the control theory community -- please feel free to contact me with any questions or requests for clarification.  The sourcecode to generate the plots in the papers is available on the CDC2011 and SysID2012 pages.

''-- Smoothing piecewise-defined (//hybrid//) models:''
<<bibliography submitted.bib BurdenRevzen2013floq>>

<<bibliography conference.bib BurdenRevzen2011>>

Theorem 1 contains the full statement of the result: under a non-degeneracy condition on the [[Poincaré map|]] associated with a periodic orbit in a hybrid dynamical system, one can extract a (generally lower-dimensional) smooth dynamical system whose dynamics are `equivalent' to that of the hybrid system after a finite amount of time has elapsed.  This result is just a collation of Lemmas 1 -- 3 (applicable to smooth systems) interpreted in the context of hybrid dynamical systems.

''-- Estimating parameters and states in models of legged locomotion:''
<<bibliography conference.bib BurdenOhlsson2012>>

Section 4 contains the formulation of the prediction error minimization problem we aim to solve; Section 4.5 in particular provides details of the coordinates we actually search over and the algorithm we implement to do so.  For my SICB talk I used a [[general-purpose least-squares solver|]].

''-- Numerical simulation for models of legged locomotion:''
<<bibliography submitted.bib BurdenGonzalezVasudevan2013>>

<<bibliography conference.bib BurdenGonzalez2011>>

As a final note: if you have ever tried to implement a simulation of legged locomotion, you likely came up against the difficult problem of accurately detecting and handling the discrete `events' that occur when limbs touch down or lift off from the substrate.  In another series of papers we proposed a method that does not require root-finding or time-stepping and hence is particularly easy to implement; the details and simulation code are available on the CDC2011 page.

Aside from the simplicity of implementation, we also provide the first formal proof of convergence for a numerical simulation algorithm applied to piecewise-defined (//hybrid//) models -- no other piece of code (MATLAB, I'm looking at you!) has such a guarantee.
!!!A First Course in Robotics
Long relegated to performing menial jobs on assembly lines, robots are now poised to infiltrate our homes and classrooms. The introduction of automated vacuum cleaners and a host of programmable interactive toys witness this migration and give clues as to the roles robots will inevitably fill in our daily lives. During this short course, we'll discuss potential applications for this emerging robotic presence and explore some of the challenges facing engineers trying to build these systems. In particular, we'll learn fundamental principles of robot design and apply these ideas to build maze-navigating robots.
!!![[Reduction and Identification for Hybrid Dynamical Models of Terrestrial Locomotion| pubs/BurdenSastry2013.pdf]]

''To generate the schematic and plots in the paper:''
$ hg clone spie2013
$ cd spie2013
$ ipython 
ipy$ run hop --fp
ipy$ run -i hop --sch
ipy$ run -i hop --ic

Links: [[conference|]]; [[paper| pubs/BurdenSastry2013.pdf]]; [[slides| talks/2013spie.pdf]]

{{{mercurial python ipython numpy scipy matplotlib}}}
!!!Checklist from Wilson //et al.// 2012
The paper by <<cite WilsonAruliah2012 bibliography:computing.bib>> provides a cogent and comprehensive review of proven techniques to improve coding outcomes.  Their checklist reference is particularly valuable, so I've reproduced it here and marked which tenants I already adhere to.

1. Write programs for people, not computers.
[ ] A program should not require its readers to hold more than a handful of facts in memory at once.
[ ] Make names consistent, distinctive, and meaningful.
[x] Make code style and formatting consistent.
2. Let the computer do the work.
[x] Make the computer repeat tasks.
[x] Save recent commands in a file for re-use. (c) Use a build tool to automate workflows.
3. Make incremental changes.
[x] Work in small steps with frequent feedback and course correction. (b) Use a version control system.
[x] Put everything that has been created manually in version control.
4. Don’t repeat yourself (or others).
[x] Every piece of data must have a single authoritative representation in the system.
[x] Modularize code rather than copying and pasting. (c) Re-use code instead of rewriting it.
5. Plan for mistakes.
[ ] Add assertions to programs to check their operation. (b) Use an off-the-shelf unit testing library.
[ ] Turn bugs into test cases.
[x] Use a symbolic debugger.
6. Optimize software only after it works correctly.
[x] Use a profiler to identify bottlenecks.
[x] Write code in the highest-level language possible.
7. Document design and purpose, not mechanics.
[x] Document interfaces and reasons, not implementations.
[ ] Refactor code in preference to explaining how it works.
[x] Embed the documentation for a piece of software in that software.
8. Collaborate.
[ ] Use pre-merge code reviews.
[x] Use pair programming when bringing someone new up to speed and when tackling particularly tricky problems.
[ ] Use an issue tracking tool.

<<bibliography computing.bib showAll>>

<<closeAll>><<permaview>><<newTiddler>><<newJournal "MMM DD YYYY" "blog">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
Postdoc in EECS at UC Berkeley; Asst Prof in EE at UW Seattle
Sam Burden
~TiddlyWiki uses several "special tiddlers" to perform a number of essential functions as follows:
*[[Configuration]] tiddlers configure the layout of the page, including the MainMenu, the SiteTitle, the SiteSubtitle and other features. 
*A tiddler called DefaultTiddlers is used to list the tiddlers that are shown at startup. 
*A tiddler called SaveChanges is automatically displayed if there's a problem with saving. Any of them can be edited with the changes taking effect immediately.
* MoreTab, MissingTiddlers, OrphanTiddlers

''Inspired by [[TiddlyPom|]]''

|Created by|SaqImtiaz|
|Version|0.21 |
Provides a simple splash screen that is visible while the TW is loading.

Copy the source text of this tiddler to your TW in a new tiddler, tag it with systemConfig and save and reload. The SplashScreen will now be installed and will be visible the next time you reload your TW.

Once the SplashScreen has been installed and you have reloaded your TW, the splash screen html will be present in the MarkupPreHead tiddler. You can edit it and customize to your needs.

* 20-07-06 : version 0.21, modified to hide contentWrapper while SplashScreen is displayed.
* 26-06-06 : version 0.2, first release


function pausecomp(ms) {
ms += new Date().getTime();
while (new Date() < ms){}

window.restart = function()
{   if (document.getElementById("SplashScreen"))
        document.getElementById("SplashScreen").style.display = "none";
      if (document.getElementById("contentWrapper"))
        document.getElementById("contentWrapper").style.display = "block";

    if (splashScreenInstall)
        displayMessage("TW SplashScreen has been installed, please save and refresh your TW.");

var oldText = store.getTiddlerText("MarkupPreHead");
if (oldText.indexOf("SplashScreen")==-1)
   {var siteTitle = store.getTiddlerText("SiteTitle");
   var splasher='\n\n<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>'+siteTitle +'</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>';
   if (! store.tiddlerExists("MarkupPreHead"))
       {var myTiddler = store.createTiddler("MarkupPreHead");}
      {var myTiddler = store.getTiddler("MarkupPreHead");}
      var splashScreenInstall = true;
Here's a [[Folk Theorem|]] whose formal justification eluded me for an aggravating span of time (if you have a reference, please send it my way!):

''Thm:'' (//Folk//) The solution of $n$ "linearly independent equations" in $n$ unknowns "varies continuously" as the equations are "perturbed".

Thus the solution of a generic set of equations is "structurally stable".  There are several undefined terms in the statement of this Thm; here's a reformulation that's slightly sharper:

''Thm:'' (//Informal//) Suppose for $h\in C^r(R^n,R^n)$ that there exists $z\in R^n$ such that $h(z) = 0$ and $Dh(z)$ is invertible.  Then for all functions $\tilde{h}$ "sufficiently close to $h$", there exists a unique solution $\tilde{z}$ "near $z$" to the equation $\tilde{h}(x) = 0$.

This sounds more authoritative, but still requires a formal notion of "closeness" in the space of smooth functions.  If we restrict our attention to parameterized perturbations, we obtain an easy version of the result using the (classical, finite-dimensional) Implicit Function Theorem (IFT in the sequel; see Theorem 7.8 in Lee, 2002):

''Thm:'' (//Parameterized//)  Suppose for $h\in C^r(R^d\times R^n,R^n)$ that there exists $(\zeta,z)\in R^d\times R^n$ such that $h(\zeta,z) = 0$ and $D_z h(\zeta,z)$ is invertible.  Then there exists a function $\sigma:U\rightarrow V$ from a neighborhood $U\subset R^d$ of $\zeta$ to a neighborhood $V\subset R^n$ of $z$ such that for all $\tilde{\zeta}\in R^d$ the we have $h(\tilde{\zeta},\sigma(\tilde{\zeta})) = 0$ and for all $x\in V\setminus\{\sigma(\tilde{\zeta})\}$ we have $h(\tilde{\zeta},x) \ne 0$.

This is workable for most purposes, but it's dissatisfying that the perturbation must be finitely parameterized.  However, reliance on IFT is suggestive since there exist extensions to Banach spaces (proofs in both finite and infinite dimensions make use of the Contraction Mapping Principle; see for instance Theorem 4.E in Zeidler, 1995).  Restricting our attention to a compact neighborhood of the equation's solution, the uniform norm gives the space of smooth functions the structure of a Banach space (see Chapter 2 in Hirsch, 1976)!  This yields the following:

''Thm:'' Suppose for $h\in C^r(R^n,R^n)$ that there exists $z\in R^n$ such that $h(z) = 0$ and $Dh(z)$ is invertible.  Then there exists $\alpha,\beta > 0$ and a function $\sigma\in C^r(B_\alpha(h),B_\beta(z))$ such that for all $\tilde{h}\in B_\alpha(h)$ we have $\tilde{h}(\sigma(\tilde{h})) = 0$ and for all $x\in B_\beta(z)\setminus\{\sigma(\tilde{h})\}$ we have $\tilde{h}(x) \ne 0$.

This is satisfying for several reasons:
# it is valid for ''any'' smooth perturbation;
# the solution depends ''smoothly'' on the perturbation;
# there is a ''uniform bound'' on the allowed perturbation size (i.e. the result does not depend on the "direction" in which you perturb).
<<bibliography geometry.bib Lee2002 Hirsch1976>>

<<bibliography analysis.bib Zeidler1995>>
I just discovered [[Kuhn's classic essay|]]. Though many of the ideas have been assimilated into academic culture -- the phrase “[[paradigm shift|]]” and [[science as a social phenomenon|]] -- I found the piece informative and highly relevant. It helped clarify and contextualize some frustrations I have as a student and researcher, and provoked more fundamental questions about the purpose and goal of academic research in engineering.  This post will evolve as I discuss the ideas with colleagues.

!!!Narrative fallacy in science curriculum
Kuhn observes that the main pedagogical apparatus of a typical [[R1 university|]] -- textbooks -- efficiently indoctrinate students with the tools and perspectives of the dominant scientific paradigm while suppressing competing interpretations:
Because they aim quickly to acquaint the student with what the contemporary scientific community thinks it knows, textbooks treat the various experiments, concepts, laws, and theories of the current normal science as separately and as nearly seriatim as possible.
> <<cite Kuhn1970 bibliography:kuhn.bib>>, pg. 140
I found this narrative structure of physics and chemistry textbooks extremely misleading and difficult to follow as an undergraduate.  Though difficult to implement, it strikes me that a better curriculum could be crafted around more open-ended exploration and assimilation of results of laboratory experiments.

!!!The human condition corrupts scientific progress
[[Resistance by scientists to scientific discovery|]] is an acknowledged phenomenon.  Kuhn contributes the observation that this resistance is necessary for the progress of [[normal science|]], rather than a psychological failing attributable to ego or cognitive bias:
Though the historian can always find scientists who were unreasonable to resist for as long as they did, they will not find a point at which resistance becomes illogical or unscientific.  At most one may wish to say that the person who continues to resist after the whole profession has been converted has //ipso facto// ceased to be a scientist.
> <<cite Kuhn1970 bibliography:kuhn.bib>>, pg. 159
This is refreshing since it redirects frustration one may feel when a progressive paper is rejected away from unproductive bitterness toward renewed progress.

!!!Open questions
*Does engineering research (an enormous enterprise today compared to the 1960's) fit Kuhn's `Structure` ?
*Regardless, does engineering research qualify as a `science` (either under Kuhn's definition or another) ?

Kuhn wrote in a time when academia was utterly dominated by men; I elected to sanitize the gender bias in the quotes above.

The essay is a goldmine of landmark papers in the history, philosophy, psychology, & sociology of science -- many such citations are included below even if I haven't been able to assimilate them above.

<<bibliography kuhn.bib showAll>>
/*Blackicity Theme for TiddlyWiki*/
/*Design and CSS by Saq Imtiaz*/
/*Version 1.0*/
body{	font-family: Monaco, Courier New, monospace, "Neue Helvetica", Helvetica, "Lucida Grande", Verdana, sans-serif;
	background-color: #fff;
	color: #333;}

img{ border: 2px solid #666; margin: 10px 10px 10px 10px }

.header { background: #000; color: #fff; }

.viewer table.bd0,
.viewer table.bd0 * { border:0;padding:0 4px 4px 0;vertical-align:top; }

#topMenu {position:relative; background:#282826; padding:10px; color:#fff;font-family:Monaco, Courier New, monospace,'Lucida Grande', Verdana, Sans-Serif;}
#topMenu br {display:none;}

#topMenu a{			color: #999;
			padding: 0px 8px 0px 8px;
			border-right: 1px solid #444;}
#topMenu a:hover {color:#fff; background:transparent;}

#displayArea {margin-left:1em; margin-bottom:2em; margin-top:0.5em;}

text-decoration: none;   background:transparent; 

text-decoration: none;   background:transparent; 

.viewer a, .viewer a:hover {border-bottom:1px dotted #333; font-weight:bold; text-decoration:none}

.viewer .button, .editorFooter .button{
color: #333;
border: 1px solid #333;

.viewer .button:hover,
.editorFooter .button:hover, .viewer .button:active, .viewer .highlight,.editorFooter .button:active, .editorFooter .highlight{
color: #fff;
background: #333;
border-color: #333;

.tiddler .subtitle { display:none; } 

.tiddler .viewer {line-height:1.45em; padding: 0px 0px 0px 20px}
.title {color:#222; border-bottom:2px solid#222; font-family:Monaco, Courier New, monospace,'Lucida Grande', Verdana, Sans-Serif; font-size:1.45em; margin-bottom: 10px}
.subtitle, .subtitle a { color: #999999; font-size: 0.85em;margin:0.2em;}
.shadow .title{color:#999;}

.toolbar {font-size:90%;}
.selected .toolbar a {color:#999999;}
.selected .toolbar a:hover {color:#333; background:transparent;border:1px solid #fff;}

.toolbar .button:hover, .toolbar .highlight, .toolbar .marked, .toolbar a.button:active{color:#333; background:transparent;border:1px solid #fff;}

#sidebar { margin-bottom:2em !important; margin-bottom:1em; right:0;

#sidebarOptions { padding-top:2em;background:#f3f3f3;padding-left:0.5em;}

#sidebarOptions a {
                        border:1px solid #f3f3f3;
			text-decoration: none;

#sidebarOptions	a:hover, #sidebarOptions a:active {
			background-color:#fff;border:1px solid #fff;

#sidebarOptions input {border:1px solid #ccc; }

#sidebarOptions .sliderPanel {
	background: #f3f3f3; 	font-size: .9em;

#sidebarOptions .sliderPanel input {border:1px solid #999;}
#sidebarOptions .sliderPanel .txtOptionInput {border:1px solid #999;width:9em;}

#sidebarOptions .sliderPanel a {font-weight:normal; color:#555;background-color: #f3f3f3; border-bottom:1px dotted #333;}

#sidebarOptions .sliderPanel a:hover {
background-color: #f3f3f3;
border-bottom:1px dotted #111;
 .listTitle {color:#222;}
#sidebarTabs {background:#f3f3f3;}

#sidebarTabs .tabContents {background:#cfcfcf;}

#sidebarTabs .tabUnselected:hover {color:#999;}

#sidebarTabs .tabSelected{background:#cfcfcf;}

#sidebarTabs .tabContents .tiddlyLink, #sidebarTabs .tabContents .button{color:#666;}
#sidebarTabs .tabContents .tiddlyLink:hover,#sidebarTabs .tabContents .button:hover{color:#222;background:transparent; text-decoration:none;border:none;}

#sidebarTabs .tabContents .button:hover, #sidebarTabs .tabContents .highlight, #sidebarTabs .tabContents .marked, #sidebarTabs .tabContents a.button:active{color:#222;background:transparent;}

#sidebarTabs .txtMoreTab .tabSelected,
#sidebarTabs .txtMoreTab .tab:hover,
#sidebarTabs .txtMoreTab .tabContents{
 color: #111;
 background: #f3f3f3; border:1px solid #f3f3f3;

#sidebarTabs .txtMoreTab .tabUnselected {
 color: #555;
 background: #AFAFAF;

.tabSelected{color:#fefefe; background:#999; padding-bottom:1px;}
 .tabSelected, .tabSelected:hover {
 color: #111;
 background: #fefefe;
 border: solid 1px #cfcfcf;

 .tabUnselected {
 color: #999;
 background: #eee;
 border: solid 1px #cfcfcf;
.tabUnselected:hover {text-decoration:none; border:1px solid #cfcfcf;}
.tabContents {background:#fefefe;}

.tagging, .tagged {
border: 1px solid #eee;
background-color: #F7F7F7;

.selected .tagging, .selected .tagged {
background-color: #f3f3f3;
border: 1px solid #ccc;

.tagging .listTitle, .tagged .listTitle {
color: #bbb;

.selected .tagging .listTitle, .selected .tagged .listTitle {
color: #333;

.tagging .button, .tagged .button {
.selected .tagging .button, .selected .tagged .button {

.highlight, .marked {background:transparent; color:#111; border:none; text-decoration:none;}

.tagging .button:hover, .tagged .button:hover, .tagging .button:active, .tagged .button:active {
border: none; background:transparent; text-decoration:none; color:#333;

.popup {
background: #cfcfcf;
border: 1px solid #333;

.popup li.disabled {
color: #000;

.popup li a, .popup li a:visited {
color: #555;
border: none;
text-decoration: none;

.popup li a:hover {
background: #f3f3f3;
color: #555;
border: none;
text-decoration: none;

#messageArea {

border: 4px dotted #282826;
background: #F3F3F3;
color: #333;

#messageArea a:hover { background:#f5f5f5; border:none; text-decoration: none; }

#messageArea .button{
color: #333;
border: 1px solid #282826;

#messageArea .button:hover {
color: #fff;
background: #282826;
border-color: #282826;

.tiddler {padding-bottom:10px;}

.viewer blockquote {
border-left: 5px solid #282826;

.viewer table, .viewer td {
border: 1px solid #282826;

.viewer th, thead td {
background: #282826;
border: 1px solid #282826;
color: #fff;
.viewer pre {
border: 1px solid #ccc;
background: #f5f5f5;

.viewer code {
color: #111; background:#f5f5f5;

.viewer hr {
border-top: dashed 1px #222; margin:0 1em;

.editor input {
border: 1px solid #ccc; margin-top:5px;

.editor textarea {
border: 1px solid #ccc;

h1,h2,h3,h4,h5 { color: #282826; background: transparent; padding-bottom:2px; font-family:Monaco, Courier New, monospace, Arial, Helvetica, sans-serif; }
h1 {font-size:22px;}
h2 {font-size:14px;}
h3 {font-size: 14px;}

Just a quick script to streamline the creation of playlists on the [[SwiMP3|]] waterproof mp3 player.  The player sorts songs alphabetically, so simply dragging files from your filesystem or iTunes will usually yield an incorrect order.  Instead, create .m3u playlists directly on the USB device, then execute the following Python code in the same directory.

import os
from glob import glob

sfx = '.m3u'
lis = glob('*'+sfx)

for li in lis:
  l = li.strip(sfx)
  if not os.path.exists(l):
    cmd = 'mkdir "{l}"'.format(l=l)
    print cmd
    fis = open(li,'r').readline().split('\r')[::2][1:]
    for n,fi in enumerate(fis):
      f = fi.split('/')[-1]
      cmd = 'cp "{fi}" "{l}/{n:04d}_{f}"'.format(fi=fi,l=l,n=n,f=f)
      print cmd

If you update a playlist, simply delete the corresponding folder and re-run the script.
!!![[Parameter Identification Near Periodic Orbits of Hybrid Dynamical Systems| pubs/BurdenOhlsson2012.pdf]]

''To generate the schematic and plots in the paper:''
$ hg clone sysid2012
$ cd sysid2012
$ ipython 
ipy$ run hop --fp
ipy$ run -i hop --sch
ipy$ run -i hop --ic
ipy$ run -i hop --icpar

Links: [[slides| talks/2012sysid.pdf]], [[paper| pubs/BurdenOhlsson2012.pdf]]

{{{mercurial python ipython numpy scipy matplotlib}}}
chkAnimate: false
chkToggleLinks: false
txtBackupFolder: tmp
[[Dynamic Inverse Models in Human-Cyber-Physical Systems| talks/20150810-soa.ppt]]
ONR Science of Autonomy Workshop
Arlington, VA, USA, 2015

[[Near-simultaneous footfalls lend stability to multi-legged gaits| talks/20150723-dw.pdf]] ([[abstract|]])
Dynamic Walking
Columbus, OH, USA, 2015

[[Parsimonious predictive models for legged locomotion| talks/20150526-icra.pdf]]
[[ICRA Workshop on Robotics-Inspired Biology (and Bio-Inspired Robotics)|]]
Seattle, WA, USA, 2015

[[Dynamic Inverse Models in Cyber-Human Systems| talks/20150512-kavli.ppt]] ([[abstract| talks/20150512-kavli-abstract.txt]])
Kavli Futures Workshop on ~Neuroscience-Inspired Computing
Berkeley, CA, USA, 2015

[[Metrization, Simulation, and First-Order Approximation for Networked CPS| talks/20141208-forces.pdf]]
NSF [[CPS-FORCES|]] Review Meeting
Berkeley, CA, USA, 2014

[[Hybrid Models for Dynamic and Dexterous Robots| talks/20141024uw.pdf]] ([[abstract|]])
UW CSE Robotics Colloquium
Seattle, WA, USA, 2014

[[Adaptive piecewise-affine inverse modeling of hybrid dynamical systems| IFAC2014]]
IFAC World Congress
Cape Town, South Africa, 2014

[[Reduction and Identification for Models of Locomotion: an Emerging Systems Theory for Neuromechanics| talks/2014-uw-ee.pdf]] ([[video|]]) ([[abstract|]])
Electrical Engineering at University of Washington, Seattle, WA, February 2014
Mechanical Engineering & Institute for Systems Research at University of Maryland, College Park, MD, February & March 2014
Electrical, Computer, and Energy Engineering at University of Colorado, Boulder, CO, February 2014
Electrical Engineering at Harvard University, Cambridge, MA, March 2014
Electrical and Computer Engineering at Northeastern University, Boston, MA, March 2014

[[Optimization for models of legged locomotion: parameter estimation, gait synthesis, and experiment design| talks/2014sicb.pptx]] ([[abstract|]])
Society for Integrative and Comparative Biology
Austin, TX, USA, 2014

[[Bio-Inspired Reduction and Robustness of Dynamic Robot Gaits| UMD2013]]
University of Maryland, College Park, MD, USA, 2013

[[Reduction and Identification for Hybrid Dynamical Models of Terrestrial Locomotion| talks/2013spie.pdf]]
SPIE Conference on Defense, Security, and Sensing (DSS)
Baltimore, MD, USA, 2013
Army Research Labs (ARL)
Adelphi, MD, USA, 2013

[[From Templates to Anchors: Exact and Approximate Reduction in Models of Legged Locomotion| talks/2013dw.pdf]] ([[abstract|]])
Dynamic Walking
Pittsburgh, PA, USA, 2013

[[Using reduced—order models to study dynamic legged locomotion: Parameter identification and model validation| SICB2013]] ([[slides| talks/2013sicb.pptx]]) ([[abstract|]])
Society for Integrative and Comparative Biology
San Francisco, CA, USA, 2013

[[Reduction and Robustness via Intermittent Contact| talks/2012cdc.pdf]]
Workshop: [[Control Systems in the Open World|]]
IEEE Conference on Decision and Control (CDC)
Maui, HI, USA, 2012

[[Parameter Identification Near Periodic Orbits of Hybrid Dynamical Systems| SysID2012]]
IFAC Symposium on System Identification (~SysID)
Brussels, Belgium, 2012

[[Reduction and Identification for Hybrid Dynamical Models of Terrestrial Locomotion| talks/20130322umich.pdf]]
Johns Hopkins University, University of Pennsylvania, University of Delaware, 2011
University of Maryland, Massachusetts Institute of Technology, Harvard University, University of Washington, 2012
SRI International, University of Michigan, 2013

[[Dimension Reduction Near Periodic Orbits of Hybrid Systems| CDC2011]]
IEEE Conference on Decision and Control / European Control Conference (CDC/ECC)
Orlando, FL, USA, 2011

[[On State Estimation for Hybrid Abstractions of Legged Locomotion| talks/2010hscc.pdf]]
Hybrid Systems: Computation and Control (HSCC)
Stockholm, Sweden, 2010

[[A First Course in Robotics| talks/or/2009simuw.pdf]]
University of Washington [[Summer Institute for Mathematics|]] (SIMUW)
Seattle, Washington, USA, 2009, 2010, 2011, 2012

[[Robots that run, climb, flap, and swim| talks/or/2012mathday.pdf]]
University of Washington [[MathDay|]]
Seattle, Washington, USA, 2009, 2010, 2011, 2012 (plenary -- ''1000+ attendees!'')

Mathematical Contest in Modeling (MCM)
University of Washington [[Summer Institute for Mathematics|]] (SIMUW)
Seattle, Washington, USA, 2007, 2008

Heterogeneous Leg Stiffness and Roll in Dynamic Running
International Conference on Robotics and Automation (ICRA)
Rome, Italy, 2007

Pull Yourself Together: Creating Robots that ~Self-Assemble
University of Washington NASA Space Grant Reception
Seattle, Washington, USA, 2007
|Author|Eric Shulman|
|Description|show/hide right sidebar (SideBarOptions)|
<<tiddler ToggleRightSidebar>>
<<tiddler ToggleRightSidebar with: label tooltip>>
Try it: <<tiddler ToggleRightSidebar##show
	with: {{config.options.chkShowRightSidebar?'►':'◄'}}>>
copy/paste the following settings into a tiddler tagged with <<tag systemConfig>> and then modify the values to suit your preferences:
<<tiddler {{
	var co=config.options;
	if (co.chkShowRightSidebar===undefined) co.chkShowRightSidebar=true;
	var sb=document.getElementById('sidebar');
	var da=document.getElementById('displayArea');
	if (sb) {'block':'none';'':'1em';
'';}}>><html><nowiki><a href='javascript:;' title="$2"
	var co=config.options;
	var opt='chkShowRightSidebar';
	var show=co[opt]=!co[opt];
	var sb=document.getElementById('sidebar');
	var da=document.getElementById('displayArea');
	if (sb) {'block':'none';'':'1em';
	var labelShow=co.txtToggleRightSideBarLabelShow||'&#x25C4;';
	var labelHide=co.txtToggleRightSideBarLabelHide||'&#x25BA;';
	if (this.innerHTML==labelShow||this.innerHTML==labelHide) 
	this.title=(show?'hide':'show')+' right sidebar';
	var sm=document.getElementById('storyMenu');
	if (sm) config.refreshers.content(sm);
	return false;
%/<<tiddler {{
	var src='ToggleRightSidebar';
}} with: {{
	var co=config.options;
	var labelShow=co.txtToggleRightSideBarLabelShow||'&#x25C4;';
	var labelHide=co.txtToggleRightSideBarLabelHide||'&#x25BA;';
}} {{
	var tip=(config.options.chkShowRightSidebar?'hide':'show')+' right sidebar';
!!!4pm on Thu Oct 24 in 2164 Martin Hall at UMD College Park
([[announcement|]]) ([[slides| talks/20131024umd.pdf]])
~Bio-Inspired Reduction and Robustness of Dynamic Robot Gaits
Compared to robots, animals are remarkably adept at rapid locomotion on challenging terrain.  Although a rich sensor suite and sophisticated neural circuitry must contribute, the skill exhibited across scale and taxa suggests there are unknown passive mechanisms contributing to performance.  Multi-legged animals coordinate their limbs in unexpected ways: they effect tight synchronization that dramatically reduces their effective mechanical degrees-of-freedom; and they utilize gaits wherein multiple legs impact the terrain nearly simultaneously.  Studying these puzzling phenomena, in this talk I derive new principles for model reduction and robust stability arising from the intermittent contact of limbs with terrain.  Aside from providing theoretical explanations for surprising properties of animal gaits, these results suggest novel mechanisms for design of dynamically-stable robot gaits.
Sam Burden is a ~PhD candidate in Electrical Engineering and Computer Sciences at UC Berkeley advised by Prof. Shankar Sastry.  He is broadly interested in discovering and formalizing principles that enable dynamic locomotion and dexterous manipulation in robotics, biomechanics, and human motor control.  In experimental studies with robots and animals, he adopts a comparative approach that enables demonstration and translation of these principles across scale, material, and morphology.  He is a recipient of the NSF Graduate Research Fellowship and actively contributes to the Army Research Lab's MAST CTA.
The following is a summary of notable user-level feature changes in ~TiddlyWiki v<<version>>:
*''FireFox "privilege" handling''<br>Catch and supress "privilege" error messages in the TWCore backstage Import functions that use FireFox local file I/O or "ajax" remote (http) file access.
*''TiddlySaver''<br>Changes in handling for filenames with Unicode/UTF-8 characters.  Updated new signed security certificate.
*''backstage import''<br>Fixes for importing tiddlers from local files (must be in same directory as current document)
I just returned from attending the first [[International Leadership Conference|]] organized by [[IEEE Women In Engineering|]], which is the arm of the IEEE dedicated to recruiting and retaining women in engineering.  I learned about the conference from [[Linda Bushnell|]], who is the [[Control Systems Society|]] coordinator to IEEE WIE; to my embarrassment, I wasn't previously aware of the organization, or the fact that IEEE student members can [[join for $0.00|]]!  The conference registration was a little steep for me to pay out-of-pocket, but fortunately the [[NSF ActionWebs|]] project was generous enough to cover the fee.

Women seek and earn engineering degrees at abysmally low rates, even compared to scientific disciplines; [[this chart|]] gives you some idea, but refer to [[the raw data|]] to compute the stats in your particular subfield.  Beyond bringing shame to engineers everywhere, this also implies the field is excluding an enormous potential source of talent.  I find this unacceptable, so I attended the [[ILC|]] to learn what to do as a teacher and advisor to effect change.

The conference was inspiring and informative.  Although the sessions were not uniformly great, attending exposed me to excellent resources, connected me to fantastic organizations, and focused my effort on a concrete set of actions.

!!!My experience at the conference
Although I've certainly thought abstractly about the fact that it must feel strange to be in a minority group in a professional context, as a white male this was the first time I was a member of a minority group in a large professional event (in fact, the only other men in attendance were representatives from IEEE or part of the committee that organized the conference).  Checking in at the registration desk, I felt isolated and out of place.  I was daunted by the prospect of networking.  I didn't know where or whether to sit or stand.  I hoped everyone would just ignore me.  For the morning's plenary, I found an empty table at the far end of the banquet hall and diligently studied the conference program, avoiding eye contact as people walked by.

Fortunately for me, [[Deb Campbell|]] from [[Catalyst|]] sat next to me and introduced herself.  Deb consults a variety of organizations about how to advance women into leadership roles.  She was interested in learning why I was at the conference, but being singled out in this way didn't make me uncomfortable.  The conversation immediately validated my reasons for attending, and she gave me concrete advice about common mistakes made at universities.  In particular, she alerted me to the fact that [[faculty preferentially reply to "cold calls" from white males|]], and generally that professors tend to support and advance students that look and act like them.  

I was much more at ease after that initial conversation.  Although I was singled out occasionally in a session (e.g. speaker makes a stereotyping statement about men, then apologizes generally to "any men in the audience" or specifically to me), I never felt uncomfortable or unwelcome, and everyone I introduced myself to was open and gracious.

!!!Resources and action items
The low graduation rate for women in engineering is a systemic problem whose solution will require effort from across the education system and the broader society, and from both sides of the gender divide.  One of the most empowering things I learned at the conference were concrete actions men can take to aid the cause; some supporting literature:
* [[Catalyst's Actions Men Can Take to Create an Inclusive Workplace|]]
* [[NCWIT's Top 10 Ways to Be a Male Advocate for Technical Women|]]
* [[NCWIT's Top 10 Ways Managers Can Retain Technical Women|]]
* [[AAUW's "Why So Few [Women in Engineering]?" Executive Summary|]]
Beyond the obvious steps (do not condone sexism; do not diminish/shame others; discuss and increase awareness of this issue among colleagues) and those that require more introspection and self-awareness (compensate for unconscious / implicit bias), one major new recommendation is for [[women to seek sponsors|]], both among men and women.  Note that the term ''sponsor'' is deliberately distinct from that of ''mentor'':
* a ''mentor'' advises you about your career; they can be a peer, or someone outside your organization, and may or may not be able to evaluate your ability;
* a ''sponsor'' advocates for your promotion within your organization; they are at a higher level than you and must be able to evaluate your ability.
The semantic distinction is useful insofar as it clarifies that "mentorship" and "sponsorship" are distinct actions that can be taken by distinct individuals.  Thus to fight the gender discrepancy in engineering, we should all (women and men alike) specifically seek out women to advise and promote within our organizations (though it may not be necessary to fill both roles for every individual).
	Author = {Zeidler, E},
	Publisher = {Springer--Verlag},
	Title = {Applied functional analysis and its applications},
	Year = {1995}}
	Author = {Greg Wilson and D. A. Aruliah and C. Titus Brown and Neil P. Chue Hong and Matt Davis and Richard T. Guy and Steven H. D. Haddock and Katy Huff and Ian M. Mitchell and Mark Plumbley and Ben Waugh and Ethan P. White and Paul Wilson},
	Title = {Best Practices for Scientific Computing},
        Institution = {arXiv:1210.0530v4},
        url = {},
	Year = {2012}}
	Author = {Elhamifar, E and Burden, S A and Sastry, S S},
	Title = {Adaptive piecewise-affine inverse modeling of hybrid dynamical systems},
	Booktitle = {IFAC World Congress},
        url = {papers/ElhamifarBurden2014ifac.pdf}
	Year = {2014}}

	Author = {Ratliff, L J and Burden, S A and Sastry, S S},
	Title = {Genericity and structural stability of non-degenerate differential Nash equilibria },
	Booktitle = {American Control Conference},
        url = {papers/RatliffBurden2014acc.pdf},
	Year = {2014}}

	Author = {Burden, S A and Sastry, S S and Full, R J},
	Title = {Optimization for models of legged locomotion: Parameter estimation, gait synthesis, and experiment design},
	Booktitle = {Society for Integrative and Comparative Biology},
        url = {talks/2014sicb.pptx},
	Year = {2014}}

	Author = {Revzen, S and Burden, S A and Kvalheim, M D},
	Title = {Why the trot?},
	Booktitle = {Society for Integrative and Comparative Biology},
        url = {},
	Year = {2014}}

	Author = {Yang, I and Burden, S A and Sastry, S S and Tomlin, C J},
	Title = {Infinitesimal interconnection variation in nonlinear networked systems},
	Booktitle = {IEEE Conference on Decision and Control},
        url = {papers/YangBurden2013.pdf},
	Year = {2013}}

	Author = {Ratliff, L J and Burden, S A and Sastry, S S},
	Title = {Characterization and computation of local Nash equilibria in continuous games},
	Booktitle = {Allerton Conference on Communication, Control, and Computing},
        url = {papers/RatliffBurden2013.pdf},
	Year = {2013}}

	Author = {Burden, S A and Revzen, S and Sastry, S S},
	Title = {From anchors to templates: Exact and approximate reduction in models of legged locomotion},
	Booktitle = {Dynamic Walking},
        url = {papers/BurdenRevzen2013dw.pdf},
	Year = {2013}}

	Author = {Revzen, S and Burden, S A and Koditschek, D E and Sastry, S S},
	Title = {Pinned equilibria provide robustly stable multilegged locomotion},
	Booktitle = {Dynamic Walking},
        url = {papers/RevzenBurden2013dw.pdf},
	Year = {2013}}

	Author = {Burden, S and Sastry, S S},
	Title = {Reduction and identification for hybrid dynamical models of terrestrial locomotion},
	Booktitle = {SPIE Conference on Micro-Nanotechnology Sensors, Systems, and Applications},
        url = {SPIE2013},
	Year = {2013}}

	Author = {Burden, S A and Revzen, S and Moore, T Y and Sastry, S S and Full, R J},
	Title = {Using reduced-order models to study dynamic legged locomotion: Parameter identification and model validation},
	Booktitle = {Society for Integrative and Comparative Biology},
        url = {SICB2013},
	Year = {2013}}

	Author = {Burden, S A and Ohlsson, H and Sastry, S S},
	Title = {Parameter identification near periodic orbits of hybrid dynamical systems},
	Booktitle = {IFAC Symposium on System Identification},
        url = {SysID2012},
	Year = {2012}}

	Author = {Burden, S and Gonzalez, H and Vasudevan, R and Bajcsy, R and Sastry, S S},
	Month = {dec.},
	Pages = {3958--3965},
	Title = {Numerical integration of hybrid dynamical systems via domain relaxation},
	Booktitle = {IEEE Conference on Decision and Control},
        url = {CDC2011},
	Year = {2011}}

	Author = {Burden, S A and Revzen, S and Sastry, S S},
	Month = {dec.},
	Pages = {6116--6121},
	Title = {Dimension reduction near periodic orbits of hybrid systems},
	Booktitle = {IEEE Conference on Decision and Control},
        url = {CDC2011},
	Year = {2011}}

	Author = {Hoover, A and Burden, S A and Fu, X and Sastry, S S and Fearing, R},
	Title = {Bio-inspired design and dynamic maneuverability of a minimally actuated six-legged robot},
	Booktitle = {IEEE Conference on Biomedical Robotics and Biomechatronics},
        url = {papers/HooverBurden2010.pdf},
	Year = {2010}}

	Author = {Moore, T Y and Revzen, S and Burden, S A and Full, R J},
	Title = {Adding inertia and mass to test stability predictions in rapid running insects},
	Booktitle = {Society for Integrative and Comparative Biology},
        url = {},
	Year = {2010}}

	Author = {Napp, N and Burden, S A and Klavins, E},
	Title = {Setpoint regulation for stochastically interacting robots},
	Booktitle = {Robotics: Science and Systems},
        url = {papers/NappBurden2009.pdf},
	Year = {2009}}

	Author = {Burden, S A and Clark, J and Weingarten, J and Komsuoglu, H and Koditschek, D E},
	Number = {605},
	Title = {Heterogeneous leg stiffness and roll in dynamic running},
	Booktitle = {International Conference on Robotics and Automation},
        url = {papers/BurdenClark2007.pdf},
	Year = {2007}}

	Author = {Klavins, E and Burden, S A and Napp, N},
	Title = {The statistical dynamics of programmed robotic self-assembly},
	Booktitle = {International Conference on Robotics and Automation},
        url = {papers/KlavinsBurden2006.pdf},
	Year = {2006}}

	Author = {Klavins, E and Burden, S A and Napp, N},
	Title = {Optimal rules for programmed stochastic self-assembly},
	Booktitle = {Robotics: Science and Systems},
        url = {papers/KlavinsBurden2006a.pdf},
	Year = {2006}}

	Author = {Bishop, J and Burden, S A and Klavins, E and Kreisberg, R and Malone, W and Napp, N and Nguyen, T},
	Organization = {IEEE},
	Pages = {3684--3691},
	Title = {Programmable parts: A demonstration of the grammatical approach to self-organization},
	Booktitle = {International Conference on Intelligent Robots and Systems},
        url = {papers/BishopBurden2005.pdf},
	Year = {2005}}


ffmpeg -i in.ext -vf crop=width:height:x:y -o out.ext
ffmpeg -i in.ext -an -crf 23 -pix_fmt yuv420p -o out.ext
!!!Seek & trim
ffmpeg -ss 00:00:02 -t 00:00:06 -i in.ext -o out.ext
!!!First frame
ffmpeg -i in.ext -ss 0 -vframes 1 -vcodec mjpeg -f image2 out.jpg
!!!From image seq (default rate 25fps)
ffmpeg -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
!!!HD to 640x360
ffmpeg -i -s 640x360 -r 30000/1001 -b 200k -bt 240k -vcodec libx264 -coder 0 -bf 0 -refs 1 -level 30 -maxrate 10M -bufsize 10M -acodec aac -ac 2 -ar 48000 -ab 192k -strict -2 out.mp4
	Author = {Lee, J M},
	Publisher = {Springer--Verlag},
	Title = {{Introduction to smooth manifolds}},
	Year = {2002}}

	Author = {Hirsch, M W},
	Publisher = {Springer--Verlag},
	Title = {{Differential topology}},
	Year = {1976}}


	Author = {Darwin, Charles},
	Publisher = {Murray},
	Title = {On the Origin of Species by Means of Natural Selections: Or the Preservation of Favoured Races in the Struggle for Life},
	Year = {1859}}

	Author = {Milnor, J.W.},
	Publisher = {Princeton University Press},
	Title = {{Morse theory}},
	Year = {1963}}

	Author = {Eldredge, Niles and Gould, Stephen Jay},
	Editor = {Schopf, T. J. M.},
	Pages = {82--115},
	Title = {Punctuated equilibria: an alternative to phyletic gradualism},
	Booktitle = {Models in Paleobiology},
	Year = {1972}}

	Author = {Gould, Stephen Jay and Eldredge, Niles},
	Journal = {Systematic Zoology},
	Number = {1},
	Pages = {143--148},
	Title = {Punctuated Equilibrium at the Third Stage},
	Volume = {35},
	Year = {1986}}

	Author = {Gould, Stephen Jay and Eldredge, Niles and others},
	Journal = {Nature},
	Number = {6452},
	Pages = {223--227},
	Title = {Punctuated equilibrium comes of age},
	Volume = {366},
	Year = {1993}}

	Author = {Vogel, Steven and Davis, Kathryn K},
	Publisher = {WW Norton & Company},
	Title = {Cats' paws and catapults: Mechanical worlds of nature and people},
	Year = {2000}}

	Author = {Gould, Stephen Jay},
	Publisher = {Harvard University Press},
	Title = {Punctuated equilibrium},
	Year = {2007}}

	Author = {Taleb, Nassim Nicholas},
	Publisher = {Random House},
	Title = {The black swan: The impact of the highly improbable},
	Year = {2007}}

	Author = {Revzen, S and Burden, S A and Moore, T Y and Mongeau, J M and Full, R J},
	Title = {Instantaneous kinematic phase reflects neuromechanical response to lateral perturbations of running cockroaches},
	Journal = {Biological Cybernetics},
        Volume = {107},
        Number = {2},
        Pages = {179-200},
	Year = {2013},
        Doi = {10.1007/s00422-012-0545-z},
        url = {papers/RevzenBurden2013.pdf}}

	Author = {Napp, N and Burden, S A and Klavins, E},
	Journal = {Autonomous Robots},
	Pages = {57-71},
	Title = {Setpoint regulation for stochastically interacting robots},
	Volume = {30},
	Year = {2011},
        doi = {10.1007/s10514-010-9203-2},
        url = {papers/NappBurden2011.pdf}}

	Author = {Burden, S A and Gonzalez, H and Vasudevan, R and Bajcsy, R and Sastry, S S},
	Title = {{Metrization and simulation of controlled hybrid systems}},
        Journal = {IEEE Transactions on Automatic Control},
	Institution = {arXiv:1302.4402},
        url = {},
	Year = {2015}}

	Author = {Burden, S A and Revzen, S and Sastry, S S},
	Title = {Model reduction near periodic orbits of hybrid dynamical systems},
        Journal = {IEEE Transactions on Automatic Control},
	Institution = {arXiv:1308.4158},
        url = {},
	Year = {2015}}

	Author = {Barber, B.},
	Journal = {Science},
	Pages = {596--602},
	Title = {Resistance by Scientists to Scientific Discovery},
	Volume = {134},
	Year = {1961}}

	Author = {Bruner, J. S. and Postman, L.},
	Journal = {Journal of Personality},
	Number = {2},
	Pages = {206--223},
	Title = {On the perception of incongruity: a paradigm},
	Volume = {18},
	Year = {1949}}

	Author = {Kubie, L. S.},
	Journal = {American Scientist},
	Number = {4},
	Pages = {pp. 596-613},
	Title = {Some unsolved problems of the scientific career},
	Volume = {41},
	Year = {1953}}

	Author = {Kuhn, T.S.},
	Edition = {Second},
	Publisher = {University of Chicago Press},
	Title = {The structure of scientific revolutions},
	Year = {1970}}

	Author = {MacIver, R. M.},
	Journal = {Proceedings of the American Philosophical Society},
	Number = {5},
	Pages = {pp. 500-505},
	Title = {Science as a Social Phenomenon},
	Volume = {105},
	Year = {1961}}

	Author = {Schagrin, M. L.},
	Journal = {American Journal of Physics},
	Pages = {536-547},
	Title = {{Resistance to Ohm's Law}},
	Volume = {31},
	Year = {1963}}

	Author = {de Solla Price, D. J.},
	Journal = {Science},
	Number = {3683},
	Pages = {510-515},
	Title = {Networks of Scientific Papers},
	Volume = {149},
	Year = {1965}}

	Author = {Yang, I and Burden, S A and Rajogopal, R and Sastry, S S and Tomlin, C J},
	Title = {Approximation algorithms for optimization of combinatorial dynamical systems},
	Institution = {arXiv:1409.7861},
        url = {},
	Year = {2014}}

	Author = {Ratliff, L J and Burden, S A and Sastry, S S},
	Title = {On the Characterization of local Nash equilibria in continuous games},
	Institution = {arXiv:1411.2168},
        url = {},
	Year = {2014}}

	Author = {Burden, S A and Revzen, S and Sastry, S S and Koditschek, D E},
	Title = {Event-selected vector field discontinuities yield piecewise-differentiable flows },
	Institution = {arXiv:1407.1775},
        Year = {2015},
        url = {}}

	Author = {Johnson, A M and Burden, S A and Koditschek, D E},
	Title = {A simple hybrid system model for manipulation and self-manipulation systems},
	Institution = {1502.01538},
        Year = {2015},
        url = {}}
	Author = {Burden, S A and Revzen, S and Sastry, S S},
	Institution = {arXiv:1109.1780},
	Title = {Dimension reduction near periodic orbits of hybrid systems},
        url = {},
	Year = {2011}}
There are many reasons [[vim|]] is my preferred text editor.

!!!Remap ~CAPS-LOCK to ESC
Operating system dependent: [[on OSX|]]; 

Although I'm happy using vim in a terminal when SSH'd, on OSX I prefer the graphical [[MacVim|]] for native copy + paste and simply a different set of windows from my terminal.

My configuration files are available: [[vim|]]; [[vimrc|]]; [[gvimrc|]].

You'll want the following from MacPorts:
sudo port install py-ctags

!!!Find and replace in selection
After using ''Shift + v'' or ''v'' to make a selection, press '':'' to get '':'<,'>'', add ''s/old/new/gc'' to get '':'<,'>s/old/new/gc''

!!!Search only in LaTeX math mode

!!!Find and replace only in LaTeX math mode

Egregious? Perhaps.  But the ability to [[access gmail from vim|]] has its purposes.  For one, it lets you compose emails in plain text and subsequently send in a batch.