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
/*{{{*/
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]];
	background:[[ColorPalette::TertiaryPale]];
	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]];}

#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]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.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]];}

#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 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.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:0em 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 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

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

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

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 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 0em;}
.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 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 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 0em 14em;}

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

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

.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:0em 0.25em; padding:0em 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:0px 3px 0px 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 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

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

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.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 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 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 use a logographic writing system and 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;}

.htmlarea .toolbarHA table {border:1px solid ButtonFace; margin:0em 0em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' 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>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' 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>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></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>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></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'></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>>
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
{{textcenter{
[img[Kindergarten interview|files/kindergarten_quotes.jpg]]


[img[Tyler in the backyard|files/tyler_backyard.jpg]]
}}}
I am currently a PhD student at Iowa State University doing artificial intelligence research. Shana and I were married in August, 2001. Besides research, I enjoy reading (Ray Kurzweil, Arthur C. Clarke, Richard Dawkins, Aldous Huxley, Ray Bradbury), [[blogging|Blog]] about interesting ideas, pencil drawing, playing the piano, playing jazz on the tenor sax, and playing video games (especially realistic 3D simulations).
{{textcenter{
[img[files/projects/avh/splash.png]]
}}}
''Date:'' Fall 2003 - Spring 2004

''Description:'' "Optimizing neural networks with genetic algorithms to control simulated humans."

This [[Discover article|http://www.discover.com/issues/aug-03/departments/feattech]] was the original inspiration.  This started as a project for an artificial intelligence class and eventually became the motivation for my graduate research.  The goal was to create motor control systems for virtual humans using artificial neural networks and genetic algorithms.  I wanted to take the current physically simulated "ragdolls" in video games and bring them to life, allowing them to learn motor skills entirely on their own.

Basically, a physically simulated humanoid is controlled by an artificial neural network which senses joint angles and controls muscle forces. A genetic algorithm optimizes the neural network weights to improve performance on a given motor control task (standing, jumping, or walking).  The most fascinating thing about this method is that the system can learn an appropriate control algorithm with minimal help from the programmer.  The main design decision is the fitness function (e.g., for jumping, individuals that jump higher stay in the population and spread their genes).

I would usually start a simulation in the evening, go to sleep, and check on the progress in the morning.  I was often surprised at the types of results I would find.  Sometimes a suboptimal solution would dominate the population; sometimes they would exploit some instability in the physics simulation and cheat the system; sometimes they would turn out better than I'd hoped.

During spring 2004 I spent time developing tools (a wxwidgets/SDL setup for evolving behaviors and visualizing the results), integrating a modified version of [[NEAT|http://www.cs.ucf.edu/~kstanley/neat.html]], and improving results on the walking task.  One of the videos below shows the walking results.  The neural networks used for walking have no sensory inputs.  They are simple central pattern generators which output oscillatory signals in the absence of any sensory input.

''Documents:''
* Fall 2003 class presentation [ [[ppt|files/projects/avh/autonomous_virtual_humans_fall_2003.ppt]] ]
* Fall 2003 class final report [ [[pdf|files/projects/avh/coms572_final_report.pdf]] ]
* Spring 2004 Iowa State HCI Forum presentation [ [[ppt|files/publications/StreeterAutonomousVirtualHumansPresentation2004.ppt]] ]

''Download:''
(Disclaimer: The source code here is old and messy.  I didn't plan on posting it online, but I kept getting emails requesting it.  It is probably best used as an example.  If you are doing a similar project, you will probably want to start from scratch.)
* Original version source code from Fall 2003 [ [[zip|files/projects/avh/avh_original-src.zip]] ]
* Original version win32 executables from Fall 2003 (including several preliminary applications) [ [[zip|files/projects/avh/avh_original_apps.zip]] ]
* Source code from Spring 2004 non-GUI version (includes modified NEAT code with leaky integrator neurons) [ [[zip|files/projects/avh/avh_2-src.zip]] ]
* Source code from Fall 2004 GUI version (includes modified NEAT code with leaky integrator neurons and a wxWidgets-based GUI for training/viewing behaviors) [ [[zip|files/projects/avh/avh_2_gui-src.zip]] ]
* Win32 Executable GUI version from Fall 2004 (includes modified NEAT code with leaky integrator neurons and a wxWidgets-based GUI for training/viewing behaviors) [ [[zip|files/projects/avh/avh_2_gui-exe.zip]] ]
* Another win32 executable demo from Spring 2004.  This uses a simplified body (pelvis and legs only).  It uses invisible springs to hold the pelvis up against gravity. This is like training wheels (or an artificial parent) to allow oscillatory leg motion to evolve without worrying about falling over. [ [[zip|files/projects/avh/avh_win32_5-27-04.zip]] ]

----

{{textcenter{
[img[A virtual human learning to stand|files/projects/avh/standing_thumbnail.jpg][files/projects/avh/standing.jpg]] [img[A virtual human learning to walk|files/projects/avh/walking_thumbnail.jpg][files/projects/avh/walking.jpg]] [img[Using a model of a wooden artist's mannequin|files/projects/avh/wooden_thumbnail.jpg][files/projects/avh/wooden.jpg]] [img[Screenshot of the GUI for the evolution tool|files/projects/avh/gui_thumbnail.jpg][files/projects/avh/gui.jpg]]

<html>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-2510462304066175045&hl=en" flashvars=""> </embed>
<br><br>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=1002062030982551847&hl=en" flashvars=""> </embed>
<br><br>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-1150508620047972951&hl=en" flashvars=""> </embed>
</html>
}}}
{{textcenter{
[img[files/projects/battlespace/splash.jpg]]
}}}
''Date:'' Spring 2004

''Description:'' From the Battlespace website:

"The objective of this initiative is to build upon the existing facilities at Iowa State University's renowned Virtual Reality Applications Center (VRAC) to design, develop, implement, and test the hardware, software, and aeronautical systems necessary to create immersive ground control stations based on virtual reality technology.

Our goal is to explore the inversion of the typical paradigm in which information is conveyed to a remote operator. Rather than augmenting real-time visual information (typically from cameras) with information generated from other sensors and systems (e.g., heads-up display), we will explore using a virtual environment of the operating theater as the primary interface context that is augmented in spatial and temporal context with the myriad of information sources available in a modern military engagement. We will also explore, develop, and measure the effectiveness of new human interface techniques to enable remote operators to effectively control swarms of semiautonomous air vehicles."

My primary contribution to this project has been in the area of speech recognition and synthesis software development.  My speech software SDK was integrated in Battlespace, allowing the operator to select and control units solely through a speech interface.

''Project Website:'' http://www.vrac.iastate.edu/battlespace

----

{{textcenter{
[img[Battlespace|files/projects/battlespace/battlespace1_thumbnail.jpg][files/projects/battlespace/battlespace1.jpg]] [img[Battlespace|files/projects/battlespace/battlespace2_thumbnail.jpg][files/projects/battlespace/battlespace2.jpg]] [img[Battlespace|files/projects/battlespace/battlespace3_thumbnail.jpg][files/projects/battlespace/battlespace3.jpg]] [img[Battlespace|files/projects/battlespace/battlespace4_thumbnail.jpg][files/projects/battlespace/battlespace4.jpg]] [img[Battlespace|files/projects/battlespace/battlespace5_thumbnail.jpg][files/projects/battlespace/battlespace5.jpg]] [img[Battlespace|files/projects/battlespace/battlespace6_thumbnail.jpg][files/projects/battlespace/battlespace6.jpg]] [img[Battlespace|files/projects/battlespace/battlespace7_thumbnail.jpg][files/projects/battlespace/battlespace7.jpg]] [img[Battlespace|files/projects/battlespace/battlespace8_thumbnail.jpg][files/projects/battlespace/battlespace8.jpg]] [img[Tom Latham and John Boehner getting a tour of Battlespace in the C6|files/projects/battlespace/battlespace9_thumbnail.jpg][files/projects/battlespace/battlespace9.jpg]] [img[Battlespace|files/projects/battlespace/battlespace10_thumbnail.jpg][files/projects/battlespace/battlespace10.jpg]]
}}}
Visit my blog here: [[The Verve Project|http://verveproject.blogspot.com]]
{{textcenter{
[img[files/projects/botworld/splash.png]]
}}}
''Date:'' Fall 2003 - Spring 2004

''Description:'' This was my undergraduate senior design project in computer engineering.  Dr. Dan Ashlock in the math department at Iowa State was doing research on the evolution of simulated robots behaviors.  His "symbots" were simple artificial creatures living on discrete 2D grids.  They could evolve to improve their performance on competitive tasks, like painting the floor or predator/prey scenarios.  His software lacked any kind of GUI or visualization tools; he was simply printing out data and plotting the results.

Our project was to plug Dr. Ashlock's code into a GUI/visualization tool.  We used wxwidgets and OpenGL to accomplish this.  The result was a program called Botworld, which allowed users to evolve or design robot controllers, battle them against each other, and visualize the results.

''Download:'' Win32 executable [ [[zip|files/projects/botworld/botworld-exe.zip]] ]

----

{{textcenter{
[img[Two painter bots battling|files/projects/botworld/bot_battle_thumbnail.png][files/projects/botworld/bot_battle.png]] [img[Senior design project poster|files/projects/botworld/poster_thumbnail.png][files/projects/botworld/poster.png]]
}}}
{{textcenter{
[img[files/projects/brain-inspired_agi/splash.png]]
}}}
''Date:'' Officially began in January 2006 (after I finished my MS thesis), but the core ideas date back to Fall 2004.

''Description:'' This project represents my primary research goal: to design and build advanced intelligent machines (artificial general intelligence, or [[AGI|http://en.wikipedia.org/wiki/Artificial_general_intelligence]]) with mental capabilities similar to the mammalian brain.  I believe this goal is becoming increasingly attainable because:
* We have more knowledge of the brain now than ever before, and this knowledge keeps growing.
* Our tools for studying and simulating the brain, including scanning devices, computational power, and data analysis techniques, are improving at an amazing rate.
* In recent years, the cross-disciplinary connection between the brain and computer sciences has become very strong.
My general strategy for accomplishing this goal includes:
* Implementing software systems that mimic the core functional brain components, including sensory cortex, motor cortex, posterior cortex, hippocampus, basal ganglia, and cerebellum.
* Testing the individual software components to ensure they replicate brain functions.
* Connecting the full integrated system to a full body with sensors and effectors, such as a video game-like simulation or a real robot.
This project was originally inspired by the [[AutonomousVirtualHumans]] project which showed that it's possible for a simulated entity to learn complex motor control with very little instruction from humans.  That led me to study other forms of machine learning, especially those that require little help from a human teacher, i.e. reinforcement learning.  My MS thesis work ([[Verve]]) was basically an initial AGI prototype implementation which was limited to just a few sensors and effectors.

Reinforcement learning is a great framework for designing intelligent machines which must learn from trial and error.  However, it is only as effective as the machine's representation of the world.  Thus, most of my research effort since 2006 has been focused on engineering an effective context representation, the internal representation of the outside world.  In the brain this corresponds to the cerebral cortex.

The posters below describe the individual components of my system in a little more detail.

----

{{textcenter{
[img[Iowa State Emerging Technologies Conference 2008 poster|files/projects/brain-inspired_agi/ETC2008_poster_thumbnail.png][files/publications/StreeterBrainInspiredAGIPoster2008.png]] [img[Artificial General Intelligence 2009 poster|files/projects/brain-inspired_agi/AGI2009_poster_thumbnail.png][files/publications/StreeterHierarchicalEmpiricalBayesianPoster2009.png]]
}}}
{{textcenter{
[img[files/projects/brainpower_labs/splash.png]]
}}}
''Date:'' Founded in October, 2008.

''Description:'' Besides providing a practical funding source for my ongoing research, this company serves as a tangible outlet for research ideas. It is my primary channel to transfer those ideas from the whiteboard to the real world.

''Company Website:'' http://www.brainpowerlabs.com
{{textcenter{
[img[files/projects/branching_systems/splash.png]]
}}}
''Date:'' Fall 2006

''Description:'' This was a weekend project to simulate branching systems like neurons and trees.  I was inspired by the [[Paths|http://www.complexification.net/gallery/machines/paths01/]] piece at [[Complexification|http://www.complexification.net/]], which simulates paths without branches.

I'm fascinated by how simple the rules are that govern these kinds of branching systems.  Also, it seems like there are similarities among branching systems of all types.  Neurons grow dendritic branches with the purpose of increasing the probability of making synaptic contacts with other neurons.  Trees grow leaf-covered branches with the purpose of increasing the probability of acquiring photons.

Each source starts with a certain number of paths, and each path has its own velocity vector which determines the direction of growth. The paths have a bunch of parameters, like Gaussian noise variance on the growth vector, branching probability, thinning rate, etc.  I wrote the code in Python.  I used PyOpenGL to draw all the paths as translucent antialiased lines. At each step I just draw a small line segment at the end of each path, and I never clear the frame buffer. It runs pretty fast since I'm not redrawing everything constantly.

----

{{textcenter{
[img[Neurons|files/projects/branching_systems/neurons1_thumbnail.png][files/projects/branching_systems/neurons1.png]] [img[Neurons|files/projects/branching_systems/neurons2_thumbnail.png][files/projects/branching_systems/neurons2.png]] [img[Neurons|files/projects/branching_systems/neurons3_thumbnail.png][files/projects/branching_systems/neurons3.png]] [img[Neurons|files/projects/branching_systems/neurons4_thumbnail.png][files/projects/branching_systems/neurons4.png]] [img[Trees|files/projects/branching_systems/trees1_thumbnail.png][files/projects/branching_systems/trees1.png]] [img[Trees|files/projects/branching_systems/trees2_thumbnail.png][files/projects/branching_systems/trees2.png]] [img[Trees|files/projects/branching_systems/trees3_thumbnail.png][files/projects/branching_systems/trees3.png]]
}}}
{{textcenter{
[img[files/projects/cellular_automata_physics/splash.png]]
}}}
''Date:'' Spring 2007

''Description:'' [[Randall O'Reilly|http://psych.colorado.edu/%7Eoreilly/]] recently came up with "an autonomous computational model of fundamental physics, based generally on the cellular automaton framework, but using analog state values instead of the usual binary or discrete ones."  (Here is the wikipedia page on [[cellular automata|http://en.wikipedia.org/wiki/Cellular_automata]].)  His model is called "[[EmeWave|http://psych.colorado.edu/~oreilly/emewave.html]]."  I thought it would be interesting to implement this model and visualize it in real time.  I set up both 2D and 3D grids of analog state-based cellular automata and ran several simulations with various starting conditions (e.g., uniformly random initial states, high energy at the center of the universe, etc.).  The images and video below show some of my results.

----

{{textcenter{
[img[2D simulation|files/projects/cellular_automata_physics/2d_simulation1_thumbnail.png][files/projects/cellular_automata_physics/2d_simulation1.png]]  [img[2D simulation|files/projects/cellular_automata_physics/2d_simulation2_thumbnail.png][files/projects/cellular_automata_physics/2d_simulation2.png]]  [img[2D simulation|files/projects/cellular_automata_physics/2d_simulation3_thumbnail.png][files/projects/cellular_automata_physics/2d_simulation3.png]]  [img[2D simulation|files/projects/cellular_automata_physics/2d_simulation4_thumbnail.png][files/projects/cellular_automata_physics/2d_simulation4.png]]  [img[3D simulation|files/projects/cellular_automata_physics/3d_simulation1_thumbnail.png][files/projects/cellular_automata_physics/3d_simulation1.png]]  [img[3D simulation|files/projects/cellular_automata_physics/3d_simulation2_thumbnail.png][files/projects/cellular_automata_physics/3d_simulation2.png]]  [img[3D simulation|files/projects/cellular_automata_physics/3d_simulation3_thumbnail.png][files/projects/cellular_automata_physics/3d_simulation3.png]]  [img[3D simulation|files/projects/cellular_automata_physics/3d_simulation4_thumbnail.png][files/projects/cellular_automata_physics/3d_simulation4.png]] 

<html>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-9127635748392981434&hl=en" flashvars=""> </embed>
</html>
}}}
{{textcenter{
[img[IBM TJ Watson Research Center, Yorktown Building|files/projects/cerebellum_model/watson_yorktown_building_splash.jpg]]
}}}
''Date:'' Summer 2006

''Description:'' In the summer of 2006 I did an internship with IBM Research at the TJ Watson Research Center in Yorktown Heights, NY.  I worked with the Biometaphorical Computing Research group.  My project was to take an idea for a novel cerebellum model, implement it in software, and test its capabilities on various motor learning and conditioning tasks.  See the Peck, Streeter, Kozloski, 2007 paper in [[Publications]] for more details.

The video below is a visual demonstration of a computational model of the cerebellum. The cerebellum model is learning to control an articulated arm with 6 distinct muscles. Note how at the beginning the basal ganglia provide most of the control signal, but over time the cerebellum learns the reaching task, offloading most of the work from the basal ganglia.

----

{{textcenter{
[img[IBM Research Intern Poster Session 2006|files/projects/cerebellum_model/IBM_poster_thumbnail.png][files/publications/StreeterModelofMotorTaskOffloadingPoster2006.png]] [img[Society for Neuroscience Annual Meeting 2006|files/projects/cerebellum_model/SFN_poster_thumbnail.png][files/publications/PeckStreeterKozloskiSFNPoster2006.png]] [img[Offloading a simple associative learning task from basal ganglia to cerebellum|files/projects/cerebellum_model/associative_learning_thumbnail.jpg][files/projects/cerebellum_model/associative_learning.jpg]] [img[Offloading reaching movements from basal ganglia to cerebellum using a simulated arm|files/projects/cerebellum_model/offloading_thumbnail.jpg][files/projects/cerebellum_model/offloading.jpg]] [img[Me standing outside the Watson building in Yorktown|files/projects/cerebellum_model/tyler_at_watson_yorktown_thumbnail.jpg][files/projects/cerebellum_model/tyler_at_watson_yorktown.jpg]]

<html>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=3602661334569424179&hl=en" flashvars=""> </embed>
</html>
}}}
{{textcenter{
[img[files/projects/chess_set/splash.jpg]]
}}}
''Date:'' Spring 2004

''Description:'' My dad and I made this chess set and table.  The board is made of stained oak squares inlaid into the table top.  The chess pieces are also oak and were stained the same color as the board.  We cut the pieces on my grandpa's lathe.

----

{{textcenter{
[img[Chess set|files/projects/chess_set/chess1_thumbnail.jpg][files/projects/chess_set/chess1.jpg]]  [img[Chess set|files/projects/chess_set/chess2_thumbnail.jpg][files/projects/chess_set/chess2.jpg]]  [img[Chess set|files/projects/chess_set/chess3_thumbnail.jpg][files/projects/chess_set/chess3.jpg]]  [img[Chess set|files/projects/chess_set/chess4_thumbnail.jpg][files/projects/chess_set/chess4.jpg]]  [img[Chess set|files/projects/chess_set/chess5_thumbnail.jpg][files/projects/chess_set/chess5.jpg]]
}}}
''Date:'' Fall 2005

''Description:'' This was an experiment to test the benefits of curiosity-driven exploration for autonomous agents.  It became a short student paper in the AAAI 2006 conference.  The following is the paper's abstract:

"Reinforcement learning (RL) agents can reduce learning time dramatically by planning with learned predictive models. Such planning agents learn to improve their actions using planning trajectories, sequences of imagined interactions with the environment. However, planning agents are not intrinsically driven to improve their predictive models, which is a necessity in complex environments. This problem can be solved by adding a curiosity drive that rewards agents for experiencing novel states. Curiosity acts as a higher form of exploration than simple random action selection schemes because it encourages targeted investigation of interesting situations.

In a task with multiple external rewards, we show that RL agents using uncertainty-limited planning trajectories and intrinsic curiosity rewards outperform non-curious planning agents. The results show that curiosity helps drive planning agents to improve their predictive models by exploring uncertain territory. To the author's knowledge, no previous work has tested the benefits of curiosity with planning trajectories."

See the AAAI 2006 paper in [[Publications]] for more details.

----

{{textcenter{
[img[Iowa State HCI Forum 2006 poster|files/projects/curiosity_driven_exploration/artificial_curiosity_poster_thumbnail.png][files/publications/StreeterArtificialCuriosityPoster2006.png]] [img[The optimal situation is somewhere between too boring and too complicated|files/projects/curiosity_driven_exploration/curiosity_plots_thumbnail.png][files/projects/curiosity_driven_exploration/curiosity_plots.png]] [img[A simple 2D environment in which to test curious and non-curious agents|files/projects/curiosity_driven_exploration/curiosity_world_thumbnail.png][files/projects/curiosity_driven_exploration/curiosity_world.png]] [img[Learning performance plots for curious and non-curious agents|files/projects/curiosity_driven_exploration/curiosity_performance_thumbnail.png][files/projects/curiosity_driven_exploration/curiosity_performance.png]] 
}}}
Download my curriculum vitae here: [[TylerStreeterCV.pdf|files/TylerStreeterCV.pdf]]
Welcome
version.extensions.disableWikiLinks= {major: 1, minor: 5, revision: 0, date: new Date(2007,6,9)};

if (config.options.chkDisableNonExistingWikiLinks==undefined) config.options.chkDisableNonExistingWikiLinks= false;
if (config.options.chkDisableWikiLinks==undefined) config.options.chkDisableWikiLinks= false;
if (config.options.chkAllowLinksFromShadowTiddlers==undefined) config.options.chkAllowLinksFromShadowTiddlers=true;
if (config.options.txtDisableWikiLinksTag==undefined) config.options.txtDisableWikiLinksTag="excludeWikiWords";

// find the formatter for wikiLink and replace handler with 'pass-thru' rendering
initDisableWikiLinksFormatter();
function initDisableWikiLinksFormatter() {
	for (var i=0; i<config.formatters.length && config.formatters[i].name!="wikiLink"; i++);
	config.formatters[i].coreHandler=config.formatters[i].handler;
	config.formatters[i].handler=function(w) {
		// supress any leading "~" (if present)
		var skip=(w.matchText.substr(0,1)==config.textPrimitives.unWikiLink)?1:0;
		var title=w.matchText.substr(skip);
		var exists=store.tiddlerExists(title);
		var inShadow=w.tiddler && store.isShadowTiddler(w.tiddler.title);

		// check for excluded Tiddler
		if (w.tiddler && w.tiddler.isTagged(config.options.txtDisableWikiLinksTag))
			{ w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }
		
		// check for specific excluded wiki words
		var t=store.getTiddlerText("DisableWikiLinksList")
		if (t && t.length && t.indexOf(w.matchText)!=-1)
			{ w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }

		// if not disabling links from shadows (default setting)
		if (config.options.chkAllowLinksFromShadowTiddlers && inShadow)
			return this.coreHandler(w);

		// check for non-existing non-shadow tiddler
		if (config.options.chkDisableNonExistingWikiLinks && !exists)
			{ w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }

		// if not enabled, just do standard WikiWord link formatting
		if (!config.options.chkDisableWikiLinks)
			return this.coreHandler(w);

		// just return text without linking
		w.outputText(w.output,w.matchStart+skip,w.nextMatch)
	}
}

Tiddler.prototype.coreAutoLinkWikiWords = Tiddler.prototype.autoLinkWikiWords;
Tiddler.prototype.autoLinkWikiWords = function()
{
	// DEBUG alert("processing: "+this.title);
	// if all automatic links are not disabled, just return results from core function
	if (!config.options.chkDisableWikiLinks)
		return this.coreAutoLinkWikiWords.apply(this,arguments);
	return false;
}
{{textcenter{
[img[files/projects/fish_behavior/school_splash.png]]
}}}
''Date:'' Spring 2007

''Description:'' For a class project Tom Batkiewicz and I simulated fish behavior in a physically realistic environment.  We were trying to develop a model that was more realistic (in terms of behavior and physical interactions) than [[boids|http://www.red3d.com/cwr/boids]] but simpler than the detailed physical fish model of [[Demetri Terzopoulos|http://www.cs.ucla.edu/~dt]].  Essentially, we wanted a model that would allow schools of hundreds of fish in real time with full collision detection on a single core PC, which we achieved.

Our fish model includes a simple box-shaped volume sensor, a global directional bias (i.e. swim forward most of the time), local directional biases (e.g., avoid obstacles, follow friendly fish, avoid predators), and force-based motion control.  Our model is very general.  For example, instead of avoiding pre-defined obstacles and predators, it processes general object properties like volume and relative velocity.  This results in novel behaviors when the fish interact with new objects.

----

{{textcenter{
[img[The sensor volume of a single fish|files/projects/fish_behavior/sensor_thumbnail.png][files/projects/fish_behavior/sensor.png]]   [img[Schooling behavior|files/projects/fish_behavior/school_thumbnail.png][files/projects/fish_behavior/school.png]]   [img[Obstacle avoidance behavior|files/projects/fish_behavior/obstacle_avoidance_thumbnail.png][files/projects/fish_behavior/obstacle_avoidance.png]]   [img[Predator avoidance behavior|files/projects/fish_behavior/predator_avoidance_thumbnail.png][files/projects/fish_behavior/predator_avoidance.png]]  
}}}
{{textcenter{
[img[files/projects/flammable_cabin/splash.jpg]]
}}}
''Date:'' Fall 2004

''Description:'' For a computer graphics class project I created a simulation of a wooden cabin that can be set on fire and burned to the ground.  Each board is physically simulated.  The user can pick up burning logs from a campfire and ignite parts of the cabin.  Over time each board catches fire and falls off, eventually leaving only a smoking pile.

''Download:'' Original win32 executable (shadows may look wrong on some graphics cards) [ [[zip|files/projects/flammable_cabin/cabin_original-exe.zip]] ]

''Documents:'' Final report [ [[pdf|files/projects/flammable_cabin/cabin_final_report.pdf]] ]

----

{{textcenter{
[img[Initial concept sketch|files/projects/flammable_cabin/sketch_thumbnail.jpg][files/projects/flammable_cabin/sketch.jpg]] [img[Sequence of 3 images of the cabin collapsing|files/projects/flammable_cabin/cabin_strip_thumbnail.jpg][files/projects/flammable_cabin/cabin_strip.jpg]] [img[Cabin screenshot|files/projects/flammable_cabin/screenshot_thumbnail.jpg][files/projects/flammable_cabin/screenshot.jpg]] [img[Testing a campfire particle system|files/projects/flammable_cabin/campfire1_thumbnail.jpg][files/projects/flammable_cabin/campfire1.jpg]] [img[Testing a campfire particle system|files/projects/flammable_cabin/campfire2_thumbnail.jpg][files/projects/flammable_cabin/campfire2.jpg]] [img[Having too much fun playing with fire|files/projects/flammable_cabin/firefountain_thumbnail.jpg][files/projects/flammable_cabin/firefountain.jpg]]
}}}
window.removeElementWhen = function(test,place) {
	if (test) {
		removeChildren(place);
		place.parentNode.removeChild(place);
	}
};

merge(config.macros,{

	hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( eval(paramString), place);
	}},

	showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !eval(paramString), place);
	}},

	hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAny(params), place);
	}},

	showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAny(params), place);
	}},

	hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);
	}},

	showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);
	}}

});
{{textcenter{
[img[files/projects/island/splash.jpg]]
}}}
''Date:'' Started development summer 2006

''Description:'' The goal of this team project is to create a tropical island environment in virtual reality to show off the newly-upgraded six-wall [[C6|http://www.vrac.iastate.edu/c6.php]] display at [[VRAC|http://www.vrac.iastate.edu]].  It includes a hovercraft that can be driven in water and on land.  My primary contribution has been to integrate a physics simulation system.

The images below show the island application running in the C6.

----

{{textcenter{
[img[Island application running in the C6 VR system|files/projects/island/island1_thumbnail.jpg][files/projects/island/island1.jpg]] [img[Island application running in the C6 VR system|files/projects/island/island2_thumbnail.jpg][files/projects/island/island2.jpg]] [img[Island application running in the C6 VR system|files/projects/island/island3_thumbnail.jpg][files/projects/island/island3.jpg]]
}}}
{{textcenter{
[img[files/projects/kernel_mixture_model/splash.png]]
}}}
''Date:'' Fall 2006, then again in Spring 2008 to present

''Short Description:'' The goal of this project is to develop a practical, robust kernel mixture model of a data space that can provide class probabilities for any given data sample. This will become a core component of my sensory and motor cortex model. This unsupervised learning system can also be used for probability density estimation (i.e. what is the data density near a data sample?) and for pattern classification (i.e. to which class/category does a data sample most probably belong?). Currently this effort is mainly based on the work of [[Marc Van Hulle|http://simone.neuro.kuleuven.be/marccv.html]].

''Long Description:'' For of the second half of 2008 I revisited the issue of sensory and motor representation. I had implemented some initial ideas at the end of 2006, but I hadn't taken the time to study things in depth. My goal here is to represent real-valued sensory and motor spaces as efficiently as possible with limited resources. For example, say we're talking about visual sensory data (i.e. pixel arrays) involving 100 pixels (10x10 image), and we only have the resources to represent the 28 most common visual patterns. If we want to represent that visual space efficiently, we have to move our 28 basis vectors around the 100-dimensional space so that the resulting vectors represent the 28 most common visual patterns. This all must be learned online (in real time) as the system is experiencing visual data. Then, after learning, each incoming image will be classified as one of those 28 "categories."

One approach is based on the standard statistical approach of maximum likelihood learning. We assume the basis vectors are the center points of Gaussian kernels, each with a corresponding variance. For each data sample, we compute the likelihood of seeing that sample. (Given our current model, i.e. the 28 Gaussian centers and variances, what's the likelihood that the data sample was "generated" by our model?) Maximum likelihood learning attempts to adjust the Gaussian kernel positions and sizes within the data space to maximize this likelihood value over all data samples. The end result should be the model that best represents the actual data distribution.

Another approach is based on information theory, specifically the mutual information between the "input" and "output" variables. (This idea is usually attributed to Ralph Linsker at IBM Research, who called it "infomax.") I like to think of it this way: the data samples are coming from a real-valued input variable, V. We want to classify those samples into a discrete number of classes which represent the discrete class variable C. Each Gaussian kernel represents one class in C. Now, for each sample v, we want to transmit the maximum amount of information to the output class variable. We can do this by maximizing the mutual info between V and C, given the constraint of limited resources (i.e. a finite number of Gaussian kernels).

How do we do this? There are several ways. The simplest way to get started is to do gradient ascent on the mutual info. (Take the derivative of the expression for mutual info between V and C with respect to the Gaussian kernels' parameters, then continually adjust those parameters to increase the mutual info.) However, this direct gradient-based approach is hard to derive for mutual info because it depends on terms that are difficult to estimate; also, the resulting learning rules are (in my experience) unstable, similar to [[EM|http://en.wikipedia.org/wiki/Expectation-maximization_algorithm]] and [[max likelihood learning|http://en.wikipedia.org/wiki/Maximum_likelihood]]. But in general, any learning rule can be used as long as it generates a model with two properties: maximal prior entropy and minimal posterior entropy. Before seeing each data sample, the prior distribution over C should be uniform (maximum entropy/uncertainty), ensuring that each kernel is utilized equally (i.e. we're not wasting resources). After seeing each sample, the posterior distribution over C should be totally peaked on one class/kernel, representing minimal entropy/uncertainty. This is true when the Gaussian kernels are distinct, not overlapping. Thus, for each data sample received, we're reducing uncertainty as much as possible, which is equivalent to transmitting the greatest amount of information.

So I've been working on an infomax-inspired algorithm to represent real-valued data vectors optimally with limited resources. I say infomax-inspired because it's learning goal isn't exactly infomax: it's a heuristic with goals similar to infomax that provides very robust results... and hopefully it approaches infomax as the number of kernels increases. One tricky issue is that the posterior probability calculations (needed for pattern classification) require an accurate estimation of the probability density at each data sample, but I think I have a good solution. The current version appears to be great at pattern classification (< 10% error on the classic Iris data set and < 4% error on a handwritten digits set). More importantly, it should be just what I need for the core of my sensory and motor cortex systems.

The images below show an earlier version of this system learning to represent a simple visual space (i.e. basic edges). They also show the system embedded in a hierarchical Bayesian framework, which provides the benefit of breaking up the high-dimensional visual space into several lower-dimensional spaces to be processed independently. (Lower dimensionality is almost always easier to deal with in machine learning.)

----

{{textcenter{
[img[Half-learned model of a simple visual space|files/projects/kernel_mixture_model/half_learned_thumbnail.png][files/projects/kernel_mixture_model/half_learned.png]] [img[Mostly-finished learned model of a simple visual space|files/projects/kernel_mixture_model/mostly_finished_learning_thumbnail.png][files/projects/kernel_mixture_model/mostly_finished_learning.png]] [img[Reconstruction of an image sample|files/projects/kernel_mixture_model/reconstruction_thumbnail.png][files/projects/kernel_mixture_model/reconstruction.png]] [img[Kernel mixture model embedded within a hierarchical Bayesian framework|files/projects/kernel_mixture_model/hierarchy_thumbnail.png][files/projects/kernel_mixture_model/hierarchy.png]]}}}
{{textcenter{
[img[The real magnet toy in Jim Oliver's office|files/projects/magnet_toy/real_toy_splash.jpg]]
}}}
''Date:'' Spring 2006

''Description:'' This was a weekend project where I setup a simulated replica of a magnetic toy.  I used [[OPAL|http://opal.sourceforge.net]]/[[ODE|http://www.ode.org]] to simulate the physics.  The results look pretty realistic.

----

{{textcenter{
[img[Simulated toy view #1|files/projects/magnet_toy/magnet_toy1_thumbnail.png][files/projects/magnet_toy/magnet_toy1.png]] [img[Simulated toy view #2|files/projects/magnet_toy/magnet_toy2_thumbnail.png][files/projects/magnet_toy/magnet_toy2.png]]

<html>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=3663725544206882896&hl=en" flashvars=""> </embed>
<br><br>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-317327784344098513&hl=en" flashvars=""> </embed>
<br><br>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=5484285631506735776&hl=en" flashvars=""> </embed>
</html>
}}}
[[Welcome]] [[Research Focus|ResearchFocus]] [[About Me|AboutMe]] [[Projects]] [[Blog]] [[Publications]] [[CV|CurriculumVitae]]
{{textcenter{
[img[files/projects/medieval_playground/bridge_splash.jpg]]
}}}
''Date:'' Fall 2003

''Description:'' Medieval Playground is an interactive medieval setting with a first-person perspective and realistic physics.  Matt Newcomb and I developed this application for a class project.  It was my first real application that used [[ODE|http://www.ode.org]] for physics simulation.

In Medieval Playground you can explore the world and interact with it physically.  Climb on the castle ruins.  Pick up a loose board on the bridge and drop it into the water below.  Pile loose objects on the catapult and launch them at the castle... even launch yourself if you want.  Swim along the water surface with the floating debris.  Dive underwater to see fish schools (using a physics-based variant of the [[boids|http://www.red3d.com/cwr/boids]] flocking algorithm).  Even grab a fish and carry it away, forcing the rest of the school to follow you.  Download it and try it out!

''Download:''
*Original win32 and UNIX executable [ [[zip|files/projects/medieval_playground/medieval_playground-exe.zip]] ]
*Original source code [ [[zip|files/projects/medieval_playground/medieval_playground-src.zip]] ]

''Documents:'' Final report [ [[pdf|files/projects/medieval_playground/ie584x_final_paper.pdf]] ]

----

{{textcenter{
[img[Initial concept sketch|files/projects/medieval_playground/castle_sketch_thumbnail.jpg][files/projects/medieval_playground/castle_sketch.jpg]]  [img[Initial concept sketch|files/projects/medieval_playground/glider_sketch_thumbnail.jpg][files/projects/medieval_playground/glider_sketch.jpg]]  [img[Initial concept sketch|files/projects/medieval_playground/catapult_sketch_thumbnail.jpg][files/projects/medieval_playground/catapult_sketch.jpg]]  [img[Initial VR Juggler + OpenSG prototype|files/projects/medieval_playground/vrj_opensg1_thumbnail.jpg][files/projects/medieval_playground/vrj_opensg1.jpg]]  [img[Initial VR Juggler + OpenSG prototype|files/projects/medieval_playground/vrj_opensg2_thumbnail.jpg][files/projects/medieval_playground/vrj_opensg2.jpg]]  [img[Initial VR Juggler + OpenSG prototype|files/projects/medieval_playground/vrj_opensg3_thumbnail.jpg][files/projects/medieval_playground/vrj_opensg3.jpg]]  [img[The bridge across the valley|files/projects/medieval_playground/bridge_thumbnail.jpg][files/projects/medieval_playground/bridge.jpg]]  [img[The castle ruins|files/projects/medieval_playground/castle_ruins_thumbnail.jpg][files/projects/medieval_playground/castle_ruins.jpg]]  [img[This sword was just lying around|files/projects/medieval_playground/sword_thumbnail.jpg][files/projects/medieval_playground/sword.jpg]]  [img[Some debris floating in the water|files/projects/medieval_playground/floating_debris_thumbnail.jpg][files/projects/medieval_playground/floating_debris.jpg]] [img[A school of fish underwater|files/projects/medieval_playground/fish_school1_thumbnail.jpg][files/projects/medieval_playground/fish_school1.jpg]]  [img[A school of fish along the shore|files/projects/medieval_playground/fish_school2_thumbnail.jpg][files/projects/medieval_playground/fish_school2.jpg]] [img[The catapult waiting to be launched|files/projects/medieval_playground/catapult_thumbnail.jpg][files/projects/medieval_playground/catapult.jpg]]  [img[Launching a fish from the catapult|files/projects/medieval_playground/catapult_launch_thumbnail.jpg][files/projects/medieval_playground/catapult_launch.jpg]] 
}}}
{{textcenter{
[img[files/projects/morning_animation/splash.jpg]]
}}}
''Date:'' Summer 2003

''Description:''  A 3D animation I made for a class project using 3D Studio Max 5.1.  The assignment was to create a morning scene.  In my animation a peaceful breakfast nook is interrupted by a wayward baseball.

----

{{textcenter{
[img[Morning scene|files/projects/morning_animation/morning1_thumbnail.jpg][files/projects/morning_animation/morning1.jpg]] [img[Morning scene|files/projects/morning_animation/morning2_thumbnail.jpg][files/projects/morning_animation/morning2.jpg]] [img[Morning scene|files/projects/morning_animation/morning3_thumbnail.jpg][files/projects/morning_animation/morning3.jpg]] [img[Morning scene|files/projects/morning_animation/morning4_thumbnail.jpg][files/projects/morning_animation/morning4.jpg]]

<html>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-4421246076699139614&hl=en" flashvars=""> </embed>
</html>
}}}
{{textcenter{
[img[files/projects/multitouch_game_of_life/splash.jpg]]
}}}
''Date:'' Fall 2007

''Description:'' [[Conway's Game of Life|http://en.wikipedia.org/wiki/Conway's_Game_of_Life]] is pretty interesting to watch, but what if you could reach out and touch it?  What if you could inject life into the digital universe with your fingertips?  Using [[VRAC|http://www.vrac.iastate.edu]]'s multitouch table^^*^^ as a platform, multiple people (and any number of fingers) can experiment with the Game of Life at once.  The result is a highly interactive version of this digital world where simple life forms are continually being created and destroyed.

^^*^^ This table was first built in the summer of 2006 by a group of undergraduate students using the infrared LED frustrated total internal reflection method.

''Download:'' C++ source code (requires old VRAC multitouch dependencies that have been lost, so this is best used as an example) [ [[zip|files/projects/multitouch_game_of_life/gameOfLifeTouch.tar.gz]] ]

----

{{textcenter{
[img[Touching 1|files/projects/multitouch_game_of_life/touch1_thumbnail.jpg][files/projects/multitouch_game_of_life/touch1.jpg]] [img[Touching 2|files/projects/multitouch_game_of_life/touch2_thumbnail.jpg][files/projects/multitouch_game_of_life/touch2.jpg]] [img[Close up|files/projects/multitouch_game_of_life/close_up_thumbnail.jpg][files/projects/multitouch_game_of_life/close_up.jpg]] [img[Full view|files/projects/multitouch_game_of_life/full_view_thumbnail.jpg][files/projects/multitouch_game_of_life/full_view.jpg]]

<html>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=1769142245133307502&hl=en" flashvars=""> </embed>
</html>
}}}
{{textcenter{
[img[files/projects/netflix_prize/splash.png]]
}}}
''Date:'' Started March 2008.

''Description:'' The machine learning algorithms I have been studying (in order to develop a robust cerebral cortex model) are also useful directly for real-world problems. For example, the [[Netflix Prize|http://www.netflixprize.com]] is a machine learning competition with the goal of improving the Netflix company's movie recommendation system. I haven't spent too much time on this yet, but I have managed to score 0.74% better than Netflix's own recommendation algorithm. (10% better wins $1,000,000.) I am ranked #1,364 out of 37,086 teams as of Feb. 10, 2009.
{{textcenter{
[img[Opal logo|files/projects/opal/logo.png]]
}}}
''Date:'' Started development Fall 2004

''Description:'' OPAL (Open Physics Abstraction Layer) is a C++ software library which wraps multiple real-time physics simulation engines with a common API.  That was the original goal, anyway.  Eventually, it became clear that the real value of OPAL was as a wrapper for [[ODE|http://www.ode.org]] which provides a much simpler API, smart default parameters, a handful of intuitive objects (e.g., Solids, Joints, Motors, Sensors), and XML-based file storage for complex objects.

OPAL has been used in a few dozen software development projects, mainly in independent video games, grad school class projects, and funded research projects in and around the [[VRAC|http://www.vrac.iastate.edu]].

''Project Website:'' http://opal.sourceforge.net

''Download:'' "Playpen" Win32 executable [ [[zip|files/projects/opal/playpen.zip]] ]

----

{{textcenter{
[img[Iowa State HCI Forum 2005 poster|files/projects/opal/poster_thumbnail.png][files/publications/StreeterOPALPoster2005.png]] [img[Andres Reinot's fun little fps|files/projects/opal/annex_fps_thumbnail.png][files/projects/opal/annex_fps.png]] [img[Ken Kopecky's award-winning VR Arkenoid game|files/projects/opal/arken3d_thumbnail.jpg][files/projects/opal/arken3d.jpg]] [img[Physically simulated cabin that collapses when set on fire|files/projects/opal/cabin_thumbnail.jpg][files/projects/opal/cabin.jpg]] [img[Ken Kopecky's Hovercraft Soccer game (written in one night!)|files/projects/opal/hovercraft_soccer_thumbnail.png][files/projects/opal/hovercraft_soccer.png]] [img[Infiscape's VR retail application|files/projects/opal/infiscape_retail_thumbnail.jpg][files/projects/opal/infiscape_retail.jpg]] [img[Ken Kopecky's Magic Suit, a VR application with a full motion capture suit that lets you move physically simulated objects by moving your arms through space|files/projects/opal/magic_suit_thumbnail.jpg][files/projects/opal/magic_suit.jpg]] [img[My own research on motor learning in physically simulated control systems|files/projects/opal/motor_learning_research_thumbnail.png][files/projects/opal/motor_learning_research.png]] [img[A simple "playpen" application for experimenting with OPAL (this comes with the OPAL SDK)|files/projects/opal/playpen_thumbnail.png][files/projects/opal/playpen.png]] [img[Ken Kopecky's Radius 2D sidescrolling space shooter game|files/projects/opal/radius_thumbnail.jpg][files/projects/opal/radius.jpg]] [img[Rhino, a 3D space shooter we entered in the IGF|files/projects/opal/rhino_thumbnail.jpg][files/projects/opal/rhino.jpg]] [img[A prototype VR application switcher for the VRAC, where each building represents a distinct executable VR application|files/projects/opal/switcher_thumbnail.png][files/projects/opal/switcher.png]] [img[Oleksandr Lozitskiy's Ukrainian Rumble game|files/projects/opal/ukrainian_rumble_thumbnail.jpg][files/projects/opal/ukrainian_rumble.jpg]]
}}}
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'>
     <div class='gradient' macro='gradient vert #00d000 #006000 '>
	<div class='titleLine' >
		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
	</div>
<div id='topMenu' refresh='content' tiddler='MainMenu'></div>
    </div>
</div>
<div id='bodywrapper'>
<div id='sidebar'>
<!-- stripped-down version for web users -->
<div macro="showWhen readOnly">
	<div id='sidebarOptions' refresh='content' tiddler='SideBarOptionsWeb'></div>
	<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabsWeb'></div>
</div>
<!-- regular version for admin  -->
<div macro="hideWhen readOnly">
	<div id='sidebarOptions' refresh='content' tiddler='SideBarOptionsAdmin'></div>
	<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabsAdmin'></div>
</div>
</div>
<div id='displayArea'>
	<div id='messageArea'></div>
	<div id='tiddlerDisplay'></div>
</div>
<div id='contentFooter'><p>All content copyright &copy Tyler Streeter. Powered by <a href='http://tiddlywiki.com'>TiddlyWiki</a> + <a href='http://tiddlythemes.com/empties/LewcidOrangeBlog.html'>LewcidOrangeBlog</a> theme.</p></div>
</div>

<!--}}}-->
!2008
[img[Brainpower Labs LLC|files/projects/brainpower_labs/icon.png][BrainpowerLabs]] [img[Brain-inspired artificial general intelligence|files/projects/brain-inspired_agi/splash_thumbnail.png][BrainInspiredAGI]] [img[Practical, robust, infomax-inspired learning rule for topographic kernel mixture models|files/projects/kernel_mixture_model/thumbnail.png][KernelMixtureModel]] [img[Netflix Prize|files/projects/netflix_prize/thumbnail.png][NetflixPrize]] [img[iBonsai for the iPhone and iPod touch|files/projects/ibonsai/thumbnail.png][iBonsai]] [img[QuickMP: Simple C++ loop parallelization|files/projects/quickmp/quickmp.png][QuickMP]]

!2007
[img[Somatotopic Maps|files/projects/somatotopic_maps/main_thumbnail.png][SomatotopicMaps]] [img[Cellular Automata Physics Simulation|files/projects/cellular_automata_physics/3d_simulation2_thumbnail.png][CellularAutomataPhysics]] [img[Physically Realistic Fish Behavior Simulation|files/projects/fish_behavior/school_thumbnail.png][FishBehavior]] [img[Multitouch Game of Life|files/projects/multitouch_game_of_life/touch2_thumbnail.jpg][MultitouchGameOfLife]]

!2006
[img[Branching systems simulation|files/projects/branching_systems/neurons3_thumbnail.png][BranchingSystems]] [img[A tropical island in virtual reality|files/projects/island/island3_thumbnail.jpg][Island]] [img[A computational model of the cerebellum|files/projects/cerebellum_model/brain_thumbnail.png][CerebellumModel]] [img[Self Organizing Map|files/projects/self_organizing_map/3d_som4_thumbnail.png][SelfOrganizingMap]] [img[QuickProf: A simple C++ runtime performance profiler|files/projects/quickprof/quickprof.png][QuickProf]] [img[Magnetic toy simulation|files/projects/magnet_toy/magnet_toy1_thumbnail.png][MagnetToy]]

!2005
[img[An experiment to determine the benefits of curiosity-driven exploration|files/projects/curiosity_driven_exploration/curiosity_world_thumbnail.png][CuriosityDrivenExploration]] [img[Voce: An open source speech interaction library|files/projects/voce/logo_thumbnail.jpg][Voce]] [img[QuickTest: A simple C++ unit testing framework|files/projects/quicktest/quicktest.png][QuickTest]] [img[A prototype VR application switcher|files/projects/switcher/switcher_thumbnail.png][Switcher]]

!2004
[img[Verve: A C++ software library for general purpose reinforcement learning|files/projects/verve/logo_thumbnail.png][Verve]] [img[Battlespace: immersive command & control in virtual reality|files/projects/battlespace/battlespace_title_thumbnail.jpg][Battlespace]] [img[Rhino: A 3D space shooter|files/projects/rhino/rhino6_thumbnail.jpg][Rhino]] [img[OPAL: A C++ software library to simplify the use of simulated physics|files/projects/opal/logo_thumbnail.png][OPAL]] [img[Flammable Cabin Simulation|files/projects/flammable_cabin/screenshot_thumbnail.jpg][FlammableCabin]] [img[Ray tracer|files/projects/ray_tracer/spheres_6xAA_20xSS_thumbnail.png][RayTracer]] [img[Wooden chess set and table|files/projects/chess_set/chess1_thumbnail.jpg][ChessSet]]

!2003
[img[Autonomous Virtual Humans|files/projects/avh/standing_thumbnail.jpg][AutonomousVirtualHumans]] [img[Medieval Playground|files/projects/medieval_playground/bridge_thumbnail.jpg][MedievalPlayground]] [img[Treefort Wars|files/projects/treefort_wars/game5_thumbnail.jpg][TreefortWars]] [img[3D Animation of a Morning Scene|files/projects/morning_animation/morning1_thumbnail.jpg][MorningAnimation]] [img[Botworld: A GUI and visualization utility for simulated evolving robots|files/projects/botworld/botworld_thumbnail.png][Botworld]] [img[A reconfigurable military humvee in virtual reality|files/projects/vr_humvee/configurator_thumbnail.jpg][VRHumvee]] [img[My jazz quartet|files/projects/tyler_streeter_quartet/tsq_cafe_diem_thumbnail.jpg][TylerStreeterQuartet]]

!2002
[img[Ricochet: A 3D Breakout Game|files/projects/ricochet/ricochet_thumbnail.png][Ricochet]] [img[UT Sim: A visual tool for ultrasonic nondestructive testing|files/projects/ut_sim/ut_sim2_thumbnail.jpg][UTSim]] [img[Scalable Computing Lab|files/projects/scalable_computing_lab/ibm_cluster_thumbnail.jpg][ScalableComputingLab]]
Peck, C., Streeter, T., & Kozloski, J. 2007. An Integrated Cerebro-Cerebellar Model Demonstrating Associative Learning and Motor Control. In Proceedings of the 10th Tamagawa-Riken Dynamic Brain Forum. [ [[paper|files/publications/PeckStreeterKozloskiAnIntegratedCerebro-Cerebellar2007.pdf]] | [[more|CerebellumModel]] ]

Streeter, T., Oliver, J., & Sannier, A. 2006. Verve: A General Purpose Open Source Reinforcement Learning Toolkit. In Proceedings of the ASME International Design Engineering Technical Conferences and Computers and Information in Engineering Conference. [ [[paper|files/publications/StreeterEtAlVerveAGeneralPurpose2006.pdf]] | [[slides|files/publications/StreeterEtAlVerveAGeneralPurpose2006.ppt]] | [[more|Verve]] ]

Streeter, T. 2006. Curiosity-Driven Exploration with Planning Trajectories. In Proceedings of the Twenty-First National Conference on Artificial Intelligence. [ [[paper|files/publications/StreeterCuriosityDrivenExploration2006.pdf]] | [[slides|files/publications/StreeterCuriosityDrivenExploration2006.ppt]] | [[more|CuriosityDrivenExploration]] ]

Streeter, T. 2005. Design and Implementation of General Purpose Reinforcement Learning Agents. Unpublished Master's Thesis, Iowa State University, Ames, IA. [ [[paper|files/publications/StreeterMSThesis2005.pdf]] | [[slides|files/publications/StreeterMSThesis2005.ppt]] | [[more|Verve]] ]

!Posters & Presentations
A Hierarchical Empirical Bayesian Model of Cerebral Cortex. The 2nd Conference on Artificial General Intelligence 2009, Arlington, VA. Presented again at the Iowa State Emerging Technologies Conference 2009, Ames, IA.  [ [[poster|files/publications/StreeterHierarchicalEmpiricalBayesianPoster2009.png]] ]

Brain-Inspired Artificial General Intelligence. Iowa State Emerging Technologies Conference 2008, Ames, IA. [ [[poster|files/publications/StreeterBrainInspiredAGIPoster2008.png]] | [[more|BrainInspiredAGI]] ]

An Integrated Cerebellum Model Explaining Associative Learning, Timing Prediction, and Motor Control. Society for Neuroscience Annual Meeting 2006, Atlanta, GA. [ [[abstract|files/publications/PeckStreeterKozloskiSFNAbstract2006.pdf]] | [[poster|files/publications/PeckStreeterKozloskiSFNPoster2006.png]] | [[more|CerebellumModel]] ]

A Model of Motor Task Offloading in the Cerebellum. IBM Research Intern Poster Session 2006, Yorktown Heights, NY. [ [[poster|files/publications/StreeterModelofMotorTaskOffloadingPoster2006.png]] | [[more|CerebellumModel]] ]

Artificial Curiosity. Iowa State HCI Forum 2006, Ames, IA. [ [[poster|files/publications/StreeterArtificialCuriosityPoster2006.png]] | [[slides|files/publications/StreeterArtificialCuriosityPresentation2006.ppt]] | [[more|CuriosityDrivenExploration]] ]

Motor Learning for Simulated Creatures. Iowa State HCI Forum 2005, Ames, IA. [ [[poster|files/publications/StreeterMotorLearningPoster2005.png]] | [[more|Verve]] ]

Open Physics Abstraction Layer. Iowa State HCI Forum 2005, Ames, IA. [ [[poster|files/publications/StreeterOPALPoster2005.png]] | [[more|OPAL]] ]

Autonomous Virtual Humans. 8th International Immersive Projection Technology Workshop 2004, Ames, IA. [ [[slides|files/publications/StreeterAutonomousVirtualHumansPresentation2004.ppt]] | [[more|AutonomousVirtualHumans]] ]
''Date:'' Started development Spring 2008

''Description:'' QuickMP (Quick Multi-Processing) is a simple cross-platform C++ API for generating parallel for loops in shared-memory programs, similar to OpenMP.  It provides automatic scalable performance based on the number of available processors.

For example, here is a simple C++ for loop:

{{{
// Normal for loop uses only 1 thread.
for (int i = 0; i < 1000000; ++i)
{
    processMyData(i);
}
}}}

With a few QuickMP macros, the loop becomes parallelized:
 
{{{
// Parallel for loop automatically uses 1 thread per processor.
QMP_PARALLEL_FOR(i, 0, 1000000)
    processMyData(i);
QMP_END_PARALLEL_FOR
}}}

The following chart shows performance results from using QuickMP on a ray tracing program using various numbers of threads:
{{textcenter{
[img[Ray tracing benchmark results|files/projects/quickmp/performance_results.png]]
}}}
''Project Website:'' http://quickmp.sourceforge.net
''Date:'' Started development Spring 2006

''Description:'' QuickProf is a simple runtime performance measurement tool for C++ code.  It is contained within a single header file, so it's very easy to add it to any programming project, and the timing measurements it provides are very useful for optimizing performance.  It can give you an overall timing summary when your app finishes, or it can generate an output file for graphing your app's runtime performance.

For example, I used QuickProf in one project to profile the three major components of my code (inference, propagation, and adaptation). I had it print out an overall summary at the end, which usually gave me something like this:

adaptation: 23.2914 %
inference: 11.5562 %
propagation: 0.200819 %

...and I had it output a timing data file, which I then plotted with the Python library Matplotlib:

{{textcenter{
[img[Sample profiling results|files/projects/quickprof/profile_results.png]]
}}}

''Project Website:'' http://quickprof.sourceforge.net
''Date:'' Started development Summer 2005

''Description:'' QuickTest is a simple C++ unit testing framework.  It is totally contained within a single header file, so it's easy to add to any programming project.  It's goal is to let you write each test with a minimal amount of code.

Writing a test with QuickTest is as easy as this:

{{{
QT_TEST(testSquaredInts)
{
    QT_CHECK_EQUAL(4 * 4, 16);
}
}}}

''Project Website:'' http://quicktest.sourceforge.net
{{textcenter{
[img[files/projects/ray_tracer/splash.png]]
}}}
''Date:'' Fall 2004

''Description:'' For a homework assignment in a computer graphics class, I implemented the core functionality of a ray tracer.  This included ray intersection tests with spheres, cones, cylinders, and triangles.  I also added per-pixel antialiasing and area lights with soft shadows.

----

{{textcenter{
[img[Metallic spheres|files/projects/ray_tracer/spheres_simple_thumbnail.png][files/projects/ray_tracer/spheres_simple.png]]  [img[Metallic spheres with 6x antialiasing|files/projects/ray_tracer/spheres_6xAA_thumbnail.png][files/projects/ray_tracer/spheres_6xAA.png]]  [img[Metallic spheres with 6x antialiasing and 20 soft shadow ray samples per intersection|files/projects/ray_tracer/spheres_6xAA_20xSS_thumbnail.png][files/projects/ray_tracer/spheres_6xAA_20xSS.png]] [img[Metallic rings with 6x antialiasing and 20 soft shadow ray samples per intersection|files/projects/ray_tracer/rings_6xAA_20xSS_thumbnail.png][files/projects/ray_tracer/rings_6xAA_20xSS.png]] [img[Tree with 6x antialiasing and 20 soft shadow ray samples per intersection|files/projects/ray_tracer/tree_6xAA_20xSS_thumbnail.png][files/projects/ray_tracer/tree_6xAA_20xSS.png]] [img["Deranged Stools" with 6x antialiasing and 20 soft shadow ray samples per intersection|files/projects/ray_tracer/deranged_stools_6xAA_20xSS_thumbnail.png][files/projects/ray_tracer/deranged_stools_6xAA_20xSS.png]] 
}}}
My long term goal is to develop a practical general-purpose learning system, implement it in software, and apply it to real-time control problems in robotics and video games. My current approach is based on the mammalian brain architecture. Each of the brain's large-scale structures provides a unique computational benefit which can also benefit AI systems.

Practically, this means gathering the best existing machine learning algorithms (or inventing new ones) and using them to engineer software-based modules similar to the major brain regions. I am currently developing modules based on the sensory and motor cortices, prefrontal cortex, basal ganglia, hippocampus, and cerebellum. Each one is tested both independently and within a fully-integrated architecture. Finally, the entire system must be tested using a developmental approach based on real experience, including sensory data, external reinforcement, and internal curiosity rewards.
{{textcenter{
[img[files/projects/rhino/splash.jpg]]
}}}
''Date:'' Fall 2004

''Description:'' Rhino is a 3D space shooter.  "You are a space station maintenance worker assigned the task of asteroid duty. Maneuver your ship "the Rhino" in frictionless zero gravity, clearing floating debris and intercepting incoming asteroid storms before they damage the vulnerable station. It lacks a certain glory usually attributed to astronauts, but hey, it's a living."  Rhino was a group entry into the 2005 Independent Games Festival Student Competition.  My part of the project was physics tools development and integration.  My jazz combo also recorded some tunes for the in-game radio stations.

''Project Website:'' http://www.annexlabs.com/rhino

----

{{textcenter{
[img[Rhino logo|files/projects/rhino/rhino1_thumbnail.jpg][files/projects/rhino/rhino1.jpg]] [img[Rhino screenshot|files/projects/rhino/rhino2_thumbnail.jpg][files/projects/rhino/rhino2.jpg]] [img[Rhino screenshot|files/projects/rhino/rhino3_thumbnail.jpg][files/projects/rhino/rhino3.jpg]] [img[Rhino screenshot|files/projects/rhino/rhino4_thumbnail.jpg][files/projects/rhino/rhino4.jpg]] [img[Rhino screenshot|files/projects/rhino/rhino5_thumbnail.jpg][files/projects/rhino/rhino5.jpg]] [img[Rhino screenshot|files/projects/rhino/rhino6_thumbnail.jpg][files/projects/rhino/rhino6.jpg]] [img[Rhino screenshot|files/projects/rhino/rhino7_thumbnail.jpg][files/projects/rhino/rhino7.jpg]]
}}}
{{textcenter{
[img[files/projects/ricochet/ricochet_splash.jpg]]
}}}
''Date:'' Fall 2002

''Description:'' Ricochet is a 3D OpenGL version of Breakout/Brickles/Arkanoid I developed with Joe Heiniger and Jeff Oleson for a software engineering class project. In addition to the standard Breakout game mechanics, it lets you acquire various powerups (missiles, extra balls, multiball, point bonuses, nukes...) and hazards (fog, gravity, miniball). Download it and try it out!

''Download:'' Win32 executable [ [[zip|files/projects/ricochet/ricochet-1.13-exe.zip]] ]

----

{{textcenter{
[img[Ricochet screenshot|files/projects/ricochet/ricochet1_thumbnail.jpg][files/projects/ricochet/ricochet1.jpg]] [img[Ricochet screenshot|files/projects/ricochet/ricochet2_thumbnail.jpg][files/projects/ricochet/ricochet2.jpg]]
}}}
{{textcenter{
[img[IBM Cluster at the SCL|files/projects/scalable_computing_lab/ibm_cluster_splash.jpg]]
}}}
''Date:'' Summer 2002

''Description:'' I worked at Ames Lab's [[Scalable Computing Lab|http://www.scl.ameslab.gov]] during the summer of 2002.  This was probably my first real exposure to the Linux environment.  My job was to developed a simple message logging system for batch computing jobs.
{{textcenter{
[img[files/projects/self_organizing_map/splash.png]]
}}}
''Date:'' Fall 2006

''Description:'' [[Self organizing maps|http://en.wikipedia.org/wiki/Self-organizing_map]] (SOMs) perform topographic data compression.  In other words, they map a vector from some input space (usually of high dimensionality) onto a vector in some output space (usually 2-dimensional) while maintaining topographic relationships (vectors that are similar in the input space correspond to vectors that are similar in the output space).  The interesting part is learning this mapping, which is usually performed unsupervised (i.e. just from exposure to lots of data).

To learn more about them, I implemented Kohonen's basic SOM algorithm.  I wanted to gain some intuition concerning how they adapt over time, so I setup a 3D visualization which shows the map moving through the input space.  Below are some results from training a map on a uniform sampling of both a 2D square and a 3D cube.  The blue dot is the sample input point.  The translucent red dots represent the winning node's neighborhood, which diminishes over time.  Notice how in each case the maps try to fill the input space as well as possible (but note that Kohonen's original SOM does not achieve optimal spacing).

----

{{textcenter{
[img[Self organizing map conforming to a 2D square|files/projects/self_organizing_map/2d_som1_thumbnail.png][files/projects/self_organizing_map/2d_som1.png]]  [img[Self organizing map conforming to a 2D square|files/projects/self_organizing_map/2d_som2_thumbnail.png][files/projects/self_organizing_map/2d_som2.png]]  [img[Self organizing map conforming to a 2D square|files/projects/self_organizing_map/2d_som3_thumbnail.png][files/projects/self_organizing_map/2d_som3.png]]  [img[Self organizing map conforming to a 2D square|files/projects/self_organizing_map/2d_som4_thumbnail.png][files/projects/self_organizing_map/2d_som4.png]]  [img[Self organizing map conforming to a 2D square|files/projects/self_organizing_map/2d_som5_thumbnail.png][files/projects/self_organizing_map/2d_som5.png]]  [img[Self organizing map conforming to a 2D square|files/projects/self_organizing_map/2d_som6_thumbnail.png][files/projects/self_organizing_map/2d_som6.png]]  [img[Self organizing map conforming to a 3D cube|files/projects/self_organizing_map/3d_som1_thumbnail.png][files/projects/self_organizing_map/3d_som1.png]]  [img[Self organizing map conforming to a 3D cube|files/projects/self_organizing_map/3d_som2_thumbnail.png][files/projects/self_organizing_map/3d_som2.png]]  [img[Self organizing map conforming to a 3D cube|files/projects/self_organizing_map/3d_som3_thumbnail.png][files/projects/self_organizing_map/3d_som3.png]]  [img[Self organizing map conforming to a 3D cube|files/projects/self_organizing_map/3d_som4_thumbnail.png][files/projects/self_organizing_map/3d_som4.png]]  [img[Self organizing map conforming to a 3D cube|files/projects/self_organizing_map/3d_som5_thumbnail.png][files/projects/self_organizing_map/3d_som5.png]]  [img[Self organizing map conforming to a 3D cube|files/projects/self_organizing_map/3d_som6_thumbnail.png][files/projects/self_organizing_map/3d_som6.png]] 

<html>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-2977904648003466074&hl=en" flashvars=""> </embed>
</html>
}}}
config.options.chkRegExpSearch = false; // default false
config.options.chkCaseSensitiveSearch = false; // default false
config.options.chkAnimate = true; // default true
config.options.txtUserName = "TylerStreeter"; // default "YourName"
config.options.chkSaveBackups = false; // default true
config.options.chkAutoSave = false; // default false
config.options.chkGenerateAnRssFeed   = false;         // default false
config.options.chkSaveEmptyTemplate   = false;         // default false
config.options.chkOpenInNewWindow     = true;          // default true
config.options.chkToggleLinks         = false;         // default false
config.options.chkHttpReadOnly      = true;          // default true
config.options.chkForceMinorUpdate    = false;         // default false
config.options.chkConfirmDelete       = true;          // default true
config.options.chkInsertTabs          = true;         // default false
config.options.txtBackupFolder        = "";            // default ""
config.options.txtMainTab             = "tabTimeline"; // default "tabTimeline"
config.options.txtMoreTab             = "moreTabAll";  // default "moreTabAll"
config.options.txtMaxEditRows         = "30";          // default "30"
config.options.chkDisableWikiLinks  = true; // default false

config.views.wikified.dateFormat = "MMM DD, YYYY"; // "created" and "modified" timestamps in the tiddler display
config.macros.timeline.dateFormat = "DDD, MMM DD, YYYY"; // dates in the timeline
<<search>><<newTiddler>><<closeAll>><<saveChanges>><<permaview>>
<<search>><<closeAll>>
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
<html>
<div align=center>
<br>
<a href="http://www.brainpowerlabs.com"><img src="files/brainpower_labs_logo.png" alt="Brainpower Labs LLC"></a>
<br><br>
<a href="http://www.hci.iastate.edu"><img src="files/hci_logo.png" alt="Human Computer Interaction Graduate Program at ISU"></a>
<br><br>
<a href="http://www.vrac.iastate.edu"><img src="files/vrac_logo.png" alt="Virtual Reality Applications Center"></a>
</div>
</html>
/***
This CSS by DaveBirss.
***/
/*{{{*/


.tabSelected {
 background: #fff;
}

.tabUnselected {
 background: #eee;
}

#sidebar {
 color: #000;
 background: transparent; 
}

#sidebarOptions {
 background: #fff;
}

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

#sidebarOptions input:hover, #sidebarOptions input:active,  #sidebarOptions input:focus {
	border: 1px solid #000;
}

#sidebarOptions .button {
 color: #999;
}

#sidebarOptions .button:hover {
 color: #000;
 background: #fff;
 border-color:white;
}

#sidebarOptions .button:active {
 color: #000;
 background: #fff;
}

#sidebarOptions .sliderPanel {
 background: transparent;
}

#sidebarOptions .sliderPanel A {
 color: #999;
}

#sidebarOptions .sliderPanel A:hover {
 color: #000;
 background: #fff;
}

#sidebarOptions .sliderPanel A:active {
 color: #000;
 background: #fff;
}

.sidebarSubHeading {
 color: #000;
}

#sidebarTabs {`
 background: #fff
}

#sidebarTabs .tabSelected {
 color: #000;
 background: #fff;
 border-top: solid 1px #ccc;
 border-left: solid 1px #ccc;
 border-right: solid 1px #ccc;
 border-bottom: none;
}

#sidebarTabs .tabUnselected {
 color: #999;
 background: #eee;
 border-top: solid 1px #ccc;
 border-left: solid 1px #ccc;
 border-right: solid 1px #ccc;
 border-bottom: none;
}

#sidebarTabs .tabContents {
 background: #fff;
}


#sidebarTabs .txtMoreTab .tabSelected {
 background: #fff;
}

#sidebarTabs .txtMoreTab .tabUnselected {
 background: #eee;
}

#sidebarTabs .txtMoreTab .tabContents {
 background: #fff;
}

#sidebarTabs .tabContents .tiddlyLink {
 color: #999;
 border:none;
}

#sidebarTabs .tabContents .tiddlyLink:hover {
 background: #fff;
 color: #000;
 border:none;
}

#sidebarTabs .tabContents {
 color: #000;
}

#sidebarTabs .button {
 color: #666;
}

#sidebarTabs .tabContents .button:hover {
 color: #000;
 background: #fff;
}

#sidebar {color:#999;}
/*}}}*/

@@display:none;Tyler Streeter@@[img[Tyler Streeter|files/site_title.png][http://www.tylerstreeter.net]]
http://www.tylerstreeter.net/
{{textcenter{
[img[files/projects/somatotopic_maps/splash.png]]
}}}
''Date:'' Fall 2007

''Description:'' Somatotopy is "the correspondence of receptors in regions or parts of the body via respective nerve fibers to specific functional areas of the cerebral cortex."  In other words, it's the mapping from a 2D sheet of skin to a 2D sheet of brain.  Furthermore, it maintains topographic relationships: points near each other on the body surface are represented near each other in the brain.  This is the basic idea behind the [[homunculus|http://en.wikipedia.org/wiki/Cortical_homunculus]] representation of the sensory and motor cortices.  Note that brain regions learn to devote more real estate to those areas that need high resolution representations.

In preparation for an experiment on a simulated human involving my brain-inspired AI architecture, I needed a way to transform a relatively complex body surface into a simple 2D array representation.  The hard part is that the transformation must maintain topographic relationships.  Fortunately, I already have a tool to do this: my topographic map algorithm.

The images below show my topographic map learning to cover several "body" surfaces, including a simple torso, a hand, a human head, a wooden doll, a sword, and a human body.  The maps start out as flat 2D sheets and learns to wrap around the body.  Where does the training data come from? I simulate random data points from the body surface... sort of like having someone constantly poke it in different places. The topographic map responds to these data points by moving part of itself closer to them. One cool thing about my method is that it automatically learns to represent the most-touched regions with higher fidelity; it's like how our brains use more real estate to represent our hands and faces. (In these examples, I'm sampling the vertices of 3D models, which results in higher map density in places with high vertex density.  For example, the human head model has a lot of vertices in the mouth cavity, so it becomes well-represented in the topographic map.)

One way to think of this is a flat sheet of brain (e.g., somatosensory cortex) stretching itself in sensory space to represent the entire body surface.

----

{{textcenter{
[img[Torso map development sequence|files/projects/somatotopic_maps/torso1_thumbnail.png][files/projects/somatotopic_maps/torso1.png]] [img[Torso map development sequence|files/projects/somatotopic_maps/torso2_thumbnail.png][files/projects/somatotopic_maps/torso2.png]] [img[Torso map development sequence|files/projects/somatotopic_maps/torso3_thumbnail.png][files/projects/somatotopic_maps/torso3.png]] [img[Torso map development sequence|files/projects/somatotopic_maps/torso4_thumbnail.png][files/projects/somatotopic_maps/torso4.png]] [img[Torso map development sequence|files/projects/somatotopic_maps/torso5_thumbnail.png][files/projects/somatotopic_maps/torso5.png]] [img[Hand map development sequence|files/projects/somatotopic_maps/hand_sequence_thumbnail.png][files/projects/somatotopic_maps/hand_sequence.png]] [img[Head map development sequence|files/projects/somatotopic_maps/head_sequence_thumbnail.png][files/projects/somatotopic_maps/head_sequence.png]] [img[Wooden doll map development sequence|files/projects/somatotopic_maps/wooden_doll_sequence_thumbnail.png][files/projects/somatotopic_maps/wooden_doll_sequence.png]] [img[Sword map development sequence|files/projects/somatotopic_maps/sword_sequence_thumbnail.png][files/projects/somatotopic_maps/sword_sequence.png]] [img[Human map development sequence|files/projects/somatotopic_maps/human_sequence_thumbnail.png][files/projects/somatotopic_maps/human_sequence.png]]
}}}
[[SideBarWG]]

/***
!Top Menu Styles
***/
/*{{{*/
#topMenu br {display:none; }
#topMenu { background: #000 ; color:#fff;padding: 1em 1em;}
/*}}}*/

/***
!General
***/
/*{{{*/
body {
 background: #444;
 margin: 0 auto;
}

 #contentWrapper{
 background: #fff;
 border: 0;
 margin: 0 auto;
 width: 792px;
 padding:0;
}
/*}}}*/

/***
!Header rules
***/
/*{{{*/
.titleLine{
 margin: 0px;
margin-left:0em;
margin-bottom: 0px;
 padding: 0;
 text-align: left;
 color: #fff;
}

.siteTitle {
	font-size: 2em;
        font-weight: bold;
}

.siteSubtitle {
	font-size: 1.1em;
        display: block;
        margin: 0em;
}

.gradient {margin: 0 auto;}



.header {
 background: #fff; 
 margin: 0 auto;
 padding:0 12px;
 width: 768px;
}
/*}}}*/

/***
!Display Area
***/
/*{{{*/
#bodywrapper {margin:0 12px; padding:0;background:#fff; height:1%}

#displayArea{
 margin: 10px 180px 10px 10px;
 text-align: left;
 min-height: 400px;
}

.tiddler {
 padding: 1em 1em 1em 1em;
 border: 1px solid #aaa;
 margin-bottom:1em;
}

h1,h2,h3,h4,h5 { color: #000; background: transparent; padding-bottom:2px; border-bottom: 1px solid #bbb; }

.title {color:black; font-size:1.8em; padding-bottom:0.3px;}
.subtitle { font-size:90%; border-top:2px solid #555; color:#ccc; padding-left:0.25em; margin-top:0.1em; }

.shadow .title {
	color: #aaa;
}

.tagClear{
	clear: none; 
}

* html .viewer pre {
	margin-left: 0em;
}

* html .editor textarea, * html .editor input {
	width: 98%;
}


.toolbar .button {color:#bbb; border:none;}
.toolbar .button:hover, .toolbar .highlight, .toolbar .marked, .toolbar a.button:active {background:transparent; color:#111; border:none; text-decoration:none;}

#sidebar .highlight, #sidebar .marked {background:transparent;}

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

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

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

.selected .tagging .listTitle, .selected .tagged .listTitle {
	color: #222; 
}


.tagging .button:hover, .tagged .button:hover {
		border: none; background:transparent; text-decoration:underline; color:#000;
}

.tagging .button, .tagged .button {
		color:#aaa;
}

.selected .tagging .button, .selected .tagged .button {
		color:#000;
}

.viewer blockquote {
	border-left: 3px solid #000;
}

.viewer pre, .viewer code {
	border: 1px dashed #ccc;
	background: #eee;}

.viewer hr {
	border: 0;
	border-top: solid 1px #333;
 margin: 0 8em;
	color: #333;
}

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

.viewer .highlight, .viewer .marked {text-decoration:none;}

#sidebarTabs .highlight, #sidebarTabs .marked {color:#000; text-decoration:none;}

.tabSelected {
 color: #000;
 background: #fff;
 border-top: solid 1px #ccc;
 border-left: solid 1px #ccc;
 border-right: solid 1px #ccc;
 border-bottom: none;
}

.viewer .tabSelected:hover{color:#000;}

.viewer .tabSelected {font-weight:bold;}

.tabUnselected {
 color: #999;
 background: #eee;
 border-top: solid 1px #ccc;
 border-left: solid 1px #ccc;
 border-right: solid 1px #ccc;
 border-bottom: solid 1px #ccc;
 padding-bottom:1px;
}

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

.textcenter {text-align:center;}
/*}}}*/
/***
!!!Tables
***/
/*{{{*/
.viewer table {
	border: 1px solid #000;
}

.viewer th, thead td {
	background: #000;
	border: 1px solid #000;
	color: #fff;
}

.viewer td, .viewer tr {
	border: 1px solid #111;
}
/*}}}*/


/***
!!!Editor area
***/
/*{{{*/
.editor input, .editor textarea {
	border: 1px solid #ccc;
}

.editor {padding-top:0.3em;}

.editor textarea:focus, .editor input:focus {
	border: 1px solid #333;
}
/*}}}*/

/***
!Sidebar
***/
/*{{{*/
#sidebar{
position:relative;
float:right;
margin-bottom:1em;
display:inline;
width: 170px;
}

#sidebarOptions .sliderPanel {
	background: #eee; border:1px solid #ccc;
}

/*}}}*/

/***
!Body Footer rules
***/
/*{{{*/
#contentFooter {
 text-align: left;
 font-size: 0.8em;
 clear: both;
 color:#fff;
 background: #000;
 padding: 1em 2em;
font-weight:bold;
}

/*}}}*/
/***
!Link Styles
***/
/*{{{*/
a{
	color: #009000;
}

a:hover{
        color: #FF6600;
        background:#fff;
}


.button {
	color: #000;
	border: 1px solid #fff;
}

.button:hover {
	color: #fff;
	background: #ff8614;
	border-color: #000;
}

.button:active {
	color: #fff;
	background: #ff8614;
	border: 1px solid #000;
}

.siteTitle a, .siteSubtitle a{
 color: #fff;
}

.viewer .button {border: 1px solid #ff8614; font-weight:bold;}
.viewer .button:hover, .viewer .marked, .viewer .highlight{background:#ff8614; color:#fff; font-weight:bold; border: 1px solid #000;}

#topMenu .button, #topMenu .tiddlyLink {
 margin-left:0.5em; margin-right:0.5em;
 padding-left:3px; padding-right:3px;
 color:white;
}
#topMenu .button:hover, #topMenu .tiddlyLink:hover { background:#000; color:#FF8814}

#topMenu a{border:none;}
/*}}}*/

/***
!Message Area /%=================================================%/
***/
/*{{{*/
#messageArea {
	border: 4px dotted #ff8614;
	background: #000;
	color: #fff;
        font-size:90%;
}

#messageArea .button {
	padding: 0.2em;
	color: #000;
	background: #fff;
        text-decoration:none;
        font-weight:bold;
        border:1px solid #000; 
}

#messageArea a {color:#fff;}

#messageArea a:hover {color:#ff8614; background:transparent;}

#messageArea .button:hover {background: #FF8614; color:#fff; border:1px solid #fff; }

/*}}}*/

/***
!Popup /%=================================================%/
***/
/*{{{*/
.popup {
	background: #ff8814;
	border: 1px solid #333;
}

.popup hr {
	color: #333;
	background: #333;
	border-bottom: 1px;
}

.popup li.disabled {
	color: #333;
}

.popup li a, .popup li a:visited {
	color: #eee;
	border: none;
}

.popup li a:hover {
	background: #ff8614;
	color: #fff;
	border: none;
        text-decoration:underline;
}
/*}}}*/

.blog h2, .blog h3, .blog h4{
  margin:0;
  padding:0;
border-bottom:none;
}
.blog {margin-left:1.5em;}  


.blog .excerpt {
  margin:0;
margin-top:0.3em;
  padding: 0;
  margin-left:1em;
  padding-left:1em;
  font-size:90%;
  border-left:1px solid #ddd;
}

#tiddlerWhatsNew h1, #tiddlerWhatsNew h2 {border-bottom:none;}
div[tags~="RecentUpdates"], div[tags~="lewcidExtension"] {margin-bottom: 2em;}

#hoverMenu  .button, #hoverMenu  .tiddlyLink {border:none; font-weight:bold; background:#f37211; color:#fff; padding:0 5px; float:right; margin-bottom:4px;}
#hoverMenu .button:hover, #hoverMenu .tiddlyLink:hover {font-weight:bold; border:none; color:#f37211; background:#000; padding:0 5px; float:right; margin-bottom:4px;}

#topMenu .fontResizer {float:right;}

#topMenu .fontResizer .button{border:1px solid #000;}
#topMenu .fontResizer .button:hover {border:1px solid #f37211; color:#fff;}
#sidebarTabs .txtMainTab .tiddlyLinkExisting {
 font-weight: normal;
 font-style: normal;
}

#sidebarTabs .txtMoreTab .tiddlyLinkExisting {
 font-weight: bold;
 font-style: normal;
}

.blog h2, .blog h3, .blog h4{
  margin:0;
  padding:0;
border-bottom:none;
}
.blog {margin-left:1.5em;}  


.blog .excerpt {
  margin:0;
margin-top:0.3em;
  padding: 0;
  margin-left:1em;
  padding-left:1em;
  font-size:90%;
  border-left:1px solid #ddd;
}

#tiddlerWhatsNew h1, #tiddlerWhatsNew h2 {border-bottom:none;}
div[tags~="RecentUpdates"], div[tags~="lewcidExtension"] {margin-bottom: 2em;}

#hoverMenu {background:transparent;}
#hoverMenu  .button, #hoverMenu  .tiddlyLink {border:none; font-weight:bold; background:#f37211; color:#fff; padding:0 5px; float:right; margin-bottom:4px;}
#hoverMenu .button:hover, #hoverMenu .tiddlyLink:hover {font-weight:bold; border:none; color:#f37211; background:#000; padding:0 5px; float:right; margin-bottom:4px;}

#topMenu .fontResizer {float:right;}

#topMenu .fontResizer .button{border:1px solid #000;}
#topMenu .fontResizer .button:hover {border:1px solid #f37211; color:#fff;}
#sidebarTabs .txtMainTab .tiddlyLinkExisting {
 font-weight: normal;
 font-style: normal;
}

#sidebarTabs .txtMoreTab .tiddlyLinkExisting {
 font-weight: bold;
 font-style: normal;
}
/*{{{*/
* 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 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.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:0em 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 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

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

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

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 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 0em;}
.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 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 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 0em 14em;}

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

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

.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:0em 0.25em; padding:0em 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:0px 3px 0px 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 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

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

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.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 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
{{textcenter{
[img[The Cityscape Switcher|files/projects/switcher/switcher.png]]
}}}
''Date:'' Spring 2005

''Description:'' The Switcher is a prototype VR application switcher for the VRAC.  It's sort of a VR operating system based on VR Juggler.  The core functionality of this system was designed and implemented by Josh Brown.  Andres Reinot and I implemented an instance of Josh's switcher framework: the Cityscape Switcher.  All artwork in the Cityscape was done by Josh Larson.  Each building represents a distinct VR application which can be selected and executed.  Visually, when a building is selected, it explodes into pieces, the Cityscape fades out, and the application fades in.
<<allTags excludeLists>>
{{textcenter{
[img[files/projects/treefort_wars/splash.jpg]]
}}}
''Date:'' Fall 2003

''Description:'' "Break out the squirt guns, go find all the balloons in your house, and leave that garden hose in the garage you cheater! Treefort Wars is the ultimate strategic backyard water battle raged between the neighborhood kids. Starting with a posse of pals, their respective skills and some left over allowance money, you must construct a fortress high in the foliage to defend your turf while pelting your opponents with as much watery weaponry as possible. Soak 'em to the skin while impressing all with your vast stronghold of the skies and the other kids will beg to join your crew. Charging everyone for the privilege of using your treefort lets you buy even more supplies and build additional defenses, but don't be too greedy, or the guys might decide your opponent runs a cleaner ship and abandon your efforts. Which would of course leave you and your small remaining crew high but hardly dry."

Treefort Wars was a game development class project that became one of ten finalists in the annual Independent Games Festival Student Competition. We were invited to demo our project at the Game Developer's Conference 2004 in San Jose.

I worked on the first (Ash) edition of the game as a 3D modeler using 3D Studio Max 5.1.  My models are shown in the images below, along with screenshots of the game in action.

''Project Website:'' http://www.treefortwars.com

----

{{textcenter{
[img[My models|files/projects/treefort_wars/model1_thumbnail.jpg][files/projects/treefort_wars/model1.jpg]] [img[My models|files/projects/treefort_wars/model2_thumbnail.jpg][files/projects/treefort_wars/model2.jpg]] [img[My models|files/projects/treefort_wars/model3_thumbnail.jpg][files/projects/treefort_wars/model3.jpg]] [img[My models|files/projects/treefort_wars/model4_thumbnail.jpg][files/projects/treefort_wars/model4.jpg]] [img[My models|files/projects/treefort_wars/model5_thumbnail.jpg][files/projects/treefort_wars/model5.jpg]] [img[My models|files/projects/treefort_wars/model6_thumbnail.jpg][files/projects/treefort_wars/model6.jpg]] [img[My models|files/projects/treefort_wars/model7_thumbnail.jpg][files/projects/treefort_wars/model7.jpg]] [img[My models|files/projects/treefort_wars/model8_thumbnail.jpg][files/projects/treefort_wars/model8.jpg]] [img[In-game screenshots|files/projects/treefort_wars/game1_thumbnail.jpg][files/projects/treefort_wars/game1.jpg]] [img[In-game screenshots|files/projects/treefort_wars/game2_thumbnail.jpg][files/projects/treefort_wars/game2.jpg]] [img[In-game screenshots|files/projects/treefort_wars/game3_thumbnail.jpg][files/projects/treefort_wars/game3.jpg]] [img[In-game screenshots|files/projects/treefort_wars/game4_thumbnail.jpg][files/projects/treefort_wars/game4.jpg]] [img[In-game screenshots|files/projects/treefort_wars/game5_thumbnail.jpg][files/projects/treefort_wars/game5.jpg]] [img[In-game screenshots|files/projects/treefort_wars/game6_thumbnail.jpg][files/projects/treefort_wars/game6.jpg]] [img[In-game screenshots|files/projects/treefort_wars/game7_thumbnail.jpg][files/projects/treefort_wars/game7.jpg]] [img[In-game screenshots|files/projects/treefort_wars/game8_thumbnail.jpg][files/projects/treefort_wars/game8.jpg]] [img[In-game screenshots|files/projects/treefort_wars/game9_thumbnail.jpg][files/projects/treefort_wars/game9.jpg]] [img[In-game screenshots|files/projects/treefort_wars/game10_thumbnail.jpg][files/projects/treefort_wars/game10.jpg]]
}}}
{{textcenter{
[img[The group playing at Cafe Diem in Ames|files/projects/tyler_streeter_quartet/tsq_cafe_diem_splash.jpg]]
}}}
''Date:'' Fall 2003 - Fall 2004

''Description:'' Scott Yoshimura (drums), Michael Roberts (guitar), Brendon Fuhs (bass) and I (tenor sax) played together as the Tyler Streeter Quartet.  We did music by Herbie Hancock, Miles Davis, John Coltrane, and others, performing in Ames at Cafe Diem, People's, and Stomping Grounds.

''2004 Recordings:''
* Brother Hubbard [ [[mp3|files/projects/tyler_streeter_quartet/brother_hubbard.mp3]] ]
* Caravan [ [[mp3|files/projects/tyler_streeter_quartet/caravan.mp3]] ]
* Chameleon [ [[mp3|files/projects/tyler_streeter_quartet/chameleon.mp3]] ]
* So What [ [[mp3|files/projects/tyler_streeter_quartet/so_what.mp3]] ]
* Song for my Father [ [[mp3|files/projects/tyler_streeter_quartet/song_for_my_father.mp3]] ]
* Spain [ [[mp3|files/projects/tyler_streeter_quartet/spain.mp3]] ]
''Date:'' Summer 2002 - Fall 2003

''Description:'' At Iowa State's [[Center for Nondestructive Evaluation|http://www.cnde.iastate.edu]] I worked on a 3D CAD/Ultrasonic Testing simulation package.  This was my first exposure to OpenGL and 3D graphics programming.  My supervisor had developed a software package called UT Sim, which was a visual simulator for ultrasonic testing.  It allowed users to load 3D models (e.g., parts from jet engines, airplane wings, or space shuttle tiles) and test them with a simulated ultrasonic probe.  UT Sim was a UNIX program when I arrived.  My main task was to port it to Windows using Visual Studio 6.0.  I also integrating a .stl file importer, an existing octree space partitioning system, and several visual features.

----

{{textcenter{
[img[UT Sim in Windows|files/projects/ut_sim/ut_sim1_thumbnail.jpg][files/projects/ut_sim/ut_sim1.jpg]] [img[UT Sim in Windows|files/projects/ut_sim/ut_sim2_thumbnail.jpg][files/projects/ut_sim/ut_sim2.jpg]] [img[UT Sim in Windows|files/projects/ut_sim/ut_sim3_thumbnail.jpg][files/projects/ut_sim/ut_sim3.jpg]]
}}}
{{textcenter{
[img[files/projects/vr_humvee/splash.jpg]]
}}}
''Date:'' Fall 2003

''Description:'' This was a US Army research project to develop a virtual reconfigurable humvee.  The virtual components were to provide interfaces to real devices.  Thus, one of my tasks on this group project was to make it possible to control a real PC by interacting with a virtual PC one inside of the VR humvee.  I extended an existing VR Juggler/VNC framework to accomplish this.  This combination uses a VNC client window mapped to a texture, which can then be used in a variety of ways in a 3D application (e.g., as a virtual PC monitor).

----

{{textcenter{
[img[Basic virtual VNC setup: a VNC window mapped to a texture in 3D space|files/projects/vr_humvee/virtual_vnc_thumbnail.jpg][files/projects/vr_humvee/virtual_vnc.jpg]] [img[The view inside of the virtual humvee, complete with a simulated PC connected to a real PC|files/projects/vr_humvee/configurator_thumbnail.jpg][files/projects/vr_humvee/configurator.jpg]]
}}}
{{textcenter{
[img[Verve logo|files/projects/verve/logo.png]]
}}}
''Date:'' Started development Fall 2004

''Description:'' Verve is an open source C++ software library for general purpose reinforcement learning. Its main component is an intelligent agent, with user-defined sensors, actions, and motivation (rewards and punishment). It is useful for situations where you need an intelligent control system to learn a complex control task, but you don't know the exact control algorithm. Simply by providing the agent with a scalar reinforcement signal as it explores the task, it will learn to optimize its behavior to achieve more rewards, thus learning the desired control policy. It combines several well-studied methods (radial basis functions, temporal difference learning, and planning) with a few experimental methods (uncertainty estimations and curiosity) into a novel learning architecture.  See my master's thesis in [[Publications]] for more details.

Most of the images and videos below are from several physical simulations I wrote for my master's thesis.  They test the library's capabilities on motor learning tasks.  The 3rd video below, which was done after my thesis work, is a simulated playground for curious robot exploration.

''Project Website:'' http://verve-agents.sourceforge.net

''Download:'' Verve Apps Win32 package, including the pendulum swing-up, cart-pole, and curious robot playground applications [ [[zip|files/projects/verve/verve_apps.zip]] ]

----

{{textcenter{
[img[The cart-pole/inverted pendulum reinforcement learning task|files/projects/verve/cart_pole_thumbnail.png][files/projects/verve/cart_pole.png]] [img[A simulated playground for curious robot exploration|files/projects/verve/robot_playground_thumbnail.png][files/projects/verve/robot_playground.png]] [img[A simulated robot with a green curiosity meter|files/projects/verve/curious_robot_thumbnail.png][files/projects/verve/curious_robot.png]] [img[Neural network value function and control policy visualization before and after learning|files/projects/verve/pendulum_networks_thumbnail.png][files/projects/verve/pendulum_networks.png]] [img[Visual representation of an agent's value function in the 2D state space of the pendulum swing-up task|files/projects/verve/pendulum-value-sequence_thumbnail.png][files/projects/verve/pendulum-value-sequence.png]] [img[Learning performance of an agent on the pendulum swing-up task|files/projects/verve/pendulum-performance_thumbnail.png][files/projects/verve/pendulum-performance.png]] [img[Performance measurement on an exploration task with various features enabled|files/projects/verve/curiosity_performance_thumbnail.png][files/projects/verve/curiosity_performance.png]] [img[Iowa State HCI Forum 2005 poster|files/projects/verve/motor_learning_poster_thumbnail.png][files/publications/StreeterMotorLearningPoster2005.png]] 

<html>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-7486940940456391207&hl=en" flashvars=""></embed>
<br><br>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=8226600171334714429&hl=en" flashvars=""> </embed>
<br><br>
<embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=-6377415821882587060&hl=en" flashvars=""> </embed>
</html>
}}}
<!--{{{-->
<span class='title' macro='view title'></span>
<!-- stripped-down version for web users -->
<span macro="showWhen readOnly">
<span class='toolbar' macro='toolbar closeTiddler permalink'></span>
</span>
<!-- regular version for me  -->
<span macro="hideWhen readOnly">
<span class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields permalink references jump'></span>
</span>
<!-- stuff for everyone -->
<div class='subtitle'></div>
<div class='tagging' macro='tagging'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
''Date:'' Started development Spring 2005

''Description:'' Voce is a speech synthesis and recognition library that is cross-platform, accessible from Java and C++, and has a very small API.  It uses CMU Sphinx4 and FreeTTS internally.  "Voce" is Italian for "voice" ([[pronounciation|files/projects/voce/voce_pronounciation.wav]]).

Voce has been used in many software development projects, especially within the [[VRAC|http://www.vrac.iastate.edu]].  For example, it has been successfully integrated into a UAV (unmanned aerial vehicle) command and control simulation, in which the user can select and direct swarms of simulated unmanned aerial vehicles.

''Project Website:'' http://voce.sourceforge.net
Welcome to my personal website! This is mainly a repository of my projects, including funded research, classwork, independent research, and hobbies.  See the [[Projects]] section for more info, including images, videos, and executable demos.

{{textcenter{
[img[Email me|files/email_address.png]]
}}}
{{textcenter{
[img[files/projects/ibonsai/splash.png]]
}}}
''Date:'' Started October 2008.

''Description:'' This fun little diversion is my company's first product. It's a 3D tree generator for the iPhone and iPod touch, inspired by an earlier experiment with [[BranchingSystems]]. Read more about it on the [[Brainpower Labs|http://www.brainpowerlabs.com]] website, or download it directly from the App Store by clicking/tapping the following image:

{{textcenter{
[img[iBonsai on the App Store|files/projects/ibonsai/app_store_badge.png][http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=300829218&mt=8]]}}}