From a53530bd5c89b17351332c708c53db919534823f Mon Sep 17 00:00:00 2001 From: PegasusGTV Date: Mon, 11 May 2026 18:34:50 -0400 Subject: [PATCH 1/7] feat(site): import content sections from legacy sbpl.net MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add the lab content that lived on the old Drupal site (~2012–2015) into the new Hugo site as proper top-level sections, plus 33 historical lab members as Alumni: - New top-level pages and menu entries: - /robots/ — Allen the PR2, Man-Hack the Hexacopter, Melvin the Segbot - /software/ — current SBPL libraries, MoveIt plugin, lattice/SIPP/E-Graph planners - /old-software/ — historical SVN / ROS Diamondback / Electric / Fuerte links - /videos/ — YouTube reel (mobile-manip, manip, navigation, dyn-env, hexacopter) - /tutorials/ — index that links into the archived tutorial HTML - /contact/ — physical / mailing address and sbpl-users mailing list - Add 33 historical members to `data/members/alumni.yaml` covering the CMU / UPenn lab roster of that era (PhDs, masters, postdocs, research staff, interns). Three of them (Brian MacAllister, Jonathan Butzke, Bradford Neuman) have real headshots from the legacy site avatars, saved under `static/images/members/legacy/`. - Refresh the homepage `labBlurb` (in `hugo.toml`) with the authoritative mission statement from the original sbpl.net home page. - Introduce a generic `layouts/_default/single.html` so any future standalone markdown page renders without custom layout work. - Extend `static/css/custom.css` with `.legacy-page`, `.video-grid`, and related rules to style the new sections consistently. Co-authored-by: Cursor --- content/contact.md | 37 +++ content/old-software.md | 42 +++ content/robots.md | 68 +++++ content/software.md | 100 +++++++ content/tutorials.md | 66 +++++ content/videos.md | 58 ++++ data/members/alumni.yaml | 264 ++++++++++++++++++ hugo.toml | 22 +- layouts/_default/single.html | 9 + static/css/custom.css | 74 +++++ .../images/members/legacy/bradford-neuman.jpg | Bin 0 -> 9710 bytes .../members/legacy/brian-macallister.jpg | Bin 0 -> 393315 bytes .../images/members/legacy/jonathan-butzke.jpg | Bin 0 -> 246438 bytes 13 files changed, 739 insertions(+), 1 deletion(-) create mode 100644 content/contact.md create mode 100644 content/old-software.md create mode 100644 content/robots.md create mode 100644 content/software.md create mode 100644 content/tutorials.md create mode 100644 content/videos.md create mode 100644 layouts/_default/single.html create mode 100644 static/images/members/legacy/bradford-neuman.jpg create mode 100755 static/images/members/legacy/brian-macallister.jpg create mode 100644 static/images/members/legacy/jonathan-butzke.jpg diff --git a/content/contact.md b/content/contact.md new file mode 100644 index 0000000..881d586 --- /dev/null +++ b/content/contact.md @@ -0,0 +1,37 @@ +--- +title: "Contact" +lead: "How to reach the Search-Based Planning Lab." +date: 2014-01-01 +--- + +## Visit Us + +**Physical Address** + +Newell-Simon Hall (NSH) +Carnegie Mellon University +5000 Forbes Avenue +Pittsburgh, PA 15213 + +## Mail + +Maxim Likhachev +Carnegie Mellon University — Robotics Institute +5000 Forbes Avenue +Pittsburgh, PA 15213 + +## Stay In Touch + +To get updates and announcements, please join the +[**sbpl-users** mailing list](https://groups.google.com/forum/#!forum/sbpl-users). + +## Email + +For comments, questions, or collaboration enquiries, please contact +the lab's principal investigator, [Maxim Likhachev](mailto:maxim@cs.cmu.edu). + +--- + +*The address above was updated from the original sbpl.net contact page +(1612 Newell Simon Hall) — please confirm the current room before +visiting in person.* diff --git a/content/old-software.md b/content/old-software.md new file mode 100644 index 0000000..1cc495d --- /dev/null +++ b/content/old-software.md @@ -0,0 +1,42 @@ +--- +title: "Old Software" +lead: "Historical SBPL software links from the sbpl.net era (~2012–2015)." +date: 2014-01-01 +--- + +These links are preserved verbatim from the legacy sbpl.net "Old +Software" page. Many of them point at SVN/Mercurial repositories or +ROS distributions (Diamondback, Electric, Fuerte) that are no longer +maintained, but they are kept here for completeness. For current, +maintained software see the [Software](/software/) page. + +### SBPL + +- ROS Wiki page: [wiki.ros.org/sbpl](http://wiki.ros.org/sbpl) +- Original repository: [kforge.ros.org/sbpl/sbpl](https://kforge.ros.org/sbpl/sbpl) + (now mirrored at [github.com/sbpl/sbpl](https://github.com/sbpl/sbpl)) + +### 3-D Navigation Planner + +- [ros.org/wiki/sbpl_3dnav_planner](http://wiki.ros.org/sbpl_3dnav_planner) + +### Lattice Planner + +- [ros.org/wiki/sbpl_lattice_planner](http://wiki.ros.org/sbpl_lattice_planner) + +### Arm Planner (PR2 only) + +- ROS Wiki: [ros.org/wiki/sbpl_arm_planner](http://wiki.ros.org/sbpl_arm_planner) +- ROS Diamondback: `https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/tags/diamondback/` +- ROS Electric: `https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/electric/` +- ROS Fuerte: `https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/trunk/` + +### Full-Body Navigation Planner (PR2 only) + +- Repository: `https://sbpl.pc.cs.cmu.edu/redmine/projects/full-body-nav` +- Documentation: [kforge.ros.org/Sushi/trac/wiki/Navigation](https://kforge.ros.org/Sushi/trac/wiki/Navigation) + +### Dynamic Environment Navigation Planner (SIPP) + +- ROS Wiki: [ros.org/wiki/sbpl_dynamic_env](http://wiki.ros.org/sbpl_dynamic_env) +- Repository (svn): `https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_dynamic_env/trunk` diff --git a/content/robots.md b/content/robots.md new file mode 100644 index 0000000..8afd8e2 --- /dev/null +++ b/content/robots.md @@ -0,0 +1,68 @@ +--- +title: "Lab Robots" +lead: "The hardware platforms we use to validate our planning algorithms in the real world." +date: 2014-01-01 +--- + +## Allen the PR2 + +![Allen the PR2 grasping](/archive/legacy-drupal/media/uploads/site/all/images/pr2_grasp.png) + +Allen the PR2 is a mobile manipulation platform developed by +[Willow Garage](http://www.willowgarage.com/pages/pr2/overview). The robot +has two 7-degree-of-freedom arms for manipulating objects and an +omni-directional base for navigation. It carries an array of sensors +including two Hokuyo laser range finders and seven cameras for building +3-D maps of its surroundings and identifying objects. In our lab we use +Allen to test a variety of planners including single-arm, dual-arm, +navigation (in position and orientation), and full-body mobile manipulation. + +## Man-Hack the Hexacopter + +

+ Hexacopter top view + Hexacopter in flight + Hexacopter side view +

+ +Man-Hack the Hexacopter is our lab unmanned aerial vehicle (UAV). The +base is a Mikrokopter Hexa XL frame with a custom-made carbon fiber +computer carrier and blade guard. Onboard processing is performed by an +i7 COM Express module running ROS, allowing the hexacopter to operate +without any off-board connectivity. Like Melvin, it uses two +orthogonally mounted Hokuyo laser range finders as the primary +localization sensors, augmented by GPS and two wide-angle camera +systems. Total system weight is approximately 4.3 kg with over 15 +minutes of flight time. + +The hexacopter is used for 3-D planning research including planning +under uncertainty, planning in the presence of 3-D dynamic obstacles, +and visual servoing in conjunction with planning. + +## Melvin the Segbot + +

+ Segbot + Segbot side + Segbot front +

+ +Melvin the Segbot is based on a Segway RMP 200 platform with a +custom-made rear trailer allowing it to operate in a variety of +environments both indoors and outdoors. The custom computer system +consists of an 8-core server and a 2-core controller, giving Melvin the +highest computational capability of any of our lab robots. Like all of +our robots, Melvin uses ROS running on Kubuntu for the software +infrastructure. For sensing the environment, Melvin relies on two +Hokuyo laser range finders, supplemented by GPS or vision systems +when required. + +Melvin is used primarily for ground navigation research, including +research in exploration, planning in the presence of dynamic obstacles, +and multi-robot planning. + +--- + +*This page describes the hardware platforms used during the sbpl.net +era of the lab (~2012–2015). For the lab's current robotic platforms, +see the People page and recent publications.* diff --git a/content/software.md b/content/software.md new file mode 100644 index 0000000..7b7d5bb --- /dev/null +++ b/content/software.md @@ -0,0 +1,100 @@ +--- +title: "Software" +lead: "Planning libraries, ROS packages, and utilities released by the lab." +date: 2014-01-01 +--- + +For setup help with the libraries below, see the +[Tutorials](/tutorials/) page. The most maintained software is +hosted on the lab's [GitHub organisation](https://github.com/sbpl). + +## Core Libraries + +### SBPL — Search-Based Planning Library + +The core planning library, written in C++ with no required +dependencies. Implements ARA\*, AD\*, Anytime D\*, R\*, weighted A\*, +SIPP, Experience Graphs, and lattice-based planners. + +- Repository: [github.com/sbpl/sbpl](https://github.com/sbpl/sbpl.git) +- ROS Wiki: [ros.org/wiki/sbpl](http://wiki.ros.org/sbpl) + +### SBPL Geometry Utilities + +Geometry helpers used across SBPL packages. + +- Repository: [github.com/sbpl/sbpl_geometry_utils](https://github.com/sbpl/sbpl_geometry_utils.git) + +## ROS Planners and Plugins + +### SBPL MoveIt! Plugin + +Generic SBPL planner plugin for MoveIt!. + +- Core: [aurone/moveit_planners_sbpl](https://github.com/aurone/moveit_planners_sbpl.git) +- Manipulation: [aurone/sbpl_manipulation](https://github.com/aurone/sbpl_manipulation.git) +- Leatherman utilities: [aurone/leatherman](https://github.com/aurone/leatherman.git) +- PR2 config: [aurone/pr2_sbpl_interface_config](https://github.com/aurone/pr2_sbpl_interface_config.git) + +### Lattice Planner (3-D Navigation) + +A global planner for `move_base` based on motion primitives. + +- ROS source: [ros-planning/navigation_experimental](https://github.com/ros-planning/navigation_experimental.git) +- ROS Wiki: [ros.org/wiki/sbpl_lattice_planner](http://wiki.ros.org/sbpl_lattice_planner) +- Paper: [Likhachev & Ferguson, RSS 2008](http://www.cs.cmu.edu/~maxim/files/planlongdynfeasmotions_rss08.pdf) + +### 3-D Navigation with Full-Body Collision Checking (PR2) + +A `move_base` global planner that performs full-body collision +checks. PR2 specific. + +- ROS Wiki: [ros.org/wiki/sbpl_3dnav_planner](http://wiki.ros.org/sbpl_3dnav_planner) + +### Single-Arm Planning + +Can be used with the ROS `arm_navigation` stack (`move_arm`). PR2 +support plus an experimental "Any Robot" branch. + +- ROS Wiki: [ros.org/wiki/sbpl_arm_planner](http://wiki.ros.org/sbpl_arm_planner) +- Papers: [ICRA 2010](http://www.seas.upenn.edu/~maximl/files/SBPlanningwithMotionPrims_icra10.pdf), + [ICRA 2011](http://www.cs.cmu.edu/~maxim/files/armplanwithadaptmprim_icra11.pdf) + +### Dual-Arm Planning (PR2) + +- Paper: [ICRA 2012](http://www.cs.cmu.edu/~maxim/files/dualarmplanning_icra12.pdf) + +### Navigation in Dynamic Environments (SIPP) + +- ROS Wiki: [ros.org/wiki/sbpl_dynamic_env](http://wiki.ros.org/sbpl_dynamic_env) +- Papers: [ICRA 2011](http://www.cs.cmu.edu/~maxim/files/sipp_icra11.pdf), + [AAAI 2011](http://www.cs.cmu.edu/~maxim/files/cfdaa_aaai11.pdf) + +### Cart Planning + +- ROS Wiki: [ros.org/wiki/sbpl_cart_planner](http://wiki.ros.org/sbpl_cart_planner) + +### Experience Graphs (E-Graphs) + +E-Graphs are built from experience (previously planned paths or user +demonstrations). The planner reuses parts of these prior paths to +plan faster. + +- Papers: [RSS 2012](http://www.cs.cmu.edu/~maxim/files/egraph_rss12.pdf), + [ICRA 2013](http://www.cs.cmu.edu/~maxim/files/anytimeincrementalegraphs_icra13.pdf) + +## Utilities + +### PViz + +PR2 visualisation library. With one function call you can visualise +the PR2 in RViz with any joint configuration; the original meshes are +drawn as visualisation markers. + +- Repository: [bcohen/pviz](https://github.com/bcohen/pviz.git) + +--- + +See also: [**Old Software**](/old-software/) — historical SVN/Mercurial +links and ROS Diamondback/Electric/Fuerte branches from the +sbpl.net era. diff --git a/content/tutorials.md b/content/tutorials.md new file mode 100644 index 0000000..4d53737 --- /dev/null +++ b/content/tutorials.md @@ -0,0 +1,66 @@ +--- +title: "Tutorials" +lead: "Historical SBPL tutorials preserved from the legacy sbpl.net site." +date: 2014-01-01 +--- + +The tutorials below were authored for SBPL roughly 2012–2015. The +content of each tutorial is preserved in the legacy snapshot under +`/archive/legacy-drupal/`. They reference older versions of SBPL but +the underlying concepts (graph search, lattice planning, motion +primitives) are still current. + +## [Primer to Search-Based Motion Planning](/archive/legacy-drupal/content/pages/0050-primer-to-search-based-motion-planning.html) + +The theoretical background: state spaces, graph search, +A\* / weighted A\* / ARA\*, heuristics, motion primitives, and how +search-based planning compares with sampling-based approaches. + +## [Primer to the Search-Based Planning Library (SBPL)](/archive/legacy-drupal/content/pages/0049-primer-to-the-search-based-planning-library-sbpl.html) + +A walk-through of how the SBPL C++ library is organised: planners, +environments, motion primitives, and how to write your own +`SBPLPlanner`/`DiscreteSpaceInformation` pair. + +## [SBPL Overview](/archive/legacy-drupal/content/pages/0047-sbpl-overview.html) + +A brief overview of how the SBPL repository is structured and which +files implement which planners. + +## [Planning with SBPL: Example in (x, y, θ) State Space](/archive/legacy-drupal/content/pages/0051-planning-with-sbpl-example-in-x-y-theta-state-space.html) + +Worked example of planning for a 2-D footprint robot in (x, y, θ). + +## [Navigation with SBPL in (x, y, θ)](/archive/legacy-drupal/content/pages/0046-navigation-with-sbpl-in-x-y-theta.html) + +Builds on the previous tutorial to handle exploration of an +unknown environment. + +## [Kinematic Constraints and Motion Primitives](/archive/legacy-drupal/content/pages/0048-kinematic-constraints-and-motion-primitives.html) + +How kinematic constraints are encoded in SBPL. + +## [Generating Motion Primitives](/archive/legacy-drupal/content/pages/0052-generating-motion-primitives-with-sbpl.html) + +How to use the Matlab scripts in SBPL to generate custom motion +primitives. + +## [Forward Arc Motion Primitives](/archive/legacy-drupal/content/pages/0053-forward-arc-motion-primitives.html) + +The arc-based motion primitive formulation used in SBPL. + +## [Building, Installing, and Using SBPL](/archive/legacy-drupal/content/pages/0054-building-installing-and-using-sbpl.html) + +Build instructions (CMake on Linux/macOS/Windows) and a minimal +example of invoking a planner. + +## [Arm Planning](/archive/legacy-drupal/content/pages/0055-arm-planning.html) + +Tutorials and repository links for the legacy PR2 arm planner. + +--- + +*If any of these links is broken in the published site, the source +markdown lives under +[`archive/legacy-drupal/content/pages/`](https://github.com/sbpl/sbpl.github.io/tree/main/archive/legacy-drupal/content/pages) +in this repository.* diff --git a/content/videos.md b/content/videos.md new file mode 100644 index 0000000..8d89e17 --- /dev/null +++ b/content/videos.md @@ -0,0 +1,58 @@ +--- +title: "Videos" +lead: "A historical reel of the lab's research, originally hosted on sbpl.net." +date: 2014-01-01 +--- + +The videos below are YouTube embeds preserved from the legacy +sbpl.net site. They span the lab's mobile manipulation, manipulation, +navigation, dynamic-environment, and hexacopter work circa 2012–2015. + +## Mobile Manipulation + +
+ +
+ +## Manipulation + +
+ + + + + +
+ +## Navigation + +
+ + + + + +
+ +## Dynamic Environments + +
+ + + +
+ +## Hexacopter + +
+ + + +
+ +--- + +*A few raw `.mp4` masters from the original site (manipulation, flight, +ICRA2 demo) total about 559 MB and are tracked separately in the +`archive/legacy-drupal/` snapshot via Git LFS. See `LEGACY_LFS.md` at +the repo root.* diff --git a/data/members/alumni.yaml b/data/members/alumni.yaml index 1418b2c..af9d9b0 100644 --- a/data/members/alumni.yaml +++ b/data/members/alumni.yaml @@ -4,6 +4,11 @@ # When a student graduates or leaves, move their entry from current.yaml here # and add the "now_at" field indicating their current position. # Their publications will continue to be linked automatically. +# +# Entries below the "Legacy (sbpl.net, ~2012-2015)" marker were imported from +# the old Drupal sbpl.net site. Many have only the brief bios that existed on +# the old site and no current "now_at" status; please update if you have +# better information about where these alumni are today. # ============================================================================= - name: "Ramkumar Natarajan" @@ -17,3 +22,262 @@ links: website: "https://www.drramkumar.me/" +# ----------------------------------------------------------------------------- +# Legacy (sbpl.net, ~2012-2015) +# ----------------------------------------------------------------------------- +# Sourced from the old Drupal site (`archive/legacy-drupal/content/pages/`). +# Bios are verbatim from the original member pages. Photos are only present +# for the handful of members who had user avatars in the old site. + +- name: "Andrew Dornbush" + slug: "andrew-dornbush" + category: "research-staff" + photo: "/images/members/placeholder.svg" + bio: > + Research Staff at SBPL (sbpl.net era). + +- name: "Brian MacAllister" + slug: "brian-macallister" + category: "research-staff" + photo: "/images/members/legacy/brian-macallister.jpg" + bio: > + Research staff member at CMU. + +- name: "Ben Cohen" + slug: "ben-cohen" + category: "phd" + photo: "/images/members/placeholder.svg" + bio: > + PhD student in CIS at the University of Pennsylvania. + links: + website: "http://bcohen.info" + +- name: "Subhrajit Bhattacharya" + slug: "subhrajit-bhattacharya" + category: "phd" + photo: "/images/members/placeholder.svg" + bio: > + PhD student in MEAM at the University of Pennsylvania, + co-advised with V. Kumar. + +- name: "Jonathan Butzke" + slug: "jonathan-butzke" + category: "phd" + photo: "/images/members/legacy/jonathan-butzke.jpg" + bio: > + PhD student in the SBP Lab at CMU (as of Spring 2015). Interests in + Robot Design, System Integration, Path Planning, Exploration, + Navigation, and High-level Control. Previously 19 years as a Navy + Officer, qualified Ship's Engineer on USS Oklahoma City (SSN-723) + and division officer on USS Toledo (SSN-769). Past projects include + the lab Segbot and the Hexacopter UAV. + links: + website: "http://www.jbutzke.com" + +- name: "Chris Clingerman" + slug: "chris-clingerman" + category: "phd" + photo: "/images/members/placeholder.svg" + bio: > + PhD student in CIS at the University of Pennsylvania, + co-advised with B. Taskar. + +- name: "John Drake" + slug: "john-drake" + category: "phd" + photo: "/images/members/placeholder.svg" + bio: > + PhD student in CIS at the University of Pennsylvania, + co-advised with A. Safonova. + +- name: "Steven Gray" + slug: "steven-gray" + category: "phd" + photo: "/images/members/placeholder.svg" + bio: > + PhD student in MEAM at the University of Pennsylvania, + co-advised with V. Kumar. + +- name: "Kalin Gochev" + slug: "kalin-gochev" + category: "phd" + photo: "/images/members/placeholder.svg" + bio: > + PhD student in CIS at the University of Pennsylvania. + +- name: "Bradford Neuman" + slug: "bradford-neuman" + category: "phd" + photo: "/images/members/legacy/bradford-neuman.jpg" + bio: > + PhD student in Robotics at CMU, co-advised with A. Stentz. + +- name: "Aline Normoyle" + slug: "aline-normoyle" + category: "phd" + photo: "/images/members/placeholder.svg" + bio: > + PhD student in CIS at the University of Pennsylvania, + co-advised with A. Safonova. + +- name: "Mike Phillips" + slug: "mike-phillips" + category: "phd" + photo: "/images/members/placeholder.svg" + bio: > + PhD student in Robotics at CMU. + links: + website: "https://sites.google.com/site/robotman0/" + +- name: "Aram Ebtekar" + slug: "aram-ebtekar" + category: "phd" + photo: "/images/members/placeholder.svg" + bio: > + PhD student in Computer Science. + +- name: "Sung-Kyun Kim" + slug: "sung-kyun-kim" + category: "phd" + photo: "/images/members/placeholder.svg" + bio: > + PhD student. + +- name: "Soonkyum Kim" + slug: "soonkyum-kim" + category: "postdoc" + photo: "/images/members/placeholder.svg" + bio: > + Post-doctoral researcher at SBPL. + +- name: "Venkatraman Narayanan" + slug: "venkatraman-narayanan" + category: "masters" + photo: "/images/members/placeholder.svg" + bio: > + Masters student in Robotics at CMU. Later worked on + Discriminatively-guided Deliberative Perception (D2P) for + pose estimation of multiple 3D object instances. + links: + website: "http://www.cs.cmu.edu/~venkatrn/" + +- name: "Siddharth Swaminathan" + slug: "siddharth-swaminathan" + category: "masters" + photo: "/images/members/placeholder.svg" + bio: > + Masters student at SBPL. + +- name: "Chen Gao" + slug: "chen-gao" + category: "masters" + photo: "/images/members/placeholder.svg" + bio: > + Masters student at SBPL. + +- name: "Hao Wang" + slug: "hao-wang" + category: "masters" + photo: "/images/members/placeholder.svg" + bio: > + Masters student at SBPL. + +- name: "Victor Hwang" + slug: "victor-hwang" + category: "masters" + photo: "/images/members/placeholder.svg" + bio: > + Masters student at SBPL. + +- name: "Alex Kushleyev" + slug: "alex-kushleyev" + category: "research-staff" + photo: "/images/members/placeholder.svg" + bio: > + Research staff at SBPL. + +- name: "Kush Prasad" + slug: "kush-prasad" + category: "research-staff" + photo: "/images/members/placeholder.svg" + bio: > + Research staff at SBPL. + +- name: "Margarite Safonova" + slug: "margarite-safonova" + category: "developer" + photo: "/images/members/placeholder.svg" + bio: > + Software developer at SBPL. + +- name: "Arjun Menon" + slug: "arjun-menon" + category: "research-staff" + photo: "/images/members/placeholder.svg" + bio: > + Research staff at SBPL. + +- name: "Sandip Aine" + slug: "sandip-aine" + category: "phd" + photo: "/images/members/placeholder.svg" + bio: > + Visiting researcher / collaborator at SBPL. + links: + website: "https://sites.google.com/site/sandipaine/" + +- name: "Ellis Ratner" + slug: "ellis-ratner" + category: "intern" + photo: "/images/members/placeholder.svg" + bio: > + Summer intern / off-site developer at SBPL. + +- name: "Harsh Pandey" + slug: "harsh-pandey" + category: "intern" + photo: "/images/members/placeholder.svg" + bio: > + Summer intern at SBPL. + +- name: "Kavan McEachern" + slug: "kavan-mceachern" + category: "intern" + photo: "/images/members/placeholder.svg" + bio: > + Summer intern at SBPL. + +- name: "Matthew Mac Allister" + slug: "matthew-mac-allister" + category: "intern" + photo: "/images/members/placeholder.svg" + bio: > + Summer 2012 intern at SBPL. + +- name: "Eduardo Barrera" + slug: "eduardo-barrera" + category: "intern" + photo: "/images/members/placeholder.svg" + bio: > + Summer intern at SBPL. + +- name: "Krishna Sapkota" + slug: "krishna-sapkota" + category: "intern" + photo: "/images/members/placeholder.svg" + bio: > + Summer intern at SBPL. + +- name: "Burak Yucesoy" + slug: "burak-yucesoy" + category: "intern" + photo: "/images/members/placeholder.svg" + bio: > + Summer intern at SBPL. + +- name: "Haojie \"Tony\" Zhang" + slug: "haojie-tony-zhang" + category: "intern" + photo: "/images/members/placeholder.svg" + bio: > + Former member at SBPL. diff --git a/hugo.toml b/hugo.toml index 11d98be..814d130 100644 --- a/hugo.toml +++ b/hugo.toml @@ -10,7 +10,7 @@ title = 'SBPL — Search-Based Planning Lab' labName = "SBPL" labFullName = "Search-Based Planning Lab" labLogo = "/images/lab-logo.png" - labBlurb = "The Search-Based Planning Lab develops algorithms and systems that enable robots and autonomous agents to plan and act intelligently in complex, real-world environments. Our research spans motion planning, task planning, planning under uncertainty, and machine learning, with a focus on principled approaches that provide theoretical guarantees while remaining practical for real-world deployment." + labBlurb = "The Search-Based Planning Laboratory researches methodologies and algorithms that enable autonomous systems to act fast, intelligently, and robustly. Our research concentrates on developing novel planning approaches, novel heuristic searches, and investigating how planning can be combined with machine learning. Our work spans graph theory, algorithms, data structures, machine learning, and robotics. We use our algorithms to build real-time planners for complex robotic systems operating in the real world and performing challenging tasks ranging from autonomous navigation and autonomous flight to multi-agent systems and full-body mobile manipulation." university = "Carnegie Mellon University" department = "Robotics Institute" @@ -27,6 +27,26 @@ title = 'SBPL — Search-Based Planning Lab' name = "Publications" url = "/publications/" weight = 3 + [[menu.main]] + name = "Robots" + url = "/robots/" + weight = 4 + [[menu.main]] + name = "Software" + url = "/software/" + weight = 5 + [[menu.main]] + name = "Videos" + url = "/videos/" + weight = 6 + [[menu.main]] + name = "Tutorials" + url = "/tutorials/" + weight = 7 + [[menu.main]] + name = "Contact" + url = "/contact/" + weight = 8 [markup] [markup.goldmark] diff --git a/layouts/_default/single.html b/layouts/_default/single.html new file mode 100644 index 0000000..d3e7db5 --- /dev/null +++ b/layouts/_default/single.html @@ -0,0 +1,9 @@ +{{ define "main" }} +
+

{{ .Title }}

+ {{ with .Params.lead }}

{{ . }}

{{ end }} +
+ {{ .Content }} +
+
+{{ end }} diff --git a/static/css/custom.css b/static/css/custom.css index 2e9eb44..e027574 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -611,6 +611,80 @@ article { color: #555; } +/* ---------- Legacy / Generic Single Pages ---------- */ +.legacy-page { + max-width: 900px; + margin: 0 auto; + background: transparent !important; + border: none; + padding: 0; +} + +.legacy-page > h1 { + color: var(--sbpl-dark); + margin-bottom: 0.25rem; +} + +.legacy-page .page-lead { + color: var(--sbpl-gray); + font-size: 1.1rem; + margin-bottom: 1.5rem; +} + +.legacy-page-content { + line-height: 1.7; + color: #444; +} + +.legacy-page-content h2 { + color: var(--sbpl-dark); + margin-top: 2rem; + padding-bottom: 0.25rem; + border-bottom: 1px solid var(--sbpl-border); +} + +.legacy-page-content h3 { + color: var(--sbpl-dark); + margin-top: 1.5rem; +} + +.legacy-page-content img { + max-width: 100%; + height: auto; + border-radius: 6px; + margin: 0.5rem 0; +} + +.legacy-page-content a { + color: var(--sbpl-accent); +} + +.legacy-page-content a:hover { + color: var(--sbpl-accent-hover); +} + +/* Inline-flex image row (used on Robots page) */ +.legacy-page-content p img { + margin-right: 0.5rem; + vertical-align: middle; +} + +/* Video grid (used on Videos page) */ +.video-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); + gap: 1rem; + margin: 1rem 0 1.5rem; +} + +.video-grid iframe { + width: 100%; + aspect-ratio: 16 / 9; + height: auto; + border-radius: 6px; + border: 1px solid var(--sbpl-border); +} + /* ---------- Footer ---------- */ .site-footer { background: var(--sbpl-light); diff --git a/static/images/members/legacy/bradford-neuman.jpg b/static/images/members/legacy/bradford-neuman.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b864b259d0633fe3895f71b1f5324d5f66b2aacc GIT binary patch literal 9710 zcmbW6Wl$VI)8`j=2pZfI2<~Cg5P}B??hAWqPLiS5wu~Q}g`ic@^+NSzbvVfPw-5p!{oq=O=);tfridwz{Sm zBgl%|-qjk!=*`c=$H?yGVdo5DR8m%8RQ@EV!00U^@P>=g&FizHou?n8BqNXy_jv&z z3qV6f{g3?<`ai?K#=t;F$H2wH!oItC5~1`Zhk9s$|^v!1&F#Mpo}KpGkfGXRws1&tWxxfj6j z4-y0AzXbT7LP7l(BPJF$4ldq5hlUpbR1`EcRCKieME%bj{BItBPK-gq#4m$Ms__|% z*^NvfG^qfa<$cW$a?SBmRzVB*FF3dqFDa?0U%h5yf5RapEb>+qC?@+sPF_J#Nm)x< zM^{hZz|hjl+6H86XYb+Zok(pIkR17VFm6ny)*3~yO zHZ`}j{_N@P>qia@4oyr>P0!5!nVVl*-`L#R-r3#TKRds;yt@8-b9?t6E))RTe`Ea{ z{~PT8;3EFVg^G@jhK}_gE)-Ose;th&9fOG$4jvvp^^|+54n|njbhUf|{q~ z7VhJ?6s$sPug?C1_FrWGcVJ)szsUX<*#G952jHWj{5w1}Vt_Q@Zhm{_31owd%8wlK z41-XY)3|5M@NZ7LHf^VM3kvWm)fT&BR7mli>cqqxgJF&N&WDPBaHGTLHIOxWoz3DIKsfaCbgQm!tMHq=fYQMv)Uo%# zmG#^jRTe_IleL}Q2{REruV6}&zutu|HsgiB%BO*vAF`ByG^co^Gl z>flKqI8wCINo|SSDPzNJ;Xwgvd89Q?Bc{qAy|`DqXn*#u zvc<>gJH0EB{~lqCRWtZtn*)aLAAvlFPp;j6fVdROk*?-!%*3ih&98O3sst8*2^=`m zZ$2_9FMPA3cCGQv6XxFpPq<4pBRc6n_W(4S=M@YG!3*p2nE>|y>J}jvj=o4nPODN$ za7C8tum=K1R#t)i6BAmZ^3PeOCONxCB7S)kEI6^f;;%hSo0Kx^T}h7O#&cH3i8jUH z*oIexdhUx;kV^fUHkVqGp~?-kt;>opa-Y6tIJ3lEN==V3i?!98_hxR@jdE(Kb~bdx z+N|ma1T~PqIq)>$$kHF2_Te5T`5r{31D9iNZvLD@d?M!|?j=8e3HnXI7hmicaa;Xv zpCdn-=GW=t%+yMV=!1hCoLSdKBb_^ES~5sCR-x^cVmCUdOL)Qa8VEGJiAy9js7j{~ zx;^Mq1(ysu=6T}$PSy!XQ6ER}jSHYO(MjV@v^6VPpa;TpLK7T>HQmyaOh-u~vjka* zM70;{A-8p-f+|j*s|CIRSO76O#z-9V)$%4;HDa}7)N+Z&es?#GH-nsxcDQcNCtCEI za7cT(+6>?U*<7i@tu4pNgj+-tf)Kopcq|MgIMq@yyHOJMUGK`y5V{XuF;+dP@x$9k zhF(>LdOZVf*#E|DbagsNzE#K@eJ@wz;K#xrzi9PRydQ87HrUT;s~wim@e!nEZ+blN z_#t7>=C^qc6kC{_QS5qjR8`_GCqz`&}`NO47}E6inEFHWFx5rm}WH z%lF1_htMyXq%a`+I%lk52a~Q3NJrQYz zNUSGqe49AffwU*fQ%ot#T892f%|Cw#cJ^wsb~pWF1_z%s{)G;^p?BGBE|=INe)gNV`#jL#`W>Lu}NcPXdOZP`*+&~>tMsby3U!7o%s=VDKb*!dSOT%KeAMN6bQ=`*u?{=#^=+R4R7Wi1!fA=hXK@-i3$(XB zA%s@pcYoRa=xW6RA_^Ghw!pQ1-1%8*QqG)bVLjAOMQiaE!@3iQ;_4|!8w2<;v#9MN zZ3M$k&U%-^6I#%ONPazGRNBikJl>av@?EwOEK$zDA4yn_S1gUba69!h<68a-JY*JI z<2yq(Z+WboWcZXWBI~E`FfzCMo5w>%d|QNx)X_$h600ss%jenUde1RRJcDpvYv%qX zBi})(=_U3?L;|G}TiKM|e68@~Nc$kGD%DWhZV#P9L9K1x3!M(b7X1dZBcPU502(bp zuRCW^O*BR=L9r9%tzwlxy(XwkUajAz?hO~NNKc*|Sr&9`&Kb9%t~MAC6c`%7w-$5Q! zh~rT1E>nixbG&BTN;dB+ag}^a*L6zde_L{ibVhfW_9q==n?X1jhW|}(dh5}W<+o*L z4Y?cG+={+SF-Vemb#Ytkn=B$sdmrAYLj+;KVaa|c;nXF#aC=5E%>6B|{Ui0b6qS)6tzrMyHYc*N7lCZG zScG#n<&4&@x}q%sV}LC&brQX@NP%dtTLj`9ovEk6Al9QCOj02%7a;jh8PhAQqU63I@cZCGYd4+g?^En#FxyF| zI^PpxAvcp@7RssegtwrWeW5s67^4mPH+iswSeZEWWNMO+W{Y5X`o{JHJ0e(PYFeaU z%{z-T`X^FP@~@C{nv!L6d@Q`(A!F%ZGHnqjyZ=y-{0V`=(YtvXkhPT9>)__(_}NTg z!+C-s(K4o}2uWrLpU4hgYPZT=@lrR|^Uv06*&f1~M_L!z2hWQPlR1rgr%b|vp?(TS z4dor_-E=05x*X>+=-Dqrpto$lT`~M6;m?3;NB*Itaz!J2>8cJtmm`;;`IYWqQU%)a zK2AA?fsK^=zSV$y!wUzww$4asq(`jIN}IP+PQ|>ph{YiT89E$%vB~c zW%X)3?|xe}DE4=&n>y5t!wo>UG8}(IFZ=wU>Ahow(0Q511_xFopj?p>EWkMx$cy-6 z{5=^+Rw`OGRz6vpyO}s&?ZrO46rLi!1e{ssqCD;C5V&?dPhr%hES-2-mX9t%7eru{Mgbb6%P1C249R1e7L~L%*)Yh{HeIi#biCzR{&KF=34(9|Tr?7jD)z zYFQx2+7(pc~t@8h*FA{NiT- zzOZ)Vjq2*Pu|(J08Gc@u&ocmSVv}7y=;N_NgHcj3X-lj~ z$3J=2&sk9)u}(z-tVuhLq`IssFJfIq1d`h}i1^28md|5qwM6&NH*Ma|5c_>31+J`| zBh#EviME$xpnB?)`7Wv6U7;C{XO!)7^g5Jia4WaxrcDp8*mT9{d#s+5R z%;@jC6#5GRKAmsG25c!Ki+n2d0-U2yz-ZkbwR=_zpuTcaUd}gB z`tS?W*S3p%b#DH9w?zldHvDB-8d`=9&w%1K270B_G^GAbxsZyT`X9I@sS=kXp2u&} zKeI63&bfrtd8u-^K;fo3)xr+rZctJ4L%=j|`iD|krz2~+3FcL+Fx=FN73oC*;l{sq zpz1MJV$_zsxzP4J^5`|C?0m7?`6j`)iJ%n35&sMTn+J1TFPwZW5elfWsZ&QsNLls! z(2HF!Bo4JdK2dkH`)JUherQHj&>W!`=Y_cpwe4B#sfv!Q%xVo)rCYpFRm<@M)2N?H z3a**;9hq)uiim~tq`MJiyI$`=eWciKsvg4tEqS^+13PpM13@IdKKhA$HAZt>#I=k> z+!HT}t1RoiSV3qKLF6^}AMNhaa$l!gUC8*k@H@83Y)OFFr~u#OMX%P|GbdmY@4qx; zUR}Cnl#Al%K$cpc0ftYQ>QT}TO6IM;++6ghgo*75K@g;AV9=Q^%xinWZX0`WP==Jx zr3~S|@u91!R)4*XKQ)DUh7a|K<%D8iU9AC%FSY=V83MKs6z_Oj*Td^%u|d06(4Qp+wASELhaOVZbgeU;UlcVG zB`PIy`u$26HKr?2qmcl#KJ?*hc!3S%WfaQZGXPbxOKe+;=qAWlBEXVl0AD3Y*M=bg z+udU?kFx@cU2A(&cR_aK*Bk9V_cue=+fH|!&w!qM(2Z%oG@-9QQavoZF_dMHHixhT z0bO*u-(Uhsw*wMFbZ8vDHZQTN-+y;i3098OPSdwgz%Pe=A+o>oowH3G+gzBMPV7Hx z?-zbwAb*&*-j;}Me@X}BVY!7|j8zG*HTlObo1ksovWIPZNie+Q{Ou{Jbx6i9grNePGt5#6U!Nbz%OfmUv{gZaVX5OV&r_2hQX@v5|m42mA9OI}23P;=6>VenugtfevN&gw<4jyTIx&9P7c0sg$i_X=Yhw%Fkxdzw z*~oWxsGPXWKTLeROb#-(baTw_Z(x~t*h(3R8>Y?FRRVA*6kx&qd}Hk4Z?rn&>1WKM zeLt#7s3KM;oAxfG-ZeHiHlIO`E;TC?x%j!-{B9%M#wN*k#l-ODUb5ke*}xy%PNA>} zVH5i8pEJv&IBRJlD!!1HuI6)$KDS-UTb@pV^UM^I>h?GI&UC+nhW^&v^XMc-2o&{} zo|j3s(HD5F4m22%eKXDWOEo7)vLLXJCFA{0;)EzYGa8p1qH#Rx74TUCz+zKDY&X!y zX!B#3AYZR7Y}@k46l~|^RoZops9@~BWoG!Nd7}b`9bK#c%F0*? zlw+Ziwm9%YESC~ZqA`dWZgfMVHd&Btdzrb`qGsu5`A4b~wuhXl@Wt!PiVQD~__>x@ z38jjWmq1(8D{%pM_hrSgqG7)+hqn^?gSNT*^(kC0I zCw)pP`*uE}sf+_+CK;z7IfivhJ$DA)baHWx>ZT>m`HQGndj-jhU30?+yoq}_e+C4G z2qSA^d!j;siC zWkK4a(R8)*yY4Z6%U$dLoVg^(-(D@NFqN)ou$Y%heBVjYs%uq^=d|<-{#JU$#`r|O=`YadFHsk^H)0XA5KQtkS!!p>P?K|5tL5cd zy7WrgM`}$zcvUBVwd%!jW22wQZ9l6!SO&1&=_A(TUaDhM51z$euiTP1dTn+Szk2^D zfL3PkepU}36-g?BTBWorhvQrWU@!7snN#Ri+y@2K|@o#00+Ogn3-#0 z4s*qY48a6gb-ySg#v{cWGI8|`2mu+P=`Ic>>+Ub5@7&ThjKx-Z6(@|Tcf}lQ`g|DY z6IU;zht%*if!#_LBIC!G&@37xNKYr_ejlxWc1*GYxrY#r@7g^{%s6t##Z#AKn3NZV z07|#R%iSmROhJ<6)I_mNh*U|4rX@ZKomV!2 z1D0_*#$D_qSQO4f_97Vik^nBjsYZV;MWHR{6AIFAo=C** zrx_^rDH{EimzGA;&R9?<6mK+cXVZNzuHz;=^$lm``eEM1p)7BRd9Pe1I>Bde6R+~A zjR#*t{kVUIC@MHI6UoVRSG`Xoger{idXaKO+cro=ohck?tf^8=9^TouP9r7(?RHze z(yOYo=Lk}xN0?W0Eqh=4XOG&t7f}DLJE`^=;0wUy z91v#d+-CHDX}0sPt_XE2>5nWmw&)a;&Moi04`L{WQs-WZcSSt$##~Z{hhU;@Nd`Z9 zEgU@2JKW-@Z3dk>uXj33NzJacodsC!pdVXfQAtm92>vjmJz5VXIeu3OJ09>4(Ce{q zO%CoTDwkFquA{blG$V&)HU*qsXlWY0LrR8)-f6&Yl=qyIMX;RRwF#xEm!AP&XQ4}$ zL^R$s@@~dHaZ&>Md*6P|I8)d~EWQ~;HbFi5DWmVxB!{M}h1SN#JlhA`eb#sDHLmqp zarZOWN-%s^qJ;gf7F5zfE_H`a9kFM#dj@}B&gQXA(+5OYRJzMZDnQMqQ)OTu1w%^J zH#rxf@}iz;=Te-+(Rso{>WXCx&-Ax=lw)OOR+@1xgU z+C3FN7!rrQJv-5F(hyfRwM{XKn0(m#vX(-6nYLZzLUYW$$r*}tG)Z?h zG3Q&6mAP3q<@H2_?Gl84E>Av%pC2vW#bgG9^A9wZ*J(g^dJFY_6#=v*>5Na)?X(-h zW$wLqkDR2+PEEBn8*UO$!p*z-q^4ey7NbaqoaGX4wfNocr-s9M>v?1~Az8?~D*Bm1 zCaRil%nr_;C+q7lOSjSOXf?2J)z`6tlfJscbDV`d&VjkIK4Ce?7yU`&KBTt^dr2X<%_d&zyodO#?sO~+E3C9ET56lWQe zyt-pg_%IXR0LJENkgnxe^J(*_$N$D&?i%#8?U%78xK#qiGMg3BRq}A~pkmD&e=m}v z?KSwz^#vBI&d9x4k1xFVh>n19ljVr5t{7jDhC z265C~suKAgliilk(DL$EFr6j(ipm>Ju)t<3;$?H6jtHC?gzhao?dz~EmA=8wTs!sU z&%PDG zw{fIY^yLbIi2V`gL485=*)&Rm3)*BJnyB^!Avn%-fzA)I_PF%}q#8z!P71}IN+#MQ zD*8z1NL7+Go&gL5=lzmn{ufx)_wx7yHn;8lON)22ChKs6h9ym%cq;QeGLAY?^zwy)3p-iEbm-2rN#1TGvCz1OnGXd)?3O$p(V4_J_|Y} z?v1n~J#~F6B306K3GezGj(^%*3IF(6&dyFXTj;th+}K{cEyj%SYjlbO+H%Fx@a7Lz zSgEPx{v_g}yYk4O>6R}6vGK3AWo}9tuO&vev~INu|HPly`?oNcqm0Sum9{y)#`{TG zD#LAP@so2tS-3gmAyL*~v<-&-)ZjfnRk`2s)`h>awB7b>E}A^COtAqtyBTWvBGtbrkl=&` zdn!B$OI{@de#L$P?&&xS-S8eIE%O=pvXLVP#Z=OA_FbVCCSegFjC% z18o|UiYC1{r?Xa$kseI98`tK3$S(UcpVP;>_-su7GI&0Q?Hyf2?WFzLaU(x5sX!f< zrj>cMCJyDmMu~^1+UKunJh5MWJ&YO;eqXsCIvHblX@@1?a4`Offyg~)8LcNlkA zX8v6(voU{UuJx4&q_m0W#PiEWITL?NaX$krmse~@SVs!#e{tDlKU%r%Z0TM<>5Tan z^#;3iWnKF)a~(#5$vmF{)HjD!EIIsxv!$jk7KDXXM z)}KTYGRWgg55^bjUUi)m?}h#bt7BaBtSC)P z4bXwVs&NSYGwmePX?pp{wFVr;66T)&Zn!(WQlliC=qBnU>*28l1Ngj#Ic%qCeh&<5 zDSyGKhEL_&z9wdS+9x29fS9J}Lz2ktqh zs^3uv+r68IxtX23wQtSD{v}VVtl2#7wsB6KKphwGY2O9{+Z5qcga`Uv`CB zt5i1hq@eKm^dd9?;^Ivjru|tWL48eEqT2}W$yOl3`cA>{%cHN>A~nP;-`;v~G5pgL z4OtUye5=G{mMJ#6J9eMU%b{i=bHs$Cz1DB82v*lfAV!Y&;ObPTvPiJI($&9jNyFeA zH8pi|!+>P{P~|};XT=3sbGIW|9tC0i4^3%h&=s^5WhA77&z?*gNVQ!Y=yY9b zX-(Lyo0pJ= zcJ!O2D>CEY0f}cot8HNmbgJHCUhg5uFnE^bk+UTD%Iqtdo(Roa@azYm^9O$oIr1gC L1Ow;b=ehp@r0(UA literal 0 HcmV?d00001 diff --git a/static/images/members/legacy/brian-macallister.jpg b/static/images/members/legacy/brian-macallister.jpg new file mode 100755 index 0000000000000000000000000000000000000000..e5cace3ef6a162d7527a5cd572d829293f484681 GIT binary patch literal 393315 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�P*jq@lo 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
%P%Q{_n|ZM+9KX;cWG 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

    tbLUtu< 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

    private files

    +

    Private Files       Upload:

    +

    username: REDACTED   password: REDACTED

    + + diff --git a/static/archive/legacy-drupal/content/blocks/001-private-files.json b/static/archive/legacy-drupal/content/blocks/001-private-files.json new file mode 100644 index 0000000..d3c1849 --- /dev/null +++ b/static/archive/legacy-drupal/content/blocks/001-private-files.json @@ -0,0 +1,10 @@ +{ + "bid": 1, + "info": "private files", + "format": "full_html", + "slug": "private-files", + "body_html_rewritten": "

    Private Files       Upload:

    \r\n

    username: REDACTED   password: REDACTED

    \r\n", + "body_html_raw": "

    Private Files       Upload:

    \r\n

    username: REDACTED   password: REDACTED

    \r\n", + "body_markdown": "[Private Files](/private/SBPL/) Upload:\n\nusername: REDACTED password: REDACTED\n", + "_redaction_note": "Original Drupal block body contained plaintext credentials for a /private/SBPL/ upload form on the (now offline) sbpl.net site. Credentials were redacted before publishing this archive snapshot." +} diff --git a/static/archive/legacy-drupal/content/blocks/001-private-files.md b/static/archive/legacy-drupal/content/blocks/001-private-files.md new file mode 100644 index 0000000..4540633 --- /dev/null +++ b/static/archive/legacy-drupal/content/blocks/001-private-files.md @@ -0,0 +1,6 @@ +# private files + +[Private Files](/private/SBPL/) Upload: + +username: REDACTED password: REDACTED + diff --git a/static/archive/legacy-drupal/content/blocks/002-publicfiles.html b/static/archive/legacy-drupal/content/blocks/002-publicfiles.html new file mode 100644 index 0000000..431f917 --- /dev/null +++ b/static/archive/legacy-drupal/content/blocks/002-publicfiles.html @@ -0,0 +1,7 @@ + +publicfiles + +

    publicfiles

    +

    Member of the lab? Want to see private files? Log in!

    + + diff --git a/static/archive/legacy-drupal/content/blocks/002-publicfiles.json b/static/archive/legacy-drupal/content/blocks/002-publicfiles.json new file mode 100644 index 0000000..7d1d8b1 --- /dev/null +++ b/static/archive/legacy-drupal/content/blocks/002-publicfiles.json @@ -0,0 +1,9 @@ +{ + "bid": 2, + "info": "publicfiles", + "format": "full_html", + "slug": "publicfiles", + "body_html_rewritten": "

    Member of the lab? Want to see private files? Log in!

    \r\n", + "body_html_raw": "

    Member of the lab? Want to see private files? Log in!

    \r\n", + "body_markdown": "Member of the lab? Want to see private files? Log in!\n" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/blocks/002-publicfiles.md b/static/archive/legacy-drupal/content/blocks/002-publicfiles.md new file mode 100644 index 0000000..9d1ca7f --- /dev/null +++ b/static/archive/legacy-drupal/content/blocks/002-publicfiles.md @@ -0,0 +1,3 @@ +# publicfiles + +Member of the lab? Want to see private files? Log in! diff --git a/static/archive/legacy-drupal/content/blocks_index.json b/static/archive/legacy-drupal/content/blocks_index.json new file mode 100644 index 0000000..93848c3 --- /dev/null +++ b/static/archive/legacy-drupal/content/blocks_index.json @@ -0,0 +1,20 @@ +[ + { + "bid": 1, + "info": "private files", + "slug": "private-files", + "format": "full_html", + "file_html": "content/blocks/001-private-files.html", + "file_md": "content/blocks/001-private-files.md", + "file_json": "content/blocks/001-private-files.json" + }, + { + "bid": 2, + "info": "publicfiles", + "slug": "publicfiles", + "format": "full_html", + "file_html": "content/blocks/002-publicfiles.html", + "file_md": "content/blocks/002-publicfiles.md", + "file_json": "content/blocks/002-publicfiles.json" + } +] \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/menus.json b/static/archive/legacy-drupal/content/menus.json new file mode 100644 index 0000000..28b64c6 --- /dev/null +++ b/static/archive/legacy-drupal/content/menus.json @@ -0,0 +1,910 @@ +{ + "user-menu": [ + { + "menu_name": "user-menu", + "mlid": 2, + "plid": 0, + "link_path": "user", + "router_path": "user", + "link_title": "User account", + "options": { + "alter": true + }, + "module": "system", + "hidden": 0, + "external": 0, + "weight": -10, + "depth": 1, + "node_target": null, + "children": [ + { + "menu_name": "user-menu", + "mlid": 10, + "plid": 2, + "link_path": "user/register", + "router_path": "user/register", + "link_title": "Create new account", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": 0, + "depth": 2, + "node_target": null, + "children": [] + }, + { + "menu_name": "user-menu", + "mlid": 14, + "plid": 2, + "link_path": "user/login", + "router_path": "user/login", + "link_title": "Log in", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": 0, + "depth": 2, + "node_target": null, + "children": [] + }, + { + "menu_name": "user-menu", + "mlid": 20, + "plid": 2, + "link_path": "user/password", + "router_path": "user/password", + "link_title": "Request new password", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": 0, + "depth": 2, + "node_target": null, + "children": [] + } + ] + }, + { + "menu_name": "user-menu", + "mlid": 15, + "plid": 0, + "link_path": "user/logout", + "router_path": "user/logout", + "link_title": "Log out", + "options": [], + "module": "system", + "hidden": 0, + "external": 0, + "weight": 10, + "depth": 1, + "node_target": null, + "children": [] + } + ], + "navigation": [ + { + "menu_name": "navigation", + "mlid": 3, + "plid": 0, + "link_path": "comment/%", + "router_path": "comment/%", + "link_title": "Comment permalink", + "options": [], + "module": "system", + "hidden": 0, + "external": 0, + "weight": 0, + "depth": 1, + "node_target": null, + "children": [ + { + "menu_name": "navigation", + "mlid": 28, + "plid": 3, + "link_path": "comment/%/view", + "router_path": "comment/%/view", + "link_title": "View comment", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": -10, + "depth": 2, + "node_target": null, + "children": [] + }, + { + "menu_name": "navigation", + "mlid": 26, + "plid": 3, + "link_path": "comment/%/edit", + "router_path": "comment/%/edit", + "link_title": "Edit", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": 0, + "depth": 2, + "node_target": null, + "children": [] + }, + { + "menu_name": "navigation", + "mlid": 24, + "plid": 3, + "link_path": "comment/%/approve", + "router_path": "comment/%/approve", + "link_title": "Approve", + "options": [], + "module": "system", + "hidden": 0, + "external": 0, + "weight": 1, + "depth": 2, + "node_target": null, + "children": [] + }, + { + "menu_name": "navigation", + "mlid": 25, + "plid": 3, + "link_path": "comment/%/delete", + "router_path": "comment/%/delete", + "link_title": "Delete", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": 2, + "depth": 2, + "node_target": null, + "children": [] + } + ] + }, + { + "menu_name": "navigation", + "mlid": 4, + "plid": 0, + "link_path": "filter/tips", + "router_path": "filter/tips", + "link_title": "Compose tips", + "options": [], + "module": "system", + "hidden": 1, + "external": 0, + "weight": 0, + "depth": 1, + "node_target": null, + "children": [] + }, + { + "menu_name": "navigation", + "mlid": 5, + "plid": 0, + "link_path": "node/%", + "router_path": "node/%", + "link_title": "", + "options": [], + "module": "system", + "hidden": 0, + "external": 0, + "weight": 0, + "depth": 1, + "node_target": null, + "children": [ + { + "menu_name": "navigation", + "mlid": 62, + "plid": 5, + "link_path": "node/%/view", + "router_path": "node/%/view", + "link_title": "View", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": -10, + "depth": 2, + "node_target": null, + "children": [] + }, + { + "menu_name": "navigation", + "mlid": 41, + "plid": 5, + "link_path": "node/%/edit", + "router_path": "node/%/edit", + "link_title": "Edit", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": 0, + "depth": 2, + "node_target": null, + "children": [] + }, + { + "menu_name": "navigation", + "mlid": 38, + "plid": 5, + "link_path": "node/%/delete", + "router_path": "node/%/delete", + "link_title": "Delete", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": 1, + "depth": 2, + "node_target": null, + "children": [] + }, + { + "menu_name": "navigation", + "mlid": 52, + "plid": 5, + "link_path": "node/%/revisions", + "router_path": "node/%/revisions", + "link_title": "Revisions", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": 2, + "depth": 2, + "node_target": null, + "children": [ + { + "menu_name": "navigation", + "mlid": 146, + "plid": 52, + "link_path": "node/%/revisions/%/delete", + "router_path": "node/%/revisions/%/delete", + "link_title": "Delete earlier revision", + "options": [], + "module": "system", + "hidden": 0, + "external": 0, + "weight": 0, + "depth": 3, + "node_target": null, + "children": [] + }, + { + "menu_name": "navigation", + "mlid": 147, + "plid": 52, + "link_path": "node/%/revisions/%/revert", + "router_path": "node/%/revisions/%/revert", + "link_title": "Revert to earlier revision", + "options": [], + "module": "system", + "hidden": 0, + "external": 0, + "weight": 0, + "depth": 3, + "node_target": null, + "children": [] + }, + { + "menu_name": "navigation", + "mlid": 148, + "plid": 52, + "link_path": "node/%/revisions/%/view", + "router_path": "node/%/revisions/%/view", + "link_title": "Revisions", + "options": [], + "module": "system", + "hidden": 0, + "external": 0, + "weight": 0, + "depth": 3, + "node_target": null, + "children": [] + } + ] + } + ] + }, + { + "menu_name": "navigation", + "mlid": 6, + "plid": 0, + "link_path": "node/add", + "router_path": "node/add", + "link_title": "Add content", + "options": [], + "module": "system", + "hidden": 0, + "external": 0, + "weight": 0, + "depth": 1, + "node_target": null, + "children": [ + { + "menu_name": "navigation", + "mlid": 219, + "plid": 6, + "link_path": "node/add/article", + "router_path": "node/add/article", + "link_title": "Article", + "options": { + "attributes": { + "title": "Use articles for time-sensitive content like news, press releases or blog posts." + } + }, + "module": "system", + "hidden": 0, + "external": 0, + "weight": 0, + "depth": 2, + "node_target": null, + "children": [] + }, + { + "menu_name": "navigation", + "mlid": 220, + "plid": 6, + "link_path": "node/add/page", + "router_path": "node/add/page", + "link_title": "Basic page", + "options": { + "attributes": { + "title": "Use basic pages for your static content, such as an 'About us' page." + } + }, + "module": "system", + "hidden": 0, + "external": 0, + "weight": 0, + "depth": 2, + "node_target": null, + "children": [] + } + ] + }, + { + "menu_name": "navigation", + "mlid": 17, + "plid": 0, + "link_path": "user/%", + "router_path": "user/%", + "link_title": "My account", + "options": [], + "module": "system", + "hidden": 0, + "external": 0, + "weight": 0, + "depth": 1, + "node_target": null, + "children": [ + { + "menu_name": "navigation", + "mlid": 63, + "plid": 17, + "link_path": "user/%/view", + "router_path": "user/%/view", + "link_title": "View", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": -10, + "depth": 2, + "node_target": null, + "children": [] + }, + { + "menu_name": "navigation", + "mlid": 31, + "plid": 17, + "link_path": "user/%/cancel", + "router_path": "user/%/cancel", + "link_title": "Cancel account", + "options": [], + "module": "system", + "hidden": 0, + "external": 0, + "weight": 0, + "depth": 2, + "node_target": null, + "children": [ + { + "menu_name": "navigation", + "mlid": 156, + "plid": 31, + "link_path": "user/%/cancel/confirm/%/%", + "router_path": "user/%/cancel/confirm/%/%", + "link_title": "Confirm account cancellation", + "options": [], + "module": "system", + "hidden": 0, + "external": 0, + "weight": 0, + "depth": 3, + "node_target": null, + "children": [] + } + ] + }, + { + "menu_name": "navigation", + "mlid": 40, + "plid": 17, + "link_path": "user/%/edit", + "router_path": "user/%/edit", + "link_title": "Edit", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": 0, + "depth": 2, + "node_target": null, + "children": [ + { + "menu_name": "navigation", + "mlid": 126, + "plid": 40, + "link_path": "user/%/edit/account", + "router_path": "user/%/edit/account", + "link_title": "Account", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": 0, + "depth": 3, + "node_target": null, + "children": [] + } + ] + }, + { + "menu_name": "navigation", + "mlid": 191, + "plid": 17, + "link_path": "user/%/shortcuts", + "router_path": "user/%/shortcuts", + "link_title": "Shortcuts", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": 0, + "depth": 2, + "node_target": null, + "children": [] + } + ] + }, + { + "menu_name": "navigation", + "mlid": 23, + "plid": 0, + "link_path": "comment/reply/%", + "router_path": "comment/reply/%", + "link_title": "Add new comment", + "options": [], + "module": "system", + "hidden": 0, + "external": 0, + "weight": 0, + "depth": 1, + "node_target": null, + "children": [] + }, + { + "menu_name": "navigation", + "mlid": 27, + "plid": 0, + "link_path": "taxonomy/term/%", + "router_path": "taxonomy/term/%", + "link_title": "Taxonomy term", + "options": [], + "module": "system", + "hidden": 0, + "external": 0, + "weight": 0, + "depth": 1, + "node_target": null, + "children": [ + { + "menu_name": "navigation", + "mlid": 88, + "plid": 27, + "link_path": "taxonomy/term/%/view", + "router_path": "taxonomy/term/%/view", + "link_title": "View", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": 0, + "depth": 2, + "node_target": null, + "children": [] + }, + { + "menu_name": "navigation", + "mlid": 87, + "plid": 27, + "link_path": "taxonomy/term/%/edit", + "router_path": "taxonomy/term/%/edit", + "link_title": "Edit", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": 10, + "depth": 2, + "node_target": null, + "children": [] + } + ] + }, + { + "menu_name": "navigation", + "mlid": 187, + "plid": 0, + "link_path": "search", + "router_path": "search", + "link_title": "Search", + "options": [], + "module": "system", + "hidden": 1, + "external": 0, + "weight": 0, + "depth": 1, + "node_target": null, + "children": [ + { + "menu_name": "navigation", + "mlid": 188, + "plid": 187, + "link_path": "search/node", + "router_path": "search/node", + "link_title": "Content", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": -10, + "depth": 2, + "node_target": null, + "children": [ + { + "menu_name": "navigation", + "mlid": 190, + "plid": 188, + "link_path": "search/node/%", + "router_path": "search/node/%", + "link_title": "Content", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": 0, + "depth": 3, + "node_target": null, + "children": [] + } + ] + }, + { + "menu_name": "navigation", + "mlid": 189, + "plid": 187, + "link_path": "search/user", + "router_path": "search/user", + "link_title": "Users", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": 0, + "depth": 2, + "node_target": null, + "children": [ + { + "menu_name": "navigation", + "mlid": 193, + "plid": 189, + "link_path": "search/user/%", + "router_path": "search/user/%", + "link_title": "Users", + "options": [], + "module": "system", + "hidden": -1, + "external": 0, + "weight": 0, + "depth": 3, + "node_target": null, + "children": [] + } + ] + } + ] + } + ], + "shortcut-set-1": [ + { + "menu_name": "shortcut-set-1", + "mlid": 216, + "plid": 0, + "link_path": "node/add", + "router_path": "node/add", + "link_title": "Add content", + "options": [], + "module": "menu", + "hidden": 0, + "external": 0, + "weight": -50, + "depth": 1, + "node_target": null, + "children": [] + }, + { + "menu_name": "shortcut-set-1", + "mlid": 217, + "plid": 0, + "link_path": "admin/content", + "router_path": "admin/content", + "link_title": "Find content", + "options": [], + "module": "menu", + "hidden": 0, + "external": 0, + "weight": -49, + "depth": 1, + "node_target": null, + "children": [] + }, + { + "menu_name": "shortcut-set-1", + "mlid": 412, + "plid": 0, + "link_path": "node/3", + "router_path": "node/%", + "link_title": "People", + "options": [], + "module": "menu", + "hidden": 0, + "external": 0, + "weight": -48, + "depth": 1, + "node_target": { + "nid": 3, + "title": "People" + }, + "children": [] + } + ], + "main-menu": [ + { + "menu_name": "main-menu", + "mlid": 396, + "plid": 0, + "link_path": "node/9", + "router_path": "node/%", + "link_title": "Home", + "options": [], + "module": "menu", + "hidden": 0, + "external": 0, + "weight": -50, + "depth": 1, + "node_target": { + "nid": 9, + "title": "Home" + }, + "children": [] + }, + { + "menu_name": "main-menu", + "mlid": 525, + "plid": 0, + "link_path": "node/45", + "router_path": "node/%", + "link_title": "Tutorials", + "options": { + "attributes": [] + }, + "module": "menu", + "hidden": 0, + "external": 0, + "weight": 0, + "depth": 1, + "node_target": { + "nid": 45, + "title": "Tutorials" + }, + "children": [] + }, + { + "menu_name": "main-menu", + "mlid": 395, + "plid": 0, + "link_path": "node/3", + "router_path": "node/%", + "link_title": "People", + "options": [], + "module": "menu", + "hidden": 0, + "external": 0, + "weight": 1, + "depth": 1, + "node_target": { + "nid": 3, + "title": "People" + }, + "children": [] + }, + { + "menu_name": "main-menu", + "mlid": 397, + "plid": 0, + "link_path": "node/10", + "router_path": "node/%", + "link_title": "Publications", + "options": [], + "module": "menu", + "hidden": 0, + "external": 0, + "weight": 2, + "depth": 1, + "node_target": { + "nid": 10, + "title": "Publications" + }, + "children": [] + }, + { + "menu_name": "main-menu", + "mlid": 398, + "plid": 0, + "link_path": "node/11", + "router_path": "node/%", + "link_title": "Videos", + "options": { + "attributes": [] + }, + "module": "menu", + "hidden": 0, + "external": 0, + "weight": 3, + "depth": 1, + "node_target": { + "nid": 11, + "title": "Videos" + }, + "children": [] + }, + { + "menu_name": "main-menu", + "mlid": 399, + "plid": 0, + "link_path": "node/12", + "router_path": "node/%", + "link_title": "Robots", + "options": [], + "module": "menu", + "hidden": 0, + "external": 0, + "weight": 4, + "depth": 1, + "node_target": { + "nid": 12, + "title": "Robots" + }, + "children": [] + }, + { + "menu_name": "main-menu", + "mlid": 417, + "plid": 0, + "link_path": "node/32", + "router_path": "node/%", + "link_title": "Software", + "options": [], + "module": "menu", + "hidden": 0, + "external": 0, + "weight": 5, + "depth": 1, + "node_target": { + "nid": 32, + "title": "Software" + }, + "children": [] + }, + { + "menu_name": "main-menu", + "mlid": 418, + "plid": 0, + "link_path": "node/33", + "router_path": "node/%", + "link_title": "Files", + "options": [], + "module": "menu", + "hidden": 0, + "external": 0, + "weight": 6, + "depth": 1, + "node_target": { + "nid": 33, + "title": " " + }, + "children": [] + }, + { + "menu_name": "main-menu", + "mlid": 415, + "plid": 0, + "link_path": "node/30", + "router_path": "node/%", + "link_title": "Contact", + "options": { + "attributes": [] + }, + "module": "menu", + "hidden": 0, + "external": 0, + "weight": 8, + "depth": 1, + "node_target": { + "nid": 30, + "title": "Contact" + }, + "children": [] + }, + { + "menu_name": "main-menu", + "mlid": 513, + "plid": 0, + "link_path": "node/44", + "router_path": "node/%", + "link_title": "Calender", + "options": [], + "module": "menu", + "hidden": 0, + "external": 0, + "weight": 8, + "depth": 1, + "node_target": { + "nid": 44, + "title": "Calendar" + }, + "children": [] + }, + { + "menu_name": "main-menu", + "mlid": 416, + "plid": 0, + "link_path": "node/31", + "router_path": "node/%", + "link_title": "Login", + "options": { + "attributes": { + "title": "" + } + }, + "module": "menu", + "hidden": 0, + "external": 0, + "weight": 50, + "depth": 1, + "node_target": { + "nid": 31, + "title": "Login" + }, + "children": [] + } + ] +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0003-people.html b/static/archive/legacy-drupal/content/pages/0003-people.html new file mode 100644 index 0000000..7f30043 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0003-people.html @@ -0,0 +1,61 @@ + +People + +

    People

    +

    + Advisor

    +

    Dr. Maxim Likhachev

    +

     

    +

    + Current Members

    +

    Margarite Safonova

    +

    Andrew Dornbush

    +

    Brian MacAllister

    +

    Jonathan Butzke

    +

    Ben Cohen

    +

    John Drake

    +

    Kalin Gochev

    +

    Aline Normoyle

    +

    Mike Phillips

    +

    Venkatraman Narayanan

    +

    Harsh Pandey

    +

    Victor Hwang

    +

    Arjun Menon

    +

    Aram Ebtekar

    +

    Kush Prasad

    +

    Soonkyum Kim

    +

    Sung-Kyun Kim

    +

    Siddharth Swaminathan

    +

    Ellis Ratner

    +

    Chen Gao

    +

    Hao Wang

    +

     

    +

    + Alumni

    +

    Subhrajit Bhattacharya

    +

    Alex Kushleyev

    +

    Steven Gray

    +

    Bradford Neuman

    +

    Sandip Aine

    +

    +  

    +

    + Former Members

    +

    Matthew Mac Allister

    +

    Kavan McEachern

    +

    Eduardo Barrera

    +

    Haojie "Tony" Zhang

    +

    Krishna Sapkota

    +

    Burak Yucesoy

    +

     

    +

    + Pictures of the group

    +

    Lab Cookout (Summer 2011)

    +

    +

     

    +

    The group goes to Kennywood (Summer 2012)

    +

    +

    +

    + + diff --git a/static/archive/legacy-drupal/content/pages/0003-people.json b/static/archive/legacy-drupal/content/pages/0003-people.json new file mode 100644 index 0000000..a4c5aa1 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0003-people.json @@ -0,0 +1,27 @@ +{ + "nid": 3, + "vid": 3, + "type": "page", + "language": "und", + "title": "People", + "slug": "people", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 1, + "comment": 1, + "created": 1340117914, + "changed": 1415994753, + "url_aliases": [ + "People" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    \r\n\tAdvisor

    \r\n

    Dr. Maxim Likhachev

    \r\n

     

    \r\n

    \r\n\tCurrent Members

    \r\n

    Margarite Safonova

    \r\n

    Andrew Dornbush

    \r\n

    Brian MacAllister

    \r\n

    Jonathan Butzke

    \r\n

    Ben Cohen

    \r\n

    John Drake

    \r\n

    Kalin Gochev

    \r\n

    Aline Normoyle

    \r\n

    Mike Phillips

    \r\n

    Venkatraman Narayanan

    \r\n

    Harsh Pandey

    \r\n

    Victor Hwang

    \r\n

    Arjun Menon

    \r\n

    Aram Ebtekar

    \r\n

    Kush Prasad

    \r\n

    Soonkyum Kim

    \r\n

    Sung-Kyun Kim

    \r\n

    Siddharth Swaminathan

    \r\n

    Ellis Ratner

    \r\n

    Chen Gao

    \r\n

    Hao Wang

    \r\n

     

    \r\n

    \r\n\tAlumni

    \r\n

    Subhrajit Bhattacharya

    \r\n

    Alex Kushleyev

    \r\n

    Steven Gray

    \r\n

    Bradford Neuman

    \r\n

    Sandip Aine

    \r\n

    \r\n\t 

    \r\n

    \r\n\tFormer Members

    \r\n

    Matthew Mac Allister

    \r\n

    Kavan McEachern

    \r\n

    Eduardo Barrera

    \r\n

    Haojie "Tony" Zhang

    \r\n

    Krishna Sapkota

    \r\n

    Burak Yucesoy

    \r\n

     

    \r\n

    \r\n\tPictures of the group

    \r\n

    Lab Cookout (Summer 2011)

    \r\n

    \"\"

    \r\n

     

    \r\n

    The group goes to Kennywood (Summer 2012)

    \r\n

    \"\"

    \r\n

    \"\"

    \r\n

    \"\"

    \r\n", + "body_markdown": "## Advisor\n\n[Dr. Maxim Likhachev](http://www.cs.cmu.edu/~maxim/)\n\n## Current Members\n\n[Margarite Safonova](0068-margarite-safonova.html)\n\n[Andrew Dornbush](0015-andrew-dornbush.html)\n\n[Brian MacAllister](0014-brian-macallister.html)\n\n[Jonathan Butzke](0017-jonathan-butzke.html)\n\n[Ben Cohen](http://bcohen.info)\n\n[John Drake](0019-john-drake.html)\n\n[Kalin Gochev](0021-kalin-gochev.html)\n\n[Aline Normoyle](0023-aline-normoyle.html)\n\n[Mike Phillips](https://sites.google.com/site/robotman0/)\n\n[Venkatraman Narayanan](http://www.cs.cmu.edu/~venkatrn/)\n\n[Harsh Pandey](0027-harsh-pandey.html)\n\n[Victor Hwang](0067-victor-hwang.html)\n\n[Arjun Menon](0065-arjun-menon.html)\n\n[Aram Ebtekar](0056-aram-ebtekar.html)\n\n[Kush Prasad](0057-kush-prasad.html)\n\n[Soonkyum Kim](0059-soonkyum-kim.html)\n\n[Sung-Kyun Kim](0058-sung-kyun-kim.html)\n\n[Siddharth Swaminathan](0060-siddharth-swaminathan.html)\n\n[Ellis Ratner](0062-ellis-ratner.html)\n\n[Chen Gao](0061-chen-gao.html)\n\n[Hao Wang](0066-hao-wang.html)\n\n## Alumni\n\n[Subhrajit Bhattacharya](0016-subhrajit-bhattacharya.html)\n\n[Alex Kushleyev](0026-alex-kushleyev.html)\n\n[Steven Gray](0020-steven-gray.html)\n\n[Bradford Neuman](0022-bradford-neuman.html)\n\n[Sandip Aine](https://sites.google.com/site/sandipaine/)\n\n##\n\n## Former Members\n\n[Matthew Mac Allister](0029-matthew-mac-allister.html)\n\n[Kavan McEachern](0028-kavan-mceachern.html)\n\n[Eduardo Barrera](0039-eduardo-barrera.html)\n\nHaojie \"Tony\" Zhang\n\n[Krishna Sapkota](0063-krishna-sapkota.html)\n\n[Burak Yucesoy](0064-burak-yucesoy.html)\n\n# Pictures of the group\n\n**Lab Cookout (Summer 2011)**\n\n![](../../media/images/DSC00420.JPG)\n\n**The group goes to Kennywood (Summer 2012)**\n\n![](../../media/images/andrew-mike-kenny.jpg)\n\n![](../../media/images/matt-ed-jon-kenny.jpg)\n\n![](../../media/images/brian-kenny-shooped.jpg)\n", + "body_html_raw": "

    \r\n\tAdvisor

    \r\n

    Dr. Maxim Likhachev

    \r\n

     

    \r\n

    \r\n\tCurrent Members

    \r\n

    Margarite Safonova

    \r\n

    Andrew Dornbush

    \r\n

    Brian MacAllister

    \r\n

    Jonathan Butzke

    \r\n

    Ben Cohen

    \r\n

    John Drake

    \r\n

    Kalin Gochev

    \r\n

    Aline Normoyle

    \r\n

    Mike Phillips

    \r\n

    Venkatraman Narayanan

    \r\n

    Harsh Pandey

    \r\n

    Victor Hwang

    \r\n

    Arjun Menon

    \r\n

    Aram Ebtekar

    \r\n

    Kush Prasad

    \r\n

    Soonkyum Kim

    \r\n

    Sung-Kyun Kim

    \r\n

    Siddharth Swaminathan

    \r\n

    Ellis Ratner

    \r\n

    Chen Gao

    \r\n

    Hao Wang

    \r\n

     

    \r\n

    \r\n\tAlumni

    \r\n

    Subhrajit Bhattacharya

    \r\n

    Alex Kushleyev

    \r\n

    Steven Gray

    \r\n

    Bradford Neuman

    \r\n

    Sandip Aine

    \r\n

    \r\n\t 

    \r\n

    \r\n\tFormer Members

    \r\n

    Matthew Mac Allister

    \r\n

    Kavan McEachern

    \r\n

    Eduardo Barrera

    \r\n

    Haojie "Tony" Zhang

    \r\n

    Krishna Sapkota

    \r\n

    Burak Yucesoy

    \r\n

     

    \r\n

    \r\n\tPictures of the group

    \r\n

    Lab Cookout (Summer 2011)

    \r\n

    \"\"

    \r\n

     

    \r\n

    The group goes to Kennywood (Summer 2012)

    \r\n

    \"\"

    \r\n

    \"\"

    \r\n

    \"\"

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0003-people.md b/static/archive/legacy-drupal/content/pages/0003-people.md new file mode 100644 index 0000000..2cc1796 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0003-people.md @@ -0,0 +1,91 @@ +# People + +## Advisor + +[Dr. Maxim Likhachev](http://www.cs.cmu.edu/~maxim/) + +## Current Members + +[Margarite Safonova](0068-margarite-safonova.html) + +[Andrew Dornbush](0015-andrew-dornbush.html) + +[Brian MacAllister](0014-brian-macallister.html) + +[Jonathan Butzke](0017-jonathan-butzke.html) + +[Ben Cohen](http://bcohen.info) + +[John Drake](0019-john-drake.html) + +[Kalin Gochev](0021-kalin-gochev.html) + +[Aline Normoyle](0023-aline-normoyle.html) + +[Mike Phillips](https://sites.google.com/site/robotman0/) + +[Venkatraman Narayanan](http://www.cs.cmu.edu/~venkatrn/) + +[Harsh Pandey](0027-harsh-pandey.html) + +[Victor Hwang](0067-victor-hwang.html) + +[Arjun Menon](0065-arjun-menon.html) + +[Aram Ebtekar](0056-aram-ebtekar.html) + +[Kush Prasad](0057-kush-prasad.html) + +[Soonkyum Kim](0059-soonkyum-kim.html) + +[Sung-Kyun Kim](0058-sung-kyun-kim.html) + +[Siddharth Swaminathan](0060-siddharth-swaminathan.html) + +[Ellis Ratner](0062-ellis-ratner.html) + +[Chen Gao](0061-chen-gao.html) + +[Hao Wang](0066-hao-wang.html) + +## Alumni + +[Subhrajit Bhattacharya](0016-subhrajit-bhattacharya.html) + +[Alex Kushleyev](0026-alex-kushleyev.html) + +[Steven Gray](0020-steven-gray.html) + +[Bradford Neuman](0022-bradford-neuman.html) + +[Sandip Aine](https://sites.google.com/site/sandipaine/) + +## + +## Former Members + +[Matthew Mac Allister](0029-matthew-mac-allister.html) + +[Kavan McEachern](0028-kavan-mceachern.html) + +[Eduardo Barrera](0039-eduardo-barrera.html) + +Haojie "Tony" Zhang + +[Krishna Sapkota](0063-krishna-sapkota.html) + +[Burak Yucesoy](0064-burak-yucesoy.html) + +# Pictures of the group + +**Lab Cookout (Summer 2011)** + +![](../../media/images/DSC00420.JPG) + +**The group goes to Kennywood (Summer 2012)** + +![](../../media/images/andrew-mike-kenny.jpg) + +![](../../media/images/matt-ed-jon-kenny.jpg) + +![](../../media/images/brian-kenny-shooped.jpg) diff --git a/static/archive/legacy-drupal/content/pages/0009-home.html b/static/archive/legacy-drupal/content/pages/0009-home.html new file mode 100644 index 0000000..651c08c --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0009-home.html @@ -0,0 +1,21 @@ + +Home + +

    Home

    +

    Search-based Planning Laboratory researches methodologies and algorithms that enable autonomous systems to act fast, intelligently and robustly. Our research concentrates mostly on developing novel planning approaches, coming up with novel heuristic searches and investigating how planning can be combined with machine learning. Our work spans graph theory, algorithms, data structures, machine learning and of course robotics. We use our algorithms to build real-time planners for complex robotic systems operating in real world and performing challenging tasks ranging from autonomous navigation and autonomous flight to multi-agent systems and to full-body mobile manipulation.
    +
    + In a bit more details, we study such problems as high-dimensional motion planning, task planning, planning under uncertainty and multi-agent planning.  Our goal is to develop planners that work in real-time and deal with complex real-world environments. We are also actively pursuing planning approaches that "learn from experience". In all of our work, we strive to develop methods that come with rigorous analytical guarantees on performance such as completeness and bounds on sub-optimality. Such guarantees help dramatically users to analyze and anticipate the behavior of autonomous systems which is crucial for safe autonomy alongside people. The lab is home to several robots including PR2 robot, segbot robot, hexarotor aerial vehicle, quadrotor aerial vehicles and few other smaller aerial vehicles.  In addition, we build planners for a number of large-scale robotic systems such as humanoid robots and full-scale helicopter.

    +

    New! Please join the sbpl-users mailing list by signing up here.

    +

     

    +

    Project Birdhouse! Autonomous Assembly

    + +

    +

     

    +

     

    + + +

    April 23, 2013: Autonomous Hexarotor Avoids a Person

    +

    +

     

    + + diff --git a/static/archive/legacy-drupal/content/pages/0009-home.json b/static/archive/legacy-drupal/content/pages/0009-home.json new file mode 100644 index 0000000..5ee3482 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0009-home.json @@ -0,0 +1,27 @@ +{ + "nid": 9, + "vid": 9, + "type": "page", + "language": "und", + "title": "Home", + "slug": "home", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 1, + "comment": 1, + "created": 1340166841, + "changed": 1434546172, + "url_aliases": [ + "Home" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    Search-based Planning Laboratory researches methodologies and algorithms that enable autonomous systems to act fast, intelligently and robustly. Our research concentrates mostly on developing novel planning approaches, coming up with novel heuristic searches and investigating how planning can be combined with machine learning. Our work spans graph theory, algorithms, data structures, machine learning and of course robotics. We use our algorithms to build real-time planners for complex robotic systems operating in real world and performing challenging tasks ranging from autonomous navigation and autonomous flight to multi-agent systems and to full-body mobile manipulation.
    \r\n\t
    \r\n\tIn a bit more details, we study such problems as high-dimensional motion planning, task planning, planning under uncertainty and multi-agent planning.  Our goal is to develop planners that work in real-time and deal with complex real-world environments. We are also actively pursuing planning approaches that "learn from experience". In all of our work, we strive to develop methods that come with rigorous analytical guarantees on performance such as completeness and bounds on sub-optimality. Such guarantees help dramatically users to analyze and anticipate the behavior of autonomous systems which is crucial for safe autonomy alongside people. The lab is home to several robots including PR2 robot, segbot robot, hexarotor aerial vehicle, quadrotor aerial vehicles and few other smaller aerial vehicles.  In addition, we build planners for a number of large-scale robotic systems such as humanoid robots and full-scale helicopter.

    \r\n

    New! Please join the sbpl-users mailing list by signing up here.

    \r\n

     

    \r\n

    Project Birdhouse! Autonomous Assembly

    \r\n\r\n

    \r\n

     

    \r\n

     

    \r\n\r\n\r\n

    April 23, 2013: Autonomous Hexarotor Avoids a Person

    \r\n

    \r\n

     

    \r\n", + "body_markdown": "Search-based Planning Laboratory researches methodologies and algorithms that enable autonomous systems to act fast, intelligently and robustly. Our research concentrates mostly on developing novel planning approaches, coming up with novel heuristic searches and investigating how planning can be combined with machine learning. Our work spans graph theory, algorithms, data structures, machine learning and of course robotics. We use our algorithms to build real-time planners for complex robotic systems operating in real world and performing challenging tasks ranging from autonomous navigation and autonomous flight to multi-agent systems and to full-body mobile manipulation.\n\n In a bit more details, we study such problems as high-dimensional motion planning, task planning, planning under uncertainty and multi-agent planning. Our goal is to develop planners that work in real-time and deal with complex real-world environments. We are also actively pursuing planning approaches that \"learn from experience\". In all of our work, we strive to develop methods that come with rigorous analytical guarantees on performance such as completeness and bounds on sub-optimality. Such guarantees help dramatically users to analyze and anticipate the behavior of autonomous systems which is crucial for safe autonomy alongside people. The lab is home to several robots including PR2 robot, segbot robot, hexarotor aerial vehicle, quadrotor aerial vehicles and few other smaller aerial vehicles. In addition, we build planners for a number of large-scale robotic systems such as humanoid robots and full-scale helicopter.\n\n**New!** Please join the *sbpl-users *mailing list by signing up [here](https://groups.google.com/forum/#!forum/sbpl-users).\n\n***Project Birdhouse! Autonomous Assembly***\n\n***April 23, 2013: ****Autonomous Hexarotor Avoids a Person***\n", + "body_html_raw": "

    Search-based Planning Laboratory researches methodologies and algorithms that enable autonomous systems to act fast, intelligently and robustly. Our research concentrates mostly on developing novel planning approaches, coming up with novel heuristic searches and investigating how planning can be combined with machine learning. Our work spans graph theory, algorithms, data structures, machine learning and of course robotics. We use our algorithms to build real-time planners for complex robotic systems operating in real world and performing challenging tasks ranging from autonomous navigation and autonomous flight to multi-agent systems and to full-body mobile manipulation.
    \r\n\t
    \r\n\tIn a bit more details, we study such problems as high-dimensional motion planning, task planning, planning under uncertainty and multi-agent planning.  Our goal is to develop planners that work in real-time and deal with complex real-world environments. We are also actively pursuing planning approaches that "learn from experience". In all of our work, we strive to develop methods that come with rigorous analytical guarantees on performance such as completeness and bounds on sub-optimality. Such guarantees help dramatically users to analyze and anticipate the behavior of autonomous systems which is crucial for safe autonomy alongside people. The lab is home to several robots including PR2 robot, segbot robot, hexarotor aerial vehicle, quadrotor aerial vehicles and few other smaller aerial vehicles.  In addition, we build planners for a number of large-scale robotic systems such as humanoid robots and full-scale helicopter.

    \r\n

    New! Please join the sbpl-users mailing list by signing up here.

    \r\n

     

    \r\n

    Project Birdhouse! Autonomous Assembly

    \r\n\r\n

    \r\n

     

    \r\n

     

    \r\n\r\n\r\n

    April 23, 2013: Autonomous Hexarotor Avoids a Person

    \r\n

    \r\n

     

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0009-home.md b/static/archive/legacy-drupal/content/pages/0009-home.md new file mode 100644 index 0000000..8e39b97 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0009-home.md @@ -0,0 +1,11 @@ +# Home + +Search-based Planning Laboratory researches methodologies and algorithms that enable autonomous systems to act fast, intelligently and robustly. Our research concentrates mostly on developing novel planning approaches, coming up with novel heuristic searches and investigating how planning can be combined with machine learning. Our work spans graph theory, algorithms, data structures, machine learning and of course robotics. We use our algorithms to build real-time planners for complex robotic systems operating in real world and performing challenging tasks ranging from autonomous navigation and autonomous flight to multi-agent systems and to full-body mobile manipulation. + + In a bit more details, we study such problems as high-dimensional motion planning, task planning, planning under uncertainty and multi-agent planning. Our goal is to develop planners that work in real-time and deal with complex real-world environments. We are also actively pursuing planning approaches that "learn from experience". In all of our work, we strive to develop methods that come with rigorous analytical guarantees on performance such as completeness and bounds on sub-optimality. Such guarantees help dramatically users to analyze and anticipate the behavior of autonomous systems which is crucial for safe autonomy alongside people. The lab is home to several robots including PR2 robot, segbot robot, hexarotor aerial vehicle, quadrotor aerial vehicles and few other smaller aerial vehicles. In addition, we build planners for a number of large-scale robotic systems such as humanoid robots and full-scale helicopter. + +**New!** Please join the *sbpl-users *mailing list by signing up [here](https://groups.google.com/forum/#!forum/sbpl-users). + +***Project Birdhouse! Autonomous Assembly*** + +***April 23, 2013: ****Autonomous Hexarotor Avoids a Person*** diff --git a/static/archive/legacy-drupal/content/pages/0010-publications.html b/static/archive/legacy-drupal/content/pages/0010-publications.html new file mode 100644 index 0000000..fa11652 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0010-publications.html @@ -0,0 +1,7 @@ + +Publications + +

    Publications

    +

    + + diff --git a/static/archive/legacy-drupal/content/pages/0010-publications.json b/static/archive/legacy-drupal/content/pages/0010-publications.json new file mode 100644 index 0000000..954f6aa --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0010-publications.json @@ -0,0 +1,27 @@ +{ + "nid": 10, + "vid": 10, + "type": "page", + "language": "und", + "title": "Publications", + "slug": "publications", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 1, + "comment": 1, + "created": 1340167429, + "changed": 1344455725, + "url_aliases": [ + "Publications" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    \r\n", + "body_markdown": "\n", + "body_html_raw": "

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0010-publications.md b/static/archive/legacy-drupal/content/pages/0010-publications.md new file mode 100644 index 0000000..2ae884d --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0010-publications.md @@ -0,0 +1,3 @@ +# Publications + + diff --git a/static/archive/legacy-drupal/content/pages/0011-videos.html b/static/archive/legacy-drupal/content/pages/0011-videos.html new file mode 100644 index 0000000..1e723db --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0011-videos.html @@ -0,0 +1,133 @@ + +Videos + +

    Videos

    + +

    +

    Mobile Manipulation Videos

    +
    +
    + +
    +  
    +
    +  
    +

    +

    Manipulation Videos

    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +  
    +
    +  
    +

    +

    Navigation Videos

    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +  
    +
    +  
    +

    +

    Dynamic Environment Videos

    +
    +
    + +
    +
    + +
    +
    + +
    +  
    +
    +  
    +

    +

    Hexacopter Videos

    +
    +
    + +
    +  
    +
    +
    + +
    +  
    +
    +
    + +
    +  
    + + diff --git a/static/archive/legacy-drupal/content/pages/0011-videos.json b/static/archive/legacy-drupal/content/pages/0011-videos.json new file mode 100644 index 0000000..8b58c92 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0011-videos.json @@ -0,0 +1,27 @@ +{ + "nid": 11, + "vid": 11, + "type": "page", + "language": "und", + "title": "Videos", + "slug": "videos", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 1, + "comment": 1, + "created": 1340167533, + "changed": 1376604486, + "url_aliases": [ + "Videos" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "\r\n

    \r\n

    Mobile Manipulation Videos

    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t 
    \r\n
    \r\n\t 
    \r\n

    \r\n

    Manipulation Videos

    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t 
    \r\n
    \r\n\t 
    \r\n

    \r\n

    Navigation Videos

    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t 
    \r\n
    \r\n\t 
    \r\n

    \r\n

    Dynamic Environment Videos

    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t 
    \r\n
    \r\n\t 
    \r\n

    \r\n

    Hexacopter Videos

    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t 
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t 
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t 
    \r\n", + "body_markdown": "[]()\n\n**Mobile Manipulation Videos**\n\n [![](http://img.youtube.com/vi/lpNbt7btxgg/1.jpg)](#mobilemanipulationvideos)\n\n[]()\n\n**Manipulation Videos**\n\n [![](http://img.youtube.com/vi/KrMsyDVWo8A/1.jpg)](#manipulationvideos)\n\n [![](http://img.youtube.com/vi/GreYnmUfCnU/1.jpg)](#manipulationvideos)\n\n [![](http://img.youtube.com/vi/AmpbvymDQwk/1.jpg)](#manipulationvideos)\n\n [![](http://img.youtube.com/vi/nZoVGzQPSQI/1.jpg)](#manipulationvideos)\n\n [![](http://img.youtube.com/vi/Zlt6EJVdUN8/1.jpg)](#manipulationvideos)\n\n[]()\n\n**Navigation Videos**\n\n [![](http://img.youtube.com/vi/D3jkj8KSIQk/1.jpg)](#navigationvideos)\n\n [![](http://img.youtube.com/vi/NnfJUPz6__M/1.jpg)](#navigationvideos)\n\n [![](http://img.youtube.com/vi/WeXdCmEpRW0/1.jpg)](#navigationvideos)\n\n [![](http://img.youtube.com/vi/NMKhf3B5968/1.jpg)](#navigationvideos)\n\n [![](http://img.youtube.com/vi/Y1TZMQTEahs/1.jpg)](#navigationvideos)\n\n[]()\n\n**Dynamic Environment Videos**\n\n [![](http://img.youtube.com/vi/khzJUVnN4rw/1.jpg)](#dynamicenvironmentvideos)\n\n [![](http://img.youtube.com/vi/RZ4lEXjg5fQ/1.jpg)](#dynamicenvironmentvideos)\n\n [![](http://img.youtube.com/vi/kdaeQMo5Khk/1.jpg)](#dynamicenvironmentvideos)\n\n[]()\n\n**Hexacopter Videos**\n\n [![](http://img.youtube.com/vi/-abpnZ960kY/1.jpg)](#hexacoptervideos)\n\n [![](http://img.youtube.com/vi/UlxYl625tu0/3.jpg)](#hexacoptervideos)\n\n [![](http://img.youtube.com/vi/twFoHp5CGMo/1.jpg)](#hexacoptervideos)\n", + "body_html_raw": "\r\n

    \r\n

    Mobile Manipulation Videos

    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t 
    \r\n
    \r\n\t 
    \r\n

    \r\n

    Manipulation Videos

    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t 
    \r\n
    \r\n\t 
    \r\n

    \r\n

    Navigation Videos

    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t 
    \r\n
    \r\n\t 
    \r\n

    \r\n

    Dynamic Environment Videos

    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t 
    \r\n
    \r\n\t 
    \r\n

    \r\n

    Hexacopter Videos

    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t 
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t 
    \r\n
    \r\n\t
    \r\n
    \r\n\t
    \r\n
    \r\n\t 
    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0011-videos.md b/static/archive/legacy-drupal/content/pages/0011-videos.md new file mode 100644 index 0000000..c21517c --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0011-videos.md @@ -0,0 +1,55 @@ +# Videos + +[]() + +**Mobile Manipulation Videos** + + [![](http://img.youtube.com/vi/lpNbt7btxgg/1.jpg)](#mobilemanipulationvideos) + +[]() + +**Manipulation Videos** + + [![](http://img.youtube.com/vi/KrMsyDVWo8A/1.jpg)](#manipulationvideos) + + [![](http://img.youtube.com/vi/GreYnmUfCnU/1.jpg)](#manipulationvideos) + + [![](http://img.youtube.com/vi/AmpbvymDQwk/1.jpg)](#manipulationvideos) + + [![](http://img.youtube.com/vi/nZoVGzQPSQI/1.jpg)](#manipulationvideos) + + [![](http://img.youtube.com/vi/Zlt6EJVdUN8/1.jpg)](#manipulationvideos) + +[]() + +**Navigation Videos** + + [![](http://img.youtube.com/vi/D3jkj8KSIQk/1.jpg)](#navigationvideos) + + [![](http://img.youtube.com/vi/NnfJUPz6__M/1.jpg)](#navigationvideos) + + [![](http://img.youtube.com/vi/WeXdCmEpRW0/1.jpg)](#navigationvideos) + + [![](http://img.youtube.com/vi/NMKhf3B5968/1.jpg)](#navigationvideos) + + [![](http://img.youtube.com/vi/Y1TZMQTEahs/1.jpg)](#navigationvideos) + +[]() + +**Dynamic Environment Videos** + + [![](http://img.youtube.com/vi/khzJUVnN4rw/1.jpg)](#dynamicenvironmentvideos) + + [![](http://img.youtube.com/vi/RZ4lEXjg5fQ/1.jpg)](#dynamicenvironmentvideos) + + [![](http://img.youtube.com/vi/kdaeQMo5Khk/1.jpg)](#dynamicenvironmentvideos) + +[]() + +**Hexacopter Videos** + + [![](http://img.youtube.com/vi/-abpnZ960kY/1.jpg)](#hexacoptervideos) + + [![](http://img.youtube.com/vi/UlxYl625tu0/3.jpg)](#hexacoptervideos) + + [![](http://img.youtube.com/vi/twFoHp5CGMo/1.jpg)](#hexacoptervideos) diff --git a/static/archive/legacy-drupal/content/pages/0012-robots.html b/static/archive/legacy-drupal/content/pages/0012-robots.html new file mode 100644 index 0000000..6c7c162 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0012-robots.html @@ -0,0 +1,26 @@ + +Robots + +

    Robots

    +

    pr2

    + +

    + Allen the PR2:

    +

    Allen the PR2 is a mobile manipulation platform developed by Willow Garage (http://www.willowgarage.com/pages/pr2/overview). The robot has two 7 degree of freedom arms for manipulating objects and an omni-directional base for navigation. The robot has an array of sensors including two Hokuyo laser range finders and seven cameras for building 3D maps of its surroundings and identifying objects. In our lab we use Allen to test a variety of planners including single-arm, dual-arm, navigation (in position and orientation), and full-body mobile manipulation. 

    +

     

    +

      hexabot

    +

    + Man-Hack the Hexacopter:

    +

    Man-Hack the Hexacopter is our lab unmanned aerial vehicle (UAV).  The base is a Mikrokopter Hexa XL frame with a custom-made carbon fiber computer carrier and blade guard.  The onboard processing is performed by an i7 COM Express module  running ROS allowing the Hexacopter to operate without any offboard connectitivity.  Similar to Melvin, the hexacopter uses two orthogonally mounted Hokuyo laser range finders as the primary localization sensors augmented by GPS and two wide-angle camera systems.  Total system weight is approximately 4.3kg with over 15 minutes of flight time.
    +
    + The hexacopter is used for 3-D planning research including planning under uncertainty, planning in the presence of 3-D dynamic obstacles, and visual servoing in conjunction with planning.

    +

     

    +

     

    +

     segbot

    +

    + Melvin the Segbot:

    +

    Melvin the Segbot is based on a Segway RMP 200 platform with a custom made rear trailer allowing it to operate in a variety of environments both indoors and outdoors.  The custom computer system consists of an 8-core server and a 2-core controller giving Melvin the highest computational capability of any of our lab robots. Like all of our robots, Melvin uses the ROS operating system running on Kubuntu for the software infrastructure.  For sensing the environment, Melvin relies on two Hokuyo laser range finders which can be supplemented by GPS or vision systems when required. 
    +
    + Melvin is used primarily for ground navigation research including research in exploration, planning in the presense of dynamic obstacles, and multi-robot planning.

    + + diff --git a/static/archive/legacy-drupal/content/pages/0012-robots.json b/static/archive/legacy-drupal/content/pages/0012-robots.json new file mode 100644 index 0000000..4d0def3 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0012-robots.json @@ -0,0 +1,27 @@ +{ + "nid": 12, + "vid": 12, + "type": "page", + "language": "und", + "title": "Robots", + "slug": "robots", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 1, + "comment": 1, + "created": 1340167840, + "changed": 1357941235, + "url_aliases": [ + "Robots" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    \"pr2\"

    \r\n\r\n

    \r\n\tAllen the PR2:

    \r\n

    Allen the PR2 is a mobile manipulation platform developed by Willow Garage (http://www.willowgarage.com/pages/pr2/overview). The robot has two 7 degree of freedom arms for manipulating objects and an omni-directional base for navigation. The robot has an array of sensors including two Hokuyo laser range finders and seven cameras for building 3D maps of its surroundings and identifying objects. In our lab we use Allen to test a variety of planners including single-arm, dual-arm, navigation (in position and orientation), and full-body mobile manipulation. 

    \r\n

     

    \r\n

      \"hexabot\"\"\"\"\"

    \r\n

    \r\n\tMan-Hack the Hexacopter:

    \r\n

    Man-Hack the Hexacopter is our lab unmanned aerial vehicle (UAV).  The base is a Mikrokopter Hexa XL frame with a custom-made carbon fiber computer carrier and blade guard.  The onboard processing is performed by an i7 COM Express module  running ROS allowing the Hexacopter to operate without any offboard connectitivity.  Similar to Melvin, the hexacopter uses two orthogonally mounted Hokuyo laser range finders as the primary localization sensors augmented by GPS and two wide-angle camera systems.  Total system weight is approximately 4.3kg with over 15 minutes of flight time.
    \r\n\t
    \r\n\tThe hexacopter is used for 3-D planning research including planning under uncertainty, planning in the presence of 3-D dynamic obstacles, and visual servoing in conjunction with planning.

    \r\n

     

    \r\n

     

    \r\n

     \"segbot\"\"\"\"\"

    \r\n

    \r\n\tMelvin the Segbot:

    \r\n

    Melvin the Segbot is based on a Segway RMP 200 platform with a custom made rear trailer allowing it to operate in a variety of environments both indoors and outdoors.  The custom computer system consists of an 8-core server and a 2-core controller giving Melvin the highest computational capability of any of our lab robots. Like all of our robots, Melvin uses the ROS operating system running on Kubuntu for the software infrastructure.  For sensing the environment, Melvin relies on two Hokuyo laser range finders which can be supplemented by GPS or vision systems when required. 
    \r\n\t
    \r\n\tMelvin is used primarily for ground navigation research including research in exploration, planning in the presense of dynamic obstacles, and multi-robot planning.

    \r\n", + "body_markdown": "![pr2](../../media/uploads/site/all/images/pr2_grasp.png)\n\n## Allen the PR2:\n\nAllen the PR2 is a mobile manipulation platform developed by Willow Garage ([http://www.willowgarage.com/pages/pr2/overview](http://www.willowgarage.com/pages/pr2/overview)). The robot has two 7 degree of freedom arms for manipulating objects and an omni-directional base for navigation. The robot has an array of sensors including two Hokuyo laser range finders and seven cameras for building 3D maps of its surroundings and identifying objects. In our lab we use Allen to test a variety of planners including single-arm, dual-arm, navigation (in position and orientation), and full-body mobile manipulation.\n\n ![hexabot](../../media/uploads/site/all/images/hexarotor.png)![](../../media/images/IMG_2895_small.jpeg)![](../../media/images/MC-UAV-1-2_small.jpeg)\n\n## Man-Hack the Hexacopter:\n\nMan-Hack the Hexacopter is our lab unmanned aerial vehicle (UAV). The base is a Mikrokopter Hexa XL frame with a custom-made carbon fiber computer carrier and blade guard. The onboard processing is performed by an i7 COM Express module running ROS allowing the Hexacopter to operate without any offboard connectitivity. Similar to Melvin, the hexacopter uses two orthogonally mounted Hokuyo laser range finders as the primary localization sensors augmented by GPS and two wide-angle camera systems. Total system weight is approximately 4.3kg with over 15 minutes of flight time.\n\n The hexacopter is used for 3-D planning research including planning under uncertainty, planning in the presence of 3-D dynamic obstacles, and visual servoing in conjunction with planning.\n\n ![segbot](../../media/images/segbot_small.png)![](../../media/images/IMG_2896_small.jpeg)![](../../media/images/IMG_2897_small.jpeg)\n\n## Melvin the Segbot:\n\nMelvin the Segbot is based on a Segway RMP 200 platform with a custom made rear trailer allowing it to operate in a variety of environments both indoors and outdoors. The custom computer system consists of an 8-core server and a 2-core controller giving Melvin the highest computational capability of any of our lab robots. Like all of our robots, Melvin uses the ROS operating system running on Kubuntu for the software infrastructure. For sensing the environment, Melvin relies on two Hokuyo laser range finders which can be supplemented by GPS or vision systems when required.\n\n Melvin is used primarily for ground navigation research including research in exploration, planning in the presense of dynamic obstacles, and multi-robot planning.\n", + "body_html_raw": "

    \"pr2\"

    \r\n\r\n

    \r\n\tAllen the PR2:

    \r\n

    Allen the PR2 is a mobile manipulation platform developed by Willow Garage (http://www.willowgarage.com/pages/pr2/overview). The robot has two 7 degree of freedom arms for manipulating objects and an omni-directional base for navigation. The robot has an array of sensors including two Hokuyo laser range finders and seven cameras for building 3D maps of its surroundings and identifying objects. In our lab we use Allen to test a variety of planners including single-arm, dual-arm, navigation (in position and orientation), and full-body mobile manipulation. 

    \r\n

     

    \r\n

      \"hexabot\"\"\"\"\"

    \r\n

    \r\n\tMan-Hack the Hexacopter:

    \r\n

    Man-Hack the Hexacopter is our lab unmanned aerial vehicle (UAV).  The base is a Mikrokopter Hexa XL frame with a custom-made carbon fiber computer carrier and blade guard.  The onboard processing is performed by an i7 COM Express module  running ROS allowing the Hexacopter to operate without any offboard connectitivity.  Similar to Melvin, the hexacopter uses two orthogonally mounted Hokuyo laser range finders as the primary localization sensors augmented by GPS and two wide-angle camera systems.  Total system weight is approximately 4.3kg with over 15 minutes of flight time.
    \r\n\t
    \r\n\tThe hexacopter is used for 3-D planning research including planning under uncertainty, planning in the presence of 3-D dynamic obstacles, and visual servoing in conjunction with planning.

    \r\n

     

    \r\n

     

    \r\n

     \"segbot\"\"\"\"\"

    \r\n

    \r\n\tMelvin the Segbot:

    \r\n

    Melvin the Segbot is based on a Segway RMP 200 platform with a custom made rear trailer allowing it to operate in a variety of environments both indoors and outdoors.  The custom computer system consists of an 8-core server and a 2-core controller giving Melvin the highest computational capability of any of our lab robots. Like all of our robots, Melvin uses the ROS operating system running on Kubuntu for the software infrastructure.  For sensing the environment, Melvin relies on two Hokuyo laser range finders which can be supplemented by GPS or vision systems when required. 
    \r\n\t
    \r\n\tMelvin is used primarily for ground navigation research including research in exploration, planning in the presense of dynamic obstacles, and multi-robot planning.

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0012-robots.md b/static/archive/legacy-drupal/content/pages/0012-robots.md new file mode 100644 index 0000000..a231073 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0012-robots.md @@ -0,0 +1,23 @@ +# Robots + +![pr2](../../media/uploads/site/all/images/pr2_grasp.png) + +## Allen the PR2: + +Allen the PR2 is a mobile manipulation platform developed by Willow Garage ([http://www.willowgarage.com/pages/pr2/overview](http://www.willowgarage.com/pages/pr2/overview)). The robot has two 7 degree of freedom arms for manipulating objects and an omni-directional base for navigation. The robot has an array of sensors including two Hokuyo laser range finders and seven cameras for building 3D maps of its surroundings and identifying objects. In our lab we use Allen to test a variety of planners including single-arm, dual-arm, navigation (in position and orientation), and full-body mobile manipulation. + + ![hexabot](../../media/uploads/site/all/images/hexarotor.png)![](../../media/images/IMG_2895_small.jpeg)![](../../media/images/MC-UAV-1-2_small.jpeg) + +## Man-Hack the Hexacopter: + +Man-Hack the Hexacopter is our lab unmanned aerial vehicle (UAV). The base is a Mikrokopter Hexa XL frame with a custom-made carbon fiber computer carrier and blade guard. The onboard processing is performed by an i7 COM Express module running ROS allowing the Hexacopter to operate without any offboard connectitivity. Similar to Melvin, the hexacopter uses two orthogonally mounted Hokuyo laser range finders as the primary localization sensors augmented by GPS and two wide-angle camera systems. Total system weight is approximately 4.3kg with over 15 minutes of flight time. + + The hexacopter is used for 3-D planning research including planning under uncertainty, planning in the presence of 3-D dynamic obstacles, and visual servoing in conjunction with planning. + + ![segbot](../../media/images/segbot_small.png)![](../../media/images/IMG_2896_small.jpeg)![](../../media/images/IMG_2897_small.jpeg) + +## Melvin the Segbot: + +Melvin the Segbot is based on a Segway RMP 200 platform with a custom made rear trailer allowing it to operate in a variety of environments both indoors and outdoors. The custom computer system consists of an 8-core server and a 2-core controller giving Melvin the highest computational capability of any of our lab robots. Like all of our robots, Melvin uses the ROS operating system running on Kubuntu for the software infrastructure. For sensing the environment, Melvin relies on two Hokuyo laser range finders which can be supplemented by GPS or vision systems when required. + + Melvin is used primarily for ground navigation research including research in exploration, planning in the presense of dynamic obstacles, and multi-robot planning. diff --git a/static/archive/legacy-drupal/content/pages/0013-ben-cohen.html b/static/archive/legacy-drupal/content/pages/0013-ben-cohen.html new file mode 100644 index 0000000..4754fd3 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0013-ben-cohen.html @@ -0,0 +1,7 @@ + +Ben Cohen + +

    Ben Cohen

    +

    PhD student in CIS, UPenn

    + + diff --git a/static/archive/legacy-drupal/content/pages/0013-ben-cohen.json b/static/archive/legacy-drupal/content/pages/0013-ben-cohen.json new file mode 100644 index 0000000..c579d04 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0013-ben-cohen.json @@ -0,0 +1,27 @@ +{ + "nid": 13, + "vid": 13, + "type": "page", + "language": "und", + "title": "Ben Cohen", + "slug": "ben-cohen", + "uid": 11, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599028, + "changed": 1344290038, + "url_aliases": [ + "BenCohen" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    PhD student in CIS, UPenn

    \r\n", + "body_markdown": "PhD student in CIS, UPenn\n", + "body_html_raw": "

    PhD student in CIS, UPenn

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0013-ben-cohen.md b/static/archive/legacy-drupal/content/pages/0013-ben-cohen.md new file mode 100644 index 0000000..e9f2ff6 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0013-ben-cohen.md @@ -0,0 +1,3 @@ +# Ben Cohen + +PhD student in CIS, UPenn diff --git a/static/archive/legacy-drupal/content/pages/0014-brian-macallister.html b/static/archive/legacy-drupal/content/pages/0014-brian-macallister.html new file mode 100644 index 0000000..a6c9180 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0014-brian-macallister.html @@ -0,0 +1,9 @@ + +Brian MacAllister + +

    Brian MacAllister

    +

    Brian MacAllister

    +

                                Me: a research staff member, CMU.

    +

                               

    + + diff --git a/static/archive/legacy-drupal/content/pages/0014-brian-macallister.json b/static/archive/legacy-drupal/content/pages/0014-brian-macallister.json new file mode 100644 index 0000000..4515856 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0014-brian-macallister.json @@ -0,0 +1,27 @@ +{ + "nid": 14, + "vid": 14, + "type": "page", + "language": "und", + "title": "Brian MacAllister", + "slug": "brian-macallister", + "uid": 13, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599070, + "changed": 1344388676, + "url_aliases": [ + "BrianMacAllister" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    Brian MacAllister

    \r\n

    \"\"                            Me: a research staff member, CMU.

    \r\n

                               

    \r\n", + "body_markdown": "**Brian MacAllister**\n\n![](../../media/images/brian.jpg) Me: a research staff member, CMU.\n", + "body_html_raw": "

    Brian MacAllister

    \r\n

    \"\"                            Me: a research staff member, CMU.

    \r\n

                               

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0014-brian-macallister.md b/static/archive/legacy-drupal/content/pages/0014-brian-macallister.md new file mode 100644 index 0000000..57d9c32 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0014-brian-macallister.md @@ -0,0 +1,5 @@ +# Brian MacAllister + +**Brian MacAllister** + +![](../../media/images/brian.jpg) Me: a research staff member, CMU. diff --git a/static/archive/legacy-drupal/content/pages/0015-andrew-dornbush.html b/static/archive/legacy-drupal/content/pages/0015-andrew-dornbush.html new file mode 100644 index 0000000..bb3a6b1 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0015-andrew-dornbush.html @@ -0,0 +1,7 @@ + +Andrew Dornbush + +

    Andrew Dornbush

    +

    Reasearch Staff

    + + diff --git a/static/archive/legacy-drupal/content/pages/0015-andrew-dornbush.json b/static/archive/legacy-drupal/content/pages/0015-andrew-dornbush.json new file mode 100644 index 0000000..fdb30cf --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0015-andrew-dornbush.json @@ -0,0 +1,27 @@ +{ + "nid": 15, + "vid": 15, + "type": "page", + "language": "und", + "title": "Andrew Dornbush", + "slug": "andrew-dornbush", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599102, + "changed": 1344135530, + "url_aliases": [ + "AndrewDornbush" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    Reasearch Staff

    \r\n", + "body_markdown": "Reasearch Staff\n", + "body_html_raw": "

    Reasearch Staff

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0015-andrew-dornbush.md b/static/archive/legacy-drupal/content/pages/0015-andrew-dornbush.md new file mode 100644 index 0000000..eb1acc5 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0015-andrew-dornbush.md @@ -0,0 +1,3 @@ +# Andrew Dornbush + +Reasearch Staff diff --git a/static/archive/legacy-drupal/content/pages/0016-subhrajit-bhattacharya.html b/static/archive/legacy-drupal/content/pages/0016-subhrajit-bhattacharya.html new file mode 100644 index 0000000..501c749 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0016-subhrajit-bhattacharya.html @@ -0,0 +1,7 @@ + +Subhrajit Bhattacharya + +

    Subhrajit Bhattacharya

    +

    PhD student in MEAM, UPenn, co-advised with V. Kumar

    + + diff --git a/static/archive/legacy-drupal/content/pages/0016-subhrajit-bhattacharya.json b/static/archive/legacy-drupal/content/pages/0016-subhrajit-bhattacharya.json new file mode 100644 index 0000000..c2f0e1b --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0016-subhrajit-bhattacharya.json @@ -0,0 +1,27 @@ +{ + "nid": 16, + "vid": 16, + "type": "page", + "language": "und", + "title": "Subhrajit Bhattacharya", + "slug": "subhrajit-bhattacharya", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599156, + "changed": 1344135548, + "url_aliases": [ + "SubhrajitBhattacharya" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    PhD student in MEAM, UPenn, co-advised with V. Kumar

    \r\n", + "body_markdown": "PhD student in MEAM, UPenn, co-advised with V. Kumar\n", + "body_html_raw": "

    PhD student in MEAM, UPenn, co-advised with V. Kumar

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0016-subhrajit-bhattacharya.md b/static/archive/legacy-drupal/content/pages/0016-subhrajit-bhattacharya.md new file mode 100644 index 0000000..ebd6edf --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0016-subhrajit-bhattacharya.md @@ -0,0 +1,3 @@ +# Subhrajit Bhattacharya + +PhD student in MEAM, UPenn, co-advised with V. Kumar diff --git a/static/archive/legacy-drupal/content/pages/0017-jonathan-butzke.html b/static/archive/legacy-drupal/content/pages/0017-jonathan-butzke.html new file mode 100644 index 0000000..699dafc --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0017-jonathan-butzke.html @@ -0,0 +1,59 @@ + +Jonathan Butzke + +

    Jonathan Butzke

    +

    + Current Status

    +

    I am currently (as of Spring 2015) a PhD student in the SBP Lab here at CMU.  My interests are in Robot Design, System Integration, Path Planning, Exploration, Navigation, and High-level Control.

    +

    I am also looking for a job...

    +

    + Previous Experience

    +

    19 years as a Navy Officer - qualified and served as a Ship's Engineer for a Fast-Attack Nuclear Submarine (USS OKLAHOMA CITY, SSN-723) and division officer (USS TOLEDO, SSN-769).

    +

    Taught undergrad Logic Design Lab and Intro to Robotics courses.

    +

    + Skills:

    +
      +
    • + Mechanical +
        +
      • + Tools - Mill, Lathe, Brake, Press, just about every hand tool known to mankind
      • +
      • + Past Projects - automotive engine rebuild, ground robot design & construction, UAV design & construction
      • +
      +
    • +
    +
      +
    • + Electrical +
        +
      • + Residential construction, digital circuit design, SMD soldering, PCB layout
      • +
      +
    • +
    +
      +
    • + Computer +
        +
      • + Software - C, C++, 6800 series assembly, Matlab, Solidworks, Linux, ROS
      • +
      • + Hardware - Arduino, COM Express, TTL, SMD
      • +
      +
    • +
    +

    + Past Robotics Projects

    +

    + Segbot

    +

    Designed and constructed the frame, computer case, stabilization system and other mechanical components, and the electrical distribution and storage systems, . 

    +

    + Hexacopter

    +

    Modified existing UAV kit to add sensors and additional computational devices to the UAV.  Wrote the drivers, controllers, and high-level logic control nodes for the system.  Performed all flight testing and design verifications testing.

    + +

    +Website: +

    www.jbutzke.com

    + + diff --git a/static/archive/legacy-drupal/content/pages/0017-jonathan-butzke.json b/static/archive/legacy-drupal/content/pages/0017-jonathan-butzke.json new file mode 100644 index 0000000..d658f7e --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0017-jonathan-butzke.json @@ -0,0 +1,27 @@ +{ + "nid": 17, + "vid": 17, + "type": "page", + "language": "und", + "title": "Jonathan Butzke", + "slug": "jonathan-butzke", + "uid": 32, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599235, + "changed": 1425152701, + "url_aliases": [ + "JonathanButzke" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    \r\n\tCurrent Status

    \r\n

    I am currently (as of Spring 2015) a PhD student in the SBP Lab here at CMU.  My interests are in Robot Design, System Integration, Path Planning, Exploration, Navigation, and High-level Control.

    \r\n

    I am also looking for a job...

    \r\n

    \r\n\tPrevious Experience

    \r\n

    19 years as a Navy Officer - qualified and served as a Ship's Engineer for a Fast-Attack Nuclear Submarine (USS OKLAHOMA CITY, SSN-723) and division officer (USS TOLEDO, SSN-769).

    \r\n

    Taught undergrad Logic Design Lab and Intro to Robotics courses.

    \r\n

    \r\n\tSkills:

    \r\n
      \r\n\t
    • \r\n\t\tMechanical\r\n\t\t
        \r\n\t\t\t
      • \r\n\t\t\t\tTools - Mill, Lathe, Brake, Press, just about every hand tool known to mankind
      • \r\n\t\t\t
      • \r\n\t\t\t\tPast Projects - automotive engine rebuild, ground robot design & construction, UAV design & construction
      • \r\n\t\t
      \r\n\t
    • \r\n
    \r\n
      \r\n\t
    • \r\n\t\tElectrical\r\n\t\t
        \r\n\t\t\t
      • \r\n\t\t\t\tResidential construction, digital circuit design, SMD soldering, PCB layout
      • \r\n\t\t
      \r\n\t
    • \r\n
    \r\n
      \r\n\t
    • \r\n\t\tComputer\r\n\t\t
        \r\n\t\t\t
      • \r\n\t\t\t\tSoftware - C, C++, 6800 series assembly, Matlab, Solidworks, Linux, ROS
      • \r\n\t\t\t
      • \r\n\t\t\t\tHardware - Arduino, COM Express, TTL, SMD
      • \r\n\t\t
      \r\n\t
    • \r\n
    \r\n

    \r\n\tPast Robotics Projects

    \r\n

    \r\n\tSegbot

    \r\n

    Designed and constructed the frame, computer case, stabilization system and other mechanical components, and the electrical distribution and storage systems, . 

    \r\n

    \r\n\tHexacopter

    \r\n

    Modified existing UAV kit to add sensors and additional computational devices to the UAV.  Wrote the drivers, controllers, and high-level logic control nodes for the system.  Performed all flight testing and design verifications testing.

    \r\n\r\n

    \r\nWebsite:\r\n

    www.jbutzke.com

    \r\n", + "body_markdown": "# Current Status\n\nI am currently (as of Spring 2015) a PhD student in the SBP Lab here at CMU. My interests are in Robot Design, System Integration, Path Planning, Exploration, Navigation, and High-level Control.\n\nI am also looking for a job...\n\n# Previous Experience\n\n19 years as a Navy Officer - qualified and served as a Ship's Engineer for a Fast-Attack Nuclear Submarine (USS OKLAHOMA CITY, SSN-723) and division officer (USS TOLEDO, SSN-769).\n\nTaught undergrad Logic Design Lab and Intro to Robotics courses.\n\n## Skills:\n\n- Mechanical\n\n - Tools - Mill, Lathe, Brake, Press, just about every hand tool known to mankind\n - Past Projects - automotive engine rebuild, ground robot design & construction, UAV design & construction\n\n- Electrical\n\n - Residential construction, digital circuit design, SMD soldering, PCB layout\n\n- Computer\n\n - Software - C, C++, 6800 series assembly, Matlab, Solidworks, Linux, ROS\n - Hardware - Arduino, COM Express, TTL, SMD\n\n## Past Robotics Projects\n\n### Segbot\n\nDesigned and constructed the frame, computer case, stabilization system and other mechanical components, and the electrical distribution and storage systems, .\n\n### Hexacopter\n\nModified existing UAV kit to add sensors and additional computational devices to the UAV. Wrote the drivers, controllers, and high-level logic control nodes for the system. Performed all flight testing and design verifications testing.\n\n## Website:\n\nwww.jbutzke.com\n", + "body_html_raw": "

    \r\n\tCurrent Status

    \r\n

    I am currently (as of Spring 2015) a PhD student in the SBP Lab here at CMU.  My interests are in Robot Design, System Integration, Path Planning, Exploration, Navigation, and High-level Control.

    \r\n

    I am also looking for a job...

    \r\n

    \r\n\tPrevious Experience

    \r\n

    19 years as a Navy Officer - qualified and served as a Ship's Engineer for a Fast-Attack Nuclear Submarine (USS OKLAHOMA CITY, SSN-723) and division officer (USS TOLEDO, SSN-769).

    \r\n

    Taught undergrad Logic Design Lab and Intro to Robotics courses.

    \r\n

    \r\n\tSkills:

    \r\n
      \r\n\t
    • \r\n\t\tMechanical\r\n\t\t
        \r\n\t\t\t
      • \r\n\t\t\t\tTools - Mill, Lathe, Brake, Press, just about every hand tool known to mankind
      • \r\n\t\t\t
      • \r\n\t\t\t\tPast Projects - automotive engine rebuild, ground robot design & construction, UAV design & construction
      • \r\n\t\t
      \r\n\t
    • \r\n
    \r\n
      \r\n\t
    • \r\n\t\tElectrical\r\n\t\t
        \r\n\t\t\t
      • \r\n\t\t\t\tResidential construction, digital circuit design, SMD soldering, PCB layout
      • \r\n\t\t
      \r\n\t
    • \r\n
    \r\n
      \r\n\t
    • \r\n\t\tComputer\r\n\t\t
        \r\n\t\t\t
      • \r\n\t\t\t\tSoftware - C, C++, 6800 series assembly, Matlab, Solidworks, Linux, ROS
      • \r\n\t\t\t
      • \r\n\t\t\t\tHardware - Arduino, COM Express, TTL, SMD
      • \r\n\t\t
      \r\n\t
    • \r\n
    \r\n

    \r\n\tPast Robotics Projects

    \r\n

    \r\n\tSegbot

    \r\n

    Designed and constructed the frame, computer case, stabilization system and other mechanical components, and the electrical distribution and storage systems, . 

    \r\n

    \r\n\tHexacopter

    \r\n

    Modified existing UAV kit to add sensors and additional computational devices to the UAV.  Wrote the drivers, controllers, and high-level logic control nodes for the system.  Performed all flight testing and design verifications testing.

    \r\n\r\n

    \r\nWebsite:\r\n

    www.jbutzke.com

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0017-jonathan-butzke.md b/static/archive/legacy-drupal/content/pages/0017-jonathan-butzke.md new file mode 100644 index 0000000..4d7f6ed --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0017-jonathan-butzke.md @@ -0,0 +1,43 @@ +# Jonathan Butzke + +# Current Status + +I am currently (as of Spring 2015) a PhD student in the SBP Lab here at CMU. My interests are in Robot Design, System Integration, Path Planning, Exploration, Navigation, and High-level Control. + +I am also looking for a job... + +# Previous Experience + +19 years as a Navy Officer - qualified and served as a Ship's Engineer for a Fast-Attack Nuclear Submarine (USS OKLAHOMA CITY, SSN-723) and division officer (USS TOLEDO, SSN-769). + +Taught undergrad Logic Design Lab and Intro to Robotics courses. + +## Skills: + +- Mechanical + + - Tools - Mill, Lathe, Brake, Press, just about every hand tool known to mankind + - Past Projects - automotive engine rebuild, ground robot design & construction, UAV design & construction + +- Electrical + + - Residential construction, digital circuit design, SMD soldering, PCB layout + +- Computer + + - Software - C, C++, 6800 series assembly, Matlab, Solidworks, Linux, ROS + - Hardware - Arduino, COM Express, TTL, SMD + +## Past Robotics Projects + +### Segbot + +Designed and constructed the frame, computer case, stabilization system and other mechanical components, and the electrical distribution and storage systems, . + +### Hexacopter + +Modified existing UAV kit to add sensors and additional computational devices to the UAV. Wrote the drivers, controllers, and high-level logic control nodes for the system. Performed all flight testing and design verifications testing. + +## Website: + +www.jbutzke.com diff --git a/static/archive/legacy-drupal/content/pages/0018-chris-clingerman.html b/static/archive/legacy-drupal/content/pages/0018-chris-clingerman.html new file mode 100644 index 0000000..599cc70 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0018-chris-clingerman.html @@ -0,0 +1,7 @@ + +Chris Clingerman + +

    Chris Clingerman

    +

    PhD student in CIS, UPenn, co-advised with B. Taskar

    + + diff --git a/static/archive/legacy-drupal/content/pages/0018-chris-clingerman.json b/static/archive/legacy-drupal/content/pages/0018-chris-clingerman.json new file mode 100644 index 0000000..12d2282 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0018-chris-clingerman.json @@ -0,0 +1,27 @@ +{ + "nid": 18, + "vid": 18, + "type": "page", + "language": "und", + "title": "Chris Clingerman", + "slug": "chris-clingerman", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599421, + "changed": 1344135561, + "url_aliases": [ + "ChrisClingerman" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    PhD student in CIS, UPenn, co-advised with B. Taskar

    \r\n", + "body_markdown": "PhD student in CIS, UPenn, co-advised with B. Taskar\n", + "body_html_raw": "

    PhD student in CIS, UPenn, co-advised with B. Taskar

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0018-chris-clingerman.md b/static/archive/legacy-drupal/content/pages/0018-chris-clingerman.md new file mode 100644 index 0000000..18e0a2d --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0018-chris-clingerman.md @@ -0,0 +1,3 @@ +# Chris Clingerman + +PhD student in CIS, UPenn, co-advised with B. Taskar diff --git a/static/archive/legacy-drupal/content/pages/0019-john-drake.html b/static/archive/legacy-drupal/content/pages/0019-john-drake.html new file mode 100644 index 0000000..4b25553 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0019-john-drake.html @@ -0,0 +1,7 @@ + +John Drake + +

    John Drake

    +

    PhD student in CIS, UPenn, co-advised with A. Safonova

    + + diff --git a/static/archive/legacy-drupal/content/pages/0019-john-drake.json b/static/archive/legacy-drupal/content/pages/0019-john-drake.json new file mode 100644 index 0000000..6af1f7f --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0019-john-drake.json @@ -0,0 +1,27 @@ +{ + "nid": 19, + "vid": 19, + "type": "page", + "language": "und", + "title": "John Drake", + "slug": "john-drake", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599446, + "changed": 1344135568, + "url_aliases": [ + "JohnDrake" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    PhD student in CIS, UPenn, co-advised with A. Safonova

    \r\n", + "body_markdown": "PhD student in CIS, UPenn, co-advised with A. Safonova\n", + "body_html_raw": "

    PhD student in CIS, UPenn, co-advised with A. Safonova

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0019-john-drake.md b/static/archive/legacy-drupal/content/pages/0019-john-drake.md new file mode 100644 index 0000000..8f3f6bd --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0019-john-drake.md @@ -0,0 +1,3 @@ +# John Drake + +PhD student in CIS, UPenn, co-advised with A. Safonova diff --git a/static/archive/legacy-drupal/content/pages/0020-steven-gray.html b/static/archive/legacy-drupal/content/pages/0020-steven-gray.html new file mode 100644 index 0000000..02c502b --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0020-steven-gray.html @@ -0,0 +1,7 @@ + +Steven Gray + +

    Steven Gray

    +

    PhD student in MEAM, UPenn, co-advised with V. Kumar

    + + diff --git a/static/archive/legacy-drupal/content/pages/0020-steven-gray.json b/static/archive/legacy-drupal/content/pages/0020-steven-gray.json new file mode 100644 index 0000000..db27ede --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0020-steven-gray.json @@ -0,0 +1,27 @@ +{ + "nid": 20, + "vid": 20, + "type": "page", + "language": "und", + "title": "Steven Gray", + "slug": "steven-gray", + "uid": 31, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599474, + "changed": 1344452675, + "url_aliases": [ + "StevenGray" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    PhD student in MEAM, UPenn, co-advised with V. Kumar

    \r\n", + "body_markdown": "PhD student in MEAM, UPenn, co-advised with V. Kumar\n", + "body_html_raw": "

    PhD student in MEAM, UPenn, co-advised with V. Kumar

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0020-steven-gray.md b/static/archive/legacy-drupal/content/pages/0020-steven-gray.md new file mode 100644 index 0000000..d09c448 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0020-steven-gray.md @@ -0,0 +1,3 @@ +# Steven Gray + +PhD student in MEAM, UPenn, co-advised with V. Kumar diff --git a/static/archive/legacy-drupal/content/pages/0021-kalin-gochev.html b/static/archive/legacy-drupal/content/pages/0021-kalin-gochev.html new file mode 100644 index 0000000..4d31dcf --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0021-kalin-gochev.html @@ -0,0 +1,7 @@ + +Kalin Gochev + +

    Kalin Gochev

    +

    PhD student in CIS, UPenn

    + + diff --git a/static/archive/legacy-drupal/content/pages/0021-kalin-gochev.json b/static/archive/legacy-drupal/content/pages/0021-kalin-gochev.json new file mode 100644 index 0000000..e44e7a0 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0021-kalin-gochev.json @@ -0,0 +1,27 @@ +{ + "nid": 21, + "vid": 21, + "type": "page", + "language": "und", + "title": "Kalin Gochev", + "slug": "kalin-gochev", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599493, + "changed": 1344135581, + "url_aliases": [ + "KalinGochev" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    PhD student in CIS, UPenn

    \r\n", + "body_markdown": "PhD student in CIS, UPenn\n", + "body_html_raw": "

    PhD student in CIS, UPenn

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0021-kalin-gochev.md b/static/archive/legacy-drupal/content/pages/0021-kalin-gochev.md new file mode 100644 index 0000000..a1cb1b0 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0021-kalin-gochev.md @@ -0,0 +1,3 @@ +# Kalin Gochev + +PhD student in CIS, UPenn diff --git a/static/archive/legacy-drupal/content/pages/0022-bradford-neuman.html b/static/archive/legacy-drupal/content/pages/0022-bradford-neuman.html new file mode 100644 index 0000000..c95cc3a --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0022-bradford-neuman.html @@ -0,0 +1,8 @@ + +Bradford Neuman + +

    Bradford Neuman

    +

    PhD student in Robotics, CMU, co-advised with A. Stentz

    +

    Currently on leave of absence

    + + diff --git a/static/archive/legacy-drupal/content/pages/0022-bradford-neuman.json b/static/archive/legacy-drupal/content/pages/0022-bradford-neuman.json new file mode 100644 index 0000000..151564c --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0022-bradford-neuman.json @@ -0,0 +1,27 @@ +{ + "nid": 22, + "vid": 22, + "type": "page", + "language": "und", + "title": "Bradford Neuman", + "slug": "bradford-neuman", + "uid": 33, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599525, + "changed": 1344493624, + "url_aliases": [ + "BradfordNeuman" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    PhD student in Robotics, CMU, co-advised with A. Stentz

    \r\n

    Currently on leave of absence

    \r\n", + "body_markdown": "PhD student in Robotics, CMU, co-advised with A. Stentz\n\nCurrently on leave of absence\n", + "body_html_raw": "

    PhD student in Robotics, CMU, co-advised with A. Stentz

    \r\n

    Currently on leave of absence

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0022-bradford-neuman.md b/static/archive/legacy-drupal/content/pages/0022-bradford-neuman.md new file mode 100644 index 0000000..d89a775 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0022-bradford-neuman.md @@ -0,0 +1,5 @@ +# Bradford Neuman + +PhD student in Robotics, CMU, co-advised with A. Stentz + +Currently on leave of absence diff --git a/static/archive/legacy-drupal/content/pages/0023-aline-normoyle.html b/static/archive/legacy-drupal/content/pages/0023-aline-normoyle.html new file mode 100644 index 0000000..d0ad7ec --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0023-aline-normoyle.html @@ -0,0 +1,7 @@ + +Aline Normoyle + +

    Aline Normoyle

    +

    PhD student in CIS, UPenn, co-advised with A. Safonova

    + + diff --git a/static/archive/legacy-drupal/content/pages/0023-aline-normoyle.json b/static/archive/legacy-drupal/content/pages/0023-aline-normoyle.json new file mode 100644 index 0000000..19fdd12 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0023-aline-normoyle.json @@ -0,0 +1,27 @@ +{ + "nid": 23, + "vid": 23, + "type": "page", + "language": "und", + "title": "Aline Normoyle", + "slug": "aline-normoyle", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599547, + "changed": 1344135596, + "url_aliases": [ + "AlineNormoyle" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    PhD student in CIS, UPenn, co-advised with A. Safonova

    \r\n", + "body_markdown": "PhD student in CIS, UPenn, co-advised with A. Safonova\n", + "body_html_raw": "

    PhD student in CIS, UPenn, co-advised with A. Safonova

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0023-aline-normoyle.md b/static/archive/legacy-drupal/content/pages/0023-aline-normoyle.md new file mode 100644 index 0000000..2ccb9cb --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0023-aline-normoyle.md @@ -0,0 +1,3 @@ +# Aline Normoyle + +PhD student in CIS, UPenn, co-advised with A. Safonova diff --git a/static/archive/legacy-drupal/content/pages/0024-mike-phillips.html b/static/archive/legacy-drupal/content/pages/0024-mike-phillips.html new file mode 100644 index 0000000..77a9a55 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0024-mike-phillips.html @@ -0,0 +1,7 @@ + +Mike Phillips + +

    Mike Phillips

    +

    PhD student in Robotics, CMU

    + + diff --git a/static/archive/legacy-drupal/content/pages/0024-mike-phillips.json b/static/archive/legacy-drupal/content/pages/0024-mike-phillips.json new file mode 100644 index 0000000..aeb1c20 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0024-mike-phillips.json @@ -0,0 +1,27 @@ +{ + "nid": 24, + "vid": 24, + "type": "page", + "language": "und", + "title": "Mike Phillips", + "slug": "mike-phillips", + "uid": 27, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599574, + "changed": 1345840108, + "url_aliases": [ + "MikePhillips" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    PhD student in Robotics, CMU

    \r\n", + "body_markdown": "PhD student in Robotics, CMU\n", + "body_html_raw": "

    PhD student in Robotics, CMU

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0024-mike-phillips.md b/static/archive/legacy-drupal/content/pages/0024-mike-phillips.md new file mode 100644 index 0000000..ac46861 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0024-mike-phillips.md @@ -0,0 +1,3 @@ +# Mike Phillips + +PhD student in Robotics, CMU diff --git a/static/archive/legacy-drupal/content/pages/0025-venkatraman-narayanan.html b/static/archive/legacy-drupal/content/pages/0025-venkatraman-narayanan.html new file mode 100644 index 0000000..fe9660d --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0025-venkatraman-narayanan.html @@ -0,0 +1,7 @@ + +Venkatraman Narayanan + +

    Venkatraman Narayanan

    +

    Masters student in Robotics, CMU

    + + diff --git a/static/archive/legacy-drupal/content/pages/0025-venkatraman-narayanan.json b/static/archive/legacy-drupal/content/pages/0025-venkatraman-narayanan.json new file mode 100644 index 0000000..7cb9834 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0025-venkatraman-narayanan.json @@ -0,0 +1,27 @@ +{ + "nid": 25, + "vid": 25, + "type": "page", + "language": "und", + "title": "Venkatraman Narayanan", + "slug": "venkatraman-narayanan", + "uid": 34, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599594, + "changed": 1344545585, + "url_aliases": [ + "VenkatramanNarayanan" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    Masters student in Robotics, CMU

    \r\n", + "body_markdown": "Masters student in Robotics, CMU\n", + "body_html_raw": "

    Masters student in Robotics, CMU

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0025-venkatraman-narayanan.md b/static/archive/legacy-drupal/content/pages/0025-venkatraman-narayanan.md new file mode 100644 index 0000000..3dab78d --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0025-venkatraman-narayanan.md @@ -0,0 +1,3 @@ +# Venkatraman Narayanan + +Masters student in Robotics, CMU diff --git a/static/archive/legacy-drupal/content/pages/0026-alex-kushleyev.html b/static/archive/legacy-drupal/content/pages/0026-alex-kushleyev.html new file mode 100644 index 0000000..ff0085c --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0026-alex-kushleyev.html @@ -0,0 +1,7 @@ + +Alex Kushleyev + +

    Alex Kushleyev

    +

    Reasearch Staff

    + + diff --git a/static/archive/legacy-drupal/content/pages/0026-alex-kushleyev.json b/static/archive/legacy-drupal/content/pages/0026-alex-kushleyev.json new file mode 100644 index 0000000..ee72841 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0026-alex-kushleyev.json @@ -0,0 +1,27 @@ +{ + "nid": 26, + "vid": 26, + "type": "page", + "language": "und", + "title": "Alex Kushleyev", + "slug": "alex-kushleyev", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599726, + "changed": 1344135537, + "url_aliases": [ + "AlexKushleyev" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    Reasearch Staff

    \r\n", + "body_markdown": "Reasearch Staff\n", + "body_html_raw": "

    Reasearch Staff

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0026-alex-kushleyev.md b/static/archive/legacy-drupal/content/pages/0026-alex-kushleyev.md new file mode 100644 index 0000000..0b9c018 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0026-alex-kushleyev.md @@ -0,0 +1,3 @@ +# Alex Kushleyev + +Reasearch Staff diff --git a/static/archive/legacy-drupal/content/pages/0027-harsh-pandey.html b/static/archive/legacy-drupal/content/pages/0027-harsh-pandey.html new file mode 100644 index 0000000..e3f2af8 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0027-harsh-pandey.html @@ -0,0 +1,7 @@ + +Harsh Pandey + +

    Harsh Pandey

    +

    Summer Intern

    + + diff --git a/static/archive/legacy-drupal/content/pages/0027-harsh-pandey.json b/static/archive/legacy-drupal/content/pages/0027-harsh-pandey.json new file mode 100644 index 0000000..5baed09 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0027-harsh-pandey.json @@ -0,0 +1,27 @@ +{ + "nid": 27, + "vid": 27, + "type": "page", + "language": "und", + "title": "Harsh Pandey", + "slug": "harsh-pandey", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599759, + "changed": 1344135614, + "url_aliases": [ + "HarshPandey" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    Summer Intern

    \r\n", + "body_markdown": "Summer Intern\n", + "body_html_raw": "

    Summer Intern

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0027-harsh-pandey.md b/static/archive/legacy-drupal/content/pages/0027-harsh-pandey.md new file mode 100644 index 0000000..4a1a5aa --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0027-harsh-pandey.md @@ -0,0 +1,3 @@ +# Harsh Pandey + +Summer Intern diff --git a/static/archive/legacy-drupal/content/pages/0028-kavan-mceachern.html b/static/archive/legacy-drupal/content/pages/0028-kavan-mceachern.html new file mode 100644 index 0000000..5b8d0d3 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0028-kavan-mceachern.html @@ -0,0 +1,7 @@ + +Kavan McEachern + +

    Kavan McEachern

    +

    Summer Intern

    + + diff --git a/static/archive/legacy-drupal/content/pages/0028-kavan-mceachern.json b/static/archive/legacy-drupal/content/pages/0028-kavan-mceachern.json new file mode 100644 index 0000000..8110d39 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0028-kavan-mceachern.json @@ -0,0 +1,27 @@ +{ + "nid": 28, + "vid": 28, + "type": "page", + "language": "und", + "title": "Kavan McEachern", + "slug": "kavan-mceachern", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599780, + "changed": 1344135621, + "url_aliases": [ + "KavanMcEachern" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    Summer Intern

    \r\n", + "body_markdown": "Summer Intern\n", + "body_html_raw": "

    Summer Intern

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0028-kavan-mceachern.md b/static/archive/legacy-drupal/content/pages/0028-kavan-mceachern.md new file mode 100644 index 0000000..503dbda --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0028-kavan-mceachern.md @@ -0,0 +1,3 @@ +# Kavan McEachern + +Summer Intern diff --git a/static/archive/legacy-drupal/content/pages/0029-matthew-mac-allister.html b/static/archive/legacy-drupal/content/pages/0029-matthew-mac-allister.html new file mode 100644 index 0000000..31d9e20 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0029-matthew-mac-allister.html @@ -0,0 +1,7 @@ + +Matthew Mac Allister + +

    Matthew Mac Allister

    +

    Summer Intern 2012

    + + diff --git a/static/archive/legacy-drupal/content/pages/0029-matthew-mac-allister.json b/static/archive/legacy-drupal/content/pages/0029-matthew-mac-allister.json new file mode 100644 index 0000000..67100cb --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0029-matthew-mac-allister.json @@ -0,0 +1,27 @@ +{ + "nid": 29, + "vid": 29, + "type": "page", + "language": "und", + "title": "Matthew Mac Allister", + "slug": "matthew-mac-allister", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341599803, + "changed": 1370637730, + "url_aliases": [ + "MatthewMacAllister" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "
    \r\n", + "body_html_rewritten": "

    Summer Intern 2012

    \r\n", + "body_markdown": "Summer Intern 2012\n", + "body_html_raw": "

    Summer Intern 2012

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0029-matthew-mac-allister.md b/static/archive/legacy-drupal/content/pages/0029-matthew-mac-allister.md new file mode 100644 index 0000000..f6b96dd --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0029-matthew-mac-allister.md @@ -0,0 +1,3 @@ +# Matthew Mac Allister + +Summer Intern 2012 diff --git a/static/archive/legacy-drupal/content/pages/0030-contact.html b/static/archive/legacy-drupal/content/pages/0030-contact.html new file mode 100644 index 0000000..5c3c610 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0030-contact.html @@ -0,0 +1,22 @@ + +Contact + +

    Contact

    +

    Physical Address:
    + 1612 Newell Simon Hall
    + Carnegie Mellon University
    + Pittsburgh, PA 15217
    +
    + Mailing Address:
    + Maxim Likhachev
    + Carnegie Mellon University - Robotics Institute
    + 5000 Forbes Ave
    + Pittsburgh, PA, 15217

    +
    +  
    +
    + To get updates and announcements, please join the sbpl-users mailing list by signing up here.
    +

    Email any comments to us at: a*************h@gmail.com

    +

    + + diff --git a/static/archive/legacy-drupal/content/pages/0030-contact.json b/static/archive/legacy-drupal/content/pages/0030-contact.json new file mode 100644 index 0000000..257fc9b --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0030-contact.json @@ -0,0 +1,27 @@ +{ + "nid": 30, + "vid": 30, + "type": "page", + "language": "und", + "title": "Contact", + "slug": "contact", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 1, + "comment": 1, + "created": 1341860373, + "changed": 1407243685, + "url_aliases": [ + "Contact" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    Physical Address:
    \r\n\t1612 Newell Simon Hall
    \r\n\tCarnegie Mellon University
    \r\n\tPittsburgh, PA 15217
    \r\n\t
    \r\n\tMailing Address:
    \r\n\tMaxim Likhachev
    \r\n\tCarnegie Mellon University - Robotics Institute
    \r\n\t5000 Forbes Ave
    \r\n\tPittsburgh, PA, 15217

    \r\n
    \r\n\t 
    \r\n
    \r\n\tTo get updates and announcements, please join the sbpl-users mailing list by signing up here.
    \r\n

    Email any comments to us at: a*************h@gmail.com

    \r\n

    \r\n", + "body_markdown": "Physical Address:\n 1612 Newell Simon Hall\n Carnegie Mellon University\n Pittsburgh, PA 15217\n\n Mailing Address:\n Maxim Likhachev\n Carnegie Mellon University - Robotics Institute\n 5000 Forbes Ave\n Pittsburgh, PA, 15217\n\n To get updates and announcements, please join the* sbpl-users* mailing list by signing up [here](https://groups.google.com/forum/#!forum/sbpl-users).\n\nEmail any comments to us at: a*************h@gmail.com\n", + "body_html_raw": "

    Physical Address:
    \r\n\t1612 Newell Simon Hall
    \r\n\tCarnegie Mellon University
    \r\n\tPittsburgh, PA 15217
    \r\n\t
    \r\n\tMailing Address:
    \r\n\tMaxim Likhachev
    \r\n\tCarnegie Mellon University - Robotics Institute
    \r\n\t5000 Forbes Ave
    \r\n\tPittsburgh, PA, 15217

    \r\n
    \r\n\t 
    \r\n
    \r\n\tTo get updates and announcements, please join the sbpl-users mailing list by signing up here.
    \r\n

    Email any comments to us at: a*************h@gmail.com

    \r\n

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0030-contact.md b/static/archive/legacy-drupal/content/pages/0030-contact.md new file mode 100644 index 0000000..498e3c0 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0030-contact.md @@ -0,0 +1,16 @@ +# Contact + +Physical Address: + 1612 Newell Simon Hall + Carnegie Mellon University + Pittsburgh, PA 15217 + + Mailing Address: + Maxim Likhachev + Carnegie Mellon University - Robotics Institute + 5000 Forbes Ave + Pittsburgh, PA, 15217 + + To get updates and announcements, please join the* sbpl-users* mailing list by signing up [here](https://groups.google.com/forum/#!forum/sbpl-users). + +Email any comments to us at: a*************h@gmail.com diff --git a/static/archive/legacy-drupal/content/pages/0031-login.html b/static/archive/legacy-drupal/content/pages/0031-login.html new file mode 100644 index 0000000..b847380 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0031-login.html @@ -0,0 +1,6 @@ + +Login + +

    Login

    + + diff --git a/static/archive/legacy-drupal/content/pages/0031-login.json b/static/archive/legacy-drupal/content/pages/0031-login.json new file mode 100644 index 0000000..fa86430 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0031-login.json @@ -0,0 +1,27 @@ +{ + "nid": 31, + "vid": 31, + "type": "page", + "language": "und", + "title": "Login", + "slug": "login", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 1, + "comment": 1, + "created": 1341861515, + "changed": 1344145057, + "url_aliases": [ + "Login" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "", + "body_summary": "", + "body_html_rewritten": "", + "body_markdown": "\n", + "body_html_raw": "", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0031-login.md b/static/archive/legacy-drupal/content/pages/0031-login.md new file mode 100644 index 0000000..55041b8 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0031-login.md @@ -0,0 +1,3 @@ +# Login + + diff --git a/static/archive/legacy-drupal/content/pages/0032-software.html b/static/archive/legacy-drupal/content/pages/0032-software.html new file mode 100644 index 0000000..ec233ff --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0032-software.html @@ -0,0 +1,229 @@ + +Software + +

    Software

    +

    For additional help running our software please see the tutorials page.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    + Projects

    +
    +

    + Description

    +
    +

    + Software

    +
    +

    + Documentation

    +
    +

    SBPL

    +
    +

    no dependencies!

    +
    +

    Repo (git)

    +
    + ROS Wiki
    +

    SBPL MoveIt! Plugin

    +
    +

    Generic Plugin for MoveIt!

    +
    +

    SBPL Geometry Utilities (git)

    +

    Leatherman Utilities (git)

    +

    SBPL Manipulation Package (git)

    +

    Core Repository (git)

    +

    PR2 Configuration Repository (git)

    +
    +
    +

    3D Navigation with Full Body Collision Checking

    +
    +

    global planner for move_base,

    +

    PR2 Only

    +

     

    +
    +

    ROS Electric (git)

    +
    + ROS Wiki
    +

    3D Navigation

    +

    (“Lattice Planner”)

    +
    +

    global planner for move_base

    +
    +

    ROS Diamondback, Electric (hg)

    +

    ROS Fuerte, Groovy (hg)

    +

    ROS Hydro (Github fork 1) (git)

    +

    ROS Hydro (Github fork 2) (git)

    +
    +

    ROS Wiki

    +

    RSS 2008

    +
    +

    Single Arm Planning

    +
    +

    can be used with arm_navigation stack (move_arm),

    +

    PR2 Only 

    +

    Any Robot (experimental, Groovy only)

    +
    +

     

    +

    Repositories

    +
    +

    ROS Wiki

    +

    ICRA 2010

    +

    ICRA 2011

    +
    +

    Dual Arm Planning

    +
    +

    PR2 Only

    +
    +

    ROS Diamondback (svn)

    +
    +

    ICRA 2012

    +
    +

    Navigation in Dynamic Environment

    +
    +

     

    +
    +

    ROS Diamondback (svn)

    +
    +

    ROS Wiki

    +

    ICRA 2011

    +

    AAAI 2011

    +
    + Cart Planning +   + svn + ROS WIKI
    + Door Planning +   + svn +  
    + Experience Graphs + E-Graphs are built from experience (previously planned paths or user demonstrations). The planner is able to reuse parts of these prior paths to plan faster.  +

    E-Graphs git (branch v3)

    +

    PR2 fully body planning integration git (branch v3)

    +

    Arm and navigation integration git (branch v3)

    +
    +

    E-Graph documentation

    +

    Full body planning documentation

    +

    Arm and navigation documentation

    +

    RSS 2012

    +

    ICRA 2013

    +
    +
    +

     

    +

     

    + + + + + + + + + + + + + + + +
    +

    + Utilities

    +
    +

    + Description

    +
    +

    + Repository

    +
    +

    + Documentation

    +
    +

    PViz

    +
    +

    PR2 Visualization Library - With one function call, you can visualize the PR2 in RViz with any joint configuration. The original meshes are drawn in as visualization markers.

    +

    Note: Currently, the robot is drawn without a head :)

    +
    +

    ROS Electric (svn)

    +

    ROS Fuerte (git)

    +
    + none...but it's pretty simple to use
    +

     

    + + diff --git a/static/archive/legacy-drupal/content/pages/0032-software.json b/static/archive/legacy-drupal/content/pages/0032-software.json new file mode 100644 index 0000000..ef24b30 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0032-software.json @@ -0,0 +1,27 @@ +{ + "nid": 32, + "vid": 32, + "type": "page", + "language": "und", + "title": "Software", + "slug": "software", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 1, + "comment": 1, + "created": 1341862175, + "changed": 1452290132, + "url_aliases": [ + "Software" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    For additional help running our software please see the tutorials page.

    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n

    \r\n Projects

    \r\n
    \r\n

    \r\n Description

    \r\n
    \r\n

    \r\n Software

    \r\n
    \r\n

    \r\n Documentation

    \r\n
    \r\n

    SBPL

    \r\n
    \r\n

    no dependencies!

    \r\n
    \r\n

    Repo (git)

    \r\n
    \r\n ROS Wiki
    \r\n

    SBPL MoveIt! Plugin

    \r\n
    \r\n

    Generic Plugin for MoveIt!

    \r\n
    \r\n

    SBPL Geometry Utilities (git)

    \r\n

    Leatherman Utilities (git)

    \r\n

    SBPL Manipulation Package (git)

    \r\n

    Core Repository (git)

    \r\n

    PR2 Configuration Repository (git)

    \r\n
    \r\n
    \r\n

    3D Navigation with Full Body Collision Checking

    \r\n
    \r\n

    global planner for move_base,

    \r\n

    PR2 Only

    \r\n

     

    \r\n
    \r\n

    ROS Electric (git)

    \r\n
    \r\n ROS Wiki
    \r\n

    3D Navigation

    \r\n

    (“Lattice Planner”)

    \r\n
    \r\n

    global planner for move_base

    \r\n
    \r\n

    ROS Diamondback, Electric (hg)

    \r\n

    ROS Fuerte, Groovy (hg)

    \r\n

    ROS Hydro (Github fork 1) (git)

    \r\n

    ROS Hydro (Github fork 2) (git)

    \r\n
    \r\n

    ROS Wiki

    \r\n

    RSS 2008

    \r\n
    \r\n

    Single Arm Planning

    \r\n
    \r\n

    can be used with arm_navigation stack (move_arm),

    \r\n

    PR2 Only 

    \r\n

    Any Robot (experimental, Groovy only)

    \r\n
    \r\n

     

    \r\n

    Repositories

    \r\n
    \r\n

    ROS Wiki

    \r\n

    ICRA 2010

    \r\n

    ICRA 2011

    \r\n
    \r\n

    Dual Arm Planning

    \r\n
    \r\n

    PR2 Only

    \r\n
    \r\n

    ROS Diamondback (svn)

    \r\n
    \r\n

    ICRA 2012

    \r\n
    \r\n

    Navigation in Dynamic Environment

    \r\n
    \r\n

     

    \r\n
    \r\n

    ROS Diamondback (svn)

    \r\n
    \r\n

    ROS Wiki

    \r\n

    ICRA 2011

    \r\n

    AAAI 2011

    \r\n
    \r\n Cart Planning\r\n  \r\n svn\r\n ROS WIKI
    \r\n Door Planning\r\n  \r\n svn\r\n  
    \r\n Experience Graphs\r\n E-Graphs are built from experience (previously planned paths or user demonstrations). The planner is able to reuse parts of these prior paths to plan faster. \r\n

    E-Graphs git (branch v3)

    \r\n

    PR2 fully body planning integration git (branch v3)

    \r\n

    Arm and navigation integration git (branch v3)

    \r\n
    \r\n

    E-Graph documentation

    \r\n

    Full body planning documentation

    \r\n

    Arm and navigation documentation

    \r\n

    RSS 2012

    \r\n

    ICRA 2013

    \r\n
    \r\n
    \r\n

     

    \r\n

     

    \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n

    \r\n Utilities

    \r\n
    \r\n

    \r\n Description

    \r\n
    \r\n

    \r\n Repository

    \r\n
    \r\n

    \r\n Documentation

    \r\n
    \r\n

    PViz

    \r\n
    \r\n

    PR2 Visualization Library - With one function call, you can visualize the PR2 in RViz with any joint configuration. The original meshes are drawn in as visualization markers.

    \r\n

    Note: Currently, the robot is drawn without a head :)

    \r\n
    \r\n

    ROS Electric (svn)

    \r\n

    ROS Fuerte (git)

    \r\n
    \r\n none...but it's pretty simple to use
    \r\n

     

    \r\n", + "body_markdown": "For additional help running our software please see the [tutorials](http://sbpl.net/node/45) page.\n\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n

    \r\n Projects

    \r\n
    \r\n

    \r\n Description

    \r\n
    \r\n

    \r\n Software

    \r\n
    \r\n

    \r\n Documentation

    \r\n
    \r\n

    SBPL

    \r\n
    \r\n

    no dependencies!

    \r\n
    \r\n

    Repo (git)

    \r\n
    \r\n ROS Wiki
    \r\n

    SBPL MoveIt! Plugin

    \r\n
    \r\n

    Generic Plugin for MoveIt!

    \r\n
    \r\n

    SBPL Geometry Utilities (git)

    \r\n

    Leatherman Utilities (git)

    \r\n

    SBPL Manipulation Package (git)

    \r\n

    Core Repository (git)

    \r\n

    PR2 Configuration Repository (git)

    \r\n
    \r\n
    \r\n

    3D Navigation with Full Body Collision Checking

    \r\n
    \r\n

    global planner for move_base,

    \r\n

    PR2 Only

    \r\n

     

    \r\n
    \r\n

    ROS Electric (git)

    \r\n
    \r\n ROS Wiki
    \r\n

    3D Navigation

    \r\n

    (“Lattice Planner”)

    \r\n
    \r\n

    global planner for move_base

    \r\n
    \r\n

    ROS Diamondback, Electric (hg)

    \r\n

    ROS Fuerte, Groovy (hg)

    \r\n

    ROS Hydro (Github fork 1) (git)

    \r\n

    ROS Hydro (Github fork 2) (git)

    \r\n
    \r\n

    ROS Wiki

    \r\n

    RSS 2008

    \r\n
    \r\n

    Single Arm Planning

    \r\n
    \r\n

    can be used with arm_navigation stack (move_arm),

    \r\n

    PR2 Only 

    \r\n

    Any Robot (experimental, Groovy only)

    \r\n
    \r\n

     

    \r\n

    Repositories

    \r\n
    \r\n

    ROS Wiki

    \r\n

    ICRA 2010

    \r\n

    ICRA 2011

    \r\n
    \r\n

    Dual Arm Planning

    \r\n
    \r\n

    PR2 Only

    \r\n
    \r\n

    ROS Diamondback (svn)

    \r\n
    \r\n

    ICRA 2012

    \r\n
    \r\n

    Navigation in Dynamic Environment

    \r\n
    \r\n

     

    \r\n
    \r\n

    ROS Diamondback (svn)

    \r\n
    \r\n

    ROS Wiki

    \r\n

    ICRA 2011

    \r\n

    AAAI 2011

    \r\n
    \r\n Cart Planning\r\n  \r\n svn\r\n ROS WIKI
    \r\n Door Planning\r\n  \r\n svn\r\n  
    \r\n Experience Graphs\r\n E-Graphs are built from experience (previously planned paths or user demonstrations). The planner is able to reuse parts of these prior paths to plan faster. \r\n

    E-Graphs git (branch v3)

    \r\n

    PR2 fully body planning integration git (branch v3)

    \r\n

    Arm and navigation integration git (branch v3)

    \r\n
    \r\n

    E-Graph documentation

    \r\n

    Full body planning documentation

    \r\n

    Arm and navigation documentation

    \r\n

    RSS 2012

    \r\n

    ICRA 2013

    \r\n
    \n\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n

    \r\n Utilities

    \r\n
    \r\n

    \r\n Description

    \r\n
    \r\n

    \r\n Repository

    \r\n
    \r\n

    \r\n Documentation

    \r\n
    \r\n

    PViz

    \r\n
    \r\n

    PR2 Visualization Library - With one function call, you can visualize the PR2 in RViz with any joint configuration. The original meshes are drawn in as visualization markers.

    \r\n

    Note: Currently, the robot is drawn without a head :)

    \r\n
    \r\n

    ROS Electric (svn)

    \r\n

    ROS Fuerte (git)

    \r\n
    \r\n none...but it's pretty simple to use
    \n", + "body_html_raw": "

    For additional help running our software please see the tutorials page.

    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n

    \r\n Projects

    \r\n
    \r\n

    \r\n Description

    \r\n
    \r\n

    \r\n Software

    \r\n
    \r\n

    \r\n Documentation

    \r\n
    \r\n

    SBPL

    \r\n
    \r\n

    no dependencies!

    \r\n
    \r\n

    Repo (git)

    \r\n
    \r\n ROS Wiki
    \r\n

    SBPL MoveIt! Plugin

    \r\n
    \r\n

    Generic Plugin for MoveIt!

    \r\n
    \r\n

    SBPL Geometry Utilities (git)

    \r\n

    Leatherman Utilities (git)

    \r\n

    SBPL Manipulation Package (git)

    \r\n

    Core Repository (git)

    \r\n

    PR2 Configuration Repository (git)

    \r\n
    \r\n
    \r\n

    3D Navigation with Full Body Collision Checking

    \r\n
    \r\n

    global planner for move_base,

    \r\n

    PR2 Only

    \r\n

     

    \r\n
    \r\n

    ROS Electric (git)

    \r\n
    \r\n ROS Wiki
    \r\n

    3D Navigation

    \r\n

    (“Lattice Planner”)

    \r\n
    \r\n

    global planner for move_base

    \r\n
    \r\n

    ROS Diamondback, Electric (hg)

    \r\n

    ROS Fuerte, Groovy (hg)

    \r\n

    ROS Hydro (Github fork 1) (git)

    \r\n

    ROS Hydro (Github fork 2) (git)

    \r\n
    \r\n

    ROS Wiki

    \r\n

    RSS 2008

    \r\n
    \r\n

    Single Arm Planning

    \r\n
    \r\n

    can be used with arm_navigation stack (move_arm),

    \r\n

    PR2 Only 

    \r\n

    Any Robot (experimental, Groovy only)

    \r\n
    \r\n

     

    \r\n

    Repositories

    \r\n
    \r\n

    ROS Wiki

    \r\n

    ICRA 2010

    \r\n

    ICRA 2011

    \r\n
    \r\n

    Dual Arm Planning

    \r\n
    \r\n

    PR2 Only

    \r\n
    \r\n

    ROS Diamondback (svn)

    \r\n
    \r\n

    ICRA 2012

    \r\n
    \r\n

    Navigation in Dynamic Environment

    \r\n
    \r\n

     

    \r\n
    \r\n

    ROS Diamondback (svn)

    \r\n
    \r\n

    ROS Wiki

    \r\n

    ICRA 2011

    \r\n

    AAAI 2011

    \r\n
    \r\n Cart Planning\r\n  \r\n svn\r\n ROS WIKI
    \r\n Door Planning\r\n  \r\n svn\r\n  
    \r\n Experience Graphs\r\n E-Graphs are built from experience (previously planned paths or user demonstrations). The planner is able to reuse parts of these prior paths to plan faster. \r\n

    E-Graphs git (branch v3)

    \r\n

    PR2 fully body planning integration git (branch v3)

    \r\n

    Arm and navigation integration git (branch v3)

    \r\n
    \r\n

    E-Graph documentation

    \r\n

    Full body planning documentation

    \r\n

    Arm and navigation documentation

    \r\n

    RSS 2012

    \r\n

    ICRA 2013

    \r\n
    \r\n
    \r\n

     

    \r\n

     

    \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n

    \r\n Utilities

    \r\n
    \r\n

    \r\n Description

    \r\n
    \r\n

    \r\n Repository

    \r\n
    \r\n

    \r\n Documentation

    \r\n
    \r\n

    PViz

    \r\n
    \r\n

    PR2 Visualization Library - With one function call, you can visualize the PR2 in RViz with any joint configuration. The original meshes are drawn in as visualization markers.

    \r\n

    Note: Currently, the robot is drawn without a head :)

    \r\n
    \r\n

    ROS Electric (svn)

    \r\n

    ROS Fuerte (git)

    \r\n
    \r\n none...but it's pretty simple to use
    \r\n

     

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0032-software.md b/static/archive/legacy-drupal/content/pages/0032-software.md new file mode 100644 index 0000000..fbca60e --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0032-software.md @@ -0,0 +1,222 @@ +# Software + +For additional help running our software please see the [tutorials](http://sbpl.net/node/45) page. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    + Projects

    +
    +

    + Description

    +
    +

    + Software

    +
    +

    + Documentation

    +
    +

    SBPL

    +
    +

    no dependencies!

    +
    +

    Repo (git)

    +
    + ROS Wiki
    +

    SBPL MoveIt! Plugin

    +
    +

    Generic Plugin for MoveIt!

    +
    +

    SBPL Geometry Utilities (git)

    +

    Leatherman Utilities (git)

    +

    SBPL Manipulation Package (git)

    +

    Core Repository (git)

    +

    PR2 Configuration Repository (git)

    +
    +
    +

    3D Navigation with Full Body Collision Checking

    +
    +

    global planner for move_base,

    +

    PR2 Only

    +

     

    +
    +

    ROS Electric (git)

    +
    + ROS Wiki
    +

    3D Navigation

    +

    (“Lattice Planner”)

    +
    +

    global planner for move_base

    +
    +

    ROS Diamondback, Electric (hg)

    +

    ROS Fuerte, Groovy (hg)

    +

    ROS Hydro (Github fork 1) (git)

    +

    ROS Hydro (Github fork 2) (git)

    +
    +

    ROS Wiki

    +

    RSS 2008

    +
    +

    Single Arm Planning

    +
    +

    can be used with arm_navigation stack (move_arm),

    +

    PR2 Only 

    +

    Any Robot (experimental, Groovy only)

    +
    +

     

    +

    Repositories

    +
    +

    ROS Wiki

    +

    ICRA 2010

    +

    ICRA 2011

    +
    +

    Dual Arm Planning

    +
    +

    PR2 Only

    +
    +

    ROS Diamondback (svn)

    +
    +

    ICRA 2012

    +
    +

    Navigation in Dynamic Environment

    +
    +

     

    +
    +

    ROS Diamondback (svn)

    +
    +

    ROS Wiki

    +

    ICRA 2011

    +

    AAAI 2011

    +
    + Cart Planning +   + svn + ROS WIKI
    + Door Planning +   + svn +  
    + Experience Graphs + E-Graphs are built from experience (previously planned paths or user demonstrations). The planner is able to reuse parts of these prior paths to plan faster.  +

    E-Graphs git (branch v3)

    +

    PR2 fully body planning integration git (branch v3)

    +

    Arm and navigation integration git (branch v3)

    +
    +

    E-Graph documentation

    +

    Full body planning documentation

    +

    Arm and navigation documentation

    +

    RSS 2012

    +

    ICRA 2013

    +
    + + + + + + + + + + + + + + + + +
    +

    + Utilities

    +
    +

    + Description

    +
    +

    + Repository

    +
    +

    + Documentation

    +
    +

    PViz

    +
    +

    PR2 Visualization Library - With one function call, you can visualize the PR2 in RViz with any joint configuration. The original meshes are drawn in as visualization markers.

    +

    Note: Currently, the robot is drawn without a head :)

    +
    +

    ROS Electric (svn)

    +

    ROS Fuerte (git)

    +
    + none...but it's pretty simple to use
    diff --git a/static/archive/legacy-drupal/content/pages/0033-untitled-33.html b/static/archive/legacy-drupal/content/pages/0033-untitled-33.html new file mode 100644 index 0000000..3e0c563 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0033-untitled-33.html @@ -0,0 +1,7 @@ + +untitled-33 + +

    untitled-33

    +

    + + diff --git a/static/archive/legacy-drupal/content/pages/0033-untitled-33.json b/static/archive/legacy-drupal/content/pages/0033-untitled-33.json new file mode 100644 index 0000000..0b047e0 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0033-untitled-33.json @@ -0,0 +1,27 @@ +{ + "nid": 33, + "vid": 33, + "type": "page", + "language": "und", + "title": "untitled-33", + "slug": "untitled-33", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1341862226, + "changed": 1344633456, + "url_aliases": [ + "Files" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    \r\n", + "body_markdown": "\n", + "body_html_raw": "

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0033-untitled-33.md b/static/archive/legacy-drupal/content/pages/0033-untitled-33.md new file mode 100644 index 0000000..51bb3c9 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0033-untitled-33.md @@ -0,0 +1,3 @@ +# untitled-33 + + diff --git a/static/archive/legacy-drupal/content/pages/0039-eduardo-barrera.html b/static/archive/legacy-drupal/content/pages/0039-eduardo-barrera.html new file mode 100644 index 0000000..fc55b7c --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0039-eduardo-barrera.html @@ -0,0 +1,7 @@ + +Eduardo Barrera + +

    Eduardo Barrera

    +

    Summer Intern

    + + diff --git a/static/archive/legacy-drupal/content/pages/0039-eduardo-barrera.json b/static/archive/legacy-drupal/content/pages/0039-eduardo-barrera.json new file mode 100644 index 0000000..2c954bb --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0039-eduardo-barrera.json @@ -0,0 +1,27 @@ +{ + "nid": 39, + "vid": 39, + "type": "page", + "language": "und", + "title": "Eduardo Barrera", + "slug": "eduardo-barrera", + "uid": 28, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1344136653, + "changed": 1344184701, + "url_aliases": [ + "EduardoBarrera" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    Summer Intern

    \r\n", + "body_markdown": "Summer Intern\n", + "body_html_raw": "

    Summer Intern

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0039-eduardo-barrera.md b/static/archive/legacy-drupal/content/pages/0039-eduardo-barrera.md new file mode 100644 index 0000000..480f358 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0039-eduardo-barrera.md @@ -0,0 +1,3 @@ +# Eduardo Barrera + +Summer Intern diff --git a/static/archive/legacy-drupal/content/pages/0042-old-software.html b/static/archive/legacy-drupal/content/pages/0042-old-software.html new file mode 100644 index 0000000..d7afb6c --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0042-old-software.html @@ -0,0 +1,60 @@ + +Old Software + +

    Old Software

    + +
    + +
    + +
    + + +
    + + + diff --git a/static/archive/legacy-drupal/content/pages/0042-old-software.json b/static/archive/legacy-drupal/content/pages/0042-old-software.json new file mode 100644 index 0000000..2ca2ab6 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0042-old-software.json @@ -0,0 +1,27 @@ +{ + "nid": 42, + "vid": 42, + "type": "page", + "language": "und", + "title": "Old Software", + "slug": "old-software", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1344526290, + "changed": 1344526321, + "url_aliases": [ + "OldSoftwarePage" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "\r\n
    \r\n\r\n
    \r\n
      \r\n\t
    • \r\n\t\tLattice Planner
    • \r\n\t
    • \r\n\t\tWiki Page
    • \r\n
    \r\n
    \r\n\r\n\r\n
    \r\n
      \r\n\t
    • \r\n\t\tDynamic Environment Navigation Planner (SIPP)
    • \r\n\t
    • \r\n\t\tWiki Page
    • \r\n\t
    • \r\n\t\tRepository
    • \r\n
    \r\n", + "body_markdown": "- **SBPL**\n- [Wiki Page](http://www.ros.org/wiki/sbpl)\n- [Repository](https://kforge.ros.org/sbpl/sbpl)\n\n- **3D Navigation Planner**\n- [http://www.ros.org/wiki/sbpl_3dnav_planner](http://www.ros.org/wiki/sbpl_3dnav_planner)\n\n- **Lattice Planner**\n- [Wiki Page](http://www.ros.org/wiki/sbpl_lattice_planner)\n\n- **Arm Planner (PR2 only)**\n- [Wiki Page](http://www.ros.org/wiki/sbpl_arm_planner)\n- [ROS Diamondback](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/tags/diamondback/)\n- [ROS Electric](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/electric/)\n- [ROS Fuerte](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/trunk/)\n\n-\n- **Full Body Navigation Planner (PR2 only)**\n- [Repository](https://sbpl.pc.cs.cmu.edu/redmine/projects/full-body-nav)\n- [Some Documentation](https://kforge.ros.org/Sushi/trac/wiki/Navigation)\n\n- **Dynamic Environment Navigation Planner (SIPP)**\n- [Wiki Page](http://www.ros.org/wiki/sbpl_dynamic_env)\n- [Repository](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_dynamic_env/trunk)\n", + "body_html_raw": "\r\n
    \r\n\r\n
    \r\n
      \r\n\t
    • \r\n\t\tLattice Planner
    • \r\n\t
    • \r\n\t\tWiki Page
    • \r\n
    \r\n
    \r\n\r\n\r\n
    \r\n
      \r\n\t
    • \r\n\t\tDynamic Environment Navigation Planner (SIPP)
    • \r\n\t
    • \r\n\t\tWiki Page
    • \r\n\t
    • \r\n\t\tRepository
    • \r\n
    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0042-old-software.md b/static/archive/legacy-drupal/content/pages/0042-old-software.md new file mode 100644 index 0000000..aa85035 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0042-old-software.md @@ -0,0 +1,26 @@ +# Old Software + +- **SBPL** +- [Wiki Page](http://www.ros.org/wiki/sbpl) +- [Repository](https://kforge.ros.org/sbpl/sbpl) + +- **3D Navigation Planner** +- [http://www.ros.org/wiki/sbpl_3dnav_planner](http://www.ros.org/wiki/sbpl_3dnav_planner) + +- **Lattice Planner** +- [Wiki Page](http://www.ros.org/wiki/sbpl_lattice_planner) + +- **Arm Planner (PR2 only)** +- [Wiki Page](http://www.ros.org/wiki/sbpl_arm_planner) +- [ROS Diamondback](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/tags/diamondback/) +- [ROS Electric](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/electric/) +- [ROS Fuerte](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/trunk/) + +- +- **Full Body Navigation Planner (PR2 only)** +- [Repository](https://sbpl.pc.cs.cmu.edu/redmine/projects/full-body-nav) +- [Some Documentation](https://kforge.ros.org/Sushi/trac/wiki/Navigation) + +- **Dynamic Environment Navigation Planner (SIPP)** +- [Wiki Page](http://www.ros.org/wiki/sbpl_dynamic_env) +- [Repository](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_dynamic_env/trunk) diff --git a/static/archive/legacy-drupal/content/pages/0043-sandip-aine.html b/static/archive/legacy-drupal/content/pages/0043-sandip-aine.html new file mode 100644 index 0000000..5f2d55b --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0043-sandip-aine.html @@ -0,0 +1,7 @@ + +Sandip Aine + +

    Sandip Aine

    +

    sandip needs to add text here

    + + diff --git a/static/archive/legacy-drupal/content/pages/0043-sandip-aine.json b/static/archive/legacy-drupal/content/pages/0043-sandip-aine.json new file mode 100644 index 0000000..249d9ad --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0043-sandip-aine.json @@ -0,0 +1,27 @@ +{ + "nid": 43, + "vid": 43, + "type": "page", + "language": "und", + "title": "Sandip Aine", + "slug": "sandip-aine", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1344546132, + "changed": 1344546132, + "url_aliases": [ + "SandipAine" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    sandip needs to add text here

    \r\n", + "body_markdown": "sandip needs to add text here\n", + "body_html_raw": "

    sandip needs to add text here

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0043-sandip-aine.md b/static/archive/legacy-drupal/content/pages/0043-sandip-aine.md new file mode 100644 index 0000000..fb160d2 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0043-sandip-aine.md @@ -0,0 +1,3 @@ +# Sandip Aine + +sandip needs to add text here diff --git a/static/archive/legacy-drupal/content/pages/0044-calendar.html b/static/archive/legacy-drupal/content/pages/0044-calendar.html new file mode 100644 index 0000000..5a5203d --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0044-calendar.html @@ -0,0 +1,7 @@ + +Calendar + +

    Calendar

    +

    + + diff --git a/static/archive/legacy-drupal/content/pages/0044-calendar.json b/static/archive/legacy-drupal/content/pages/0044-calendar.json new file mode 100644 index 0000000..0e38e84 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0044-calendar.json @@ -0,0 +1,27 @@ +{ + "nid": 44, + "vid": 44, + "type": "page", + "language": "und", + "title": "Calendar", + "slug": "calendar", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1344610832, + "changed": 1344656638, + "url_aliases": [ + "Calender" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    \r\n", + "body_markdown": "\n", + "body_html_raw": "

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0044-calendar.md b/static/archive/legacy-drupal/content/pages/0044-calendar.md new file mode 100644 index 0000000..b2788e6 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0044-calendar.md @@ -0,0 +1,3 @@ +# Calendar + + diff --git a/static/archive/legacy-drupal/content/pages/0045-tutorials.html b/static/archive/legacy-drupal/content/pages/0045-tutorials.html new file mode 100644 index 0000000..6cfea25 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0045-tutorials.html @@ -0,0 +1,28 @@ + +Tutorials + +

    Tutorials

    +

    + Primer to the Search-Based Planning Library (SBPL)

    +

    Learn the basic theory behind graph search and SBPL.

    +

    + SBPL Overview

    +

    This has a brief overview of how SBPL is organized.

    +

    + Planning with SBPL: Example in X, Y, Theta State Space

    +

    This has example code for planning with a 2d footprint of a robot in X, Y, and theta dimensions.

    +

    + Navigation with SBPL

    +

    This builds on the previous tutorial to handle exploring an unknown environment.

    +

    + Kinematic Constraints and Motion Primitives

    +

    An introduction to how kinematic constraints are dealt with in SBPL.

    +

    + Generating Motion Primitives

    +

    How to use the Matlab scripts in SBPL to generate custom motion primitives.

    +

    + Forward Arc Motion Primitives

    +

    + Buliding, Installing, and Using SBPL

    + + diff --git a/static/archive/legacy-drupal/content/pages/0045-tutorials.json b/static/archive/legacy-drupal/content/pages/0045-tutorials.json new file mode 100644 index 0000000..668bc5c --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0045-tutorials.json @@ -0,0 +1,27 @@ +{ + "nid": 45, + "vid": 45, + "type": "page", + "language": "und", + "title": "Tutorials", + "slug": "tutorials", + "uid": 36, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1366912385, + "changed": 1382110193, + "url_aliases": [ + "Tutorials" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "

    \r\n\tPrimer to the Search-Based Planning Library (SBPL)

    \r\n

    Learn the basic theory behind graph search and SBPL.

    \r\n

    \r\n\tSBPL Overview

    \r\n

    This has a brief overview of how SBPL is organized.

    \r\n

    \r\n\tPlanning with SBPL: Example in X, Y, Theta State Space

    \r\n

    This has example code for planning with a 2d footprint of a robot in X, Y, and theta dimensions.

    \r\n

    \r\n\tNavigation with SBPL

    \r\n

    This builds on the previous tutorial to handle exploring an unknown environment.

    \r\n

    \r\n\tKinematic Constraints and Motion Primitives

    \r\n

    An introduction to how kinematic constraints are dealt with in SBPL.

    \r\n

    \r\n\tGenerating Motion Primitives

    \r\n

    How to use the Matlab scripts in SBPL to generate custom motion primitives.

    \r\n

    \r\n\tForward Arc Motion Primitives

    \r\n

    \r\n\tBuliding, Installing, and Using SBPL

    \r\n", + "body_markdown": "## [Primer to the Search-Based Planning Library (SBPL)](http://sbpl.net/node/50)\n\nLearn the basic theory behind graph search and SBPL.\n\n## [SBPL Overview](http://sbpl.net/node/47)\n\nThis has a brief overview of how SBPL is organized.\n\n## [Planning with SBPL: Example in X, Y, Theta State Space](http://sbpl.net/node/51)\n\nThis has example code for planning with a 2d footprint of a robot in X, Y, and theta dimensions.\n\n## [Navigation with SBPL](http://sbpl.net/node/46)\n\nThis builds on the previous tutorial to handle exploring an unknown environment.\n\n## [Kinematic Constraints and Motion Primitives](http://sbpl.net/node/48)\n\nAn introduction to how kinematic constraints are dealt with in SBPL.\n\n## [Generating Motion Primitives](http://sbpl.net/node/52)\n\nHow to use the Matlab scripts in SBPL to generate custom motion primitives.\n\n## [Forward Arc Motion Primitives](http://sbpl.net/node/53)\n\n## [Buliding, Installing, and Using SBPL](http://sbpl.net/node/54)\n", + "body_html_raw": "

    \r\n\tPrimer to the Search-Based Planning Library (SBPL)

    \r\n

    Learn the basic theory behind graph search and SBPL.

    \r\n

    \r\n\tSBPL Overview

    \r\n

    This has a brief overview of how SBPL is organized.

    \r\n

    \r\n\tPlanning with SBPL: Example in X, Y, Theta State Space

    \r\n

    This has example code for planning with a 2d footprint of a robot in X, Y, and theta dimensions.

    \r\n

    \r\n\tNavigation with SBPL

    \r\n

    This builds on the previous tutorial to handle exploring an unknown environment.

    \r\n

    \r\n\tKinematic Constraints and Motion Primitives

    \r\n

    An introduction to how kinematic constraints are dealt with in SBPL.

    \r\n

    \r\n\tGenerating Motion Primitives

    \r\n

    How to use the Matlab scripts in SBPL to generate custom motion primitives.

    \r\n

    \r\n\tForward Arc Motion Primitives

    \r\n

    \r\n\tBuliding, Installing, and Using SBPL

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0045-tutorials.md b/static/archive/legacy-drupal/content/pages/0045-tutorials.md new file mode 100644 index 0000000..f71e5e2 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0045-tutorials.md @@ -0,0 +1,29 @@ +# Tutorials + +## [Primer to the Search-Based Planning Library (SBPL)](http://sbpl.net/node/50) + +Learn the basic theory behind graph search and SBPL. + +## [SBPL Overview](http://sbpl.net/node/47) + +This has a brief overview of how SBPL is organized. + +## [Planning with SBPL: Example in X, Y, Theta State Space](http://sbpl.net/node/51) + +This has example code for planning with a 2d footprint of a robot in X, Y, and theta dimensions. + +## [Navigation with SBPL](http://sbpl.net/node/46) + +This builds on the previous tutorial to handle exploring an unknown environment. + +## [Kinematic Constraints and Motion Primitives](http://sbpl.net/node/48) + +An introduction to how kinematic constraints are dealt with in SBPL. + +## [Generating Motion Primitives](http://sbpl.net/node/52) + +How to use the Matlab scripts in SBPL to generate custom motion primitives. + +## [Forward Arc Motion Primitives](http://sbpl.net/node/53) + +## [Buliding, Installing, and Using SBPL](http://sbpl.net/node/54) diff --git a/static/archive/legacy-drupal/content/pages/0046-navigation-with-sbpl-in-x-y-theta.html b/static/archive/legacy-drupal/content/pages/0046-navigation-with-sbpl-in-x-y-theta.html new file mode 100644 index 0000000..8cdf04f --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0046-navigation-with-sbpl-in-x-y-theta.html @@ -0,0 +1,14 @@ + +Navigation with SBPL (in X, Y, Theta) + +

    Navigation with SBPL (in X, Y, Theta)

    +

    In the previous article, we showed how to plan on a static map.  In the context of robot navigation, we don't have the luxury of a static map. Instead, the map of the environment updates as the robot moves towards its goal.  In this article, we'll show a few code snippets on how to change the previous example to react to an updating environment with two different kinds of planners: ARA* (anytime planning) and AD* (incremental planning).

    +

    In the sbpl/src/test/main.cpp file, there is a section of code in the planandnavigatexythetalat function that simulates an updating environment.  It's not necessary to understand this code - it is simply a framework for generating an unknown environment. The important portions of this code are the ones that inform the planners about the changed environment.

    +

    In the example, simulating the environment is rather contrived - an empty environment is create and uses the real map as its "sensors" (let's call this the sim_environment). Basically, the true values of the map are slowly fed into this duplicated environment.

    + +

    In the snippet above, we look at the newly sensed cells and determine which ones have changed. Since sim_environment has empty cells for areas it doesn't know about, there will be a difference in the costs for a particular cell once it has "sensed" new information about it. In the loop, we inform the environment to update its map using the UpdateCost function. We also push all cells that have been changed into the changedcellsV vector.

    +

    Once the vector is built, we inform the planner about the cells that have been changed. For the ARA* planner, we use costs_changed() to inform the planner that the environment has updated.

    +

    For the AD* planner, we have to do a little more work in order to update the internal search tree.  AD* needs more information than just the changed cells to update. To do this, we feed the changed cells into  GetPredsofChangedEdges. The output of this is then fed into update_preds_of_changededges.  

    +

    With those steps completed, the planner will now compute paths with the updated environment.

    + + diff --git a/static/archive/legacy-drupal/content/pages/0046-navigation-with-sbpl-in-x-y-theta.json b/static/archive/legacy-drupal/content/pages/0046-navigation-with-sbpl-in-x-y-theta.json new file mode 100644 index 0000000..ba94c09 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0046-navigation-with-sbpl-in-x-y-theta.json @@ -0,0 +1,25 @@ +{ + "nid": 46, + "vid": 46, + "type": "page", + "language": "und", + "title": "Navigation with SBPL (in X, Y, Theta)", + "slug": "navigation-with-sbpl-in-x-y-theta", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1367353102, + "changed": 1373331954, + "url_aliases": [], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    In the previous article, we showed how to plan on a static map.  In the context of robot navigation, we don't have the luxury of a static map. Instead, the map of the environment updates as the robot moves towards its goal.  In this article, we'll show a few code snippets on how to change the previous example to react to an updating environment with two different kinds of planners: ARA* (anytime planning) and AD* (incremental planning).

    \r\n

    In the sbpl/src/test/main.cpp file, there is a section of code in the planandnavigatexythetalat function that simulates an updating environment.  It's not necessary to understand this code - it is simply a framework for generating an unknown environment. The important portions of this code are the ones that inform the planners about the changed environment.

    \r\n

    In the example, simulating the environment is rather contrived - an empty environment is create and uses the real map as its "sensors" (let's call this the sim_environment). Basically, the true values of the map are slowly fed into this duplicated environment.

    \r\n\r\n

    In the snippet above, we look at the newly sensed cells and determine which ones have changed. Since sim_environment has empty cells for areas it doesn't know about, there will be a difference in the costs for a particular cell once it has "sensed" new information about it. In the loop, we inform the environment to update its map using the UpdateCost function. We also push all cells that have been changed into the changedcellsV vector.

    \r\n

    Once the vector is built, we inform the planner about the cells that have been changed. For the ARA* planner, we use costs_changed() to inform the planner that the environment has updated.

    \r\n

    For the AD* planner, we have to do a little more work in order to update the internal search tree.  AD* needs more information than just the changed cells to update. To do this, we feed the changed cells into  GetPredsofChangedEdges. The output of this is then fed into update_preds_of_changededges.  

    \r\n

    With those steps completed, the planner will now compute paths with the updated environment.

    \r\n", + "body_markdown": "In the [previous article](http://sbpl.net/node/51), we showed how to plan on a static map. In the context of robot navigation, we don't have the luxury of a static map. Instead, the map of the environment updates as the robot moves towards its goal. In this article, we'll show a few code snippets on how to change the previous example to react to an updating environment with two different kinds of planners: ARA* (anytime planning) and AD* (incremental planning).\n\nIn the sbpl/src/test/main.cpp file, there is a section of code in the planandnavigatexythetalat function that simulates an updating environment. It's not necessary to understand this code - it is simply a framework for generating an unknown environment. The important portions of this code are the ones that inform the planners about the changed environment.\n\nIn the example, simulating the environment is rather contrived - an empty environment is create and uses the real map as its \"sensors\" (let's call this the sim_environment). Basically, the true values of the map are slowly fed into this duplicated environment.\n\nIn the snippet above, we look at the newly sensed cells and determine which ones have changed. Since sim_environment has empty cells for areas it doesn't know about, there will be a difference in the costs for a particular cell once it has \"sensed\" new information about it. In the loop, we inform the environment to update its map using the *UpdateCost* function. We also push all cells that have been changed into the *changedcellsV* vector.\n\nOnce the vector is built, we inform the planner about the cells that have been changed. For the ARA* planner, we use *costs_changed()* to inform the planner that the environment has updated.\n\nFor the AD* planner, we have to do a little more work in order to update the internal search tree. AD* needs more information than just the changed cells to update. To do this, we feed the changed cells into *GetPredsofChangedEdges*. The output of this is then fed into *update_preds_of_changededges*.\n\nWith those steps completed, the planner will now compute paths with the updated environment.\n", + "body_html_raw": "

    In the previous article, we showed how to plan on a static map.  In the context of robot navigation, we don't have the luxury of a static map. Instead, the map of the environment updates as the robot moves towards its goal.  In this article, we'll show a few code snippets on how to change the previous example to react to an updating environment with two different kinds of planners: ARA* (anytime planning) and AD* (incremental planning).

    \r\n

    In the sbpl/src/test/main.cpp file, there is a section of code in the planandnavigatexythetalat function that simulates an updating environment.  It's not necessary to understand this code - it is simply a framework for generating an unknown environment. The important portions of this code are the ones that inform the planners about the changed environment.

    \r\n

    In the example, simulating the environment is rather contrived - an empty environment is create and uses the real map as its "sensors" (let's call this the sim_environment). Basically, the true values of the map are slowly fed into this duplicated environment.

    \r\n\r\n

    In the snippet above, we look at the newly sensed cells and determine which ones have changed. Since sim_environment has empty cells for areas it doesn't know about, there will be a difference in the costs for a particular cell once it has "sensed" new information about it. In the loop, we inform the environment to update its map using the UpdateCost function. We also push all cells that have been changed into the changedcellsV vector.

    \r\n

    Once the vector is built, we inform the planner about the cells that have been changed. For the ARA* planner, we use costs_changed() to inform the planner that the environment has updated.

    \r\n

    For the AD* planner, we have to do a little more work in order to update the internal search tree.  AD* needs more information than just the changed cells to update. To do this, we feed the changed cells into  GetPredsofChangedEdges. The output of this is then fed into update_preds_of_changededges.  

    \r\n

    With those steps completed, the planner will now compute paths with the updated environment.

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0046-navigation-with-sbpl-in-x-y-theta.md b/static/archive/legacy-drupal/content/pages/0046-navigation-with-sbpl-in-x-y-theta.md new file mode 100644 index 0000000..d551632 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0046-navigation-with-sbpl-in-x-y-theta.md @@ -0,0 +1,15 @@ +# Navigation with SBPL (in X, Y, Theta) + +In the [previous article](http://sbpl.net/node/51), we showed how to plan on a static map. In the context of robot navigation, we don't have the luxury of a static map. Instead, the map of the environment updates as the robot moves towards its goal. In this article, we'll show a few code snippets on how to change the previous example to react to an updating environment with two different kinds of planners: ARA* (anytime planning) and AD* (incremental planning). + +In the sbpl/src/test/main.cpp file, there is a section of code in the planandnavigatexythetalat function that simulates an updating environment. It's not necessary to understand this code - it is simply a framework for generating an unknown environment. The important portions of this code are the ones that inform the planners about the changed environment. + +In the example, simulating the environment is rather contrived - an empty environment is create and uses the real map as its "sensors" (let's call this the sim_environment). Basically, the true values of the map are slowly fed into this duplicated environment. + +In the snippet above, we look at the newly sensed cells and determine which ones have changed. Since sim_environment has empty cells for areas it doesn't know about, there will be a difference in the costs for a particular cell once it has "sensed" new information about it. In the loop, we inform the environment to update its map using the *UpdateCost* function. We also push all cells that have been changed into the *changedcellsV* vector. + +Once the vector is built, we inform the planner about the cells that have been changed. For the ARA* planner, we use *costs_changed()* to inform the planner that the environment has updated. + +For the AD* planner, we have to do a little more work in order to update the internal search tree. AD* needs more information than just the changed cells to update. To do this, we feed the changed cells into *GetPredsofChangedEdges*. The output of this is then fed into *update_preds_of_changededges*. + +With those steps completed, the planner will now compute paths with the updated environment. diff --git a/static/archive/legacy-drupal/content/pages/0047-sbpl-overview.html b/static/archive/legacy-drupal/content/pages/0047-sbpl-overview.html new file mode 100644 index 0000000..1541c53 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0047-sbpl-overview.html @@ -0,0 +1,32 @@ + +SBPL overview + +

    SBPL overview

    +

    This tutorial will describe how SBPL is set up. For background information, click here.

    +

    Environments

    +

    As described in the previous tutorial, planning with search-based methods have two parts - representing the problem as a graph, then solving the graph with graph-search methods. SBPL has two objects it uses for these two roles - the environment and the planner. Unless you're fiddling with the actual graph search algorithm, the environment object will be the thing you interact most with.

    +

    In a nutshell, the environment handles domain specific details and translates them into a generic form for the planner to handle. For example, the environment handles the translation between the (x, y, theta) position of a robot into a graph composed of generic state IDs. The planner then solves the graph without having to know about the domain. (This doesn't actually happen in one step - the graph is generated on demand by the planner. As a result, the planner often calls the environment object to retrieve information on demand). 

    +

    The environment also implements the heuristic computation. This is domain dependent, since the heuristic for guiding a robotic arm to an object will be different from navigating a car close to its goal.

    +

    There already exists many environments and planners in SBPL, but they might not cover a custom scenario. In this case, you will have to implement your own environment (a very involved topic that might be covered in the future).

    +
      +
    • Environment2D - for robots navigating in (x, y) coordinates
    • +
    • EnvironmentXYTHETALAT - for robots navigating in (x, y, theta) coordinates
    • +
    • EnvironmentXYTHETALEVLAT - for robots navigating in (x, y, theta) but alsohandles collision checking and cost computations for a given set of footprints.
    • +
    • Environment_robarm - motion planning for a 7D (7 joint angles) robotic arm.
    • +
    +

    These can all be found in sbpl/src/discrete_space_information.

    +

    Other environments that have successfully been implemented (but not included in SBPL): 

    +
      +
    •     pushing a cart with the PR2 (x, y, theta, theta of the cart)
    • +
    •     opening a door with the PR2 (x, y, theta, door interval)
    • +
    •     quadrotor path planning (x, y, z)
    • +
    •     time dependent planning (x, y, z, time)
    • +
    +

    Planners

    +

    There are a number of planners that are available in sbpl/src/planners

    +
      +
    •     ARA*
    • +
    •     Anytime D*
    • +
    •     R*
    • +
    + diff --git a/static/archive/legacy-drupal/content/pages/0047-sbpl-overview.json b/static/archive/legacy-drupal/content/pages/0047-sbpl-overview.json new file mode 100644 index 0000000..39668b6 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0047-sbpl-overview.json @@ -0,0 +1,25 @@ +{ + "nid": 47, + "vid": 47, + "type": "page", + "language": "und", + "title": "SBPL overview", + "slug": "sbpl-overview", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1367353485, + "changed": 1370995035, + "url_aliases": [], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    This tutorial will describe how SBPL is set up. For background information, click here.

    \r\n

    Environments

    \r\n

    As described in the previous tutorial, planning with search-based methods have two parts - representing the problem as a graph, then solving the graph with graph-search methods. SBPL has two objects it uses for these two roles - the environment and the planner. Unless you're fiddling with the actual graph search algorithm, the environment object will be the thing you interact most with.

    \r\n

    In a nutshell, the environment handles domain specific details and translates them into a generic form for the planner to handle. For example, the environment handles the translation between the (x, y, theta) position of a robot into a graph composed of generic state IDs. The planner then solves the graph without having to know about the domain. (This doesn't actually happen in one step - the graph is generated on demand by the planner. As a result, the planner often calls the environment object to retrieve information on demand). 

    \r\n

    The environment also implements the heuristic computation. This is domain dependent, since the heuristic for guiding a robotic arm to an object will be different from navigating a car close to its goal.

    \r\n

    There already exists many environments and planners in SBPL, but they might not cover a custom scenario. In this case, you will have to implement your own environment (a very involved topic that might be covered in the future).

    \r\n
      \r\n
    • Environment2D - for robots navigating in (x, y) coordinates
    • \r\n
    • EnvironmentXYTHETALAT - for robots navigating in (x, y, theta) coordinates
    • \r\n
    • EnvironmentXYTHETALEVLAT - for robots navigating in (x, y, theta) but alsohandles collision checking and cost computations for a given set of footprints.
    • \r\n
    • Environment_robarm - motion planning for a 7D (7 joint angles) robotic arm.
    • \r\n
    \r\n

    These can all be found in sbpl/src/discrete_space_information.

    \r\n

    Other environments that have successfully been implemented (but not included in SBPL): 

    \r\n
      \r\n
    •     pushing a cart with the PR2 (x, y, theta, theta of the cart)
    • \r\n
    •     opening a door with the PR2 (x, y, theta, door interval)
    • \r\n
    •     quadrotor path planning (x, y, z)
    • \r\n
    •     time dependent planning (x, y, z, time)
    • \r\n
    \r\n

    Planners

    \r\n

    There are a number of planners that are available in sbpl/src/planners

    \r\n
      \r\n
    •     ARA*
    • \r\n
    •     Anytime D*
    • \r\n
    •     R*
    • \r\n
    ", + "body_markdown": "This tutorial will describe how SBPL is set up. For background information, [click here](http://victor.hwanger.com/post/47051626618/primer-to-the-search-based-planning-library-sbpl).\n\n**Environments**\n\nAs described in the previous tutorial, planning with search-based methods have two parts - representing the problem as a graph, then solving the graph with graph-search methods. SBPL has two objects it uses for these two roles - the environment and the planner. Unless you're fiddling with the actual graph search algorithm, the environment object will be the thing you interact most with.\n\nIn a nutshell, the environment handles domain specific details and translates them into a generic form for the planner to handle. For example, the environment handles the translation between the (x, y, theta) position of a robot into a graph composed of generic state IDs. The planner then solves the graph without having to know about the domain. (This doesn't actually happen in one step - the graph is generated on demand by the planner. As a result, the planner often calls the environment object to retrieve information on demand).\n\nThe environment also implements the heuristic computation. This is domain dependent, since the heuristic for guiding a robotic arm to an object will be different from navigating a car close to its goal.\n\nThere already exists many environments and planners in SBPL, but they might not cover a custom scenario. In this case, you will have to implement your own environment (a very involved topic that might be covered in the future).\n\n- Environment2D - for robots navigating in (x, y) coordinates\n- EnvironmentXYTHETALAT - for robots navigating in (x, y, theta) coordinates\n- EnvironmentXYTHETALEVLAT - for robots navigating in (x, y, theta) but alsohandles collision checking and cost computations for a given set of footprints.\n- Environment_robarm - motion planning for a 7D (7 joint angles) robotic arm.\n\nThese can all be found in sbpl/src/discrete_space_information.\n\nOther environments that have successfully been implemented (but not included in SBPL):\n\n- pushing a cart with the PR2 (x, y, theta, theta of the cart)\n- opening a door with the PR2 (x, y, theta, door interval)\n- quadrotor path planning (x, y, z)\n- time dependent planning (x, y, z, time)\n\n**Planners**\n\nThere are a number of planners that are available in sbpl/src/planners\n\n- ARA*\n- Anytime D*\n- R*\n", + "body_html_raw": "

    This tutorial will describe how SBPL is set up. For background information, click here.

    \r\n

    Environments

    \r\n

    As described in the previous tutorial, planning with search-based methods have two parts - representing the problem as a graph, then solving the graph with graph-search methods. SBPL has two objects it uses for these two roles - the environment and the planner. Unless you're fiddling with the actual graph search algorithm, the environment object will be the thing you interact most with.

    \r\n

    In a nutshell, the environment handles domain specific details and translates them into a generic form for the planner to handle. For example, the environment handles the translation between the (x, y, theta) position of a robot into a graph composed of generic state IDs. The planner then solves the graph without having to know about the domain. (This doesn't actually happen in one step - the graph is generated on demand by the planner. As a result, the planner often calls the environment object to retrieve information on demand). 

    \r\n

    The environment also implements the heuristic computation. This is domain dependent, since the heuristic for guiding a robotic arm to an object will be different from navigating a car close to its goal.

    \r\n

    There already exists many environments and planners in SBPL, but they might not cover a custom scenario. In this case, you will have to implement your own environment (a very involved topic that might be covered in the future).

    \r\n
      \r\n
    • Environment2D - for robots navigating in (x, y) coordinates
    • \r\n
    • EnvironmentXYTHETALAT - for robots navigating in (x, y, theta) coordinates
    • \r\n
    • EnvironmentXYTHETALEVLAT - for robots navigating in (x, y, theta) but alsohandles collision checking and cost computations for a given set of footprints.
    • \r\n
    • Environment_robarm - motion planning for a 7D (7 joint angles) robotic arm.
    • \r\n
    \r\n

    These can all be found in sbpl/src/discrete_space_information.

    \r\n

    Other environments that have successfully been implemented (but not included in SBPL): 

    \r\n
      \r\n
    •     pushing a cart with the PR2 (x, y, theta, theta of the cart)
    • \r\n
    •     opening a door with the PR2 (x, y, theta, door interval)
    • \r\n
    •     quadrotor path planning (x, y, z)
    • \r\n
    •     time dependent planning (x, y, z, time)
    • \r\n
    \r\n

    Planners

    \r\n

    There are a number of planners that are available in sbpl/src/planners

    \r\n
      \r\n
    •     ARA*
    • \r\n
    •     Anytime D*
    • \r\n
    •     R*
    • \r\n
    ", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0047-sbpl-overview.md b/static/archive/legacy-drupal/content/pages/0047-sbpl-overview.md new file mode 100644 index 0000000..976f5be --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0047-sbpl-overview.md @@ -0,0 +1,35 @@ +# SBPL overview + +This tutorial will describe how SBPL is set up. For background information, [click here](http://victor.hwanger.com/post/47051626618/primer-to-the-search-based-planning-library-sbpl). + +**Environments** + +As described in the previous tutorial, planning with search-based methods have two parts - representing the problem as a graph, then solving the graph with graph-search methods. SBPL has two objects it uses for these two roles - the environment and the planner. Unless you're fiddling with the actual graph search algorithm, the environment object will be the thing you interact most with. + +In a nutshell, the environment handles domain specific details and translates them into a generic form for the planner to handle. For example, the environment handles the translation between the (x, y, theta) position of a robot into a graph composed of generic state IDs. The planner then solves the graph without having to know about the domain. (This doesn't actually happen in one step - the graph is generated on demand by the planner. As a result, the planner often calls the environment object to retrieve information on demand). + +The environment also implements the heuristic computation. This is domain dependent, since the heuristic for guiding a robotic arm to an object will be different from navigating a car close to its goal. + +There already exists many environments and planners in SBPL, but they might not cover a custom scenario. In this case, you will have to implement your own environment (a very involved topic that might be covered in the future). + +- Environment2D - for robots navigating in (x, y) coordinates +- EnvironmentXYTHETALAT - for robots navigating in (x, y, theta) coordinates +- EnvironmentXYTHETALEVLAT - for robots navigating in (x, y, theta) but alsohandles collision checking and cost computations for a given set of footprints. +- Environment_robarm - motion planning for a 7D (7 joint angles) robotic arm. + +These can all be found in sbpl/src/discrete_space_information. + +Other environments that have successfully been implemented (but not included in SBPL): + +- pushing a cart with the PR2 (x, y, theta, theta of the cart) +- opening a door with the PR2 (x, y, theta, door interval) +- quadrotor path planning (x, y, z) +- time dependent planning (x, y, z, time) + +**Planners** + +There are a number of planners that are available in sbpl/src/planners + +- ARA* +- Anytime D* +- R* diff --git a/static/archive/legacy-drupal/content/pages/0048-kinematic-constraints-and-motion-primitives.html b/static/archive/legacy-drupal/content/pages/0048-kinematic-constraints-and-motion-primitives.html new file mode 100644 index 0000000..a2ab5b9 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0048-kinematic-constraints-and-motion-primitives.html @@ -0,0 +1,12 @@ + +Kinematic Constraints and Motion Primitives + +

    Kinematic Constraints and Motion Primitives

    +

    In the last article, we showed how a graph can represent states of the robot. We defined a trajectory or path as a series of adjacent states in a graph. But adjacent states don't reflect the kinodynamic constraints of the robot. For example, let's say a car is facing north at x, y location (2,2). Our path tells us to move from (2,2) to (1,2). While the states are adjacent, our car cannot move sideways to achieve this transition. We could improve this by introducing a theta component, making the state space (x, y, theta). This doesn't entirely fix the problem because the resulting paths might not be smooth (imagine if the theta changed every step of the path).  Instead, SBPL uses lattice-based graphs that are constructed using motion primitives. Motion primitives are pre-computed motions that the robot can take.  

    +

    +

    By superimposing this on the graph at the robot's position, our adjacent states (or what are usually called successors) are not necessarily spatially adjacent. Instead, they represent what the robot can smoothly transition to.  The image below shows what this might look like for a robotic car - the motion primitives follow typical car-like motions. Valid successors of a given state are states that can be reached with these motions while not colliding with anything else.  

    +

    +

    Motion primitives allow us to encode the kinematic constraints of the robot into any environment that the robot is planning in. They also allow for different costs associated with each motion - for example, if we want to avoid reversing the car, we might assign a high cost to that particular motion primitive. SBPL has Matlab tools to build motion primitives for different types of vehicles.

    +

    Instructions for how to do this can be found here. For more information on lattice planning, see here.

    + + diff --git a/static/archive/legacy-drupal/content/pages/0048-kinematic-constraints-and-motion-primitives.json b/static/archive/legacy-drupal/content/pages/0048-kinematic-constraints-and-motion-primitives.json new file mode 100644 index 0000000..f825852 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0048-kinematic-constraints-and-motion-primitives.json @@ -0,0 +1,25 @@ +{ + "nid": 48, + "vid": 48, + "type": "page", + "language": "und", + "title": "Kinematic Constraints and Motion Primitives", + "slug": "kinematic-constraints-and-motion-primitives", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1367353663, + "changed": 1373332005, + "url_aliases": [], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    In the last article, we showed how a graph can represent states of the robot. We defined a trajectory or path as a series of adjacent states in a graph. But adjacent states don't reflect the kinodynamic constraints of the robot. For example, let's say a car is facing north at x, y location (2,2). Our path tells us to move from (2,2) to (1,2). While the states are adjacent, our car cannot move sideways to achieve this transition. We could improve this by introducing a theta component, making the state space (x, y, theta). This doesn't entirely fix the problem because the resulting paths might not be smooth (imagine if the theta changed every step of the path).  Instead, SBPL uses lattice-based graphs that are constructed using motion primitives. Motion primitives are pre-computed motions that the robot can take.  

    \r\n

    \"\"

    \r\n

    By superimposing this on the graph at the robot's position, our adjacent states (or what are usually called successors) are not necessarily spatially adjacent. Instead, they represent what the robot can smoothly transition to.  The image below shows what this might look like for a robotic car - the motion primitives follow typical car-like motions. Valid successors of a given state are states that can be reached with these motions while not colliding with anything else.  

    \r\n

    \"\"

    \r\n

    Motion primitives allow us to encode the kinematic constraints of the robot into any environment that the robot is planning in. They also allow for different costs associated with each motion - for example, if we want to avoid reversing the car, we might assign a high cost to that particular motion primitive. SBPL has Matlab tools to build motion primitives for different types of vehicles.

    \r\n

    Instructions for how to do this can be found here. For more information on lattice planning, see here.

    \r\n", + "body_markdown": "In the [last article](http://sbpl.net/node/50), we showed how a graph can represent states of the robot. We defined a trajectory or path as a series of adjacent states in a graph. But adjacent states don't reflect the kinodynamic constraints of the robot. For example, let's say a car is facing north at x, y location (2,2). Our path tells us to move from (2,2) to (1,2). While the states are adjacent, our car cannot move sideways to achieve this transition. We could improve this by introducing a theta component, making the state space (x, y, theta). This doesn't entirely fix the problem because the resulting paths might not be smooth (imagine if the theta changed every step of the path). Instead, SBPL uses lattice-based graphs that are constructed using motion primitives. Motion primitives are pre-computed motions that the robot can take.\n\n![](../../media/images/tumblr_inline_mkp8yrkzjm1qz4rgp.png)\n\nBy superimposing this on the graph at the robot's position, our adjacent states (or what are usually called successors) are not necessarily spatially adjacent. Instead, they represent what the robot can smoothly transition to. The image below shows what this might look like for a robotic car - the motion primitives follow typical car-like motions. Valid successors of a given state are states that can be reached with these motions while not colliding with anything else.\n\n![](../../media/images/kin2.png)\n\nMotion primitives allow us to encode the kinematic constraints of the robot into any environment that the robot is planning in. They also allow for different costs associated with each motion - for example, if we want to avoid reversing the car, we might assign a high cost to that particular motion primitive. SBPL has Matlab tools to build motion primitives for different types of vehicles.\n\nInstructions for how to do this can be found [here](http://sbpl.net/node/52). For more information on lattice planning, see [here](http://www.cs.cmu.edu/~maxim/files/planlongdynfeasmotions_rss08.pdf).\n", + "body_html_raw": "

    In the last article, we showed how a graph can represent states of the robot. We defined a trajectory or path as a series of adjacent states in a graph. But adjacent states don't reflect the kinodynamic constraints of the robot. For example, let's say a car is facing north at x, y location (2,2). Our path tells us to move from (2,2) to (1,2). While the states are adjacent, our car cannot move sideways to achieve this transition. We could improve this by introducing a theta component, making the state space (x, y, theta). This doesn't entirely fix the problem because the resulting paths might not be smooth (imagine if the theta changed every step of the path).  Instead, SBPL uses lattice-based graphs that are constructed using motion primitives. Motion primitives are pre-computed motions that the robot can take.  

    \r\n

    \"\"

    \r\n

    By superimposing this on the graph at the robot's position, our adjacent states (or what are usually called successors) are not necessarily spatially adjacent. Instead, they represent what the robot can smoothly transition to.  The image below shows what this might look like for a robotic car - the motion primitives follow typical car-like motions. Valid successors of a given state are states that can be reached with these motions while not colliding with anything else.  

    \r\n

    \"\"

    \r\n

    Motion primitives allow us to encode the kinematic constraints of the robot into any environment that the robot is planning in. They also allow for different costs associated with each motion - for example, if we want to avoid reversing the car, we might assign a high cost to that particular motion primitive. SBPL has Matlab tools to build motion primitives for different types of vehicles.

    \r\n

    Instructions for how to do this can be found here. For more information on lattice planning, see here.

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0048-kinematic-constraints-and-motion-primitives.md b/static/archive/legacy-drupal/content/pages/0048-kinematic-constraints-and-motion-primitives.md new file mode 100644 index 0000000..7441e06 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0048-kinematic-constraints-and-motion-primitives.md @@ -0,0 +1,13 @@ +# Kinematic Constraints and Motion Primitives + +In the [last article](http://sbpl.net/node/50), we showed how a graph can represent states of the robot. We defined a trajectory or path as a series of adjacent states in a graph. But adjacent states don't reflect the kinodynamic constraints of the robot. For example, let's say a car is facing north at x, y location (2,2). Our path tells us to move from (2,2) to (1,2). While the states are adjacent, our car cannot move sideways to achieve this transition. We could improve this by introducing a theta component, making the state space (x, y, theta). This doesn't entirely fix the problem because the resulting paths might not be smooth (imagine if the theta changed every step of the path). Instead, SBPL uses lattice-based graphs that are constructed using motion primitives. Motion primitives are pre-computed motions that the robot can take. + +![](../../media/images/tumblr_inline_mkp8yrkzjm1qz4rgp.png) + +By superimposing this on the graph at the robot's position, our adjacent states (or what are usually called successors) are not necessarily spatially adjacent. Instead, they represent what the robot can smoothly transition to. The image below shows what this might look like for a robotic car - the motion primitives follow typical car-like motions. Valid successors of a given state are states that can be reached with these motions while not colliding with anything else. + +![](../../media/images/kin2.png) + +Motion primitives allow us to encode the kinematic constraints of the robot into any environment that the robot is planning in. They also allow for different costs associated with each motion - for example, if we want to avoid reversing the car, we might assign a high cost to that particular motion primitive. SBPL has Matlab tools to build motion primitives for different types of vehicles. + +Instructions for how to do this can be found [here](http://sbpl.net/node/52). For more information on lattice planning, see [here](http://www.cs.cmu.edu/~maxim/files/planlongdynfeasmotions_rss08.pdf). diff --git a/static/archive/legacy-drupal/content/pages/0049-primer-to-the-search-based-planning-library-sbpl.html b/static/archive/legacy-drupal/content/pages/0049-primer-to-the-search-based-planning-library-sbpl.html new file mode 100644 index 0000000..afbba90 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0049-primer-to-the-search-based-planning-library-sbpl.html @@ -0,0 +1,48 @@ + +Primer to the Search-Based Planning Library (SBPL) + +

    Primer to the Search-Based Planning Library (SBPL)

    +

    This article aims to give a very brief overview of the concepts behind SBPL. See this wiki article for an intro to motion planning.

    +

     

    +

    Search-based Planning

    +

     

    +

    Search-based planning is a motion planning method which uses graph search methods to compute paths or trajectories over a discrete representation of the problem. This is in contrast to sample-based planning methods, which is described very well in the OMPL primer. Search-based methods provides guarantees on path quality and are used in scenarios which demand low cost paths (e.g. robot navigation). 

    +

     

    +

    First we talk about how the environment of the problem is discretized, then we describe how planning is done.

    +

     

    +

    Environments (or discrete representation of a planning problem)

    +

     

    +

    In order to properly represent the problem with a graph, we first discretize all possible states so that there are a finite number of states a robot could be in. Here, the definition of state varies depending on the application. For a car, you might only be concerned with the x, y, and orientation. For a helicopter, it might be the x, y, z position in the world. For a robotic arm, it would be the values of each joint in the arm (joint1, joint2, joint3, joint4).  The collection of these states is defined as the state space. 

    +

     

    +

    The image below shows a small portion of the state space. Here, each possible (x,y) position that a robot could be in is represented as a node with a state ID (S1, S2, etc).  A path for a robot in this state space would then be moving through a series of adjacent states (for example S6, S4, S1).

    +A discrete state +

    The graph representation then comes naturally - valid transitions between adjacent states (also called the successors of the state) are represented by edges between the nodes. For now, we assume that any two adjacent states will have a valid transition between them (this is a bit oversimplifying, but it's good enough for now - see the Kinematic Constraints and Motion Primitives section for more details.) 

    +

     

    +

    Since the state ID is just a number, environments of nearly any dimension can be discretely represented as a graph.

    +

     

    +

    State Validity and Collision Checking

    +

     

    +

    One important notion about the state space is the validity of states. When computing a trajectory, we need all states in the trajectory to be valid. Obviously, the definition of valid becomes very domain dependent.

    +

     

    +

    Looking at the above figure, which represents the 2D environment, we see that there are states that are invalid - if the blacked out regions are buildings, we certainly wouldn't want to be traveling through them.  In this case, those states are obviously invalid. More specifically, the robot would be in collision with the building. The same idea occurs in the robotic arm domain - given a particular set of joint angles for an arm, does it collide with anything in the environment? In both cases, we need logic that takes in knowledge about the robot's surrounding environment and a given state. It then returns a value telling us whether we are in collision or not (or synonymously, if the state is valid). 

    +

     

    +

    More constraints can be added as needed to the requirements of a valid state. Let's take the case where we have a robotic arm with the same joints and joint limitations as a human arm. We need to make an extra state validity check beyond just seeing if we collide with anything in the environment. If we had a list of states with the elbow joint going from 0 degrees to 270 degrees, many of those states would be invalid - elbows only have a 180 degree range (or have a joint limit of 180 degrees). Therefore, states specifying an elbow angle from 181-270 would be deemed invalid.

    +

     

    +

    Before moving on to searching this graph, it's important to note that the translation between the "real world" context and what the graph looks like is completely decoupled from how the problem is solved.  Because each state is encoded into a single identifying number (state IDs), the graph searching algorithm doesn't need to know what the original domain was - all it needs are these state IDs. This decoupling of the environment from the graph allows the graph search algorithm to operate on any problem that can be represented as a graph.

    +

     

    +

    Planners

    +

     

    +

    Now that we have a basic concept of what the graph represents, we can look at methods for solving the motion planning problem. The simplest approaches to this would be using Dijkstra's or the A* algorithm, which returns the shortest possible path between a given start and goal.  However, this can be slow and memory expensive. Instead, we can find a suboptimal solution, or a path from the start to goal that isn't necessarily the best one. In most cases, we don't need to have the best path - we just need one that's good enough.  This relaxes the conditions on the graph search and allows us to find a good-enough solution in much less time with much less memory. One algorithm that does this is weighted A*.

    +

     

    +

    This parameter of "good enough" is often denoted as epsilon of the best solution. If we allow an epsilon of 5, this means that the weighted A* algorithm will return a path that is no worse than 5 times the cost of the optimal solution.  This concept of suboptimality is fundamental to how SBPL planners work. 

    +

    imageimage image

    +

     

    +

    The three animations here depict a Dijkstra search, an A* search, and a weighted A* search. The speed and memory usage (in terms of number of nodes that are expanded) of each can easily be seen. Dijkstra's is the slowest and expands the most number of states. Weighted A* is a bit better, and computes an optimal path as well (though in this case, it's not the same as Dijkstra's because there is more than one optimal path). Weighted A* runs the fastest, but does not return the best solution.  

    +

     

    +

    With the ARA* algorithm, we can have the best of both worlds - a suboptimal solution can be returned very quickly (high epsilon), and then ARA* can continue working to return a lower epsilon solution for a user specified amount of time.

    +

     

    +

    [SBPL also implements a number of different algorithms (ARA*, AD*, R*, D* Lite, etc) that produce paths with user-specified epsilons. The differences between the algorithms are described in this future article.]

    +

     

    +

    So what does SBPL actually do? SBPL computes the exact motion path for a robot to follow in order to get from point A to point B. Furthermore, SBPL allows us to trade off how good the path is versus how long it takes to compute. If we care about computation time (like if our robot car is driving really fast), we reduce the optimality of the path.  If the car's driving slowly, and we'd like shorter paths, then we can allot more time for the planner to run.

    + + diff --git a/static/archive/legacy-drupal/content/pages/0049-primer-to-the-search-based-planning-library-sbpl.json b/static/archive/legacy-drupal/content/pages/0049-primer-to-the-search-based-planning-library-sbpl.json new file mode 100644 index 0000000..233ce2d --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0049-primer-to-the-search-based-planning-library-sbpl.json @@ -0,0 +1,25 @@ +{ + "nid": 49, + "vid": 49, + "type": "page", + "language": "und", + "title": "Primer to the Search-Based Planning Library (SBPL)", + "slug": "primer-to-the-search-based-planning-library-sbpl", + "uid": 1, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1367356916, + "changed": 1367357394, + "url_aliases": [], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "

    This article aims to give a very brief overview of the concepts behind SBPL. See this wiki article for an intro to motion planning.

    \r\n

     

    \r\n

    Search-based Planning

    \r\n

     

    \r\n

    Search-based planning is a motion planning method which uses graph search methods to compute paths or trajectories over a discrete representation of the problem. This is in contrast to sample-based planning methods, which is described very well in the OMPL primer. Search-based methods provides guarantees on path quality and are used in scenarios which demand low cost paths (e.g. robot navigation). 

    \r\n

     

    \r\n

    First we talk about how the environment of the problem is discretized, then we describe how planning is done.

    \r\n

     

    \r\n

    Environments (or discrete representation of a planning problem)

    \r\n

     

    \r\n

    In order to properly represent the problem with a graph, we first discretize all possible states so that there are a finite number of states a robot could be in. Here, the definition of state varies depending on the application. For a car, you might only be concerned with the x, y, and orientation. For a helicopter, it might be the x, y, z position in the world. For a robotic arm, it would be the values of each joint in the arm (joint1, joint2, joint3, joint4).  The collection of these states is defined as the state space. 

    \r\n

     

    \r\n

    The image below shows a small portion of the state space. Here, each possible (x,y) position that a robot could be in is represented as a node with a state ID (S1, S2, etc).  A path for a robot in this state space would then be moving through a series of adjacent states (for example S6, S4, S1).

    \r\n\"A\r\n

    The graph representation then comes naturally - valid transitions between adjacent states (also called the successors of the state) are represented by edges between the nodes. For now, we assume that any two adjacent states will have a valid transition between them (this is a bit oversimplifying, but it's good enough for now - see the Kinematic Constraints and Motion Primitives section for more details.) 

    \r\n

     

    \r\n

    Since the state ID is just a number, environments of nearly any dimension can be discretely represented as a graph.

    \r\n

     

    \r\n

    State Validity and Collision Checking

    \r\n

     

    \r\n

    One important notion about the state space is the validity of states. When computing a trajectory, we need all states in the trajectory to be valid. Obviously, the definition of valid becomes very domain dependent.

    \r\n

     

    \r\n

    Looking at the above figure, which represents the 2D environment, we see that there are states that are invalid - if the blacked out regions are buildings, we certainly wouldn't want to be traveling through them.  In this case, those states are obviously invalid. More specifically, the robot would be in collision with the building. The same idea occurs in the robotic arm domain - given a particular set of joint angles for an arm, does it collide with anything in the environment? In both cases, we need logic that takes in knowledge about the robot's surrounding environment and a given state. It then returns a value telling us whether we are in collision or not (or synonymously, if the state is valid). 

    \r\n

     

    \r\n

    More constraints can be added as needed to the requirements of a valid state. Let's take the case where we have a robotic arm with the same joints and joint limitations as a human arm. We need to make an extra state validity check beyond just seeing if we collide with anything in the environment. If we had a list of states with the elbow joint going from 0 degrees to 270 degrees, many of those states would be invalid - elbows only have a 180 degree range (or have a joint limit of 180 degrees). Therefore, states specifying an elbow angle from 181-270 would be deemed invalid.

    \r\n

     

    \r\n

    Before moving on to searching this graph, it's important to note that the translation between the "real world" context and what the graph looks like is completely decoupled from how the problem is solved.  Because each state is encoded into a single identifying number (state IDs), the graph searching algorithm doesn't need to know what the original domain was - all it needs are these state IDs. This decoupling of the environment from the graph allows the graph search algorithm to operate on any problem that can be represented as a graph.

    \r\n

     

    \r\n

    Planners

    \r\n

     

    \r\n

    Now that we have a basic concept of what the graph represents, we can look at methods for solving the motion planning problem. The simplest approaches to this would be using Dijkstra's or the A* algorithm, which returns the shortest possible path between a given start and goal.  However, this can be slow and memory expensive. Instead, we can find a suboptimal solution, or a path from the start to goal that isn't necessarily the best one. In most cases, we don't need to have the best path - we just need one that's good enough.  This relaxes the conditions on the graph search and allows us to find a good-enough solution in much less time with much less memory. One algorithm that does this is weighted A*.

    \r\n

     

    \r\n

    This parameter of "good enough" is often denoted as epsilon of the best solution. If we allow an epsilon of 5, this means that the weighted A* algorithm will return a path that is no worse than 5 times the cost of the optimal solution.  This concept of suboptimality is fundamental to how SBPL planners work. 

    \r\n

    \"image\"\"image\" \"image\"

    \r\n

     

    \r\n

    The three animations here depict a Dijkstra search, an A* search, and a weighted A* search. The speed and memory usage (in terms of number of nodes that are expanded) of each can easily be seen. Dijkstra's is the slowest and expands the most number of states. Weighted A* is a bit better, and computes an optimal path as well (though in this case, it's not the same as Dijkstra's because there is more than one optimal path). Weighted A* runs the fastest, but does not return the best solution.  

    \r\n

     

    \r\n

    With the ARA* algorithm, we can have the best of both worlds - a suboptimal solution can be returned very quickly (high epsilon), and then ARA* can continue working to return a lower epsilon solution for a user specified amount of time.

    \r\n

     

    \r\n

    [SBPL also implements a number of different algorithms (ARA*, AD*, R*, D* Lite, etc) that produce paths with user-specified epsilons. The differences between the algorithms are described in this future article.]

    \r\n

     

    \r\n

    So what does SBPL actually do? SBPL computes the exact motion path for a robot to follow in order to get from point A to point B. Furthermore, SBPL allows us to trade off how good the path is versus how long it takes to compute. If we care about computation time (like if our robot car is driving really fast), we reduce the optimality of the path.  If the car's driving slowly, and we'd like shorter paths, then we can allot more time for the planner to run.

    \r\n", + "body_markdown": "This article aims to give a very brief overview of the concepts behind SBPL. See [this wiki article](http://en.wikipedia.org/wiki/Motion_planning) for an intro to motion planning.\n\n**Search-based Planning**\n\nSearch-based planning is a motion planning method which uses graph search methods to compute paths or trajectories over a discrete representation of the problem. This is in contrast to sample-based planning methods, which is described very well in the [OMPL primer](http://ompl.kavrakilab.org/OMPL_Primer.pdf). Search-based methods provides guarantees on path quality and are used in scenarios which demand low cost paths (e.g. robot navigation).\n\nFirst we talk about how the environment of the problem is discretized, then we describe how planning is done.\n\n**Environments (or discrete representation of a planning problem)**\n\nIn order to properly represent the problem with a graph, we first discretize all possible states so that there are a finite number of states a robot could be in. Here, the definition of state varies depending on the application. For a car, you might only be concerned with the x, y, and orientation. For a helicopter, it might be the x, y, z position in the world. For a robotic arm, it would be the values of each joint in the arm (joint1, joint2, joint3, joint4). The collection of these states is defined as the state space.\n\nThe image below shows a small portion of the state space. Here, each possible (x,y) position that a robot could be in is represented as a node with a state ID (S1, S2, etc). A path for a robot in this state space would then be moving through a series of adjacent states (for example S6, S4, S1).\n\n ![A discrete state](../../media/images/primer1.png)\n\nThe graph representation then comes naturally - valid transitions between adjacent states (also called the successors of the state) are represented by edges between the nodes. For now, we assume that any two adjacent states will have a valid transition between them (this is a bit oversimplifying, but it's good enough for now - see the [Kinematic Constraints and Motion Primitives](http://victor.hwanger.com/post/47052754092/kinematic-constraints-and-motion-primitives) section for more details.)\n\nSince the state ID is just a number, environments of nearly any dimension can be discretely represented as a graph.\n\n**State Validity and Collision Checking**\n\nOne important notion about the state space is the validity of states. When computing a trajectory, we need all states in the trajectory to be valid. Obviously, the definition of valid becomes very domain dependent.\n\nLooking at the above figure, which represents the 2D environment, we see that there are states that are invalid - if the blacked out regions are buildings, we certainly wouldn't want to be traveling through them. In this case, those states are obviously invalid. More specifically, the robot would be in collision with the building. The same idea occurs in the robotic arm domain - given a particular set of joint angles for an arm, does it collide with anything in the environment? In both cases, we need logic that takes in knowledge about the robot's surrounding environment and a given state. It then returns a value telling us whether we are in collision or not (or synonymously, if the state is valid).\n\nMore constraints can be added as needed to the requirements of a valid state. Let's take the case where we have a robotic arm with the same joints and joint limitations as a human arm. We need to make an extra state validity check beyond just seeing if we collide with anything in the environment. If we had a list of states with the elbow joint going from 0 degrees to 270 degrees, many of those states would be invalid - elbows only have a 180 degree range (or have a joint limit of 180 degrees). Therefore, states specifying an elbow angle from 181-270 would be deemed invalid.\n\nBefore moving on to searching this graph, it's important to note that the translation between the \"real world\" context and what the graph looks like is completely decoupled from how the problem is solved. Because each state is encoded into a single identifying number (state IDs), the graph searching algorithm doesn't need to know what the original domain was - all it needs are these state IDs. This decoupling of the environment from the graph allows the graph search algorithm to operate on any problem that can be represented as a graph.\n\n**Planners**\n\nNow that we have a basic concept of what the graph represents, we can look at methods for solving the motion planning problem. The simplest approaches to this would be using Dijkstra's or the A* algorithm, which returns the shortest possible path between a given start and goal. However, this can be slow and memory expensive. Instead, we can find a suboptimal solution, or a path from the start to goal that isn't necessarily the best one. In most cases, we don't need to have the best path - we just need one that's good enough. This relaxes the conditions on the graph search and allows us to find a good-enough solution in much less time with much less memory. One algorithm that does this is weighted A*.\n\nThis parameter of \"good enough\" is often denoted as epsilon of the best solution. If we allow an epsilon of 5, this means that the weighted A* algorithm will return a path that is no worse than 5 times the cost of the optimal solution. This concept of suboptimality is fundamental to how SBPL planners work.\n\n![image](http://upload.wikimedia.org/wikipedia/commons/2/23/Dijkstras_progress_animation.gif)![image](http://upload.wikimedia.org/wikipedia/commons/5/5d/Astar_progress_animation.gif) ![image](http://upload.wikimedia.org/wikipedia/commons/8/85/Weighted_A_star_with_eps_5.gif)\n\nThe three animations here depict a Dijkstra search, an A* search, and a weighted A* search. The speed and memory usage (in terms of number of nodes that are expanded) of each can easily be seen. Dijkstra's is the slowest and expands the most number of states. Weighted A* is a bit better, and computes an optimal path as well (though in this case, it's not the same as Dijkstra's because there is more than one optimal path). Weighted A* runs the fastest, but does not return the best solution.\n\nWith the ARA* algorithm, we can have the best of both worlds - a suboptimal solution can be returned very quickly (high epsilon), and then ARA* can continue working to return a lower epsilon solution for a user specified amount of time.\n\n[SBPL also implements a number of different algorithms (ARA*, AD*, R*, D* Lite, etc) that produce paths with user-specified epsilons. The differences between the algorithms are described in this future article.]\n\nSo what does SBPL actually do? SBPL computes the exact motion path for a robot to follow in order to get from point A to point B. Furthermore, SBPL allows us to trade off how good the path is versus how long it takes to compute. If we care about computation time (like if our robot car is driving really fast), we reduce the optimality of the path. If the car's driving slowly, and we'd like shorter paths, then we can allot more time for the planner to run.\n", + "body_html_raw": "

    This article aims to give a very brief overview of the concepts behind SBPL. See this wiki article for an intro to motion planning.

    \r\n

     

    \r\n

    Search-based Planning

    \r\n

     

    \r\n

    Search-based planning is a motion planning method which uses graph search methods to compute paths or trajectories over a discrete representation of the problem. This is in contrast to sample-based planning methods, which is described very well in the OMPL primer. Search-based methods provides guarantees on path quality and are used in scenarios which demand low cost paths (e.g. robot navigation). 

    \r\n

     

    \r\n

    First we talk about how the environment of the problem is discretized, then we describe how planning is done.

    \r\n

     

    \r\n

    Environments (or discrete representation of a planning problem)

    \r\n

     

    \r\n

    In order to properly represent the problem with a graph, we first discretize all possible states so that there are a finite number of states a robot could be in. Here, the definition of state varies depending on the application. For a car, you might only be concerned with the x, y, and orientation. For a helicopter, it might be the x, y, z position in the world. For a robotic arm, it would be the values of each joint in the arm (joint1, joint2, joint3, joint4).  The collection of these states is defined as the state space. 

    \r\n

     

    \r\n

    The image below shows a small portion of the state space. Here, each possible (x,y) position that a robot could be in is represented as a node with a state ID (S1, S2, etc).  A path for a robot in this state space would then be moving through a series of adjacent states (for example S6, S4, S1).

    \r\n\"A\r\n

    The graph representation then comes naturally - valid transitions between adjacent states (also called the successors of the state) are represented by edges between the nodes. For now, we assume that any two adjacent states will have a valid transition between them (this is a bit oversimplifying, but it's good enough for now - see the Kinematic Constraints and Motion Primitives section for more details.) 

    \r\n

     

    \r\n

    Since the state ID is just a number, environments of nearly any dimension can be discretely represented as a graph.

    \r\n

     

    \r\n

    State Validity and Collision Checking

    \r\n

     

    \r\n

    One important notion about the state space is the validity of states. When computing a trajectory, we need all states in the trajectory to be valid. Obviously, the definition of valid becomes very domain dependent.

    \r\n

     

    \r\n

    Looking at the above figure, which represents the 2D environment, we see that there are states that are invalid - if the blacked out regions are buildings, we certainly wouldn't want to be traveling through them.  In this case, those states are obviously invalid. More specifically, the robot would be in collision with the building. The same idea occurs in the robotic arm domain - given a particular set of joint angles for an arm, does it collide with anything in the environment? In both cases, we need logic that takes in knowledge about the robot's surrounding environment and a given state. It then returns a value telling us whether we are in collision or not (or synonymously, if the state is valid). 

    \r\n

     

    \r\n

    More constraints can be added as needed to the requirements of a valid state. Let's take the case where we have a robotic arm with the same joints and joint limitations as a human arm. We need to make an extra state validity check beyond just seeing if we collide with anything in the environment. If we had a list of states with the elbow joint going from 0 degrees to 270 degrees, many of those states would be invalid - elbows only have a 180 degree range (or have a joint limit of 180 degrees). Therefore, states specifying an elbow angle from 181-270 would be deemed invalid.

    \r\n

     

    \r\n

    Before moving on to searching this graph, it's important to note that the translation between the "real world" context and what the graph looks like is completely decoupled from how the problem is solved.  Because each state is encoded into a single identifying number (state IDs), the graph searching algorithm doesn't need to know what the original domain was - all it needs are these state IDs. This decoupling of the environment from the graph allows the graph search algorithm to operate on any problem that can be represented as a graph.

    \r\n

     

    \r\n

    Planners

    \r\n

     

    \r\n

    Now that we have a basic concept of what the graph represents, we can look at methods for solving the motion planning problem. The simplest approaches to this would be using Dijkstra's or the A* algorithm, which returns the shortest possible path between a given start and goal.  However, this can be slow and memory expensive. Instead, we can find a suboptimal solution, or a path from the start to goal that isn't necessarily the best one. In most cases, we don't need to have the best path - we just need one that's good enough.  This relaxes the conditions on the graph search and allows us to find a good-enough solution in much less time with much less memory. One algorithm that does this is weighted A*.

    \r\n

     

    \r\n

    This parameter of "good enough" is often denoted as epsilon of the best solution. If we allow an epsilon of 5, this means that the weighted A* algorithm will return a path that is no worse than 5 times the cost of the optimal solution.  This concept of suboptimality is fundamental to how SBPL planners work. 

    \r\n

    \"image\"\"image\" \"image\"

    \r\n

     

    \r\n

    The three animations here depict a Dijkstra search, an A* search, and a weighted A* search. The speed and memory usage (in terms of number of nodes that are expanded) of each can easily be seen. Dijkstra's is the slowest and expands the most number of states. Weighted A* is a bit better, and computes an optimal path as well (though in this case, it's not the same as Dijkstra's because there is more than one optimal path). Weighted A* runs the fastest, but does not return the best solution.  

    \r\n

     

    \r\n

    With the ARA* algorithm, we can have the best of both worlds - a suboptimal solution can be returned very quickly (high epsilon), and then ARA* can continue working to return a lower epsilon solution for a user specified amount of time.

    \r\n

     

    \r\n

    [SBPL also implements a number of different algorithms (ARA*, AD*, R*, D* Lite, etc) that produce paths with user-specified epsilons. The differences between the algorithms are described in this future article.]

    \r\n

     

    \r\n

    So what does SBPL actually do? SBPL computes the exact motion path for a robot to follow in order to get from point A to point B. Furthermore, SBPL allows us to trade off how good the path is versus how long it takes to compute. If we care about computation time (like if our robot car is driving really fast), we reduce the optimality of the path.  If the car's driving slowly, and we'd like shorter paths, then we can allot more time for the planner to run.

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0049-primer-to-the-search-based-planning-library-sbpl.md b/static/archive/legacy-drupal/content/pages/0049-primer-to-the-search-based-planning-library-sbpl.md new file mode 100644 index 0000000..6420067 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0049-primer-to-the-search-based-planning-library-sbpl.md @@ -0,0 +1,47 @@ +# Primer to the Search-Based Planning Library (SBPL) + +This article aims to give a very brief overview of the concepts behind SBPL. See [this wiki article](http://en.wikipedia.org/wiki/Motion_planning) for an intro to motion planning. + +**Search-based Planning** + +Search-based planning is a motion planning method which uses graph search methods to compute paths or trajectories over a discrete representation of the problem. This is in contrast to sample-based planning methods, which is described very well in the [OMPL primer](http://ompl.kavrakilab.org/OMPL_Primer.pdf). Search-based methods provides guarantees on path quality and are used in scenarios which demand low cost paths (e.g. robot navigation). + +First we talk about how the environment of the problem is discretized, then we describe how planning is done. + +**Environments (or discrete representation of a planning problem)** + +In order to properly represent the problem with a graph, we first discretize all possible states so that there are a finite number of states a robot could be in. Here, the definition of state varies depending on the application. For a car, you might only be concerned with the x, y, and orientation. For a helicopter, it might be the x, y, z position in the world. For a robotic arm, it would be the values of each joint in the arm (joint1, joint2, joint3, joint4). The collection of these states is defined as the state space. + +The image below shows a small portion of the state space. Here, each possible (x,y) position that a robot could be in is represented as a node with a state ID (S1, S2, etc). A path for a robot in this state space would then be moving through a series of adjacent states (for example S6, S4, S1). + + ![A discrete state](../../media/images/primer1.png) + +The graph representation then comes naturally - valid transitions between adjacent states (also called the successors of the state) are represented by edges between the nodes. For now, we assume that any two adjacent states will have a valid transition between them (this is a bit oversimplifying, but it's good enough for now - see the [Kinematic Constraints and Motion Primitives](http://victor.hwanger.com/post/47052754092/kinematic-constraints-and-motion-primitives) section for more details.) + +Since the state ID is just a number, environments of nearly any dimension can be discretely represented as a graph. + +**State Validity and Collision Checking** + +One important notion about the state space is the validity of states. When computing a trajectory, we need all states in the trajectory to be valid. Obviously, the definition of valid becomes very domain dependent. + +Looking at the above figure, which represents the 2D environment, we see that there are states that are invalid - if the blacked out regions are buildings, we certainly wouldn't want to be traveling through them. In this case, those states are obviously invalid. More specifically, the robot would be in collision with the building. The same idea occurs in the robotic arm domain - given a particular set of joint angles for an arm, does it collide with anything in the environment? In both cases, we need logic that takes in knowledge about the robot's surrounding environment and a given state. It then returns a value telling us whether we are in collision or not (or synonymously, if the state is valid). + +More constraints can be added as needed to the requirements of a valid state. Let's take the case where we have a robotic arm with the same joints and joint limitations as a human arm. We need to make an extra state validity check beyond just seeing if we collide with anything in the environment. If we had a list of states with the elbow joint going from 0 degrees to 270 degrees, many of those states would be invalid - elbows only have a 180 degree range (or have a joint limit of 180 degrees). Therefore, states specifying an elbow angle from 181-270 would be deemed invalid. + +Before moving on to searching this graph, it's important to note that the translation between the "real world" context and what the graph looks like is completely decoupled from how the problem is solved. Because each state is encoded into a single identifying number (state IDs), the graph searching algorithm doesn't need to know what the original domain was - all it needs are these state IDs. This decoupling of the environment from the graph allows the graph search algorithm to operate on any problem that can be represented as a graph. + +**Planners** + +Now that we have a basic concept of what the graph represents, we can look at methods for solving the motion planning problem. The simplest approaches to this would be using Dijkstra's or the A* algorithm, which returns the shortest possible path between a given start and goal. However, this can be slow and memory expensive. Instead, we can find a suboptimal solution, or a path from the start to goal that isn't necessarily the best one. In most cases, we don't need to have the best path - we just need one that's good enough. This relaxes the conditions on the graph search and allows us to find a good-enough solution in much less time with much less memory. One algorithm that does this is weighted A*. + +This parameter of "good enough" is often denoted as epsilon of the best solution. If we allow an epsilon of 5, this means that the weighted A* algorithm will return a path that is no worse than 5 times the cost of the optimal solution. This concept of suboptimality is fundamental to how SBPL planners work. + +![image](http://upload.wikimedia.org/wikipedia/commons/2/23/Dijkstras_progress_animation.gif)![image](http://upload.wikimedia.org/wikipedia/commons/5/5d/Astar_progress_animation.gif) ![image](http://upload.wikimedia.org/wikipedia/commons/8/85/Weighted_A_star_with_eps_5.gif) + +The three animations here depict a Dijkstra search, an A* search, and a weighted A* search. The speed and memory usage (in terms of number of nodes that are expanded) of each can easily be seen. Dijkstra's is the slowest and expands the most number of states. Weighted A* is a bit better, and computes an optimal path as well (though in this case, it's not the same as Dijkstra's because there is more than one optimal path). Weighted A* runs the fastest, but does not return the best solution. + +With the ARA* algorithm, we can have the best of both worlds - a suboptimal solution can be returned very quickly (high epsilon), and then ARA* can continue working to return a lower epsilon solution for a user specified amount of time. + +[SBPL also implements a number of different algorithms (ARA*, AD*, R*, D* Lite, etc) that produce paths with user-specified epsilons. The differences between the algorithms are described in this future article.] + +So what does SBPL actually do? SBPL computes the exact motion path for a robot to follow in order to get from point A to point B. Furthermore, SBPL allows us to trade off how good the path is versus how long it takes to compute. If we care about computation time (like if our robot car is driving really fast), we reduce the optimality of the path. If the car's driving slowly, and we'd like shorter paths, then we can allot more time for the planner to run. diff --git a/static/archive/legacy-drupal/content/pages/0050-primer-to-search-based-motion-planning.html b/static/archive/legacy-drupal/content/pages/0050-primer-to-search-based-motion-planning.html new file mode 100644 index 0000000..e86f2ae --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0050-primer-to-search-based-motion-planning.html @@ -0,0 +1,30 @@ + +Primer to Search-Based Motion Planning + +

    Primer to Search-Based Motion Planning

    +

    This article aims to give a very brief overview of the concepts behind SBPL. See this wiki article for an intro to motion planning.

    +

    Search-based Planning

    +

    Search-based planning is a motion planning method which uses graph search methods to compute paths or trajectories over a discrete representation of the problem. Because a graph is inherently discrete, all graph-search algorithms require this discrete representation.  Search-based planning can then be seen as two problems: how to turn the problem into a graph, and how to search the graph to find the best solution. 

    +

    This is in contrast to sample-based planning methods, which are able to solve problems in continuous space without a graph representation (though certain sampling-based methods do discretize the space). While the pros and cons between the two methods can be debated for many hours, the most apparent difference between the two methods are speed and optimality: graph-search methods can guarantee how "efficient" a solution is (defined more later), but, in general, does so at the expense of computation time. Sampling based planners run fast, but can result in unusual looking and possibly inefficient paths.

    +

    First we talk about how the environment of the problem is discretized, then we describe how planning is done

    +

    Environments (or discrete representation of a planning problem)

    +

    In order to properly represent the problem with a graph, we first discretize all possible states so that there are a finite number of states a robot could be in. Here, the definition of state varies depending on the application. For a car, you might only be concerned with the x, y, and orientation. For a helicopter, it might be the x, y, z, roll, pitch, and yaw. For a robotic arm, it would be the values of each joint in the arm (joint1, joint2, joint3, joint4).  The collection of all possible states is defined as the state space. For the car example, if we have a 50x50 grid of locations it could be in while forcing the car to be in 1 of 4 orientations at all times, we would have a state space of size 50*50*4=10000.

    +

    The image below shows a small portion of the state space. Here, each possible (x,y) position that a robot could be in is represented as a node with a state ID (S1, S2, etc).  A path for a robot in this state space would then be moving through a series of adjacent states (for example S6, S4, S1).

    +

    discretized image

    +

    The graph representation then comes naturally - valid transitions between adjacent states (also called the successors of the state) are represented by edges between the nodes. For now, we assume that any two adjacent states will have a valid transition between them (this is a bit oversimplifying, but it's good enough for now - see the Kinematic Constraints and Motion Primitives section for more details.) 

    +

    Since the state ID is just a number, environments of nearly any dimension can be discretely represented as a graph.

    +

    State Validity and Collision Checking

    +

    One important notion about the state space is the validity of states. When computing a trajectory, we need all states in the trajectory to be valid. Obviously, the definition of valid becomes very domain dependent.

    +

    Looking at the above figure, which represents the 2D environment, we see that there are states that are invalid - if the blacked out regions are buildings, we certainly wouldn't want to be traveling through them.  In this case, those states are obviously invalid. More specifically, the robot would be in collision with the building. The same idea occurs in the robotic arm domain - given a particular set of joint angles for an arm, does it collide with anything in the environment? In both cases, we need logic that takes in knowledge about the robot's surrounding environment and a given state. It then returns a value telling us whether we are in collision or not (or synonymously, if the state is valid). 

    +

    More constraints can be added as needed to the requirements of a valid state. Let's take the case where we have a robotic arm with the same joints and joint limitations as a human arm. We need to make an extra state validity check beyond just seeing if we collide with anything in the environment. If we had a list of states with the elbow joint going from 0 degrees to 270 degrees, many of those states would be invalid - elbows only have a 180 degree range (or have a joint limit of 180 degrees). Therefore, states specifying an elbow angle from 181-270 would be deemed invalid.

    +

    Before moving on to searching this graph, it's important to note that the translation between the "real world" context and what the graph looks like is completely decoupled from how the problem is solved.  Because each state is encoded into a single identifying number (state IDs), the graph searching algorithm doesn't need to know what the original domain was - all it needs are these state IDs. This decoupling of the environment from the graph allows the graph search algorithm to operate on any problem that can be represented as a graph.

    +

    Planners

    +

    Now that we have a basic concept of what the graph represents, we can look at methods for solving the motion planning problem. The simplest approaches to this would be using Dijkstra's or the A* algorithm, which returns the shortest possible path between a given start and goal.  However, this can be slow and memory expensive. Instead, we can find a suboptimal solution, or a path from the start to goal that isn't necessarily the best one. In most cases, we don't need to have the best path - we just need one that's good enough.  This relaxes the conditions on the graph search and allows us to find a good-enough solution in much less time with much less memory. One algorithm that does this is weighted A*.

    +

    This parameter of "good enough" is often denoted as epsilon of the best solution. If we allow an epsilon of 5, this means that the weighted A* algorithm will return a path that is no worse than 5 times the cost of the optimal solution.  This concept of suboptimality is fundamental to how SBPL planners work. 

    +

    imageimage image

    +

    The three animations here depict a Dijkstra search, an A* search, and a weighted A* search. The speed and memory usage (in terms of number of nodes that are expanded) of each can easily be seen. Dijkstra's is the slowest and expands the most number of states. The vanilla A* is a bit better, and computes an optimal path as well (though in this case, it's not the same as Dijkstra's because there is more than one optimal path). Weighted A* runs the fastest, but does not return the best solution.  

    +

    With the ARA* algorithm, we can have the best of both worlds - a suboptimal solution can be returned very quickly (high epsilon), and then ARA* can continue working to return a lower epsilon solution for a user specified amount of time.

    +

    [SBPL also implements a number of different algorithms (ARA*, AD*, R*, D* Lite, etc) that produce paths with user-specified epsilons. The differences between the algorithms are described in this future article.]

    +

    So what does SBPL actually do? SBPL computes the exact motion path for a robot to follow in order to get from point A to point B. Furthermore, SBPL allows us to trade off how good the path is versus how long it takes to compute. If we care about computation time (like if our robot car is driving really fast), we reduce the optimality of the path.  If the car's driving slowly, and we'd like shorter paths, then we can allot more time for the planner to run.

    + + diff --git a/static/archive/legacy-drupal/content/pages/0050-primer-to-search-based-motion-planning.json b/static/archive/legacy-drupal/content/pages/0050-primer-to-search-based-motion-planning.json new file mode 100644 index 0000000..8c74d96 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0050-primer-to-search-based-motion-planning.json @@ -0,0 +1,25 @@ +{ + "nid": 50, + "vid": 50, + "type": "page", + "language": "und", + "title": "Primer to Search-Based Motion Planning", + "slug": "primer-to-search-based-motion-planning", + "uid": 648, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1370992592, + "changed": 1373331899, + "url_aliases": [], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    This article aims to give a very brief overview of the concepts behind SBPL. See this wiki article for an intro to motion planning.

    \r\n

    Search-based Planning

    \r\n

    Search-based planning is a motion planning method which uses graph search methods to compute paths or trajectories over a discrete representation of the problem. Because a graph is inherently discrete, all graph-search algorithms require this discrete representation.  Search-based planning can then be seen as two problems: how to turn the problem into a graph, and how to search the graph to find the best solution. 

    \r\n

    This is in contrast to sample-based planning methods, which are able to solve problems in continuous space without a graph representation (though certain sampling-based methods do discretize the space). While the pros and cons between the two methods can be debated for many hours, the most apparent difference between the two methods are speed and optimality: graph-search methods can guarantee how "efficient" a solution is (defined more later), but, in general, does so at the expense of computation time. Sampling based planners run fast, but can result in unusual looking and possibly inefficient paths.

    \r\n

    First we talk about how the environment of the problem is discretized, then we describe how planning is done

    \r\n

    Environments (or discrete representation of a planning problem)

    \r\n

    In order to properly represent the problem with a graph, we first discretize all possible states so that there are a finite number of states a robot could be in. Here, the definition of state varies depending on the application. For a car, you might only be concerned with the x, y, and orientation. For a helicopter, it might be the x, y, z, roll, pitch, and yaw. For a robotic arm, it would be the values of each joint in the arm (joint1, joint2, joint3, joint4).  The collection of all possible states is defined as the state space. For the car example, if we have a 50x50 grid of locations it could be in while forcing the car to be in 1 of 4 orientations at all times, we would have a state space of size 50*50*4=10000.

    \r\n

    The image below shows a small portion of the state space. Here, each possible (x,y) position that a robot could be in is represented as a node with a state ID (S1, S2, etc).  A path for a robot in this state space would then be moving through a series of adjacent states (for example S6, S4, S1).

    \r\n

    \"discretized

    \r\n

    The graph representation then comes naturally - valid transitions between adjacent states (also called the successors of the state) are represented by edges between the nodes. For now, we assume that any two adjacent states will have a valid transition between them (this is a bit oversimplifying, but it's good enough for now - see the Kinematic Constraints and Motion Primitives section for more details.) 

    \r\n

    Since the state ID is just a number, environments of nearly any dimension can be discretely represented as a graph.

    \r\n

    State Validity and Collision Checking

    \r\n

    One important notion about the state space is the validity of states. When computing a trajectory, we need all states in the trajectory to be valid. Obviously, the definition of valid becomes very domain dependent.

    \r\n

    Looking at the above figure, which represents the 2D environment, we see that there are states that are invalid - if the blacked out regions are buildings, we certainly wouldn't want to be traveling through them.  In this case, those states are obviously invalid. More specifically, the robot would be in collision with the building. The same idea occurs in the robotic arm domain - given a particular set of joint angles for an arm, does it collide with anything in the environment? In both cases, we need logic that takes in knowledge about the robot's surrounding environment and a given state. It then returns a value telling us whether we are in collision or not (or synonymously, if the state is valid). 

    \r\n

    More constraints can be added as needed to the requirements of a valid state. Let's take the case where we have a robotic arm with the same joints and joint limitations as a human arm. We need to make an extra state validity check beyond just seeing if we collide with anything in the environment. If we had a list of states with the elbow joint going from 0 degrees to 270 degrees, many of those states would be invalid - elbows only have a 180 degree range (or have a joint limit of 180 degrees). Therefore, states specifying an elbow angle from 181-270 would be deemed invalid.

    \r\n

    Before moving on to searching this graph, it's important to note that the translation between the "real world" context and what the graph looks like is completely decoupled from how the problem is solved.  Because each state is encoded into a single identifying number (state IDs), the graph searching algorithm doesn't need to know what the original domain was - all it needs are these state IDs. This decoupling of the environment from the graph allows the graph search algorithm to operate on any problem that can be represented as a graph.

    \r\n

    Planners

    \r\n

    Now that we have a basic concept of what the graph represents, we can look at methods for solving the motion planning problem. The simplest approaches to this would be using Dijkstra's or the A* algorithm, which returns the shortest possible path between a given start and goal.  However, this can be slow and memory expensive. Instead, we can find a suboptimal solution, or a path from the start to goal that isn't necessarily the best one. In most cases, we don't need to have the best path - we just need one that's good enough.  This relaxes the conditions on the graph search and allows us to find a good-enough solution in much less time with much less memory. One algorithm that does this is weighted A*.

    \r\n

    This parameter of "good enough" is often denoted as epsilon of the best solution. If we allow an epsilon of 5, this means that the weighted A* algorithm will return a path that is no worse than 5 times the cost of the optimal solution.  This concept of suboptimality is fundamental to how SBPL planners work. 

    \r\n

    \"image\"\"image\" \"image\"

    \r\n

    The three animations here depict a Dijkstra search, an A* search, and a weighted A* search. The speed and memory usage (in terms of number of nodes that are expanded) of each can easily be seen. Dijkstra's is the slowest and expands the most number of states. The vanilla A* is a bit better, and computes an optimal path as well (though in this case, it's not the same as Dijkstra's because there is more than one optimal path). Weighted A* runs the fastest, but does not return the best solution.  

    \r\n

    With the ARA* algorithm, we can have the best of both worlds - a suboptimal solution can be returned very quickly (high epsilon), and then ARA* can continue working to return a lower epsilon solution for a user specified amount of time.

    \r\n

    [SBPL also implements a number of different algorithms (ARA*, AD*, R*, D* Lite, etc) that produce paths with user-specified epsilons. The differences between the algorithms are described in this future article.]

    \r\n

    So what does SBPL actually do? SBPL computes the exact motion path for a robot to follow in order to get from point A to point B. Furthermore, SBPL allows us to trade off how good the path is versus how long it takes to compute. If we care about computation time (like if our robot car is driving really fast), we reduce the optimality of the path.  If the car's driving slowly, and we'd like shorter paths, then we can allot more time for the planner to run.

    \r\n", + "body_markdown": "This article aims to give a very brief overview of the concepts behind SBPL. See [this wiki article](http://en.wikipedia.org/wiki/Motion_planning) for an intro to motion planning.\n\n**Search-based Planning**\n\nSearch-based planning is a motion planning method which uses graph search methods to compute paths or trajectories over a discrete representation of the problem. Because a graph is inherently discrete, all graph-search algorithms require this discrete representation. Search-based planning can then be seen as two problems: how to turn the problem into a graph, and how to search the graph to find the best solution.\n\nThis is in contrast to sample-based planning methods, which are able to solve problems in continuous space without a graph representation (though certain sampling-based methods do discretize the space). While the pros and cons between the two methods can be debated for many hours, the most apparent difference between the two methods are speed and optimality: graph-search methods can guarantee how \"efficient\" a solution is (defined more later), but, in general, does so at the expense of computation time. Sampling based planners run fast, but can result in unusual looking and possibly inefficient paths.\n\nFirst we talk about how the environment of the problem is discretized, then we describe how planning is done.\n\n**Environments (or discrete representation of a planning problem)**\n\nIn order to properly represent the problem with a graph, we first discretize all possible states so that there are a finite number of states a robot could be in. Here, the definition of state varies depending on the application. For a car, you might only be concerned with the x, y, and orientation. For a helicopter, it might be the x, y, z, roll, pitch, and yaw. For a robotic arm, it would be the values of each joint in the arm (joint1, joint2, joint3, joint4). The collection of all possible states is defined as the state space. For the car example, if we have a 50x50 grid of locations it could be in while forcing the car to be in 1 of 4 orientations at all times, we would have a state space of size 50*50*4=10000.\n\nThe image below shows a small portion of the state space. Here, each possible (x,y) position that a robot could be in is represented as a node with a state ID (S1, S2, etc). A path for a robot in this state space would then be moving through a series of adjacent states (for example S6, S4, S1).\n\n![discretized image](../../media/images/primer1.png)\n\nThe graph representation then comes naturally - valid transitions between adjacent states (also called the successors of the state) are represented by edges between the nodes. For now, we assume that any two adjacent states will have a valid transition between them (this is a bit oversimplifying, but it's good enough for now - see the [Kinematic Constraints and Motion Primitives](http://sbpl.net/node/48) section for more details.)\n\nSince the state ID is just a number, environments of nearly any dimension can be discretely represented as a graph.\n\n**State Validity and Collision Checking**\n\nOne important notion about the state space is the validity of states. When computing a trajectory, we need all states in the trajectory to be valid. Obviously, the definition of valid becomes very domain dependent.\n\nLooking at the above figure, which represents the 2D environment, we see that there are states that are invalid - if the blacked out regions are buildings, we certainly wouldn't want to be traveling through them. In this case, those states are obviously invalid. More specifically, the robot would be in collision with the building. The same idea occurs in the robotic arm domain - given a particular set of joint angles for an arm, does it collide with anything in the environment? In both cases, we need logic that takes in knowledge about the robot's surrounding environment and a given state. It then returns a value telling us whether we are in collision or not (or synonymously, if the state is valid).\n\nMore constraints can be added as needed to the requirements of a valid state. Let's take the case where we have a robotic arm with the same joints and joint limitations as a human arm. We need to make an extra state validity check beyond just seeing if we collide with anything in the environment. If we had a list of states with the elbow joint going from 0 degrees to 270 degrees, many of those states would be invalid - elbows only have a 180 degree range (or have a joint limit of 180 degrees). Therefore, states specifying an elbow angle from 181-270 would be deemed invalid.\n\nBefore moving on to searching this graph, it's important to note that the translation between the \"real world\" context and what the graph looks like is completely decoupled from how the problem is solved. Because each state is encoded into a single identifying number (state IDs), the graph searching algorithm doesn't need to know what the original domain was - all it needs are these state IDs. This decoupling of the environment from the graph allows the graph search algorithm to operate on any problem that can be represented as a graph.\n\n**Planners**\n\nNow that we have a basic concept of what the graph represents, we can look at methods for solving the motion planning problem. The simplest approaches to this would be using Dijkstra's or the A* algorithm, which returns the shortest possible path between a given start and goal. However, this can be slow and memory expensive. Instead, we can find a suboptimal solution, or a path from the start to goal that isn't necessarily the best one. In most cases, we don't need to have the best path - we just need one that's good enough. This relaxes the conditions on the graph search and allows us to find a good-enough solution in much less time with much less memory. One algorithm that does this is weighted A*.\n\nThis parameter of \"good enough\" is often denoted as epsilon of the best solution. If we allow an epsilon of 5, this means that the weighted A* algorithm will return a path that is no worse than 5 times the cost of the optimal solution. This concept of suboptimality is fundamental to how SBPL planners work.\n\n![image](http://upload.wikimedia.org/wikipedia/commons/2/23/Dijkstras_progress_animation.gif)![image](http://upload.wikimedia.org/wikipedia/commons/5/5d/Astar_progress_animation.gif) ![image](http://upload.wikimedia.org/wikipedia/commons/8/85/Weighted_A_star_with_eps_5.gif)\n\nThe three animations here depict a Dijkstra search, an A* search, and a weighted A* search. The speed and memory usage (in terms of number of nodes that are expanded) of each can easily be seen. Dijkstra's is the slowest and expands the most number of states. The vanilla A* is a bit better, and computes an optimal path as well (though in this case, it's not the same as Dijkstra's because there is more than one optimal path). Weighted A* runs the fastest, but does not return the best solution.\n\nWith the ARA* algorithm, we can have the best of both worlds - a suboptimal solution can be returned very quickly (high epsilon), and then ARA* can continue working to return a lower epsilon solution for a user specified amount of time.\n\n[SBPL also implements a number of different algorithms (ARA*, AD*, R*, D* Lite, etc) that produce paths with user-specified epsilons. The differences between the algorithms are described in this future article.]\n\nSo what does SBPL actually do? SBPL computes the exact motion path for a robot to follow in order to get from point A to point B. Furthermore, SBPL allows us to trade off how good the path is versus how long it takes to compute. If we care about computation time (like if our robot car is driving really fast), we reduce the optimality of the path. If the car's driving slowly, and we'd like shorter paths, then we can allot more time for the planner to run.\n", + "body_html_raw": "

    This article aims to give a very brief overview of the concepts behind SBPL. See this wiki article for an intro to motion planning.

    \r\n

    Search-based Planning

    \r\n

    Search-based planning is a motion planning method which uses graph search methods to compute paths or trajectories over a discrete representation of the problem. Because a graph is inherently discrete, all graph-search algorithms require this discrete representation.  Search-based planning can then be seen as two problems: how to turn the problem into a graph, and how to search the graph to find the best solution. 

    \r\n

    This is in contrast to sample-based planning methods, which are able to solve problems in continuous space without a graph representation (though certain sampling-based methods do discretize the space). While the pros and cons between the two methods can be debated for many hours, the most apparent difference between the two methods are speed and optimality: graph-search methods can guarantee how "efficient" a solution is (defined more later), but, in general, does so at the expense of computation time. Sampling based planners run fast, but can result in unusual looking and possibly inefficient paths.

    \r\n

    First we talk about how the environment of the problem is discretized, then we describe how planning is done

    \r\n

    Environments (or discrete representation of a planning problem)

    \r\n

    In order to properly represent the problem with a graph, we first discretize all possible states so that there are a finite number of states a robot could be in. Here, the definition of state varies depending on the application. For a car, you might only be concerned with the x, y, and orientation. For a helicopter, it might be the x, y, z, roll, pitch, and yaw. For a robotic arm, it would be the values of each joint in the arm (joint1, joint2, joint3, joint4).  The collection of all possible states is defined as the state space. For the car example, if we have a 50x50 grid of locations it could be in while forcing the car to be in 1 of 4 orientations at all times, we would have a state space of size 50*50*4=10000.

    \r\n

    The image below shows a small portion of the state space. Here, each possible (x,y) position that a robot could be in is represented as a node with a state ID (S1, S2, etc).  A path for a robot in this state space would then be moving through a series of adjacent states (for example S6, S4, S1).

    \r\n

    \"discretized

    \r\n

    The graph representation then comes naturally - valid transitions between adjacent states (also called the successors of the state) are represented by edges between the nodes. For now, we assume that any two adjacent states will have a valid transition between them (this is a bit oversimplifying, but it's good enough for now - see the Kinematic Constraints and Motion Primitives section for more details.) 

    \r\n

    Since the state ID is just a number, environments of nearly any dimension can be discretely represented as a graph.

    \r\n

    State Validity and Collision Checking

    \r\n

    One important notion about the state space is the validity of states. When computing a trajectory, we need all states in the trajectory to be valid. Obviously, the definition of valid becomes very domain dependent.

    \r\n

    Looking at the above figure, which represents the 2D environment, we see that there are states that are invalid - if the blacked out regions are buildings, we certainly wouldn't want to be traveling through them.  In this case, those states are obviously invalid. More specifically, the robot would be in collision with the building. The same idea occurs in the robotic arm domain - given a particular set of joint angles for an arm, does it collide with anything in the environment? In both cases, we need logic that takes in knowledge about the robot's surrounding environment and a given state. It then returns a value telling us whether we are in collision or not (or synonymously, if the state is valid). 

    \r\n

    More constraints can be added as needed to the requirements of a valid state. Let's take the case where we have a robotic arm with the same joints and joint limitations as a human arm. We need to make an extra state validity check beyond just seeing if we collide with anything in the environment. If we had a list of states with the elbow joint going from 0 degrees to 270 degrees, many of those states would be invalid - elbows only have a 180 degree range (or have a joint limit of 180 degrees). Therefore, states specifying an elbow angle from 181-270 would be deemed invalid.

    \r\n

    Before moving on to searching this graph, it's important to note that the translation between the "real world" context and what the graph looks like is completely decoupled from how the problem is solved.  Because each state is encoded into a single identifying number (state IDs), the graph searching algorithm doesn't need to know what the original domain was - all it needs are these state IDs. This decoupling of the environment from the graph allows the graph search algorithm to operate on any problem that can be represented as a graph.

    \r\n

    Planners

    \r\n

    Now that we have a basic concept of what the graph represents, we can look at methods for solving the motion planning problem. The simplest approaches to this would be using Dijkstra's or the A* algorithm, which returns the shortest possible path between a given start and goal.  However, this can be slow and memory expensive. Instead, we can find a suboptimal solution, or a path from the start to goal that isn't necessarily the best one. In most cases, we don't need to have the best path - we just need one that's good enough.  This relaxes the conditions on the graph search and allows us to find a good-enough solution in much less time with much less memory. One algorithm that does this is weighted A*.

    \r\n

    This parameter of "good enough" is often denoted as epsilon of the best solution. If we allow an epsilon of 5, this means that the weighted A* algorithm will return a path that is no worse than 5 times the cost of the optimal solution.  This concept of suboptimality is fundamental to how SBPL planners work. 

    \r\n

    \"image\"\"image\" \"image\"

    \r\n

    The three animations here depict a Dijkstra search, an A* search, and a weighted A* search. The speed and memory usage (in terms of number of nodes that are expanded) of each can easily be seen. Dijkstra's is the slowest and expands the most number of states. The vanilla A* is a bit better, and computes an optimal path as well (though in this case, it's not the same as Dijkstra's because there is more than one optimal path). Weighted A* runs the fastest, but does not return the best solution.  

    \r\n

    With the ARA* algorithm, we can have the best of both worlds - a suboptimal solution can be returned very quickly (high epsilon), and then ARA* can continue working to return a lower epsilon solution for a user specified amount of time.

    \r\n

    [SBPL also implements a number of different algorithms (ARA*, AD*, R*, D* Lite, etc) that produce paths with user-specified epsilons. The differences between the algorithms are described in this future article.]

    \r\n

    So what does SBPL actually do? SBPL computes the exact motion path for a robot to follow in order to get from point A to point B. Furthermore, SBPL allows us to trade off how good the path is versus how long it takes to compute. If we care about computation time (like if our robot car is driving really fast), we reduce the optimality of the path.  If the car's driving slowly, and we'd like shorter paths, then we can allot more time for the planner to run.

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0050-primer-to-search-based-motion-planning.md b/static/archive/legacy-drupal/content/pages/0050-primer-to-search-based-motion-planning.md new file mode 100644 index 0000000..2694cfd --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0050-primer-to-search-based-motion-planning.md @@ -0,0 +1,49 @@ +# Primer to Search-Based Motion Planning + +This article aims to give a very brief overview of the concepts behind SBPL. See [this wiki article](http://en.wikipedia.org/wiki/Motion_planning) for an intro to motion planning. + +**Search-based Planning** + +Search-based planning is a motion planning method which uses graph search methods to compute paths or trajectories over a discrete representation of the problem. Because a graph is inherently discrete, all graph-search algorithms require this discrete representation. Search-based planning can then be seen as two problems: how to turn the problem into a graph, and how to search the graph to find the best solution. + +This is in contrast to sample-based planning methods, which are able to solve problems in continuous space without a graph representation (though certain sampling-based methods do discretize the space). While the pros and cons between the two methods can be debated for many hours, the most apparent difference between the two methods are speed and optimality: graph-search methods can guarantee how "efficient" a solution is (defined more later), but, in general, does so at the expense of computation time. Sampling based planners run fast, but can result in unusual looking and possibly inefficient paths. + +First we talk about how the environment of the problem is discretized, then we describe how planning is done. + +**Environments (or discrete representation of a planning problem)** + +In order to properly represent the problem with a graph, we first discretize all possible states so that there are a finite number of states a robot could be in. Here, the definition of state varies depending on the application. For a car, you might only be concerned with the x, y, and orientation. For a helicopter, it might be the x, y, z, roll, pitch, and yaw. For a robotic arm, it would be the values of each joint in the arm (joint1, joint2, joint3, joint4). The collection of all possible states is defined as the state space. For the car example, if we have a 50x50 grid of locations it could be in while forcing the car to be in 1 of 4 orientations at all times, we would have a state space of size 50*50*4=10000. + +The image below shows a small portion of the state space. Here, each possible (x,y) position that a robot could be in is represented as a node with a state ID (S1, S2, etc). A path for a robot in this state space would then be moving through a series of adjacent states (for example S6, S4, S1). + +![discretized image](../../media/images/primer1.png) + +The graph representation then comes naturally - valid transitions between adjacent states (also called the successors of the state) are represented by edges between the nodes. For now, we assume that any two adjacent states will have a valid transition between them (this is a bit oversimplifying, but it's good enough for now - see the [Kinematic Constraints and Motion Primitives](http://sbpl.net/node/48) section for more details.) + +Since the state ID is just a number, environments of nearly any dimension can be discretely represented as a graph. + +**State Validity and Collision Checking** + +One important notion about the state space is the validity of states. When computing a trajectory, we need all states in the trajectory to be valid. Obviously, the definition of valid becomes very domain dependent. + +Looking at the above figure, which represents the 2D environment, we see that there are states that are invalid - if the blacked out regions are buildings, we certainly wouldn't want to be traveling through them. In this case, those states are obviously invalid. More specifically, the robot would be in collision with the building. The same idea occurs in the robotic arm domain - given a particular set of joint angles for an arm, does it collide with anything in the environment? In both cases, we need logic that takes in knowledge about the robot's surrounding environment and a given state. It then returns a value telling us whether we are in collision or not (or synonymously, if the state is valid). + +More constraints can be added as needed to the requirements of a valid state. Let's take the case where we have a robotic arm with the same joints and joint limitations as a human arm. We need to make an extra state validity check beyond just seeing if we collide with anything in the environment. If we had a list of states with the elbow joint going from 0 degrees to 270 degrees, many of those states would be invalid - elbows only have a 180 degree range (or have a joint limit of 180 degrees). Therefore, states specifying an elbow angle from 181-270 would be deemed invalid. + +Before moving on to searching this graph, it's important to note that the translation between the "real world" context and what the graph looks like is completely decoupled from how the problem is solved. Because each state is encoded into a single identifying number (state IDs), the graph searching algorithm doesn't need to know what the original domain was - all it needs are these state IDs. This decoupling of the environment from the graph allows the graph search algorithm to operate on any problem that can be represented as a graph. + +**Planners** + +Now that we have a basic concept of what the graph represents, we can look at methods for solving the motion planning problem. The simplest approaches to this would be using Dijkstra's or the A* algorithm, which returns the shortest possible path between a given start and goal. However, this can be slow and memory expensive. Instead, we can find a suboptimal solution, or a path from the start to goal that isn't necessarily the best one. In most cases, we don't need to have the best path - we just need one that's good enough. This relaxes the conditions on the graph search and allows us to find a good-enough solution in much less time with much less memory. One algorithm that does this is weighted A*. + +This parameter of "good enough" is often denoted as epsilon of the best solution. If we allow an epsilon of 5, this means that the weighted A* algorithm will return a path that is no worse than 5 times the cost of the optimal solution. This concept of suboptimality is fundamental to how SBPL planners work. + +![image](http://upload.wikimedia.org/wikipedia/commons/2/23/Dijkstras_progress_animation.gif)![image](http://upload.wikimedia.org/wikipedia/commons/5/5d/Astar_progress_animation.gif) ![image](http://upload.wikimedia.org/wikipedia/commons/8/85/Weighted_A_star_with_eps_5.gif) + +The three animations here depict a Dijkstra search, an A* search, and a weighted A* search. The speed and memory usage (in terms of number of nodes that are expanded) of each can easily be seen. Dijkstra's is the slowest and expands the most number of states. The vanilla A* is a bit better, and computes an optimal path as well (though in this case, it's not the same as Dijkstra's because there is more than one optimal path). Weighted A* runs the fastest, but does not return the best solution. + +With the ARA* algorithm, we can have the best of both worlds - a suboptimal solution can be returned very quickly (high epsilon), and then ARA* can continue working to return a lower epsilon solution for a user specified amount of time. + +[SBPL also implements a number of different algorithms (ARA*, AD*, R*, D* Lite, etc) that produce paths with user-specified epsilons. The differences between the algorithms are described in this future article.] + +So what does SBPL actually do? SBPL computes the exact motion path for a robot to follow in order to get from point A to point B. Furthermore, SBPL allows us to trade off how good the path is versus how long it takes to compute. If we care about computation time (like if our robot car is driving really fast), we reduce the optimality of the path. If the car's driving slowly, and we'd like shorter paths, then we can allot more time for the planner to run. diff --git a/static/archive/legacy-drupal/content/pages/0051-planning-with-sbpl-example-in-x-y-theta-state-space.html b/static/archive/legacy-drupal/content/pages/0051-planning-with-sbpl-example-in-x-y-theta-state-space.html new file mode 100644 index 0000000..47077d6 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0051-planning-with-sbpl-example-in-x-y-theta-state-space.html @@ -0,0 +1,63 @@ + +Planning with SBPL: Example in X, Y, Theta State Space + +

    Planning with SBPL: Example in X, Y, Theta State Space

    +

    This tutorial will go through a simple example of loading in an environment (the Willow Garage floorplan), then generating a plan from a specified start and goal.

    +

    As described in the previous tutorial, planning with search-based methods have two parts - representing the problem as a graph, then solving the graph with graph-search methods. SBPL has two objects it uses for these two roles - the environment and the planner. The code below shows the initialization of an environment in the (x, y, theta) state space. We'll then use the ARA* planner to produce our paths.

    +

    Initializing the environment

    +

    We'll be using an environment file (specific to EnvironmentXYTHETALAT) that already contains values for all the parameters we need, so you can load them right in. But here's the breakdown of what the XYTheta environment requires. 

    +
      +
    • + discretization(cells): this describes how many cells the environment is descretized into.
    • +
    • + Obsthresh: equivalent to cost_lethal (see section 1.5 of the ROS Wiki)
    • +
    • + Cost_inscribed_thresh: (see section 1.5 of the ROS Wiki)
    • +
    • + Cost_possibly_circumscribed_thresh: (see section 1.5 of the ROS Wiki)
    • +
    • + Cellsize(meters): the length of one edge of a square cell. Multipyling each value in the discretization(cell) line should yield the size of your actual map.
    • +
    • + nominalvel(mpersecs): speed of translational movement
    • +
    • + timetoturn45degsinplace(secs): speed of rotational movement
    • +
    • + start(meters,rads): the start x, y, and theta position
    • +
    • + end(meters,rads): the end x, y, and theta position
    • +
    • + environment: a map of the environment.
    • +
    +

     

    +

    The Code

    +

    You can find the entire file at this GIST. We'll step through the planxythetalat function.

    + +

    Perimeter of robot

    +

    This function defines a vector of points that describe the perimeter of the robot. The (0,0) point of the robot is the reference location that the planner uses. In this example, the robot is a .01m by .01m robot, with its center at (0,0).

    +

    Initializing the environment

    +

    This initializes our environment with the information from the environment file, perimeter description, and motion primitive file. There are also functions available to initialize an environment without a file, but this requires a lot of parameters to be passed into the initialization function.

    +

    Specifying start and goal state

    +

    This sets the desired start and goal states to plan between. A very important detail here is that start_id and goal_id get filled in to be used later. BOTH the environment and planner must have their start and goal set. The environment takes in the continuous coordinate for the start and goal, and the planner takes in the state IDs for the start and goal. 

    +

    Initializing the planner

    +

    Here, we specify the initial epsilon. By default, this will decrement the epsilon by .2 after every solved plan. The search mode of the planner denotes if it quits after the first solution (search_mode = true) or if it continues to try and improve its solution quality until it's out of time (search_mode = false). One other parameter here is the bsearch, which sets whether it is a forward or backward search (searching from start to goal or from goal to start).

    +

    Planning

    +

    The planner takes in an double limiting how long it has to plan. It returns a vector containing the state IDs for the path. It then prints out some stats that shows how long it took to plan, the solution cost, and the final epsilon it reached.

    +

    Writing out solution

    +

    While the planner returned a vector of state IDs, this is not what you would feed to a controller - it must be converted back into continuous coordinates. The writeSolution function spits out a text file containing both the discrete and continuous paths. You'll notice that the continuous path has many more points than the discrete path. This is because each motion primitive is composed of many waypoints that are expanded for the continuous path.

    +

    Running the code

    +

    Once you compile the code, you can run it with

    +
    +$ ./xytheta [location of willow cfg file] [location of motion primitives file]
    +

    In the standard SBPL install, use these files

    +
    +env_examples/nav3d/willow-25mm-inflated-env.cfg
    +matlab/mprim/pr2.mprim
    +
    +

    (By default, the willow cfg comes as a zip, so you have to unzip it first). This will produce two solution files sol.txt and sol.txt.discrete

    +

    This is the planned path plotted using this python code (depends on matplotlib and numpy). You can run this code with

    +
    python visualize.py willow-25mm-inflated-env.cfg sol.txt.discrete
    +

    image

    +

     

    +

     

    + + diff --git a/static/archive/legacy-drupal/content/pages/0051-planning-with-sbpl-example-in-x-y-theta-state-space.json b/static/archive/legacy-drupal/content/pages/0051-planning-with-sbpl-example-in-x-y-theta-state-space.json new file mode 100644 index 0000000..ab8e5ab --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0051-planning-with-sbpl-example-in-x-y-theta-state-space.json @@ -0,0 +1,25 @@ +{ + "nid": 51, + "vid": 51, + "type": "page", + "language": "und", + "title": "Planning with SBPL: Example in X, Y, Theta State Space", + "slug": "planning-with-sbpl-example-in-x-y-theta-state-space", + "uid": 648, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1370993106, + "changed": 1386260017, + "url_aliases": [], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    This tutorial will go through a simple example of loading in an environment (the Willow Garage floorplan), then generating a plan from a specified start and goal.

    \r\n

    As described in the previous tutorial, planning with search-based methods have two parts - representing the problem as a graph, then solving the graph with graph-search methods. SBPL has two objects it uses for these two roles - the environment and the planner. The code below shows the initialization of an environment in the (x, y, theta) state space. We'll then use the ARA* planner to produce our paths.

    \r\n

    Initializing the environment

    \r\n

    We'll be using an environment file (specific to EnvironmentXYTHETALAT) that already contains values for all the parameters we need, so you can load them right in. But here's the breakdown of what the XYTheta environment requires. 

    \r\n
      \r\n\t
    • \r\n\t\tdiscretization(cells): this describes how many cells the environment is descretized into.
    • \r\n\t
    • \r\n\t\tObsthresh: equivalent to cost_lethal (see section 1.5 of the ROS Wiki)
    • \r\n\t
    • \r\n\t\tCost_inscribed_thresh: (see section 1.5 of the ROS Wiki)
    • \r\n\t
    • \r\n\t\tCost_possibly_circumscribed_thresh: (see section 1.5 of the ROS Wiki)
    • \r\n\t
    • \r\n\t\tCellsize(meters): the length of one edge of a square cell. Multipyling each value in the discretization(cell) line should yield the size of your actual map.
    • \r\n\t
    • \r\n\t\tnominalvel(mpersecs): speed of translational movement
    • \r\n\t
    • \r\n\t\ttimetoturn45degsinplace(secs): speed of rotational movement
    • \r\n\t
    • \r\n\t\tstart(meters,rads): the start x, y, and theta position
    • \r\n\t
    • \r\n\t\tend(meters,rads): the end x, y, and theta position
    • \r\n\t
    • \r\n\t\tenvironment: a map of the environment.
    • \r\n
    \r\n

     

    \r\n

    The Code

    \r\n

    You can find the entire file at this GIST. We'll step through the planxythetalat function.

    \r\n\r\n

    Perimeter of robot

    \r\n

    This function defines a vector of points that describe the perimeter of the robot. The (0,0) point of the robot is the reference location that the planner uses. In this example, the robot is a .01m by .01m robot, with its center at (0,0).

    \r\n

    Initializing the environment

    \r\n

    This initializes our environment with the information from the environment file, perimeter description, and motion primitive file. There are also functions available to initialize an environment without a file, but this requires a lot of parameters to be passed into the initialization function.

    \r\n

    Specifying start and goal state

    \r\n

    This sets the desired start and goal states to plan between. A very important detail here is that start_id and goal_id get filled in to be used later. BOTH the environment and planner must have their start and goal set. The environment takes in the continuous coordinate for the start and goal, and the planner takes in the state IDs for the start and goal. 

    \r\n

    Initializing the planner

    \r\n

    Here, we specify the initial epsilon. By default, this will decrement the epsilon by .2 after every solved plan. The search mode of the planner denotes if it quits after the first solution (search_mode = true) or if it continues to try and improve its solution quality until it's out of time (search_mode = false). One other parameter here is the bsearch, which sets whether it is a forward or backward search (searching from start to goal or from goal to start).

    \r\n

    Planning

    \r\n

    The planner takes in an double limiting how long it has to plan. It returns a vector containing the state IDs for the path. It then prints out some stats that shows how long it took to plan, the solution cost, and the final epsilon it reached.

    \r\n

    Writing out solution

    \r\n

    While the planner returned a vector of state IDs, this is not what you would feed to a controller - it must be converted back into continuous coordinates. The writeSolution function spits out a text file containing both the discrete and continuous paths. You'll notice that the continuous path has many more points than the discrete path. This is because each motion primitive is composed of many waypoints that are expanded for the continuous path.

    \r\n

    Running the code

    \r\n

    Once you compile the code, you can run it with

    \r\n
    \r\n$ ./xytheta [location of willow cfg file] [location of motion primitives file]
    \r\n

    In the standard SBPL install, use these files

    \r\n
    \r\nenv_examples/nav3d/willow-25mm-inflated-env.cfg\r\nmatlab/mprim/pr2.mprim\r\n
    \r\n

    (By default, the willow cfg comes as a zip, so you have to unzip it first). This will produce two solution files sol.txt and sol.txt.discrete

    \r\n

    This is the planned path plotted using this python code (depends on matplotlib and numpy). You can run this code with

    \r\n
    python visualize.py willow-25mm-inflated-env.cfg sol.txt.discrete
    \r\n

    \"image\"

    \r\n

     

    \r\n

     

    \r\n", + "body_markdown": "This tutorial will go through a simple example of loading in an environment (the Willow Garage floorplan), then generating a plan from a specified start and goal.\n\nAs described in the previous tutorial, planning with search-based methods have two parts - representing the problem as a graph, then solving the graph with graph-search methods. SBPL has two objects it uses for these two roles - the environment and the planner. The code below shows the initialization of an environment in the (x, y, theta) state space. We'll then use the ARA* planner to produce our paths.\n\n**Initializing the environment**\n\nWe'll be using an environment file (specific to EnvironmentXYTHETALAT) that already contains values for all the parameters we need, so you can load them right in. But here's the breakdown of what the XYTheta environment requires.\n\n- discretization(cells): this describes how many cells the environment is descretized into.\n- Obsthresh: equivalent to cost_lethal (see [section 1.5 of the ROS Wiki](http://www.ros.org/wiki/costmap_2d))\n- Cost_inscribed_thresh: (see [section 1.5 of the ROS Wiki](http://www.ros.org/wiki/costmap_2d))\n- Cost_possibly_circumscribed_thresh: (see [section 1.5 of the ROS Wiki](http://www.ros.org/wiki/costmap_2d))\n- Cellsize(meters): the length of one edge of a square cell. Multipyling each value in the discretization(cell) line should yield the size of your actual map.\n- nominalvel(mpersecs): speed of translational movement\n- timetoturn45degsinplace(secs): speed of rotational movement\n- start(meters,rads): the start x, y, and theta position\n- end(meters,rads): the end x, y, and theta position\n- environment: a map of the environment.\n\n**The Code**\n\nYou can find the entire file at [this GIST](https://gist.github.com/vhwanger/5304396). We'll step through the planxythetalat function.\n\n**Perimeter of robot**\n\nThis function defines a vector of points that describe the perimeter of the robot. The (0,0) point of the robot is the reference location that the planner uses. In this example, the robot is a .01m by .01m robot, with its center at (0,0).\n\n**Initializing the environment**\n\nThis initializes our environment with the information from the environment file, perimeter description, and motion primitive file. There are also functions available to initialize an environment without a file, but this requires a lot of parameters to be passed into the initialization function.\n\n**Specifying start and goal state**\n\nThis sets the desired start and goal states to plan between. A very important detail here is that start_id and goal_id get filled in to be used later. BOTH the environment and planner must have their start and goal set. The environment takes in the continuous coordinate for the start and goal, and the planner takes in the state IDs for the start and goal.\n\n**Initializing the planner**\n\nHere, we specify the initial epsilon. By default, this will decrement the epsilon by .2 after every solved plan. The search mode of the planner denotes if it quits after the first solution (search_mode = true) or if it continues to try and improve its solution quality until it's out of time (search_mode = false). One other parameter here is the bsearch, which sets whether it is a forward or backward search (searching from start to goal or from goal to start).\n\n**Planning**\n\nThe planner takes in an double limiting how long it has to plan. It returns a vector containing the state IDs for the path. It then prints out some stats that shows how long it took to plan, the solution cost, and the final epsilon it reached.\n\n**Writing out solution**\n\nWhile the planner returned a vector of state IDs, this is not what you would feed to a controller - it must be converted back into continuous coordinates. The writeSolution function spits out a text file containing both the discrete and continuous paths. You'll notice that the continuous path has many more points than the discrete path. This is because each motion primitive is composed of many waypoints that are expanded for the continuous path.\n\n**Running the code**\n\nOnce you compile the code, you can run it with\n\n```\n\r\n$ ./xytheta [location of willow cfg file] [location of motion primitives file]\n```\n\nIn the standard SBPL install, use these files\n\n```\n\r\nenv_examples/nav3d/willow-25mm-inflated-env.cfg\r\nmatlab/mprim/pr2.mprim\r\n\n```\n\n(By default, the willow cfg comes as a zip, so you have to unzip it first). This will produce two solution files sol.txt and sol.txt.discrete\n\nThis is the planned path plotted using [this python code](https://gist.github.com/vhwanger/5304953) (depends on matplotlib and numpy). You can run this code with\n\n```\npython visualize.py willow-25mm-inflated-env.cfg sol.txt.discrete\n```\n\n![image](http://media.tumblr.com/60a4d48268e40b016df3f6933c71065d/tumblr_inline_mkp51c2BGn1qz4rgp.png)\n", + "body_html_raw": "

    This tutorial will go through a simple example of loading in an environment (the Willow Garage floorplan), then generating a plan from a specified start and goal.

    \r\n

    As described in the previous tutorial, planning with search-based methods have two parts - representing the problem as a graph, then solving the graph with graph-search methods. SBPL has two objects it uses for these two roles - the environment and the planner. The code below shows the initialization of an environment in the (x, y, theta) state space. We'll then use the ARA* planner to produce our paths.

    \r\n

    Initializing the environment

    \r\n

    We'll be using an environment file (specific to EnvironmentXYTHETALAT) that already contains values for all the parameters we need, so you can load them right in. But here's the breakdown of what the XYTheta environment requires. 

    \r\n
      \r\n\t
    • \r\n\t\tdiscretization(cells): this describes how many cells the environment is descretized into.
    • \r\n\t
    • \r\n\t\tObsthresh: equivalent to cost_lethal (see section 1.5 of the ROS Wiki)
    • \r\n\t
    • \r\n\t\tCost_inscribed_thresh: (see section 1.5 of the ROS Wiki)
    • \r\n\t
    • \r\n\t\tCost_possibly_circumscribed_thresh: (see section 1.5 of the ROS Wiki)
    • \r\n\t
    • \r\n\t\tCellsize(meters): the length of one edge of a square cell. Multipyling each value in the discretization(cell) line should yield the size of your actual map.
    • \r\n\t
    • \r\n\t\tnominalvel(mpersecs): speed of translational movement
    • \r\n\t
    • \r\n\t\ttimetoturn45degsinplace(secs): speed of rotational movement
    • \r\n\t
    • \r\n\t\tstart(meters,rads): the start x, y, and theta position
    • \r\n\t
    • \r\n\t\tend(meters,rads): the end x, y, and theta position
    • \r\n\t
    • \r\n\t\tenvironment: a map of the environment.
    • \r\n
    \r\n

     

    \r\n

    The Code

    \r\n

    You can find the entire file at this GIST. We'll step through the planxythetalat function.

    \r\n\r\n

    Perimeter of robot

    \r\n

    This function defines a vector of points that describe the perimeter of the robot. The (0,0) point of the robot is the reference location that the planner uses. In this example, the robot is a .01m by .01m robot, with its center at (0,0).

    \r\n

    Initializing the environment

    \r\n

    This initializes our environment with the information from the environment file, perimeter description, and motion primitive file. There are also functions available to initialize an environment without a file, but this requires a lot of parameters to be passed into the initialization function.

    \r\n

    Specifying start and goal state

    \r\n

    This sets the desired start and goal states to plan between. A very important detail here is that start_id and goal_id get filled in to be used later. BOTH the environment and planner must have their start and goal set. The environment takes in the continuous coordinate for the start and goal, and the planner takes in the state IDs for the start and goal. 

    \r\n

    Initializing the planner

    \r\n

    Here, we specify the initial epsilon. By default, this will decrement the epsilon by .2 after every solved plan. The search mode of the planner denotes if it quits after the first solution (search_mode = true) or if it continues to try and improve its solution quality until it's out of time (search_mode = false). One other parameter here is the bsearch, which sets whether it is a forward or backward search (searching from start to goal or from goal to start).

    \r\n

    Planning

    \r\n

    The planner takes in an double limiting how long it has to plan. It returns a vector containing the state IDs for the path. It then prints out some stats that shows how long it took to plan, the solution cost, and the final epsilon it reached.

    \r\n

    Writing out solution

    \r\n

    While the planner returned a vector of state IDs, this is not what you would feed to a controller - it must be converted back into continuous coordinates. The writeSolution function spits out a text file containing both the discrete and continuous paths. You'll notice that the continuous path has many more points than the discrete path. This is because each motion primitive is composed of many waypoints that are expanded for the continuous path.

    \r\n

    Running the code

    \r\n

    Once you compile the code, you can run it with

    \r\n
    \r\n$ ./xytheta [location of willow cfg file] [location of motion primitives file]
    \r\n

    In the standard SBPL install, use these files

    \r\n
    \r\nenv_examples/nav3d/willow-25mm-inflated-env.cfg\r\nmatlab/mprim/pr2.mprim\r\n
    \r\n

    (By default, the willow cfg comes as a zip, so you have to unzip it first). This will produce two solution files sol.txt and sol.txt.discrete

    \r\n

    This is the planned path plotted using this python code (depends on matplotlib and numpy). You can run this code with

    \r\n
    python visualize.py willow-25mm-inflated-env.cfg sol.txt.discrete
    \r\n

    \"image\"

    \r\n

     

    \r\n

     

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0051-planning-with-sbpl-example-in-x-y-theta-state-space.md b/static/archive/legacy-drupal/content/pages/0051-planning-with-sbpl-example-in-x-y-theta-state-space.md new file mode 100644 index 0000000..44b1d96 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0051-planning-with-sbpl-example-in-x-y-theta-state-space.md @@ -0,0 +1,76 @@ +# Planning with SBPL: Example in X, Y, Theta State Space + +This tutorial will go through a simple example of loading in an environment (the Willow Garage floorplan), then generating a plan from a specified start and goal. + +As described in the previous tutorial, planning with search-based methods have two parts - representing the problem as a graph, then solving the graph with graph-search methods. SBPL has two objects it uses for these two roles - the environment and the planner. The code below shows the initialization of an environment in the (x, y, theta) state space. We'll then use the ARA* planner to produce our paths. + +**Initializing the environment** + +We'll be using an environment file (specific to EnvironmentXYTHETALAT) that already contains values for all the parameters we need, so you can load them right in. But here's the breakdown of what the XYTheta environment requires. + +- discretization(cells): this describes how many cells the environment is descretized into. +- Obsthresh: equivalent to cost_lethal (see [section 1.5 of the ROS Wiki](http://www.ros.org/wiki/costmap_2d)) +- Cost_inscribed_thresh: (see [section 1.5 of the ROS Wiki](http://www.ros.org/wiki/costmap_2d)) +- Cost_possibly_circumscribed_thresh: (see [section 1.5 of the ROS Wiki](http://www.ros.org/wiki/costmap_2d)) +- Cellsize(meters): the length of one edge of a square cell. Multipyling each value in the discretization(cell) line should yield the size of your actual map. +- nominalvel(mpersecs): speed of translational movement +- timetoturn45degsinplace(secs): speed of rotational movement +- start(meters,rads): the start x, y, and theta position +- end(meters,rads): the end x, y, and theta position +- environment: a map of the environment. + +**The Code** + +You can find the entire file at [this GIST](https://gist.github.com/vhwanger/5304396). We'll step through the planxythetalat function. + +**Perimeter of robot** + +This function defines a vector of points that describe the perimeter of the robot. The (0,0) point of the robot is the reference location that the planner uses. In this example, the robot is a .01m by .01m robot, with its center at (0,0). + +**Initializing the environment** + +This initializes our environment with the information from the environment file, perimeter description, and motion primitive file. There are also functions available to initialize an environment without a file, but this requires a lot of parameters to be passed into the initialization function. + +**Specifying start and goal state** + +This sets the desired start and goal states to plan between. A very important detail here is that start_id and goal_id get filled in to be used later. BOTH the environment and planner must have their start and goal set. The environment takes in the continuous coordinate for the start and goal, and the planner takes in the state IDs for the start and goal. + +**Initializing the planner** + +Here, we specify the initial epsilon. By default, this will decrement the epsilon by .2 after every solved plan. The search mode of the planner denotes if it quits after the first solution (search_mode = true) or if it continues to try and improve its solution quality until it's out of time (search_mode = false). One other parameter here is the bsearch, which sets whether it is a forward or backward search (searching from start to goal or from goal to start). + +**Planning** + +The planner takes in an double limiting how long it has to plan. It returns a vector containing the state IDs for the path. It then prints out some stats that shows how long it took to plan, the solution cost, and the final epsilon it reached. + +**Writing out solution** + +While the planner returned a vector of state IDs, this is not what you would feed to a controller - it must be converted back into continuous coordinates. The writeSolution function spits out a text file containing both the discrete and continuous paths. You'll notice that the continuous path has many more points than the discrete path. This is because each motion primitive is composed of many waypoints that are expanded for the continuous path. + +**Running the code** + +Once you compile the code, you can run it with + +``` + +$ ./xytheta [location of willow cfg file] [location of motion primitives file] +``` + +In the standard SBPL install, use these files + +``` + +env_examples/nav3d/willow-25mm-inflated-env.cfg +matlab/mprim/pr2.mprim + +``` + +(By default, the willow cfg comes as a zip, so you have to unzip it first). This will produce two solution files sol.txt and sol.txt.discrete + +This is the planned path plotted using [this python code](https://gist.github.com/vhwanger/5304953) (depends on matplotlib and numpy). You can run this code with + +``` +python visualize.py willow-25mm-inflated-env.cfg sol.txt.discrete +``` + +![image](http://media.tumblr.com/60a4d48268e40b016df3f6933c71065d/tumblr_inline_mkp51c2BGn1qz4rgp.png) diff --git a/static/archive/legacy-drupal/content/pages/0052-generating-motion-primitives-with-sbpl.html b/static/archive/legacy-drupal/content/pages/0052-generating-motion-primitives-with-sbpl.html new file mode 100644 index 0000000..6e513dc --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0052-generating-motion-primitives-with-sbpl.html @@ -0,0 +1,109 @@ + +Generating Motion Primitives with SBPL + +

    Generating Motion Primitives with SBPL

    +

    In this article, we'll talk about how to generate motion primitves that SBPL uses for its lattice planning. For an introduction to motion primitives, see this article.

    +

    Visualizing motion primitives

    +

    In the

    +
    +matlab/mprim/
    +

    folder of sbpl, you'll find numerous files of the form

    +
    +genmprim_*
    +

    These files generate different sets of motion primitives a robot could use. To start, open up matlab and run one of these:

    +
    + >>> genmprim output.mprim
    +

    A window similar to the one shown below should appear which shows the motion primitives for a variety of angles. If you hit <enter> in the matlab window, you'll see the visualizations increment. As your keep on hitting <enter>, you'll see all the primitives that are generated.

    +

    Decoding the genmprim.m script

    +

    At the top of the script, you'll see the following declarations:

    +
    +if UNICYCLE_MPRIM_16DEGS == 1
    +    resolution = 0.025;
    +    numberofangles = 16; %preferably a power of 2, definitely multiple of 8
    +    numberofprimsperangle = 9;
    +    
    +

    Resolution denotes the resolution of your map.

    +

    numberofangles denotes how many discrete states a full 360 degree rotation should be discretized into. 

    +

    numberofprimsperangle denotes how many different motions the robot can take for a given discretized angle.

    +

    +

    To put these parameters into perspective, let's look at the labeled image above. The image shows motion primitives for 1 of the 16 discretized angles (angle = 0). There are 9 different paths the robot can take for a given angle, which are organized into the following categories: forward, forward and turn, sidestep, backward, and turn in place. Note that there are actually two turn in place actions (clockwise and counter clockwise), but this does not show up well in the image. Also, we have two motion primitives for moving forward: one that moves 1 unit, and another that moves 8 units (this tends to speed up the search if chosen well). Since the rotation is discretized into 16 states with 9 primitives for each, the robot will have a total of 144 motion primitives.

    +

    Multipliers

    +
    +    %multipliers (multiplier is used as costmult*cost)
    +    forwardcostmult = 1;
    +    backwardcostmult = 5;
    +    forwardandturncostmult = 1;
    +    sidestepcostmult = 50;
    +    turninplacecostmult = 50;
    +
    +

    The multipliers allow the user to define preferred actions. For example, if the robot is slow to move backwards, one would raise the cost multiplier on the backwards cost. 

    +

    Motion Vectors

    +

    In order to define the actual motions, we use delta position vectors. The below is taken from genmprim_unicycleplussideways.

    +
    +    %note, what is shown x,y,theta *changes* (that is, dx,dy,dtheta and not absolute numbers)
    +
    +    %0 degreees
    +    basemprimendpts0_c = zeros(numberofprimsperangle, 4); %x,y,theta,costmult
    +    %angles are positive counterclockwise
    +    %0 theta change
    +    basemprimendpts0_c(1,:) = [1 0 0 forwardcostmult];
    +    basemprimendpts0_c(2,:) = [8 0 0 forwardcostmult];
    +    basemprimendpts0_c(3,:) = [-1 0 0 backwardcostmult];
    +    %1/16 theta change
    +    basemprimendpts0_c(4,:) = [8 1 1 forwardandturncostmult];
    +    basemprimendpts0_c(5,:) = [8 -1 -1 forwardandturncostmult];
    +    %turn in place
    +    basemprimendpts0_c(6,:) = [0 0 1 turninplacecostmult];
    +    basemprimendpts0_c(7,:) = [0 0 -1 turninplacecostmult];
    +    %sideways maintaining the same heading
    +    basemprimendpts0_c(8,:) = [0 1 0 sidestepcostmult];
    +    basemprimendpts0_c(9,:) = [0 -1 0 sidestepcostmult];
    +
    +    %45 degrees
    +    basemprimendpts45_c = zeros(numberofprimsperangle, 4); %x,y,theta,costmult (multiplier is used as costmult*cost)
    +    %angles are positive counterclockwise
    +    %0 theta change
    +    basemprimendpts45_c(1,:) = [1 1 0 forwardcostmult];
    +    basemprimendpts45_c(2,:) = [6 6 0 forwardcostmult];
    +    basemprimendpts45_c(3,:) = [-1 -1 0 backwardcostmult];
    +    %1/16 theta change
    +    basemprimendpts45_c(4,:) = [5 7 1 forwardandturncostmult];
    +    basemprimendpts45_c(5,:) = [7 5 -1 forwardandturncostmult];
    +    %turn in place
    +    basemprimendpts45_c(6,:) = [0 0 1 turninplacecostmult];
    +    basemprimendpts45_c(7,:) = [0 0 -1 turninplacecostmult];
    +    %sideways maintaining the same heading
    +    basemprimendpts45_c(8,:) = [-1 1 0 sidestepcostmult];
    +    basemprimendpts45_c(9,:) = [1 -1 0 sidestepcostmult];
    +
    +    %22.5 degrees
    +    basemprimendpts22p5_c = zeros(numberofprimsperangle, 4); %x,y,theta,costmult (multiplier is used as costmult*cost)
    +    %angles are positive counterclockwise
    +    %0 theta change
    +    basemprimendpts22p5_c(1,:) = [2 1 0 forwardcostmult];
    +    basemprimendpts22p5_c(2,:) = [6 3 0 forwardcostmult];
    +    basemprimendpts22p5_c(3,:) = [-2 -1 0 backwardcostmult];
    +    %1/16 theta change
    +    basemprimendpts22p5_c(4,:) = [5 4 1 forwardandturncostmult];
    +    basemprimendpts22p5_c(5,:) = [7 2 -1 forwardandturncostmult];
    +    %turn in place
    +    basemprimendpts22p5_c(6,:) = [0 0 1 turninplacecostmult];
    +    basemprimendpts22p5_c(7,:) = [0 0 -1 turninplacecostmult];
    +    %sideways maintaining the same heading
    +    basemprimendpts22p5_c(8,:) = [-1 2 0 sidestepcostmult];
    +    basemprimendpts22p5_c(9,:) = [1 -2 0 sidestepcostmult];
    +
    +
    +

    Defining the motion primitives is a little bit tricky due to discretization problems. Intuitively, we'd expect to only define 9 motion primitives that would be used for all 16 of our discrete angles. However, due to angle discretization error, a motion primitive defined for a robot oriented at 0 degrees may not be the best motion primitive for a robot oriented at 22.5 degrees. We'll address why this is in a bit.

    +

    In order to combat this, we define each angle (for one quadrant) explicitly. Since we have a total of 16 discretized angles, we can get away with defining 4 of the angles for quadrant one, and then duplicating the motions for the other three quadrants. Thus, we only need to define motion primitives for 4 angles: 0, 22.5, 45, and 67.5. We can take advantage of symmetry again and say that angles 22.5 and 67.5 can use the same set of motion primitives (as their discretization errors will be the same). In this code, we define motion primitives for 22.5 degrees.

    +

    Now, we only have to define motion primitives for 3 angles: 0, 22.5, and 45. With 9 motion primitives for each, this means we must define 27 motion primitives. Looking above, we see that there are indeed 27 definitions. Let's look at the definition for moving forward 8 units when the robot is oriented at 0 degrees:

    +
    +basemprimendpts0_c(2,:) = [8 0 0 forwardcostmult];
    +

    The format for this vector is [dx dy dtheta multiplier].  Since we're facing down the positive x-axis, we want dx=8, and everything else 0. For the same motion when the robot is oriented at 45 degrees, we use:

    +
    +basemprimendpts45_c(2,:) = [6 6 0 forwardcostmult];
    +

    Notice that the distance traversed is actually more than 8 (8.48). This is to counteract the previously described discretization error. This extra distance ensure that we land in the center of the discretized cell, rather than off to one corner. When designing your own motion primitives, it's important to make sure your motions land you in the centers of cells to avoid discontinuous paths. The image below depicts what happens when your motion primitives don't land in the middle of the cell - even though it's valid in discrete space, the continuous path is invalid (thanks Andrew Dornbush).

    +

    +

    Once you've defined your set of motion primitives, use the matlab visualization to ensure that the motions are correct. The generated file (usually ending with .mprim) is now ready for use by the SBPL planner!

    + + diff --git a/static/archive/legacy-drupal/content/pages/0052-generating-motion-primitives-with-sbpl.json b/static/archive/legacy-drupal/content/pages/0052-generating-motion-primitives-with-sbpl.json new file mode 100644 index 0000000..8665fcf --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0052-generating-motion-primitives-with-sbpl.json @@ -0,0 +1,25 @@ +{ + "nid": 52, + "vid": 52, + "type": "page", + "language": "und", + "title": "Generating Motion Primitives with SBPL", + "slug": "generating-motion-primitives-with-sbpl", + "uid": 648, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1373327335, + "changed": 1373331662, + "url_aliases": [], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    In this article, we'll talk about how to generate motion primitves that SBPL uses for its lattice planning. For an introduction to motion primitives, see this article.

    \r\n

    Visualizing motion primitives

    \r\n

    In the

    \r\n
    \r\nmatlab/mprim/
    \r\n

    folder of sbpl, you'll find numerous files of the form

    \r\n
    \r\ngenmprim_*
    \r\n

    These files generate different sets of motion primitives a robot could use. To start, open up matlab and run one of these:

    \r\n
    \r\n >>> genmprim output.mprim
    \r\n

    A window similar to the one shown below should appear which shows the motion primitives for a variety of angles. If you hit <enter> in the matlab window, you'll see the visualizations increment. As your keep on hitting <enter>, you'll see all the primitives that are generated.

    \r\n

    Decoding the genmprim.m script

    \r\n

    At the top of the script, you'll see the following declarations:

    \r\n
    \r\nif UNICYCLE_MPRIM_16DEGS == 1\r\n    resolution = 0.025;\r\n    numberofangles = 16; %preferably a power of 2, definitely multiple of 8\r\n    numberofprimsperangle = 9;\r\n    
    \r\n

    Resolution denotes the resolution of your map.

    \r\n

    numberofangles denotes how many discrete states a full 360 degree rotation should be discretized into. 

    \r\n

    numberofprimsperangle denotes how many different motions the robot can take for a given discretized angle.

    \r\n

    \"\"

    \r\n

    To put these parameters into perspective, let's look at the labeled image above. The image shows motion primitives for 1 of the 16 discretized angles (angle = 0). There are 9 different paths the robot can take for a given angle, which are organized into the following categories: forward, forward and turn, sidestep, backward, and turn in place. Note that there are actually two turn in place actions (clockwise and counter clockwise), but this does not show up well in the image. Also, we have two motion primitives for moving forward: one that moves 1 unit, and another that moves 8 units (this tends to speed up the search if chosen well). Since the rotation is discretized into 16 states with 9 primitives for each, the robot will have a total of 144 motion primitives.

    \r\n

    Multipliers

    \r\n
    \r\n    %multipliers (multiplier is used as costmult*cost)\r\n    forwardcostmult = 1;\r\n    backwardcostmult = 5;\r\n    forwardandturncostmult = 1;\r\n    sidestepcostmult = 50;\r\n    turninplacecostmult = 50;\r\n
    \r\n

    The multipliers allow the user to define preferred actions. For example, if the robot is slow to move backwards, one would raise the cost multiplier on the backwards cost. 

    \r\n

    Motion Vectors

    \r\n

    In order to define the actual motions, we use delta position vectors. The below is taken from genmprim_unicycleplussideways.

    \r\n
    \r\n    %note, what is shown x,y,theta *changes* (that is, dx,dy,dtheta and not absolute numbers)\r\n\r\n    %0 degreees\r\n    basemprimendpts0_c = zeros(numberofprimsperangle, 4); %x,y,theta,costmult\r\n    %angles are positive counterclockwise\r\n    %0 theta change\r\n    basemprimendpts0_c(1,:) = [1 0 0 forwardcostmult];\r\n    basemprimendpts0_c(2,:) = [8 0 0 forwardcostmult];\r\n    basemprimendpts0_c(3,:) = [-1 0 0 backwardcostmult];\r\n    %1/16 theta change\r\n    basemprimendpts0_c(4,:) = [8 1 1 forwardandturncostmult];\r\n    basemprimendpts0_c(5,:) = [8 -1 -1 forwardandturncostmult];\r\n    %turn in place\r\n    basemprimendpts0_c(6,:) = [0 0 1 turninplacecostmult];\r\n    basemprimendpts0_c(7,:) = [0 0 -1 turninplacecostmult];\r\n    %sideways maintaining the same heading\r\n    basemprimendpts0_c(8,:) = [0 1 0 sidestepcostmult];\r\n    basemprimendpts0_c(9,:) = [0 -1 0 sidestepcostmult];\r\n\r\n    %45 degrees\r\n    basemprimendpts45_c = zeros(numberofprimsperangle, 4); %x,y,theta,costmult (multiplier is used as costmult*cost)\r\n    %angles are positive counterclockwise\r\n    %0 theta change\r\n    basemprimendpts45_c(1,:) = [1 1 0 forwardcostmult];\r\n    basemprimendpts45_c(2,:) = [6 6 0 forwardcostmult];\r\n    basemprimendpts45_c(3,:) = [-1 -1 0 backwardcostmult];\r\n    %1/16 theta change\r\n    basemprimendpts45_c(4,:) = [5 7 1 forwardandturncostmult];\r\n    basemprimendpts45_c(5,:) = [7 5 -1 forwardandturncostmult];\r\n    %turn in place\r\n    basemprimendpts45_c(6,:) = [0 0 1 turninplacecostmult];\r\n    basemprimendpts45_c(7,:) = [0 0 -1 turninplacecostmult];\r\n    %sideways maintaining the same heading\r\n    basemprimendpts45_c(8,:) = [-1 1 0 sidestepcostmult];\r\n    basemprimendpts45_c(9,:) = [1 -1 0 sidestepcostmult];\r\n\r\n    %22.5 degrees\r\n    basemprimendpts22p5_c = zeros(numberofprimsperangle, 4); %x,y,theta,costmult (multiplier is used as costmult*cost)\r\n    %angles are positive counterclockwise\r\n    %0 theta change\r\n    basemprimendpts22p5_c(1,:) = [2 1 0 forwardcostmult];\r\n    basemprimendpts22p5_c(2,:) = [6 3 0 forwardcostmult];\r\n    basemprimendpts22p5_c(3,:) = [-2 -1 0 backwardcostmult];\r\n    %1/16 theta change\r\n    basemprimendpts22p5_c(4,:) = [5 4 1 forwardandturncostmult];\r\n    basemprimendpts22p5_c(5,:) = [7 2 -1 forwardandturncostmult];\r\n    %turn in place\r\n    basemprimendpts22p5_c(6,:) = [0 0 1 turninplacecostmult];\r\n    basemprimendpts22p5_c(7,:) = [0 0 -1 turninplacecostmult];\r\n    %sideways maintaining the same heading\r\n    basemprimendpts22p5_c(8,:) = [-1 2 0 sidestepcostmult];\r\n    basemprimendpts22p5_c(9,:) = [1 -2 0 sidestepcostmult];\r\n\r\n
    \r\n

    Defining the motion primitives is a little bit tricky due to discretization problems. Intuitively, we'd expect to only define 9 motion primitives that would be used for all 16 of our discrete angles. However, due to angle discretization error, a motion primitive defined for a robot oriented at 0 degrees may not be the best motion primitive for a robot oriented at 22.5 degrees. We'll address why this is in a bit.

    \r\n

    In order to combat this, we define each angle (for one quadrant) explicitly. Since we have a total of 16 discretized angles, we can get away with defining 4 of the angles for quadrant one, and then duplicating the motions for the other three quadrants. Thus, we only need to define motion primitives for 4 angles: 0, 22.5, 45, and 67.5. We can take advantage of symmetry again and say that angles 22.5 and 67.5 can use the same set of motion primitives (as their discretization errors will be the same). In this code, we define motion primitives for 22.5 degrees.

    \r\n

    Now, we only have to define motion primitives for 3 angles: 0, 22.5, and 45. With 9 motion primitives for each, this means we must define 27 motion primitives. Looking above, we see that there are indeed 27 definitions. Let's look at the definition for moving forward 8 units when the robot is oriented at 0 degrees:

    \r\n
    \r\nbasemprimendpts0_c(2,:) = [8 0 0 forwardcostmult];
    \r\n

    The format for this vector is [dx dy dtheta multiplier].  Since we're facing down the positive x-axis, we want dx=8, and everything else 0. For the same motion when the robot is oriented at 45 degrees, we use:

    \r\n
    \r\nbasemprimendpts45_c(2,:) = [6 6 0 forwardcostmult];
    \r\n

    Notice that the distance traversed is actually more than 8 (8.48). This is to counteract the previously described discretization error. This extra distance ensure that we land in the center of the discretized cell, rather than off to one corner. When designing your own motion primitives, it's important to make sure your motions land you in the centers of cells to avoid discontinuous paths. The image below depicts what happens when your motion primitives don't land in the middle of the cell - even though it's valid in discrete space, the continuous path is invalid (thanks Andrew Dornbush).

    \r\n

    \"\"

    \r\n

    Once you've defined your set of motion primitives, use the matlab visualization to ensure that the motions are correct. The generated file (usually ending with .mprim) is now ready for use by the SBPL planner!

    \r\n", + "body_markdown": "In this article, we'll talk about how to generate motion primitves that SBPL uses for its lattice planning. For an introduction to motion primitives, see [this article](http://sbpl.net/node/48).\n\n**Visualizing motion primitives**\n\nIn the\n\n```\n\r\nmatlab/mprim/\n```\n\nfolder of sbpl, you'll find numerous files of the form\n\n```\n\r\ngenmprim_*\n```\n\nThese files generate different sets of motion primitives a robot could use. To start, open up matlab and run one of these:\n\n```\n\r\n >>> genmprim output.mprim\n```\n\nA window similar to the one shown below should appear which shows the motion primitives for a variety of angles. If you hit in the matlab window, you'll see the visualizations increment. As your keep on hitting , you'll see all the primitives that are generated.\n\n**Decoding the genmprim.m script**\n\nAt the top of the script, you'll see the following declarations:\n\n```\n\r\nif UNICYCLE_MPRIM_16DEGS == 1\r\n resolution = 0.025;\r\n numberofangles = 16; %preferably a power of 2, definitely multiple of 8\r\n numberofprimsperangle = 9;\r\n\n```\n\n**Resolution** denotes the resolution of your map.\n\n**numberofangles** denotes how many discrete states a full 360 degree rotation should be discretized into.\n\n**numberofprimsperangle** denotes how many different motions the robot can take for a given discretized angle.\n\n![](../../media/images/mprims.png)\n\nTo put these parameters into perspective, let's look at the labeled image above. The image shows motion primitives for 1 of the 16 discretized angles (angle = 0). There are 9 different paths the robot can take for a given angle, which are organized into the following categories: forward, forward and turn, sidestep, backward, and turn in place. Note that there are actually two turn in place actions (clockwise and counter clockwise), but this does not show up well in the image. Also, we have two motion primitives for moving forward: one that moves 1 unit, and another that moves 8 units (this tends to speed up the search if chosen well). Since the rotation is discretized into 16 states with 9 primitives for each, the robot will have a total of 144 motion primitives.\n\n**Multipliers**\n\n```\n\r\n %multipliers (multiplier is used as costmult*cost)\r\n forwardcostmult = 1;\r\n backwardcostmult = 5;\r\n forwardandturncostmult = 1;\r\n sidestepcostmult = 50;\r\n turninplacecostmult = 50;\r\n\n```\n\nThe multipliers allow the user to define preferred actions. For example, if the robot is slow to move backwards, one would raise the cost multiplier on the backwards cost.\n\n**Motion Vectors**\n\nIn order to define the actual motions, we use delta position vectors. The below is taken from genmprim_unicycleplussideways.\n\n```\n\r\n %note, what is shown x,y,theta *changes* (that is, dx,dy,dtheta and not absolute numbers)\r\n\r\n %0 degreees\r\n basemprimendpts0_c = zeros(numberofprimsperangle, 4); %x,y,theta,costmult\r\n %angles are positive counterclockwise\r\n %0 theta change\r\n basemprimendpts0_c(1,:) = [1 0 0 forwardcostmult];\r\n basemprimendpts0_c(2,:) = [8 0 0 forwardcostmult];\r\n basemprimendpts0_c(3,:) = [-1 0 0 backwardcostmult];\r\n %1/16 theta change\r\n basemprimendpts0_c(4,:) = [8 1 1 forwardandturncostmult];\r\n basemprimendpts0_c(5,:) = [8 -1 -1 forwardandturncostmult];\r\n %turn in place\r\n basemprimendpts0_c(6,:) = [0 0 1 turninplacecostmult];\r\n basemprimendpts0_c(7,:) = [0 0 -1 turninplacecostmult];\r\n %sideways maintaining the same heading\r\n basemprimendpts0_c(8,:) = [0 1 0 sidestepcostmult];\r\n basemprimendpts0_c(9,:) = [0 -1 0 sidestepcostmult];\r\n\r\n %45 degrees\r\n basemprimendpts45_c = zeros(numberofprimsperangle, 4); %x,y,theta,costmult (multiplier is used as costmult*cost)\r\n %angles are positive counterclockwise\r\n %0 theta change\r\n basemprimendpts45_c(1,:) = [1 1 0 forwardcostmult];\r\n basemprimendpts45_c(2,:) = [6 6 0 forwardcostmult];\r\n basemprimendpts45_c(3,:) = [-1 -1 0 backwardcostmult];\r\n %1/16 theta change\r\n basemprimendpts45_c(4,:) = [5 7 1 forwardandturncostmult];\r\n basemprimendpts45_c(5,:) = [7 5 -1 forwardandturncostmult];\r\n %turn in place\r\n basemprimendpts45_c(6,:) = [0 0 1 turninplacecostmult];\r\n basemprimendpts45_c(7,:) = [0 0 -1 turninplacecostmult];\r\n %sideways maintaining the same heading\r\n basemprimendpts45_c(8,:) = [-1 1 0 sidestepcostmult];\r\n basemprimendpts45_c(9,:) = [1 -1 0 sidestepcostmult];\r\n\r\n %22.5 degrees\r\n basemprimendpts22p5_c = zeros(numberofprimsperangle, 4); %x,y,theta,costmult (multiplier is used as costmult*cost)\r\n %angles are positive counterclockwise\r\n %0 theta change\r\n basemprimendpts22p5_c(1,:) = [2 1 0 forwardcostmult];\r\n basemprimendpts22p5_c(2,:) = [6 3 0 forwardcostmult];\r\n basemprimendpts22p5_c(3,:) = [-2 -1 0 backwardcostmult];\r\n %1/16 theta change\r\n basemprimendpts22p5_c(4,:) = [5 4 1 forwardandturncostmult];\r\n basemprimendpts22p5_c(5,:) = [7 2 -1 forwardandturncostmult];\r\n %turn in place\r\n basemprimendpts22p5_c(6,:) = [0 0 1 turninplacecostmult];\r\n basemprimendpts22p5_c(7,:) = [0 0 -1 turninplacecostmult];\r\n %sideways maintaining the same heading\r\n basemprimendpts22p5_c(8,:) = [-1 2 0 sidestepcostmult];\r\n basemprimendpts22p5_c(9,:) = [1 -2 0 sidestepcostmult];\r\n\r\n\n```\n\nDefining the motion primitives is a little bit tricky due to discretization problems. Intuitively, we'd expect to only define 9 motion primitives that would be used for all 16 of our discrete angles. However, due to angle discretization error, a motion primitive defined for a robot oriented at 0 degrees may not be the best motion primitive for a robot oriented at 22.5 degrees. We'll address why this is in a bit.\n\nIn order to combat this, we define each angle (for one quadrant) explicitly. Since we have a total of 16 discretized angles, we can get away with defining 4 of the angles for quadrant one, and then duplicating the motions for the other three quadrants. Thus, we only need to define motion primitives for 4 angles: 0, 22.5, 45, and 67.5. We can take advantage of symmetry again and say that angles 22.5 and 67.5 can use the same set of motion primitives (as their discretization errors will be the same). In this code, we define motion primitives for 22.5 degrees.\n\nNow, we only have to define motion primitives for 3 angles: 0, 22.5, and 45. With 9 motion primitives for each, this means we must define 27 motion primitives. Looking above, we see that there are indeed 27 definitions. Let's look at the definition for moving forward 8 units when the robot is oriented at 0 degrees:\n\n```\n\r\nbasemprimendpts0_c(2,:) = [8 0 0 forwardcostmult];\n```\n\nThe format for this vector is [dx dy dtheta multiplier]. Since we're facing down the positive x-axis, we want dx=8, and everything else 0. For the same motion when the robot is oriented at 45 degrees, we use:\n\n```\n\r\nbasemprimendpts45_c(2,:) = [6 6 0 forwardcostmult];\n```\n\nNotice that the distance traversed is actually more than 8 (8.48). This is to counteract the previously described discretization error. This extra distance ensure that we land in the center of the discretized cell, rather than off to one corner. When designing your own motion primitives, it's important to make sure your motions land you in the centers of cells to avoid discontinuous paths. The image below depicts what happens when your motion primitives don't land in the middle of the cell - even though it's valid in discrete space, the continuous path is invalid (thanks Andrew Dornbush).\n\n![](../../media/images/unaligned_mprims.png)\n\nOnce you've defined your set of motion primitives, use the matlab visualization to ensure that the motions are correct. The generated file (usually ending with .mprim) is now ready for use by the SBPL planner!\n", + "body_html_raw": "

    In this article, we'll talk about how to generate motion primitves that SBPL uses for its lattice planning. For an introduction to motion primitives, see this article.

    \r\n

    Visualizing motion primitives

    \r\n

    In the

    \r\n
    \r\nmatlab/mprim/
    \r\n

    folder of sbpl, you'll find numerous files of the form

    \r\n
    \r\ngenmprim_*
    \r\n

    These files generate different sets of motion primitives a robot could use. To start, open up matlab and run one of these:

    \r\n
    \r\n >>> genmprim output.mprim
    \r\n

    A window similar to the one shown below should appear which shows the motion primitives for a variety of angles. If you hit <enter> in the matlab window, you'll see the visualizations increment. As your keep on hitting <enter>, you'll see all the primitives that are generated.

    \r\n

    Decoding the genmprim.m script

    \r\n

    At the top of the script, you'll see the following declarations:

    \r\n
    \r\nif UNICYCLE_MPRIM_16DEGS == 1\r\n    resolution = 0.025;\r\n    numberofangles = 16; %preferably a power of 2, definitely multiple of 8\r\n    numberofprimsperangle = 9;\r\n    
    \r\n

    Resolution denotes the resolution of your map.

    \r\n

    numberofangles denotes how many discrete states a full 360 degree rotation should be discretized into. 

    \r\n

    numberofprimsperangle denotes how many different motions the robot can take for a given discretized angle.

    \r\n

    \"\"

    \r\n

    To put these parameters into perspective, let's look at the labeled image above. The image shows motion primitives for 1 of the 16 discretized angles (angle = 0). There are 9 different paths the robot can take for a given angle, which are organized into the following categories: forward, forward and turn, sidestep, backward, and turn in place. Note that there are actually two turn in place actions (clockwise and counter clockwise), but this does not show up well in the image. Also, we have two motion primitives for moving forward: one that moves 1 unit, and another that moves 8 units (this tends to speed up the search if chosen well). Since the rotation is discretized into 16 states with 9 primitives for each, the robot will have a total of 144 motion primitives.

    \r\n

    Multipliers

    \r\n
    \r\n    %multipliers (multiplier is used as costmult*cost)\r\n    forwardcostmult = 1;\r\n    backwardcostmult = 5;\r\n    forwardandturncostmult = 1;\r\n    sidestepcostmult = 50;\r\n    turninplacecostmult = 50;\r\n
    \r\n

    The multipliers allow the user to define preferred actions. For example, if the robot is slow to move backwards, one would raise the cost multiplier on the backwards cost. 

    \r\n

    Motion Vectors

    \r\n

    In order to define the actual motions, we use delta position vectors. The below is taken from genmprim_unicycleplussideways.

    \r\n
    \r\n    %note, what is shown x,y,theta *changes* (that is, dx,dy,dtheta and not absolute numbers)\r\n\r\n    %0 degreees\r\n    basemprimendpts0_c = zeros(numberofprimsperangle, 4); %x,y,theta,costmult\r\n    %angles are positive counterclockwise\r\n    %0 theta change\r\n    basemprimendpts0_c(1,:) = [1 0 0 forwardcostmult];\r\n    basemprimendpts0_c(2,:) = [8 0 0 forwardcostmult];\r\n    basemprimendpts0_c(3,:) = [-1 0 0 backwardcostmult];\r\n    %1/16 theta change\r\n    basemprimendpts0_c(4,:) = [8 1 1 forwardandturncostmult];\r\n    basemprimendpts0_c(5,:) = [8 -1 -1 forwardandturncostmult];\r\n    %turn in place\r\n    basemprimendpts0_c(6,:) = [0 0 1 turninplacecostmult];\r\n    basemprimendpts0_c(7,:) = [0 0 -1 turninplacecostmult];\r\n    %sideways maintaining the same heading\r\n    basemprimendpts0_c(8,:) = [0 1 0 sidestepcostmult];\r\n    basemprimendpts0_c(9,:) = [0 -1 0 sidestepcostmult];\r\n\r\n    %45 degrees\r\n    basemprimendpts45_c = zeros(numberofprimsperangle, 4); %x,y,theta,costmult (multiplier is used as costmult*cost)\r\n    %angles are positive counterclockwise\r\n    %0 theta change\r\n    basemprimendpts45_c(1,:) = [1 1 0 forwardcostmult];\r\n    basemprimendpts45_c(2,:) = [6 6 0 forwardcostmult];\r\n    basemprimendpts45_c(3,:) = [-1 -1 0 backwardcostmult];\r\n    %1/16 theta change\r\n    basemprimendpts45_c(4,:) = [5 7 1 forwardandturncostmult];\r\n    basemprimendpts45_c(5,:) = [7 5 -1 forwardandturncostmult];\r\n    %turn in place\r\n    basemprimendpts45_c(6,:) = [0 0 1 turninplacecostmult];\r\n    basemprimendpts45_c(7,:) = [0 0 -1 turninplacecostmult];\r\n    %sideways maintaining the same heading\r\n    basemprimendpts45_c(8,:) = [-1 1 0 sidestepcostmult];\r\n    basemprimendpts45_c(9,:) = [1 -1 0 sidestepcostmult];\r\n\r\n    %22.5 degrees\r\n    basemprimendpts22p5_c = zeros(numberofprimsperangle, 4); %x,y,theta,costmult (multiplier is used as costmult*cost)\r\n    %angles are positive counterclockwise\r\n    %0 theta change\r\n    basemprimendpts22p5_c(1,:) = [2 1 0 forwardcostmult];\r\n    basemprimendpts22p5_c(2,:) = [6 3 0 forwardcostmult];\r\n    basemprimendpts22p5_c(3,:) = [-2 -1 0 backwardcostmult];\r\n    %1/16 theta change\r\n    basemprimendpts22p5_c(4,:) = [5 4 1 forwardandturncostmult];\r\n    basemprimendpts22p5_c(5,:) = [7 2 -1 forwardandturncostmult];\r\n    %turn in place\r\n    basemprimendpts22p5_c(6,:) = [0 0 1 turninplacecostmult];\r\n    basemprimendpts22p5_c(7,:) = [0 0 -1 turninplacecostmult];\r\n    %sideways maintaining the same heading\r\n    basemprimendpts22p5_c(8,:) = [-1 2 0 sidestepcostmult];\r\n    basemprimendpts22p5_c(9,:) = [1 -2 0 sidestepcostmult];\r\n\r\n
    \r\n

    Defining the motion primitives is a little bit tricky due to discretization problems. Intuitively, we'd expect to only define 9 motion primitives that would be used for all 16 of our discrete angles. However, due to angle discretization error, a motion primitive defined for a robot oriented at 0 degrees may not be the best motion primitive for a robot oriented at 22.5 degrees. We'll address why this is in a bit.

    \r\n

    In order to combat this, we define each angle (for one quadrant) explicitly. Since we have a total of 16 discretized angles, we can get away with defining 4 of the angles for quadrant one, and then duplicating the motions for the other three quadrants. Thus, we only need to define motion primitives for 4 angles: 0, 22.5, 45, and 67.5. We can take advantage of symmetry again and say that angles 22.5 and 67.5 can use the same set of motion primitives (as their discretization errors will be the same). In this code, we define motion primitives for 22.5 degrees.

    \r\n

    Now, we only have to define motion primitives for 3 angles: 0, 22.5, and 45. With 9 motion primitives for each, this means we must define 27 motion primitives. Looking above, we see that there are indeed 27 definitions. Let's look at the definition for moving forward 8 units when the robot is oriented at 0 degrees:

    \r\n
    \r\nbasemprimendpts0_c(2,:) = [8 0 0 forwardcostmult];
    \r\n

    The format for this vector is [dx dy dtheta multiplier].  Since we're facing down the positive x-axis, we want dx=8, and everything else 0. For the same motion when the robot is oriented at 45 degrees, we use:

    \r\n
    \r\nbasemprimendpts45_c(2,:) = [6 6 0 forwardcostmult];
    \r\n

    Notice that the distance traversed is actually more than 8 (8.48). This is to counteract the previously described discretization error. This extra distance ensure that we land in the center of the discretized cell, rather than off to one corner. When designing your own motion primitives, it's important to make sure your motions land you in the centers of cells to avoid discontinuous paths. The image below depicts what happens when your motion primitives don't land in the middle of the cell - even though it's valid in discrete space, the continuous path is invalid (thanks Andrew Dornbush).

    \r\n

    \"\"

    \r\n

    Once you've defined your set of motion primitives, use the matlab visualization to ensure that the motions are correct. The generated file (usually ending with .mprim) is now ready for use by the SBPL planner!

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0052-generating-motion-primitives-with-sbpl.md b/static/archive/legacy-drupal/content/pages/0052-generating-motion-primitives-with-sbpl.md new file mode 100644 index 0000000..8aa5379 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0052-generating-motion-primitives-with-sbpl.md @@ -0,0 +1,152 @@ +# Generating Motion Primitives with SBPL + +In this article, we'll talk about how to generate motion primitves that SBPL uses for its lattice planning. For an introduction to motion primitives, see [this article](http://sbpl.net/node/48). + +**Visualizing motion primitives** + +In the + +``` + +matlab/mprim/ +``` + +folder of sbpl, you'll find numerous files of the form + +``` + +genmprim_* +``` + +These files generate different sets of motion primitives a robot could use. To start, open up matlab and run one of these: + +``` + + >>> genmprim output.mprim +``` + +A window similar to the one shown below should appear which shows the motion primitives for a variety of angles. If you hit in the matlab window, you'll see the visualizations increment. As your keep on hitting , you'll see all the primitives that are generated. + +**Decoding the genmprim.m script** + +At the top of the script, you'll see the following declarations: + +``` + +if UNICYCLE_MPRIM_16DEGS == 1 + resolution = 0.025; + numberofangles = 16; %preferably a power of 2, definitely multiple of 8 + numberofprimsperangle = 9; + +``` + +**Resolution** denotes the resolution of your map. + +**numberofangles** denotes how many discrete states a full 360 degree rotation should be discretized into. + +**numberofprimsperangle** denotes how many different motions the robot can take for a given discretized angle. + +![](../../media/images/mprims.png) + +To put these parameters into perspective, let's look at the labeled image above. The image shows motion primitives for 1 of the 16 discretized angles (angle = 0). There are 9 different paths the robot can take for a given angle, which are organized into the following categories: forward, forward and turn, sidestep, backward, and turn in place. Note that there are actually two turn in place actions (clockwise and counter clockwise), but this does not show up well in the image. Also, we have two motion primitives for moving forward: one that moves 1 unit, and another that moves 8 units (this tends to speed up the search if chosen well). Since the rotation is discretized into 16 states with 9 primitives for each, the robot will have a total of 144 motion primitives. + +**Multipliers** + +``` + + %multipliers (multiplier is used as costmult*cost) + forwardcostmult = 1; + backwardcostmult = 5; + forwardandturncostmult = 1; + sidestepcostmult = 50; + turninplacecostmult = 50; + +``` + +The multipliers allow the user to define preferred actions. For example, if the robot is slow to move backwards, one would raise the cost multiplier on the backwards cost. + +**Motion Vectors** + +In order to define the actual motions, we use delta position vectors. The below is taken from genmprim_unicycleplussideways. + +``` + + %note, what is shown x,y,theta *changes* (that is, dx,dy,dtheta and not absolute numbers) + + %0 degreees + basemprimendpts0_c = zeros(numberofprimsperangle, 4); %x,y,theta,costmult + %angles are positive counterclockwise + %0 theta change + basemprimendpts0_c(1,:) = [1 0 0 forwardcostmult]; + basemprimendpts0_c(2,:) = [8 0 0 forwardcostmult]; + basemprimendpts0_c(3,:) = [-1 0 0 backwardcostmult]; + %1/16 theta change + basemprimendpts0_c(4,:) = [8 1 1 forwardandturncostmult]; + basemprimendpts0_c(5,:) = [8 -1 -1 forwardandturncostmult]; + %turn in place + basemprimendpts0_c(6,:) = [0 0 1 turninplacecostmult]; + basemprimendpts0_c(7,:) = [0 0 -1 turninplacecostmult]; + %sideways maintaining the same heading + basemprimendpts0_c(8,:) = [0 1 0 sidestepcostmult]; + basemprimendpts0_c(9,:) = [0 -1 0 sidestepcostmult]; + + %45 degrees + basemprimendpts45_c = zeros(numberofprimsperangle, 4); %x,y,theta,costmult (multiplier is used as costmult*cost) + %angles are positive counterclockwise + %0 theta change + basemprimendpts45_c(1,:) = [1 1 0 forwardcostmult]; + basemprimendpts45_c(2,:) = [6 6 0 forwardcostmult]; + basemprimendpts45_c(3,:) = [-1 -1 0 backwardcostmult]; + %1/16 theta change + basemprimendpts45_c(4,:) = [5 7 1 forwardandturncostmult]; + basemprimendpts45_c(5,:) = [7 5 -1 forwardandturncostmult]; + %turn in place + basemprimendpts45_c(6,:) = [0 0 1 turninplacecostmult]; + basemprimendpts45_c(7,:) = [0 0 -1 turninplacecostmult]; + %sideways maintaining the same heading + basemprimendpts45_c(8,:) = [-1 1 0 sidestepcostmult]; + basemprimendpts45_c(9,:) = [1 -1 0 sidestepcostmult]; + + %22.5 degrees + basemprimendpts22p5_c = zeros(numberofprimsperangle, 4); %x,y,theta,costmult (multiplier is used as costmult*cost) + %angles are positive counterclockwise + %0 theta change + basemprimendpts22p5_c(1,:) = [2 1 0 forwardcostmult]; + basemprimendpts22p5_c(2,:) = [6 3 0 forwardcostmult]; + basemprimendpts22p5_c(3,:) = [-2 -1 0 backwardcostmult]; + %1/16 theta change + basemprimendpts22p5_c(4,:) = [5 4 1 forwardandturncostmult]; + basemprimendpts22p5_c(5,:) = [7 2 -1 forwardandturncostmult]; + %turn in place + basemprimendpts22p5_c(6,:) = [0 0 1 turninplacecostmult]; + basemprimendpts22p5_c(7,:) = [0 0 -1 turninplacecostmult]; + %sideways maintaining the same heading + basemprimendpts22p5_c(8,:) = [-1 2 0 sidestepcostmult]; + basemprimendpts22p5_c(9,:) = [1 -2 0 sidestepcostmult]; + + +``` + +Defining the motion primitives is a little bit tricky due to discretization problems. Intuitively, we'd expect to only define 9 motion primitives that would be used for all 16 of our discrete angles. However, due to angle discretization error, a motion primitive defined for a robot oriented at 0 degrees may not be the best motion primitive for a robot oriented at 22.5 degrees. We'll address why this is in a bit. + +In order to combat this, we define each angle (for one quadrant) explicitly. Since we have a total of 16 discretized angles, we can get away with defining 4 of the angles for quadrant one, and then duplicating the motions for the other three quadrants. Thus, we only need to define motion primitives for 4 angles: 0, 22.5, 45, and 67.5. We can take advantage of symmetry again and say that angles 22.5 and 67.5 can use the same set of motion primitives (as their discretization errors will be the same). In this code, we define motion primitives for 22.5 degrees. + +Now, we only have to define motion primitives for 3 angles: 0, 22.5, and 45. With 9 motion primitives for each, this means we must define 27 motion primitives. Looking above, we see that there are indeed 27 definitions. Let's look at the definition for moving forward 8 units when the robot is oriented at 0 degrees: + +``` + +basemprimendpts0_c(2,:) = [8 0 0 forwardcostmult]; +``` + +The format for this vector is [dx dy dtheta multiplier]. Since we're facing down the positive x-axis, we want dx=8, and everything else 0. For the same motion when the robot is oriented at 45 degrees, we use: + +``` + +basemprimendpts45_c(2,:) = [6 6 0 forwardcostmult]; +``` + +Notice that the distance traversed is actually more than 8 (8.48). This is to counteract the previously described discretization error. This extra distance ensure that we land in the center of the discretized cell, rather than off to one corner. When designing your own motion primitives, it's important to make sure your motions land you in the centers of cells to avoid discontinuous paths. The image below depicts what happens when your motion primitives don't land in the middle of the cell - even though it's valid in discrete space, the continuous path is invalid (thanks Andrew Dornbush). + +![](../../media/images/unaligned_mprims.png) + +Once you've defined your set of motion primitives, use the matlab visualization to ensure that the motions are correct. The generated file (usually ending with .mprim) is now ready for use by the SBPL planner! diff --git a/static/archive/legacy-drupal/content/pages/0053-forward-arc-motion-primitives.html b/static/archive/legacy-drupal/content/pages/0053-forward-arc-motion-primitives.html new file mode 100644 index 0000000..edc3f8a --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0053-forward-arc-motion-primitives.html @@ -0,0 +1,536 @@ + +Forward Arc Motion Primitives + +

    Forward Arc Motion Primitives

    + +

     

    +
    +

    + SBPL Forward-Turn-Arc Motion Primitive Generation

    +
    + (Margarita Safonova)
    +
    + +

    SBPL Lattice Planner generates a path from start to goal by combining a series of pre-defined motion primitives. SBPL provides several matlab scripts that can be used to build motion primitives for different types of vehicles. For example, the matlab script named genmprim_unicycle.m constructs forward, backward, turn-in-place, and forward-turn-arc motion primitives for a unicycle robot in the 3D state space (x,y,θ). In this tutorial we describe how the genmprim_unicycle.m script calculates the forward-turn-arc motion primitive given the start and the end poses.

    +

    + 1 Introduction

    + +

    The task of the SBPL Lattice Planner is to generate a smooth kinematically feasible trajectory or path, that a robot can safely follow to reach its goal pose. This trajectory is represented as a series of connected states in a lattice-based graph constructed using motion primitives and efficient search algorithms. A lattice-based graph is a graph constructed using short motion primitives as edges that end up at the center of cells. Motion primitives are short, kinematically feasible motions which form the basis of movements that can be performed by the robot platform.

    +

    Figure 1 shows the base set of motion primitives used by the planner (left), the lattice-based graph construction process (middle), and the final generated path (right). Each state is represented in the 3D space by a pose with two-dimensional coordinates (x,y) and orientation θ.

    +

     

    +
    +
    + +

    PIC

    +
    + Figure 1: Lattice-based graph representation for 3D(x,y,θ) planning.
    + +

     

    +
    +
    + +

    The genmprim_unicycle.m matlab script constructs a set of motion primitives that enable a robot to move straight forward, straight backward, turn in place by a certain angle and move forward and turn by a certain angle.  The script generates primitives for a discrete set of turning angles φ, varying from 0 to 2π radians. The set of primitives generated for each turning angle φ can include two forward primitives (short and long), one backward primitive (short), two turn in place primitives (clockwise and counterclockwise) and two forward-turn-arc primitives (clockwise and counterclockwise). All motion primitives share the same starting point (x = 0, y = 0), but have different starting orientations. Motion primitives within the same set have the same starting orientation (θ = φ) equal to the turning angle of the set. Each individual motion primitive is defined by its type, its start pose, its end pose and contains a dense sequence of poses forming a trajectory in the 3D space (x,y,θ). The matlab script writes all generated primitive trajectories into a file. This file is later used by the SBPL Lattice Planner to generate trajectories.

    +

    + 2 Matlab Script Description

    + +

    The matlab script uses several configurable parameters:

    +
    +
    + (a)
    +
    + outfilename - name of the file (usually with extention .mprim) where generated set of motion primitives is saved. This parameter is required and must be passed to the script as an argument.
    +
    + (b)
    +
    + resolution - cell size of the (x,y) grid in meters (0.1 by default).
    +
    + (c)
    +
    + numberofangles - number of discrete angles per circle (16 by default). This number preferably should be a power of 2 and definitely should be multiple of 8. This parameter determines the base turning angle calculated as δ = numbe2roπfangles and the set of turning angles as φ = , where 0 k numberofangles1.
    +
    + (d)
    +
    + numberofprimsperangle - number of primitives per set (5 by default). By default turn in place primitives are not generated. To add them set this parameter to 7.
    +
    + (e)
    +
    + numofsamples - number of discrete points on each primitive trajectory (10 by default).
    +
    + +

    The turning angle of the motion primitive set (φ) and the base turning angle (δ) together define the orientation (θ) of the end pose for each motion primitive in the set:

    + + + + + + + +
    +
    + θ = φ + nδ,    where     n ∈ { − 1,0,1}
    +
    + (1)
    + +

    +

    The script defines a set of end poses for a subset of starting angles in the first quadrant.  These form the basis for all motion primitives that are generated for a discrete set of angles.

    +
    +
    + (a)
    +
    + basemprimendpts0_c - the array of end poses for the starting angle φ = 0.
    +
    + (b)
    +
    + basemprimendpts45_c - the array of end poses for the starting angle φ = 45.
    +
    + (c)
    +
    + basemprimendpts22p5_c - the array of end poses for the starting angle φ = 22.5.
    +
    + +

    In the script, each of these arrays of end poses is defined as an array of four-dimensional vectors (i,j,n,costmultiplier), where i and j specify x and y coordinates of the end pose in grid units (x = iresolution, y = jresolution), n determines the orientation of the end pose (see  (1)) and costmultiplier is a cost multiplier value used by the SBPL Lattice Planner to penalize certain types of motion primitives.

    +

    It is important for each motion primitive to start and end exactly in the center of a grid cell to avoid having discontinuities in the path generated by the lattice planner. (As an implementation detail, the matlab script actually generates primitives that start and end at the corners of grid cells. The planner then shifts motion primitive trajectories by 0.5resolution in each direction to move their start/end points to the centers of the grid cells.)

    +

    The rest of motion primitives are constructed as a result of symmetrical rotation of one of the base primitives around the origin by a certain angle which is a multiple of the base turning angle (δ). The disposition of the end pose relative to the origin determines the shape, the length and the turning angle of the primitive. By specifying appropriate end pose and base turning angle, we can control the kinematic feasibility of motion primitives.

    +

    In each set, the forward and backward primitives have fixed orientation and are represented by simple straight line segments. The two turn in place primitives have (x,y) coordinates of the end pose equal to (x,y) coordinates of the start pose, and simply demonstrate change in the orientation. The two forward-turn-arc primitives have ending orientations symmetrical with respect to the forward primitive: θ1,2 = φ ± δ. Due to the requirement to reach exactly the given end pose (x,y,θ), each forward-turn-arc primitive is constructed as combination of two movements: a forward straight line segment followed by an arc of a circle. Figure 2 illustrates the base set of motion primitives for turning angle φ = 0. Figure 3 displays the full set of motion primitives generated by the genmprim_unicycle.m matlab script.

    +

    The matlab scripts records information about all generated motion primitives into a file specified by outfilename. First it writes data related to all motion primitives:

    +
    +
    + (a)
    +
    + resolution_m - cell size of the (x,y) grid in meters.
    +
    + (b)
    +
    + numberofangles - number of discrete angles per circle.
    +
    + (c)
    +
    + totalnumberofprimitives - total number of generated motion primitives.
    +
    + +

    Then in a loop, the scripts outputs information applicable to each individual motion primitive:

    +
    +
    + (a)
    +
    + primID - unique identifier of the motion primitive.
    +
    + (b)
    +
    + startangle_c - starting orientation of the motion primitive (θ).
    +
    + (c)
    +
    + endpose_c - end pose of the motion primitive (x,y,θ).
    +
    + (d)
    +
    + additionalactioncostmult - cost multiplier of the motion primitive.
    +
    + (e)
    +
    + intermediateposes - number of generated poses for the motion primitive.
    +
    + (f)
    +
    + - list of actual intermediate poses generated for the motion primitive (x,y,θ). Notice that these poses are calculated with respect to the origin (0, 0), not the center of the grid cells.
    +
    + +

     

    +
    +
    + +

    PIC

    +
    + Figure 2: Base set of motion primitives for turning angle φ = 0. Here 0 denotes forward and backward straight motion primitives, 1 denotes the counterclockwise forward-turn-arc motion primitive with the ending orientation θ1 = φ + δ = 22.5, and 1 denotes the clockwise forward-turn-arc motion primitive with the ending orientation θ2 = φ δ = 22.5.
    + +

     

    +
    +
    + +

     

    +
    +
    + +

    PIC

    +
    + Figure 3: Full set of motion primitives generated by the genmprim_unicycle.m matlab script for turning angles φ = where k = 0,, 15.
    + +

     

    +
    +
    +

    + 3 A forward-turn-arc motion primitive

    + +

    In the following sections we describe how to build a single forward-turn-arc motion primitive. The trajectory of this motion primitive must satisfy the following requirements:

    +

     

    +
    +
    + (a)
    +
    + The robot moves from the start pose (x0,y00) to the end (goal) pose (xg,ygg) of the primitive with fixed rotational (ω) and translational (v) velocities.
    +
    +  
    +
    +  
    +
    + (b)
    +
    + The robots travels from the start pose to the goal pose during the time interval 0 t 1. For any arbitrary time interval ˜t 0 ˜t ˜t g this can be achieved using the following parameter transformation: t = ˜t−˜t-Δ-0, v = vΔ˜, ω = Δ˜ω, Δ = ˜t g ˜t 0.
    +
    +  
    +
    +  
    +
    + (c)
    +
    + The trajectory of the primitive is a combination of the segment of the straight line for (0 t tl) followed by the arc of the circle of radius r for (tl t 1). The radius of the arc r represents the robot’s turning radius. Let l denote the length of the straight line segment and (xl,yll) denote the start pose of the arc. Therefore, l = s(tl),xl = x(tl),yl = y(tl)l = θ(tl) = θ0.
    +
    + +

    To build a motion primitive, we need to determine values of l,r,v,ω and tl.

    +

    The length of the path, traveled by the robot at any given time, is s(t) = vt. Specifically for t = tl, l = vtl.

    +

    When following the arc, the robot’s turning angle at any given time is Δθ(t) = θ(t) θ0 = ω(t tl) and the length of the arc is sarc(t) = rΔθ(t) = (t tl). From the latter, r = sarc(t) t−tl1-ω = v-ω.

    +

    Figure 4 displays the sample forward-turn-arc motion primitive trajectory.

    +

     

    +
    +
    + +

    PIC

    +
    + Figure 4: The sample forward-turn-arc motion primitive with x0 = 0, y0 = 0, θ0 = 0, xg = 15, yg = 5, θg = 0.93.
    + +

     

    +
    +
    +

    + 4 Straight Line Segment Of The Motion Primitive

    + +

    Consider the case of when the robot follows the straight line segment of the motion primitive with the fixed velocity v and the fixed heading θ0. As shown on Figure 5, this behavior can be described by the following equations:

    +
    +
    + x(t) = x0 + vtcos(θ0)y(t) = y0 + vtsin (θ0),   where     0 ≤ t ≤ tl                            (2)θ(t) = θ .       0
    +
    +

    Substituting t = tl and l = vtl into (2), we get equations for the last pose of the straight line segment:

    +
    +
    + x =  x + lcos(θ ) l    0        0yl = y0 + lsin(θ0)                                                       (3)θl = θ0.
    +
    +
    +
    + +

    PIC

    +
    + Figure 5: Straight line segment of the motion primitive.
    + +

     

    +
    +
    +

    + 5 Arc Segment Of The Motion Primitive

    + +

    Now consider the case of when the robot follows the arc of the circle with the fixed velocity v and the fixed rotational velocity ω. Derivatives ddxt and ddyt give us components of the robot’s velocity vx (in the direction of the x-axis) and vy (in the direction of the y-axis), correspondingly. As shown on Figure 6, we have the following system of three differential equations:

    + + + + + + + +
    +
    + dx-dt = v cos(θ(t))dy---= v sin(θ(t)),    where     tl ≤ t ≤ 1ddtθ---= ω.dt
    +
    + (4)
    + +

    +

     

    +
    +
    + +

    PIC

    +
    + Figure 6: Robot’s velocity components.
    + +

     

    +
    +
    + +

    Integrating the last equation of  (4), we receive:

    + + + + + + + +
    +
    +       ∫ tθ(t) =    ωdt + θ(tl) = ω(t− tl) + θ0,    where    tl ≤ t ≤ 1.       tl
    +
    + (5)
    + +

    +

    Substituting  (5) into  (4) gives us:

    + + + + + + + +
    +
    + dx-dt = vcos(ω(t− tl) + θ0)dy---=  vsin (ω (t− tl) + θ0),    where     tl ≤ t ≤ 1. dt
    +
    + (6)
    + +

    +

    Integrating  (6), we receive:

    + + + + + + + +
    +
    +       ∫x(t) =  tv cos(ω (t− t) + θ)dt + x(t)       tl            l    0       l      ∫ ty(t) =   v sin(ω (t − tl)+ θ0)dt+ y (tl),    where    tl ≤ t ≤ 1.       tl
    +
    + (7)
    + +

    +

    From  (7),  (3) and using r = v-ω, we get:

    + + + + + + + +
    +
    + x(t) = x0 + lcos(θ0)+ r sin(ω (t − tl)+ θ0)−  rsin(θ0)y(t) = y0 + lsin(θ0)− rcos(ω(t− tl)+ θ0)+ r cos(θ0), where  tl ≤ t ≤ 1.
    +
    + (8)
    + +

    +

    Substituting t = tg = 1 into  (8), we have:

    + + + + + + + +
    +
    + xg − x0 = lcos(θ0)+ r(sin(θg) − sin(θ0))yg − y0 = lsin(θ0)+ r(cos(θ0) − cos(θg)).
    +
    + (9)
    + +

    +

    The  (9) is a system of two linear equation involving variables l and r. It can be expressed in the matrix form:

    + + + + + + + +
    +
    + B = AX,    where    |                   |        |      |        ||A = ||cosθ0  sin θg − sinθ0|| , B = ||xg − x0||,  X =  ||l||.    |sin θ0  cosθ0 − cos θg|       |yg − y0|       |r|
    +
    + (10)
    + +

    +

    The system  (10) has a unique solution:

    + + + + + + + +
    +
    +        −1X  = A   B,   where  l = X (1 ),  r = X (2).
    +
    + (11)
    + +

    +

    By definition, ω = θg−-θ0-1−tl. Using tl = lv and r = v-ω, we finally get:

    + + + + + + + +
    +
    +              -lω = θg − θ0 + r    and    v = rω.
    +
    + (12)
    + +

     

    +

    + 6 Motion Primitive Calculation

    + +

    In the previous sections we derived formulas for all initially unknown motion parameters. Specifically using  (11), we can find the length of the straight line segment (l) and the turning radius (r). From (12) we can determine both the rotational (ω) and the translational (v) velocities. Finally, using tl = lv we can calculate the time, corresponding to the end of the straight line segment.

    +

    The next step is to build the motion primitive trajectory. As defined earlier in this tutorial, the numofsamples is the given number of discrete poses required on the motion primitive trajectory. Let Δt be a time step between sequential discrete poses of the trajectory. Hence Δt = -----1------numofsamples− 1. To build the motion primitive trajectory, we iterate over t = iΔt, where 0 i numofsamples-1 and use an appropriate formula to calculate each discrete pose. Specifically for t tl, we use  (2) to construct the straight line segment of the motion primitive, then for tl t 1, use  (8) to construct the arc portion of the motion primitive.

    + + diff --git a/static/archive/legacy-drupal/content/pages/0053-forward-arc-motion-primitives.json b/static/archive/legacy-drupal/content/pages/0053-forward-arc-motion-primitives.json new file mode 100644 index 0000000..5ecfa67 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0053-forward-arc-motion-primitives.json @@ -0,0 +1,25 @@ +{ + "nid": 53, + "vid": 53, + "type": "page", + "language": "und", + "title": "Forward Arc Motion Primitives", + "slug": "forward-arc-motion-primitives", + "uid": 13, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1377632966, + "changed": 1377704838, + "url_aliases": [], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "\r\n

     

    \r\n
    \r\n\t

    \r\n\t\tSBPL Forward-Turn-Arc Motion Primitive Generation

    \r\n\t
    \r\n\t\t(Margarita Safonova)
    \r\n
    \r\n\r\n

    SBPL Lattice Planner generates a path from start to goal by combining a series of pre-defined motion primitives. SBPL provides several matlab scripts that can be used to build motion primitives for different types of vehicles. For example, the matlab script named genmprim_unicycle.m constructs forward, backward, turn-in-place, and forward-turn-arc motion primitives for a unicycle robot in the 3D state space (x,y,θ). In this tutorial we describe how the genmprim_unicycle.m script calculates the forward-turn-arc motion primitive given the start and the end poses.

    \r\n

    \r\n\t1 Introduction

    \r\n\r\n

    The task of the SBPL Lattice Planner is to generate a smooth kinematically feasible trajectory or path, that a robot can safely follow to reach its goal pose. This trajectory is represented as a series of connected states in a lattice-based graph constructed using motion primitives and efficient search algorithms. A lattice-based graph is a graph constructed using short motion primitives as edges that end up at the center of cells. Motion primitives are short, kinematically feasible motions which form the basis of movements that can be performed by the robot platform.

    \r\n

    Figure 1 shows the base set of motion primitives used by the planner (left), the lattice-based graph construction process (middle), and the final generated path (right). Each state is represented in the 3D space by a pose with two-dimensional coordinates (x,y) and orientation θ.

    \r\n

     

    \r\n
    \r\n
    \r\n\t\r\n\t

    \"PIC\"

    \r\n\t
    \r\n\t\tFigure 1: Lattice-based graph representation for 3D(x,y,θ) planning.
    \r\n\t\r\n\t

     

    \r\n
    \r\n
    \r\n\r\n

    The genmprim_unicycle.m matlab script constructs a set of motion primitives that enable a robot to move straight forward, straight backward, turn in place by a certain angle and move forward and turn by a certain angle.  The script generates primitives for a discrete set of turning angles φ, varying from 0 to 2π radians. The set of primitives generated for each turning angle φ can include two forward primitives (short and long), one backward primitive (short), two turn in place primitives (clockwise and counterclockwise) and two forward-turn-arc primitives (clockwise and counterclockwise). All motion primitives share the same starting point (x = 0, y = 0), but have different starting orientations. Motion primitives within the same set have the same starting orientation (θ = φ) equal to the turning angle of the set. Each individual motion primitive is defined by its type, its start pose, its end pose and contains a dense sequence of poses forming a trajectory in the 3D space (x,y,θ). The matlab script writes all generated primitive trajectories into a file. This file is later used by the SBPL Lattice Planner to generate trajectories.

    \r\n

    \r\n\t2 Matlab Script Description

    \r\n\r\n

    The matlab script uses several configurable parameters:

    \r\n
    \r\n\t
    \r\n\t\t(a)
    \r\n\t
    \r\n\t\toutfilename - name of the file (usually with extention .mprim) where generated set of motion primitives is saved. This parameter is required and must be passed to the script as an argument.
    \r\n\t
    \r\n\t\t(b)
    \r\n\t
    \r\n\t\tresolution - cell size of the (x,y) grid in meters (0.1 by default).
    \r\n\t
    \r\n\t\t(c)
    \r\n\t
    \r\n\t\tnumberofangles - number of discrete angles per circle (16 by default). This number preferably should be a power of 2 and definitely should be multiple of 8. This parameter determines the base turning angle calculated as δ = \"numbe2roπfangles\" and the set of turning angles as φ = , where 0 k numberofangles1.
    \r\n\t
    \r\n\t\t(d)
    \r\n\t
    \r\n\t\tnumberofprimsperangle - number of primitives per set (5 by default). By default turn in place primitives are not generated. To add them set this parameter to 7.
    \r\n\t
    \r\n\t\t(e)
    \r\n\t
    \r\n\t\tnumofsamples - number of discrete points on each primitive trajectory (10 by default).
    \r\n
    \r\n\r\n

    The turning angle of the motion primitive set (φ) and the base turning angle (δ) together define the orientation (θ) of the end pose for each motion primitive in the set:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"θ
    \r\n\t\t\t
    \r\n\t\t\t\t(1)
    \r\n\r\n

    \r\n

    The script defines a set of end poses for a subset of starting angles in the first quadrant.  These form the basis for all motion primitives that are generated for a discrete set of angles.

    \r\n
    \r\n\t
    \r\n\t\t(a)
    \r\n\t
    \r\n\t\tbasemprimendpts0_c - the array of end poses for the starting angle φ = 0.
    \r\n\t
    \r\n\t\t(b)
    \r\n\t
    \r\n\t\tbasemprimendpts45_c - the array of end poses for the starting angle φ = 45.
    \r\n\t
    \r\n\t\t(c)
    \r\n\t
    \r\n\t\tbasemprimendpts22p5_c - the array of end poses for the starting angle φ = 22.5.
    \r\n
    \r\n\r\n

    In the script, each of these arrays of end poses is defined as an array of four-dimensional vectors (i,j,n,costmultiplier), where i and j specify x and y coordinates of the end pose in grid units (x = iresolution, y = jresolution), n determines the orientation of the end pose (see  (1)) and costmultiplier is a cost multiplier value used by the SBPL Lattice Planner to penalize certain types of motion primitives.

    \r\n

    It is important for each motion primitive to start and end exactly in the center of a grid cell to avoid having discontinuities in the path generated by the lattice planner. (As an implementation detail, the matlab script actually generates primitives that start and end at the corners of grid cells. The planner then shifts motion primitive trajectories by 0.5resolution in each direction to move their start/end points to the centers of the grid cells.)

    \r\n

    The rest of motion primitives are constructed as a result of symmetrical rotation of one of the base primitives around the origin by a certain angle which is a multiple of the base turning angle (δ). The disposition of the end pose relative to the origin determines the shape, the length and the turning angle of the primitive. By specifying appropriate end pose and base turning angle, we can control the kinematic feasibility of motion primitives.

    \r\n

    In each set, the forward and backward primitives have fixed orientation and are represented by simple straight line segments. The two turn in place primitives have (x,y) coordinates of the end pose equal to (x,y) coordinates of the start pose, and simply demonstrate change in the orientation. The two forward-turn-arc primitives have ending orientations symmetrical with respect to the forward primitive: θ1,2 = φ ± δ. Due to the requirement to reach exactly the given end pose (x,y,θ), each forward-turn-arc primitive is constructed as combination of two movements: a forward straight line segment followed by an arc of a circle. Figure 2 illustrates the base set of motion primitives for turning angle φ = 0. Figure 3 displays the full set of motion primitives generated by the genmprim_unicycle.m matlab script.

    \r\n

    The matlab scripts records information about all generated motion primitives into a file specified by outfilename. First it writes data related to all motion primitives:

    \r\n
    \r\n\t
    \r\n\t\t(a)
    \r\n\t
    \r\n\t\tresolution_m - cell size of the (x,y) grid in meters.
    \r\n\t
    \r\n\t\t(b)
    \r\n\t
    \r\n\t\tnumberofangles - number of discrete angles per circle.
    \r\n\t
    \r\n\t\t(c)
    \r\n\t
    \r\n\t\ttotalnumberofprimitives - total number of generated motion primitives.
    \r\n
    \r\n\r\n

    Then in a loop, the scripts outputs information applicable to each individual motion primitive:

    \r\n
    \r\n\t
    \r\n\t\t(a)
    \r\n\t
    \r\n\t\tprimID - unique identifier of the motion primitive.
    \r\n\t
    \r\n\t\t(b)
    \r\n\t
    \r\n\t\tstartangle_c - starting orientation of the motion primitive (θ).
    \r\n\t
    \r\n\t\t(c)
    \r\n\t
    \r\n\t\tendpose_c - end pose of the motion primitive (x,y,θ).
    \r\n\t
    \r\n\t\t(d)
    \r\n\t
    \r\n\t\tadditionalactioncostmult - cost multiplier of the motion primitive.
    \r\n\t
    \r\n\t\t(e)
    \r\n\t
    \r\n\t\tintermediateposes - number of generated poses for the motion primitive.
    \r\n\t
    \r\n\t\t(f)
    \r\n\t
    \r\n\t\t- list of actual intermediate poses generated for the motion primitive (x,y,θ). Notice that these poses are calculated with respect to the origin (0, 0), not the center of the grid cells.
    \r\n
    \r\n\r\n

     

    \r\n
    \r\n
    \r\n\t\r\n\t

    \"PIC\"

    \r\n\t
    \r\n\t\tFigure 2: Base set of motion primitives for turning angle φ = 0. Here 0 denotes forward and backward straight motion primitives, 1 denotes the counterclockwise forward-turn-arc motion primitive with the ending orientation θ1 = φ + δ = 22.5, and 1 denotes the clockwise forward-turn-arc motion primitive with the ending orientation θ2 = φ δ = 22.5.
    \r\n\t\r\n\t

     

    \r\n
    \r\n
    \r\n\r\n

     

    \r\n
    \r\n
    \r\n\t\r\n\t

    \"PIC\"

    \r\n\t
    \r\n\t\tFigure 3: Full set of motion primitives generated by the genmprim_unicycle.m matlab script for turning angles φ = where k = 0,, 15.
    \r\n\t\r\n\t

     

    \r\n
    \r\n
    \r\n

    \r\n\t3 A forward-turn-arc motion primitive

    \r\n\r\n

    In the following sections we describe how to build a single forward-turn-arc motion primitive. The trajectory of this motion primitive must satisfy the following requirements:

    \r\n

     

    \r\n
    \r\n\t
    \r\n\t\t(a)
    \r\n\t
    \r\n\t\tThe robot moves from the start pose (x0,y00) to the end (goal) pose (xg,ygg) of the primitive with fixed rotational (ω) and translational (v) velocities.
    \r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\t(b)
    \r\n\t
    \r\n\t\tThe robots travels from the start pose to the goal pose during the time interval 0 t 1. For any arbitrary time interval \"˜t\" 0 \"˜t\" \"˜t\" g this can be achieved using the following parameter transformation: t = \"˜t−˜t-Δ-0\", v = \"vΔ˜\", ω = \"Δ˜ω\", Δ = \"˜t\" g \"˜t\" 0.
    \r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\t(c)
    \r\n\t
    \r\n\t\tThe trajectory of the primitive is a combination of the segment of the straight line for (0 t tl) followed by the arc of the circle of radius r for (tl t 1). The radius of the arc r represents the robot’s turning radius. Let l denote the length of the straight line segment and (xl,yll) denote the start pose of the arc. Therefore, l = s(tl),xl = x(tl),yl = y(tl)l = θ(tl) = θ0.
    \r\n
    \r\n\r\n

    To build a motion primitive, we need to determine values of l,r,v,ω and tl.

    \r\n

    The length of the path, traveled by the robot at any given time, is s(t) = vt. Specifically for t = tl, l = vtl.

    \r\n

    When following the arc, the robot’s turning angle at any given time is Δθ(t) = θ(t) θ0 = ω(t tl) and the length of the arc is sarc(t) = rΔθ(t) = (t tl). From the latter, r = \"sarc(t)\"1-ω\" = \"v-ω\".

    \r\n

    Figure 4 displays the sample forward-turn-arc motion primitive trajectory.

    \r\n

     

    \r\n
    \r\n
    \r\n\t\r\n\t

    \"PIC\"

    \r\n\t
    \r\n\t\tFigure 4: The sample forward-turn-arc motion primitive with x0 = 0, y0 = 0, θ0 = 0, xg = 15, yg = 5, θg = 0.93.
    \r\n\t\r\n\t

     

    \r\n
    \r\n
    \r\n

    \r\n\t4 Straight Line Segment Of The Motion Primitive

    \r\n\r\n

    Consider the case of when the robot follows the straight line segment of the motion primitive with the fixed velocity v and the fixed heading θ0. As shown on Figure 5, this behavior can be described by the following equations:

    \r\n
    \r\n\t
    \r\n\t\t\"x(t)
    \r\n
    \r\n

    Substituting t = tl and l = vtl into (2), we get equations for the last pose of the straight line segment:

    \r\n
    \r\n\t
    \r\n\t\t\"x
    \r\n
    \r\n
    \r\n
    \r\n\t\r\n\t

    \"PIC\"

    \r\n\t
    \r\n\t\tFigure 5: Straight line segment of the motion primitive.
    \r\n\t\r\n\t

     

    \r\n
    \r\n
    \r\n

    \r\n\t5 Arc Segment Of The Motion Primitive

    \r\n\r\n

    Now consider the case of when the robot follows the arc of the circle with the fixed velocity v and the fixed rotational velocity ω. Derivatives \"ddxt\" and \"ddyt\" give us components of the robot’s velocity vx (in the direction of the x-axis) and vy (in the direction of the y-axis), correspondingly. As shown on Figure 6, we have the following system of three differential equations:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"dx-dt
    \r\n\t\t\t
    \r\n\t\t\t\t(4)
    \r\n\r\n

    \r\n

     

    \r\n
    \r\n
    \r\n\t\r\n\t

    \"PIC\"

    \r\n\t
    \r\n\t\tFigure 6: Robot’s velocity components.
    \r\n\t\r\n\t

     

    \r\n
    \r\n
    \r\n\r\n

    Integrating the last equation of  (4), we receive:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"
    \r\n\t\t\t
    \r\n\t\t\t\t(5)
    \r\n\r\n

    \r\n

    Substituting  (5) into  (4) gives us:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"dx-dt
    \r\n\t\t\t
    \r\n\t\t\t\t(6)
    \r\n\r\n

    \r\n

    Integrating  (6), we receive:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"
    \r\n\t\t\t
    \r\n\t\t\t\t(7)
    \r\n\r\n

    \r\n

    From  (7),  (3) and using r = \"v-ω\", we get:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"x(t)
    \r\n\t\t\t
    \r\n\t\t\t\t(8)
    \r\n\r\n

    \r\n

    Substituting t = tg = 1 into  (8), we have:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"xg
    \r\n\t\t\t
    \r\n\t\t\t\t(9)
    \r\n\r\n

    \r\n

    The  (9) is a system of two linear equation involving variables l and r. It can be expressed in the matrix form:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"B
    \r\n\t\t\t
    \r\n\t\t\t\t(10)
    \r\n\r\n

    \r\n

    The system  (10) has a unique solution:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"
    \r\n\t\t\t
    \r\n\t\t\t\t(11)
    \r\n\r\n

    \r\n

    By definition, ω = \"θg−-θ0-1−tl\". Using tl = \"lv\" and r = \"v-ω\", we finally get:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"
    \r\n\t\t\t
    \r\n\t\t\t\t(12)
    \r\n\r\n

     

    \r\n

    \r\n\t6 Motion Primitive Calculation

    \r\n\r\n

    In the previous sections we derived formulas for all initially unknown motion parameters. Specifically using  (11), we can find the length of the straight line segment (l) and the turning radius (r). From (12) we can determine both the rotational (ω) and the translational (v) velocities. Finally, using tl = \"lv\" we can calculate the time, corresponding to the end of the straight line segment.

    \r\n

    The next step is to build the motion primitive trajectory. As defined earlier in this tutorial, the numofsamples is the given number of discrete poses required on the motion primitive trajectory. Let Δt be a time step between sequential discrete poses of the trajectory. Hence Δt = \"-----1------numofsamples−. To build the motion primitive trajectory, we iterate over t = iΔt, where 0 i numofsamples-1 and use an appropriate formula to calculate each discrete pose. Specifically for t tl, we use  (2) to construct the straight line segment of the motion primitive, then for tl t 1, use  (8) to construct the arc portion of the motion primitive.

    \r\n", + "body_markdown": "## SBPL Forward-Turn-Arc Motion Primitive Generation\n\n (Margarita Safonova)\n\nSBPL Lattice Planner generates a path from start to goal by combining a series of pre-defined motion primitives. SBPL provides several matlab scripts that can be used to build motion primitives for different types of vehicles. For example, the matlab script named genmprim_unicycle.m constructs forward, backward, turn-in-place, and forward-turn-arc motion primitives for a unicycle robot in the 3D state space (x,y,θ). In this tutorial we describe how the genmprim_unicycle.m script calculates the forward-turn-arc motion primitive given the start and the end poses.\n\n### **1 Introduction**\n\nThe task of the SBPL Lattice Planner is to generate a smooth kinematically feasible trajectory or path, that a robot can safely follow to reach its goal pose. This trajectory is represented as a series of connected states in a lattice-based graph constructed using motion primitives and efficient search algorithms. A lattice-based graph is a graph constructed using short motion primitives as edges that end up at the center of cells. Motion primitives are short, kinematically feasible motions which form the basis of movements that can be performed by the robot platform.\n\nFigure 1 shows the base set of motion primitives used by the planner (left), the lattice-based graph construction process (middle), and the final generated path (right). Each state is represented in the 3D space by a pose with two-dimensional coordinates (x,y) and orientation θ.\n\n---\n\n![PIC](../../media/images/PathGen.jpg)\n\n Figure 1: Lattice-based graph representation for 3D(x,y,θ) planning.\n\n---\n\nThe genmprim_unicycle.m matlab script constructs a set of motion primitives that enable a robot to move straight forward, straight backward, turn in place by a certain angle and move forward and turn by a certain angle. The script generates primitives for a discrete set of turning angles φ, varying from 0 to 2π radians. The set of primitives generated for each turning angle φ can include two forward primitives (short and long), one backward primitive (short), two turn in place primitives (clockwise and counterclockwise) and two forward-turn-arc primitives (clockwise and counterclockwise). All motion primitives share the same starting point (x = 0, y = 0), but have different starting orientations. Motion primitives within the same set have the same starting orientation (θ = φ) equal to the turning angle of the set. Each individual motion primitive is defined by its type, its start pose, its end pose and contains a dense sequence of poses forming a trajectory in the 3D space (x,y,θ). The matlab script writes all generated primitive trajectories into a file. This file is later used by the SBPL Lattice Planner to generate trajectories.\n\n### **2 Matlab Script Description**\n\nThe matlab script uses several configurable parameters:\n\n (a) outfilename - name of the file (usually with extention .mprim) where generated set of motion primitives is saved. This parameter is required and must be passed to the script as an argument. (b) resolution - cell size of the (x,y) grid in meters (0.1 by default). (c) numberofangles - number of discrete angles per circle (16 by default). This number preferably should be a power of 2 and definitely should be multiple of 8. This parameter determines the base turning angle calculated as δ = ![numbe2roπfangles](../../media/images/LatextDoc10x.png) and the set of turning angles as φ = kδ, where 0 ≤ k ≤ numberofangles−1. (d) numberofprimsperangle - number of primitives per set (5 by default). By default turn in place primitives are not generated. To add them set this parameter to 7. (e) numofsamples - number of discrete points on each primitive trajectory (10 by default).\n\nThe turning angle of the motion primitive set (φ) and the base turning angle (δ) together define the orientation (θ) of the end pose for each motion primitive in the set:\n\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"θ
    \r\n\t\t\t
    \r\n\t\t\t\t(1)
    \n\nThe script defines a set of end poses for a subset of starting angles in the first quadrant. These form the basis for all motion primitives that are generated for a discrete set of angles.\n\n (a) basemprimendpts0_c - the array of end poses for the starting angle φ = 0∘. (b) basemprimendpts45_c - the array of end poses for the starting angle φ = 45∘. (c) basemprimendpts22p5_c - the array of end poses for the starting angle φ = 22.5∘.\n\nIn the script, each of these arrays of end poses is defined as an array of four-dimensional vectors (i,j,n,costmultiplier), where i and j specify x and y coordinates of the end pose in grid units (x = i∗resolution, y = j∗resolution), n determines the orientation of the end pose (see (1)) and costmultiplier is a cost multiplier value used by the SBPL Lattice Planner to penalize certain types of motion primitives.\n\nIt is important for each motion primitive to start and end exactly in the center of a grid cell to avoid having discontinuities in the path generated by the lattice planner. (As an implementation detail, the matlab script actually generates primitives that start and end at the corners of grid cells. The planner then shifts motion primitive trajectories by 0.5∗resolution in each direction to move their start/end points to the centers of the grid cells.)\n\nThe rest of motion primitives are constructed as a result of symmetrical rotation of one of the base primitives around the origin by a certain angle which is a multiple of the base turning angle (δ). The disposition of the end pose relative to the origin determines the shape, the length and the turning angle of the primitive. By specifying appropriate end pose and base turning angle, we can control the kinematic feasibility of motion primitives.\n\nIn each set, the forward and backward primitives have fixed orientation and are represented by simple straight line segments. The two turn in place primitives have (x,y) coordinates of the end pose equal to (x,y) coordinates of the start pose, and simply demonstrate change in the orientation. The two forward-turn-arc primitives have ending orientations symmetrical with respect to the forward primitive: θ1,2 = φ ± δ. Due to the requirement to reach exactly the given end pose (x,y,θ), each forward-turn-arc primitive is constructed as combination of two movements: a forward straight line segment followed by an arc of a circle. Figure 2 illustrates the base set of motion primitives for turning angle φ = 0∘. Figure 3 displays the full set of motion primitives generated by the genmprim_unicycle.m matlab script.\n\nThe matlab scripts records information about all generated motion primitives into a file specified by outfilename. First it writes data related to all motion primitives:\n\n (a) resolution_m - cell size of the (x,y) grid in meters. (b) numberofangles - number of discrete angles per circle. (c) totalnumberofprimitives - total number of generated motion primitives.\n\nThen in a loop, the scripts outputs information applicable to each individual motion primitive:\n\n (a) primID - unique identifier of the motion primitive. (b) startangle_c - starting orientation of the motion primitive (θ). (c) endpose_c - end pose of the motion primitive (x,y,θ). (d) additionalactioncostmult - cost multiplier of the motion primitive. (e) intermediateposes - number of generated poses for the motion primitive. (f) - list of actual intermediate poses generated for the motion primitive (x,y,θ). Notice that these poses are calculated with respect to the origin (0, 0), not the center of the grid cells.\n\n---\n\n![PIC](../../media/images/BasePrim.jpg)\n\n Figure 2: Base set of motion primitives for turning angle φ = 0∘. Here 0 denotes forward and backward straight motion primitives, 1 denotes the counterclockwise forward-turn-arc motion primitive with the ending orientation θ1 = φ + δ = 22.5∘, and −1 denotes the clockwise forward-turn-arc motion primitive with the ending orientation θ2 = φ − δ = −22.5∘.\n\n---\n\n---\n\n![PIC](../../media/images/MotionPrimitives.jpg)\n\n Figure 3: Full set of motion primitives generated by the genmprim_unicycle.m matlab script for turning angles φ = kδ where k = 0,…, 15.\n\n---\n\n### **3 A forward-turn-arc motion primitive**\n\nIn the following sections we describe how to build a single forward-turn-arc motion primitive. The trajectory of this motion primitive must satisfy the following requirements:\n\n (a) The robot moves from the start pose (x0,y0,θ0) to the end (goal) pose (xg,yg,θg) of the primitive with fixed rotational (ω) and translational (v) velocities. (b) The robots travels from the start pose to the goal pose during the time interval 0 ≤ t ≤ 1. For any arbitrary time interval ![˜t](../../media/images/LatextDoc12x.png) 0 ≤![˜t](../../media/images/LatextDoc13x.png) ≤![˜t](../../media/images/LatextDoc14x.png) g this can be achieved using the following parameter transformation: t = ![˜t−˜t-Δ-0](../../media/images/LatextDoc15x.png), v = ![vΔ˜](../../media/images/LatextDoc16x.png), ω = ![Δ˜ω](../../media/images/LatextDoc17x.png), Δ = ![˜t](../../media/images/LatextDoc18x.png) g −![˜t](../../media/images/LatextDoc19x.png) 0. (c) The trajectory of the primitive is a combination of the segment of the straight line for (0 ≤ t ≤ tl) followed by the arc of the circle of radius r for (tl ≤ t ≤ 1). The radius of the arc r represents the robot’s turning radius. Let l denote the length of the straight line segment and (xl,yl,θl) denote the start pose of the arc. Therefore, l = s(tl),xl = x(tl),yl = y(tl),θl = θ(tl) = θ0.\n\nTo build a motion primitive, we need to determine values of l,r,v,ω and tl.\n\nThe length of the path, traveled by the robot at any given time, is s(t) = vt. Specifically for t = tl, l = vtl.\n\nWhen following the arc, the robot’s turning angle at any given time is Δθ(t) = θ(t) − θ0 = ω(t − tl) and the length of the arc is sarc(t) = rΔθ(t) = rω(t − tl). From the latter, r = ![sarc(t) t−tl](../../media/images/LatextDoc110x.png)![1-ω](../../media/images/LatextDoc111x.png) = ![v-ω](../../media/images/LatextDoc112x.png).\n\nFigure 4 displays the sample forward-turn-arc motion primitive trajectory.\n\n---\n\n![PIC](../../media/images/fig1.jpg)\n\n Figure 4: The sample forward-turn-arc motion primitive with x0 = 0, y0 = 0, θ0 = 0, xg = 15, yg = 5, θg = 0.93.\n\n---\n\n### **4 Straight Line Segment Of The Motion Primitive**\n\nConsider the case of when the robot follows the straight line segment of the motion primitive with the fixed velocity v and the fixed heading θ0. As shown on Figure 5, this behavior can be described by the following equations:\n\n ![x(t) = x0 + vtcos(θ0)y(t) = y0 + vtsin (θ0), where 0 ≤ t ≤ tl (2)θ(t) = θ . 0](../../media/images/LatextDoc113x.png)\n\nSubstituting t = tl and l = vtl into (2), we get equations for the last pose of the straight line segment:\n\n ![x = x + lcos(θ ) l 0 0yl = y0 + lsin(θ0) (3)θl = θ0.](../../media/images/LatextDoc114x.png)\n\n---\n\n![PIC](../../media/images/fig2.jpg)\n\n Figure 5: Straight line segment of the motion primitive.\n\n---\n\n### **5 Arc Segment Of The Motion Primitive**\n\nNow consider the case of when the robot follows the arc of the circle with the fixed velocity v and the fixed rotational velocity ω. Derivatives ![ddxt](../../media/images/LatextDoc115x.png) and ![ddyt](../../media/images/LatextDoc116x.png) give us components of the robot’s velocity vx (in the direction of the x-axis) and vy (in the direction of the y-axis), correspondingly. As shown on Figure 6, we have the following system of three differential equations:\n\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"dx-dt
    \r\n\t\t\t
    \r\n\t\t\t\t(4)
    \n\n---\n\n![PIC](../../media/images/fig3.jpg)\n\n Figure 6: Robot’s velocity components.\n\n---\n\nIntegrating the last equation of (4), we receive:\n\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"
    \r\n\t\t\t
    \r\n\t\t\t\t(5)
    \n\nSubstituting (5) into (4) gives us:\n\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"dx-dt
    \r\n\t\t\t
    \r\n\t\t\t\t(6)
    \n\nIntegrating (6), we receive:\n\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"
    \r\n\t\t\t
    \r\n\t\t\t\t(7)
    \n\nFrom (7), (3) and using r = ![v-ω](../../media/images/LatextDoc121x.png), we get:\n\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"x(t)
    \r\n\t\t\t
    \r\n\t\t\t\t(8)
    \n\nSubstituting t = tg = 1 into (8), we have:\n\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"xg
    \r\n\t\t\t
    \r\n\t\t\t\t(9)
    \n\nThe (9) is a system of two linear equation involving variables l and r. It can be expressed in the matrix form:\n\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"B
    \r\n\t\t\t
    \r\n\t\t\t\t(10)
    \n\nThe system (10) has a unique solution:\n\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"
    \r\n\t\t\t
    \r\n\t\t\t\t(11)
    \n\nBy definition, ω = ![θg−-θ0-1−tl](../../media/images/LatextDoc126x.png). Using tl = ![lv](../../media/images/LatextDoc127x.png) and r = ![v-ω](../../media/images/LatextDoc128x.png), we finally get:\n\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"
    \r\n\t\t\t
    \r\n\t\t\t\t(12)
    \n\n### **6 Motion Primitive Calculation**\n\nIn the previous sections we derived formulas for all initially unknown motion parameters. Specifically using (11), we can find the length of the straight line segment (l) and the turning radius (r). From (12) we can determine both the rotational (ω) and the translational (v) velocities. Finally, using tl = ![lv](../../media/images/LatextDoc130x.png) we can calculate the time, corresponding to the end of the straight line segment.\n\nThe next step is to build the motion primitive trajectory. As defined earlier in this tutorial, the numofsamples is the given number of discrete poses required on the motion primitive trajectory. Let Δt be a time step between sequential discrete poses of the trajectory. Hence Δt = ![-----1------numofsamples− 1](../../media/images/LatextDoc131x.png). To build the motion primitive trajectory, we iterate over t = iΔt, where 0 ≤ i ≤ numofsamples-1 and use an appropriate formula to calculate each discrete pose. Specifically for t ≤ tl, we use (2) to construct the straight line segment of the motion primitive, then for tl ≤ t ≤ 1, use (8) to construct the arc portion of the motion primitive.\n", + "body_html_raw": "\r\n

     

    \r\n
    \r\n\t

    \r\n\t\tSBPL Forward-Turn-Arc Motion Primitive Generation

    \r\n\t
    \r\n\t\t(Margarita Safonova)
    \r\n
    \r\n\r\n

    SBPL Lattice Planner generates a path from start to goal by combining a series of pre-defined motion primitives. SBPL provides several matlab scripts that can be used to build motion primitives for different types of vehicles. For example, the matlab script named genmprim_unicycle.m constructs forward, backward, turn-in-place, and forward-turn-arc motion primitives for a unicycle robot in the 3D state space (x,y,θ). In this tutorial we describe how the genmprim_unicycle.m script calculates the forward-turn-arc motion primitive given the start and the end poses.

    \r\n

    \r\n\t1 Introduction

    \r\n\r\n

    The task of the SBPL Lattice Planner is to generate a smooth kinematically feasible trajectory or path, that a robot can safely follow to reach its goal pose. This trajectory is represented as a series of connected states in a lattice-based graph constructed using motion primitives and efficient search algorithms. A lattice-based graph is a graph constructed using short motion primitives as edges that end up at the center of cells. Motion primitives are short, kinematically feasible motions which form the basis of movements that can be performed by the robot platform.

    \r\n

    Figure 1 shows the base set of motion primitives used by the planner (left), the lattice-based graph construction process (middle), and the final generated path (right). Each state is represented in the 3D space by a pose with two-dimensional coordinates (x,y) and orientation θ.

    \r\n

     

    \r\n
    \r\n
    \r\n\t\r\n\t

    \"PIC\"

    \r\n\t
    \r\n\t\tFigure 1: Lattice-based graph representation for 3D(x,y,θ) planning.
    \r\n\t\r\n\t

     

    \r\n
    \r\n
    \r\n\r\n

    The genmprim_unicycle.m matlab script constructs a set of motion primitives that enable a robot to move straight forward, straight backward, turn in place by a certain angle and move forward and turn by a certain angle.  The script generates primitives for a discrete set of turning angles φ, varying from 0 to 2π radians. The set of primitives generated for each turning angle φ can include two forward primitives (short and long), one backward primitive (short), two turn in place primitives (clockwise and counterclockwise) and two forward-turn-arc primitives (clockwise and counterclockwise). All motion primitives share the same starting point (x = 0, y = 0), but have different starting orientations. Motion primitives within the same set have the same starting orientation (θ = φ) equal to the turning angle of the set. Each individual motion primitive is defined by its type, its start pose, its end pose and contains a dense sequence of poses forming a trajectory in the 3D space (x,y,θ). The matlab script writes all generated primitive trajectories into a file. This file is later used by the SBPL Lattice Planner to generate trajectories.

    \r\n

    \r\n\t2 Matlab Script Description

    \r\n\r\n

    The matlab script uses several configurable parameters:

    \r\n
    \r\n\t
    \r\n\t\t(a)
    \r\n\t
    \r\n\t\toutfilename - name of the file (usually with extention .mprim) where generated set of motion primitives is saved. This parameter is required and must be passed to the script as an argument.
    \r\n\t
    \r\n\t\t(b)
    \r\n\t
    \r\n\t\tresolution - cell size of the (x,y) grid in meters (0.1 by default).
    \r\n\t
    \r\n\t\t(c)
    \r\n\t
    \r\n\t\tnumberofangles - number of discrete angles per circle (16 by default). This number preferably should be a power of 2 and definitely should be multiple of 8. This parameter determines the base turning angle calculated as δ = \"numbe2roπfangles\" and the set of turning angles as φ = , where 0 k numberofangles1.
    \r\n\t
    \r\n\t\t(d)
    \r\n\t
    \r\n\t\tnumberofprimsperangle - number of primitives per set (5 by default). By default turn in place primitives are not generated. To add them set this parameter to 7.
    \r\n\t
    \r\n\t\t(e)
    \r\n\t
    \r\n\t\tnumofsamples - number of discrete points on each primitive trajectory (10 by default).
    \r\n
    \r\n\r\n

    The turning angle of the motion primitive set (φ) and the base turning angle (δ) together define the orientation (θ) of the end pose for each motion primitive in the set:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"θ
    \r\n\t\t\t
    \r\n\t\t\t\t(1)
    \r\n\r\n

    \r\n

    The script defines a set of end poses for a subset of starting angles in the first quadrant.  These form the basis for all motion primitives that are generated for a discrete set of angles.

    \r\n
    \r\n\t
    \r\n\t\t(a)
    \r\n\t
    \r\n\t\tbasemprimendpts0_c - the array of end poses for the starting angle φ = 0.
    \r\n\t
    \r\n\t\t(b)
    \r\n\t
    \r\n\t\tbasemprimendpts45_c - the array of end poses for the starting angle φ = 45.
    \r\n\t
    \r\n\t\t(c)
    \r\n\t
    \r\n\t\tbasemprimendpts22p5_c - the array of end poses for the starting angle φ = 22.5.
    \r\n
    \r\n\r\n

    In the script, each of these arrays of end poses is defined as an array of four-dimensional vectors (i,j,n,costmultiplier), where i and j specify x and y coordinates of the end pose in grid units (x = iresolution, y = jresolution), n determines the orientation of the end pose (see  (1)) and costmultiplier is a cost multiplier value used by the SBPL Lattice Planner to penalize certain types of motion primitives.

    \r\n

    It is important for each motion primitive to start and end exactly in the center of a grid cell to avoid having discontinuities in the path generated by the lattice planner. (As an implementation detail, the matlab script actually generates primitives that start and end at the corners of grid cells. The planner then shifts motion primitive trajectories by 0.5resolution in each direction to move their start/end points to the centers of the grid cells.)

    \r\n

    The rest of motion primitives are constructed as a result of symmetrical rotation of one of the base primitives around the origin by a certain angle which is a multiple of the base turning angle (δ). The disposition of the end pose relative to the origin determines the shape, the length and the turning angle of the primitive. By specifying appropriate end pose and base turning angle, we can control the kinematic feasibility of motion primitives.

    \r\n

    In each set, the forward and backward primitives have fixed orientation and are represented by simple straight line segments. The two turn in place primitives have (x,y) coordinates of the end pose equal to (x,y) coordinates of the start pose, and simply demonstrate change in the orientation. The two forward-turn-arc primitives have ending orientations symmetrical with respect to the forward primitive: θ1,2 = φ ± δ. Due to the requirement to reach exactly the given end pose (x,y,θ), each forward-turn-arc primitive is constructed as combination of two movements: a forward straight line segment followed by an arc of a circle. Figure 2 illustrates the base set of motion primitives for turning angle φ = 0. Figure 3 displays the full set of motion primitives generated by the genmprim_unicycle.m matlab script.

    \r\n

    The matlab scripts records information about all generated motion primitives into a file specified by outfilename. First it writes data related to all motion primitives:

    \r\n
    \r\n\t
    \r\n\t\t(a)
    \r\n\t
    \r\n\t\tresolution_m - cell size of the (x,y) grid in meters.
    \r\n\t
    \r\n\t\t(b)
    \r\n\t
    \r\n\t\tnumberofangles - number of discrete angles per circle.
    \r\n\t
    \r\n\t\t(c)
    \r\n\t
    \r\n\t\ttotalnumberofprimitives - total number of generated motion primitives.
    \r\n
    \r\n\r\n

    Then in a loop, the scripts outputs information applicable to each individual motion primitive:

    \r\n
    \r\n\t
    \r\n\t\t(a)
    \r\n\t
    \r\n\t\tprimID - unique identifier of the motion primitive.
    \r\n\t
    \r\n\t\t(b)
    \r\n\t
    \r\n\t\tstartangle_c - starting orientation of the motion primitive (θ).
    \r\n\t
    \r\n\t\t(c)
    \r\n\t
    \r\n\t\tendpose_c - end pose of the motion primitive (x,y,θ).
    \r\n\t
    \r\n\t\t(d)
    \r\n\t
    \r\n\t\tadditionalactioncostmult - cost multiplier of the motion primitive.
    \r\n\t
    \r\n\t\t(e)
    \r\n\t
    \r\n\t\tintermediateposes - number of generated poses for the motion primitive.
    \r\n\t
    \r\n\t\t(f)
    \r\n\t
    \r\n\t\t- list of actual intermediate poses generated for the motion primitive (x,y,θ). Notice that these poses are calculated with respect to the origin (0, 0), not the center of the grid cells.
    \r\n
    \r\n\r\n

     

    \r\n
    \r\n
    \r\n\t\r\n\t

    \"PIC\"

    \r\n\t
    \r\n\t\tFigure 2: Base set of motion primitives for turning angle φ = 0. Here 0 denotes forward and backward straight motion primitives, 1 denotes the counterclockwise forward-turn-arc motion primitive with the ending orientation θ1 = φ + δ = 22.5, and 1 denotes the clockwise forward-turn-arc motion primitive with the ending orientation θ2 = φ δ = 22.5.
    \r\n\t\r\n\t

     

    \r\n
    \r\n
    \r\n\r\n

     

    \r\n
    \r\n
    \r\n\t\r\n\t

    \"PIC\"

    \r\n\t
    \r\n\t\tFigure 3: Full set of motion primitives generated by the genmprim_unicycle.m matlab script for turning angles φ = where k = 0,, 15.
    \r\n\t\r\n\t

     

    \r\n
    \r\n
    \r\n

    \r\n\t3 A forward-turn-arc motion primitive

    \r\n\r\n

    In the following sections we describe how to build a single forward-turn-arc motion primitive. The trajectory of this motion primitive must satisfy the following requirements:

    \r\n

     

    \r\n
    \r\n\t
    \r\n\t\t(a)
    \r\n\t
    \r\n\t\tThe robot moves from the start pose (x0,y00) to the end (goal) pose (xg,ygg) of the primitive with fixed rotational (ω) and translational (v) velocities.
    \r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\t(b)
    \r\n\t
    \r\n\t\tThe robots travels from the start pose to the goal pose during the time interval 0 t 1. For any arbitrary time interval \"˜t\" 0 \"˜t\" \"˜t\" g this can be achieved using the following parameter transformation: t = \"˜t−˜t-Δ-0\", v = \"vΔ˜\", ω = \"Δ˜ω\", Δ = \"˜t\" g \"˜t\" 0.
    \r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\t(c)
    \r\n\t
    \r\n\t\tThe trajectory of the primitive is a combination of the segment of the straight line for (0 t tl) followed by the arc of the circle of radius r for (tl t 1). The radius of the arc r represents the robot’s turning radius. Let l denote the length of the straight line segment and (xl,yll) denote the start pose of the arc. Therefore, l = s(tl),xl = x(tl),yl = y(tl)l = θ(tl) = θ0.
    \r\n
    \r\n\r\n

    To build a motion primitive, we need to determine values of l,r,v,ω and tl.

    \r\n

    The length of the path, traveled by the robot at any given time, is s(t) = vt. Specifically for t = tl, l = vtl.

    \r\n

    When following the arc, the robot’s turning angle at any given time is Δθ(t) = θ(t) θ0 = ω(t tl) and the length of the arc is sarc(t) = rΔθ(t) = (t tl). From the latter, r = \"sarc(t)\"1-ω\" = \"v-ω\".

    \r\n

    Figure 4 displays the sample forward-turn-arc motion primitive trajectory.

    \r\n

     

    \r\n
    \r\n
    \r\n\t\r\n\t

    \"PIC\"

    \r\n\t
    \r\n\t\tFigure 4: The sample forward-turn-arc motion primitive with x0 = 0, y0 = 0, θ0 = 0, xg = 15, yg = 5, θg = 0.93.
    \r\n\t\r\n\t

     

    \r\n
    \r\n
    \r\n

    \r\n\t4 Straight Line Segment Of The Motion Primitive

    \r\n\r\n

    Consider the case of when the robot follows the straight line segment of the motion primitive with the fixed velocity v and the fixed heading θ0. As shown on Figure 5, this behavior can be described by the following equations:

    \r\n
    \r\n\t
    \r\n\t\t\"x(t)
    \r\n
    \r\n

    Substituting t = tl and l = vtl into (2), we get equations for the last pose of the straight line segment:

    \r\n
    \r\n\t
    \r\n\t\t\"x
    \r\n
    \r\n
    \r\n
    \r\n\t\r\n\t

    \"PIC\"

    \r\n\t
    \r\n\t\tFigure 5: Straight line segment of the motion primitive.
    \r\n\t\r\n\t

     

    \r\n
    \r\n
    \r\n

    \r\n\t5 Arc Segment Of The Motion Primitive

    \r\n\r\n

    Now consider the case of when the robot follows the arc of the circle with the fixed velocity v and the fixed rotational velocity ω. Derivatives \"ddxt\" and \"ddyt\" give us components of the robot’s velocity vx (in the direction of the x-axis) and vy (in the direction of the y-axis), correspondingly. As shown on Figure 6, we have the following system of three differential equations:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"dx-dt
    \r\n\t\t\t
    \r\n\t\t\t\t(4)
    \r\n\r\n

    \r\n

     

    \r\n
    \r\n
    \r\n\t\r\n\t

    \"PIC\"

    \r\n\t
    \r\n\t\tFigure 6: Robot’s velocity components.
    \r\n\t\r\n\t

     

    \r\n
    \r\n
    \r\n\r\n

    Integrating the last equation of  (4), we receive:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"
    \r\n\t\t\t
    \r\n\t\t\t\t(5)
    \r\n\r\n

    \r\n

    Substituting  (5) into  (4) gives us:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"dx-dt
    \r\n\t\t\t
    \r\n\t\t\t\t(6)
    \r\n\r\n

    \r\n

    Integrating  (6), we receive:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"
    \r\n\t\t\t
    \r\n\t\t\t\t(7)
    \r\n\r\n

    \r\n

    From  (7),  (3) and using r = \"v-ω\", we get:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"x(t)
    \r\n\t\t\t
    \r\n\t\t\t\t(8)
    \r\n\r\n

    \r\n

    Substituting t = tg = 1 into  (8), we have:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"xg
    \r\n\t\t\t
    \r\n\t\t\t\t(9)
    \r\n\r\n

    \r\n

    The  (9) is a system of two linear equation involving variables l and r. It can be expressed in the matrix form:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"B
    \r\n\t\t\t
    \r\n\t\t\t\t(10)
    \r\n\r\n

    \r\n

    The system  (10) has a unique solution:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"
    \r\n\t\t\t
    \r\n\t\t\t\t(11)
    \r\n\r\n

    \r\n

    By definition, ω = \"θg−-θ0-1−tl\". Using tl = \"lv\" and r = \"v-ω\", we finally get:

    \r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\"
    \r\n\t\t\t
    \r\n\t\t\t\t(12)
    \r\n\r\n

     

    \r\n

    \r\n\t6 Motion Primitive Calculation

    \r\n\r\n

    In the previous sections we derived formulas for all initially unknown motion parameters. Specifically using  (11), we can find the length of the straight line segment (l) and the turning radius (r). From (12) we can determine both the rotational (ω) and the translational (v) velocities. Finally, using tl = \"lv\" we can calculate the time, corresponding to the end of the straight line segment.

    \r\n

    The next step is to build the motion primitive trajectory. As defined earlier in this tutorial, the numofsamples is the given number of discrete poses required on the motion primitive trajectory. Let Δt be a time step between sequential discrete poses of the trajectory. Hence Δt = \"-----1------numofsamples−. To build the motion primitive trajectory, we iterate over t = iΔt, where 0 i numofsamples-1 and use an appropriate formula to calculate each discrete pose. Specifically for t tl, we use  (2) to construct the straight line segment of the motion primitive, then for tl t 1, use  (8) to construct the arc portion of the motion primitive.

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0053-forward-arc-motion-primitives.md b/static/archive/legacy-drupal/content/pages/0053-forward-arc-motion-primitives.md new file mode 100644 index 0000000..d60de46 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0053-forward-arc-motion-primitives.md @@ -0,0 +1,271 @@ +# Forward Arc Motion Primitives + +## SBPL Forward-Turn-Arc Motion Primitive Generation + + (Margarita Safonova) + +SBPL Lattice Planner generates a path from start to goal by combining a series of pre-defined motion primitives. SBPL provides several matlab scripts that can be used to build motion primitives for different types of vehicles. For example, the matlab script named genmprim_unicycle.m constructs forward, backward, turn-in-place, and forward-turn-arc motion primitives for a unicycle robot in the 3D state space (x,y,θ). In this tutorial we describe how the genmprim_unicycle.m script calculates the forward-turn-arc motion primitive given the start and the end poses. + +### **1 Introduction** + +The task of the SBPL Lattice Planner is to generate a smooth kinematically feasible trajectory or path, that a robot can safely follow to reach its goal pose. This trajectory is represented as a series of connected states in a lattice-based graph constructed using motion primitives and efficient search algorithms. A lattice-based graph is a graph constructed using short motion primitives as edges that end up at the center of cells. Motion primitives are short, kinematically feasible motions which form the basis of movements that can be performed by the robot platform. + +Figure 1 shows the base set of motion primitives used by the planner (left), the lattice-based graph construction process (middle), and the final generated path (right). Each state is represented in the 3D space by a pose with two-dimensional coordinates (x,y) and orientation θ. + +--- + +![PIC](../../media/images/PathGen.jpg) + + Figure 1: Lattice-based graph representation for 3D(x,y,θ) planning. + +--- + +The genmprim_unicycle.m matlab script constructs a set of motion primitives that enable a robot to move straight forward, straight backward, turn in place by a certain angle and move forward and turn by a certain angle. The script generates primitives for a discrete set of turning angles φ, varying from 0 to 2π radians. The set of primitives generated for each turning angle φ can include two forward primitives (short and long), one backward primitive (short), two turn in place primitives (clockwise and counterclockwise) and two forward-turn-arc primitives (clockwise and counterclockwise). All motion primitives share the same starting point (x = 0, y = 0), but have different starting orientations. Motion primitives within the same set have the same starting orientation (θ = φ) equal to the turning angle of the set. Each individual motion primitive is defined by its type, its start pose, its end pose and contains a dense sequence of poses forming a trajectory in the 3D space (x,y,θ). The matlab script writes all generated primitive trajectories into a file. This file is later used by the SBPL Lattice Planner to generate trajectories. + +### **2 Matlab Script Description** + +The matlab script uses several configurable parameters: + + (a) outfilename - name of the file (usually with extention .mprim) where generated set of motion primitives is saved. This parameter is required and must be passed to the script as an argument. (b) resolution - cell size of the (x,y) grid in meters (0.1 by default). (c) numberofangles - number of discrete angles per circle (16 by default). This number preferably should be a power of 2 and definitely should be multiple of 8. This parameter determines the base turning angle calculated as δ = ![numbe2roπfangles](../../media/images/LatextDoc10x.png) and the set of turning angles as φ = kδ, where 0 ≤ k ≤ numberofangles−1. (d) numberofprimsperangle - number of primitives per set (5 by default). By default turn in place primitives are not generated. To add them set this parameter to 7. (e) numofsamples - number of discrete points on each primitive trajectory (10 by default). + +The turning angle of the motion primitive set (φ) and the base turning angle (δ) together define the orientation (θ) of the end pose for each motion primitive in the set: + + + + + + + + +
    +
    + θ = φ + nδ,    where     n ∈ { − 1,0,1}
    +
    + (1)
    + +The script defines a set of end poses for a subset of starting angles in the first quadrant. These form the basis for all motion primitives that are generated for a discrete set of angles. + + (a) basemprimendpts0_c - the array of end poses for the starting angle φ = 0∘. (b) basemprimendpts45_c - the array of end poses for the starting angle φ = 45∘. (c) basemprimendpts22p5_c - the array of end poses for the starting angle φ = 22.5∘. + +In the script, each of these arrays of end poses is defined as an array of four-dimensional vectors (i,j,n,costmultiplier), where i and j specify x and y coordinates of the end pose in grid units (x = i∗resolution, y = j∗resolution), n determines the orientation of the end pose (see (1)) and costmultiplier is a cost multiplier value used by the SBPL Lattice Planner to penalize certain types of motion primitives. + +It is important for each motion primitive to start and end exactly in the center of a grid cell to avoid having discontinuities in the path generated by the lattice planner. (As an implementation detail, the matlab script actually generates primitives that start and end at the corners of grid cells. The planner then shifts motion primitive trajectories by 0.5∗resolution in each direction to move their start/end points to the centers of the grid cells.) + +The rest of motion primitives are constructed as a result of symmetrical rotation of one of the base primitives around the origin by a certain angle which is a multiple of the base turning angle (δ). The disposition of the end pose relative to the origin determines the shape, the length and the turning angle of the primitive. By specifying appropriate end pose and base turning angle, we can control the kinematic feasibility of motion primitives. + +In each set, the forward and backward primitives have fixed orientation and are represented by simple straight line segments. The two turn in place primitives have (x,y) coordinates of the end pose equal to (x,y) coordinates of the start pose, and simply demonstrate change in the orientation. The two forward-turn-arc primitives have ending orientations symmetrical with respect to the forward primitive: θ1,2 = φ ± δ. Due to the requirement to reach exactly the given end pose (x,y,θ), each forward-turn-arc primitive is constructed as combination of two movements: a forward straight line segment followed by an arc of a circle. Figure 2 illustrates the base set of motion primitives for turning angle φ = 0∘. Figure 3 displays the full set of motion primitives generated by the genmprim_unicycle.m matlab script. + +The matlab scripts records information about all generated motion primitives into a file specified by outfilename. First it writes data related to all motion primitives: + + (a) resolution_m - cell size of the (x,y) grid in meters. (b) numberofangles - number of discrete angles per circle. (c) totalnumberofprimitives - total number of generated motion primitives. + +Then in a loop, the scripts outputs information applicable to each individual motion primitive: + + (a) primID - unique identifier of the motion primitive. (b) startangle_c - starting orientation of the motion primitive (θ). (c) endpose_c - end pose of the motion primitive (x,y,θ). (d) additionalactioncostmult - cost multiplier of the motion primitive. (e) intermediateposes - number of generated poses for the motion primitive. (f) - list of actual intermediate poses generated for the motion primitive (x,y,θ). Notice that these poses are calculated with respect to the origin (0, 0), not the center of the grid cells. + +--- + +![PIC](../../media/images/BasePrim.jpg) + + Figure 2: Base set of motion primitives for turning angle φ = 0∘. Here 0 denotes forward and backward straight motion primitives, 1 denotes the counterclockwise forward-turn-arc motion primitive with the ending orientation θ1 = φ + δ = 22.5∘, and −1 denotes the clockwise forward-turn-arc motion primitive with the ending orientation θ2 = φ − δ = −22.5∘. + +--- + +--- + +![PIC](../../media/images/MotionPrimitives.jpg) + + Figure 3: Full set of motion primitives generated by the genmprim_unicycle.m matlab script for turning angles φ = kδ where k = 0,…, 15. + +--- + +### **3 A forward-turn-arc motion primitive** + +In the following sections we describe how to build a single forward-turn-arc motion primitive. The trajectory of this motion primitive must satisfy the following requirements: + + (a) The robot moves from the start pose (x0,y0,θ0) to the end (goal) pose (xg,yg,θg) of the primitive with fixed rotational (ω) and translational (v) velocities. (b) The robots travels from the start pose to the goal pose during the time interval 0 ≤ t ≤ 1. For any arbitrary time interval ![˜t](../../media/images/LatextDoc12x.png) 0 ≤![˜t](../../media/images/LatextDoc13x.png) ≤![˜t](../../media/images/LatextDoc14x.png) g this can be achieved using the following parameter transformation: t = ![˜t−˜t-Δ-0](../../media/images/LatextDoc15x.png), v = ![vΔ˜](../../media/images/LatextDoc16x.png), ω = ![Δ˜ω](../../media/images/LatextDoc17x.png), Δ = ![˜t](../../media/images/LatextDoc18x.png) g −![˜t](../../media/images/LatextDoc19x.png) 0. (c) The trajectory of the primitive is a combination of the segment of the straight line for (0 ≤ t ≤ tl) followed by the arc of the circle of radius r for (tl ≤ t ≤ 1). The radius of the arc r represents the robot’s turning radius. Let l denote the length of the straight line segment and (xl,yl,θl) denote the start pose of the arc. Therefore, l = s(tl),xl = x(tl),yl = y(tl),θl = θ(tl) = θ0. + +To build a motion primitive, we need to determine values of l,r,v,ω and tl. + +The length of the path, traveled by the robot at any given time, is s(t) = vt. Specifically for t = tl, l = vtl. + +When following the arc, the robot’s turning angle at any given time is Δθ(t) = θ(t) − θ0 = ω(t − tl) and the length of the arc is sarc(t) = rΔθ(t) = rω(t − tl). From the latter, r = ![sarc(t) t−tl](../../media/images/LatextDoc110x.png)![1-ω](../../media/images/LatextDoc111x.png) = ![v-ω](../../media/images/LatextDoc112x.png). + +Figure 4 displays the sample forward-turn-arc motion primitive trajectory. + +--- + +![PIC](../../media/images/fig1.jpg) + + Figure 4: The sample forward-turn-arc motion primitive with x0 = 0, y0 = 0, θ0 = 0, xg = 15, yg = 5, θg = 0.93. + +--- + +### **4 Straight Line Segment Of The Motion Primitive** + +Consider the case of when the robot follows the straight line segment of the motion primitive with the fixed velocity v and the fixed heading θ0. As shown on Figure 5, this behavior can be described by the following equations: + + ![x(t) = x0 + vtcos(θ0)y(t) = y0 + vtsin (θ0), where 0 ≤ t ≤ tl (2)θ(t) = θ . 0](../../media/images/LatextDoc113x.png) + +Substituting t = tl and l = vtl into (2), we get equations for the last pose of the straight line segment: + + ![x = x + lcos(θ ) l 0 0yl = y0 + lsin(θ0) (3)θl = θ0.](../../media/images/LatextDoc114x.png) + +--- + +![PIC](../../media/images/fig2.jpg) + + Figure 5: Straight line segment of the motion primitive. + +--- + +### **5 Arc Segment Of The Motion Primitive** + +Now consider the case of when the robot follows the arc of the circle with the fixed velocity v and the fixed rotational velocity ω. Derivatives ![ddxt](../../media/images/LatextDoc115x.png) and ![ddyt](../../media/images/LatextDoc116x.png) give us components of the robot’s velocity vx (in the direction of the x-axis) and vy (in the direction of the y-axis), correspondingly. As shown on Figure 6, we have the following system of three differential equations: + + + + + + + + +
    +
    + dx-dt = v cos(θ(t))dy---= v sin(θ(t)),    where     tl ≤ t ≤ 1ddtθ---= ω.dt
    +
    + (4)
    + +--- + +![PIC](../../media/images/fig3.jpg) + + Figure 6: Robot’s velocity components. + +--- + +Integrating the last equation of (4), we receive: + + + + + + + + +
    +
    +       ∫ tθ(t) =    ωdt + θ(tl) = ω(t− tl) + θ0,    where    tl ≤ t ≤ 1.       tl
    +
    + (5)
    + +Substituting (5) into (4) gives us: + + + + + + + + +
    +
    + dx-dt = vcos(ω(t− tl) + θ0)dy---=  vsin (ω (t− tl) + θ0),    where     tl ≤ t ≤ 1. dt
    +
    + (6)
    + +Integrating (6), we receive: + + + + + + + + +
    +
    +       ∫x(t) =  tv cos(ω (t− t) + θ)dt + x(t)       tl            l    0       l      ∫ ty(t) =   v sin(ω (t − tl)+ θ0)dt+ y (tl),    where    tl ≤ t ≤ 1.       tl
    +
    + (7)
    + +From (7), (3) and using r = ![v-ω](../../media/images/LatextDoc121x.png), we get: + + + + + + + + +
    +
    + x(t) = x0 + lcos(θ0)+ r sin(ω (t − tl)+ θ0)−  rsin(θ0)y(t) = y0 + lsin(θ0)− rcos(ω(t− tl)+ θ0)+ r cos(θ0), where  tl ≤ t ≤ 1.
    +
    + (8)
    + +Substituting t = tg = 1 into (8), we have: + + + + + + + + +
    +
    + xg − x0 = lcos(θ0)+ r(sin(θg) − sin(θ0))yg − y0 = lsin(θ0)+ r(cos(θ0) − cos(θg)).
    +
    + (9)
    + +The (9) is a system of two linear equation involving variables l and r. It can be expressed in the matrix form: + + + + + + + + +
    +
    + B = AX,    where    |                   |        |      |        ||A = ||cosθ0  sin θg − sinθ0|| , B = ||xg − x0||,  X =  ||l||.    |sin θ0  cosθ0 − cos θg|       |yg − y0|       |r|
    +
    + (10)
    + +The system (10) has a unique solution: + + + + + + + + +
    +
    +        −1X  = A   B,   where  l = X (1 ),  r = X (2).
    +
    + (11)
    + +By definition, ω = ![θg−-θ0-1−tl](../../media/images/LatextDoc126x.png). Using tl = ![lv](../../media/images/LatextDoc127x.png) and r = ![v-ω](../../media/images/LatextDoc128x.png), we finally get: + + + + + + + + +
    +
    +              -lω = θg − θ0 + r    and    v = rω.
    +
    + (12)
    + +### **6 Motion Primitive Calculation** + +In the previous sections we derived formulas for all initially unknown motion parameters. Specifically using (11), we can find the length of the straight line segment (l) and the turning radius (r). From (12) we can determine both the rotational (ω) and the translational (v) velocities. Finally, using tl = ![lv](../../media/images/LatextDoc130x.png) we can calculate the time, corresponding to the end of the straight line segment. + +The next step is to build the motion primitive trajectory. As defined earlier in this tutorial, the numofsamples is the given number of discrete poses required on the motion primitive trajectory. Let Δt be a time step between sequential discrete poses of the trajectory. Hence Δt = ![-----1------numofsamples− 1](../../media/images/LatextDoc131x.png). To build the motion primitive trajectory, we iterate over t = iΔt, where 0 ≤ i ≤ numofsamples-1 and use an appropriate formula to calculate each discrete pose. Specifically for t ≤ tl, we use (2) to construct the straight line segment of the motion primitive, then for tl ≤ t ≤ 1, use (8) to construct the arc portion of the motion primitive. diff --git a/static/archive/legacy-drupal/content/pages/0054-building-installing-and-using-sbpl.html b/static/archive/legacy-drupal/content/pages/0054-building-installing-and-using-sbpl.html new file mode 100644 index 0000000..a8c863a --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0054-building-installing-and-using-sbpl.html @@ -0,0 +1,74 @@ + +Building, Installing, and Using SBPL + +

    Building, Installing, and Using SBPL

    +

    + Building, Installing, and Using SBPL

    +

    SBPL is available as a standalone software library. SBPL itself has no dependencies other than the C/C++ standard library.

    +

    These build and install instructions are primarily for Linux. For other operating systems, CMake can generate the platform-specific build and project files necessary for building SBPL.

    +

    Versions of ROS older than Fuerte may contain packages that depend on a ROS package version of SBPL. The recommended method to install SBPL is to install it as a standard system library. However, if you wish to use the old ROS package version of SBPL, you may follow these instructions.

    +

    + 1. Building and Installing SBPL from source

    +

    + 1.1 Build SBPL

    +

    SBPL uses git as its version control system. From the directory where you want the SBPL source to reside, clone the latest source from https://github.com/sbpl/sbpl:

    +
    +git clone https://github.com/sbpl/sbpl.git
    +

    In the source directory, build the SBPL library using standard CMake build conventions:

    +
    +mkdir build
    +cd build
    +cmake ..
    +make
    +
    +

    + 1.2 Install SBPL

    +

    Install the built library and headers onto your local system (usually into /usr/local):

    +
    +sudo make install
    +

    + 2. Installing SBPL from pre-built binary package

    +

    A pre-built Debian package exists on Linux for ROS distributions Fuerte and newer. To install the Debian, run:

    +
    +sudo apt-get install ros-distro-sbpl
    +

    where distro is the name of your ROS distribution. This will install the SBPL library and associated development headers alongside other ROS components (in /opt/ros/distro on Ubuntu distributions). A pkg-config file is also included to allow you to locate the SBPL library components in your build system.

    +

    + 3. Build your (ROS) package with SBPL as a dependency (CMake)

    +

    In the CMakeLists.txt for your (ROS) package, the following lines are needed to find the installed SBPL files:

    +
    +find_package(PkgConfig REQUIRED)
    +pkg_check_modules(SBPL REQUIRED sbpl)
    +include_directories(${SBPL_INCLUDE_DIRS})
    +link_directories(${SBPL_LIBRARY_DIRS})
    +
    +

    Then, after you've declared your binaries, you need to link them against SBPL with the following line:

    +
    +target_link_libraries(your-binary-here ${SBPL_LIBRARIES})
    +

    + 4. Installing and Using SBPL as a ROS package

    +

    The ROS package version of SBPL was deprecated with the release of ROS Fuerte. However, packages in ROS Electric may still require the ROS package version of SBPL. 

    +

    + 4.1 Install SBPL

    +

    + 4.1.1 Source install

    +

    SBPL uses git as its version control system. From the directory where you want the SBPL source to reside, clone the latest source from https://github.com/sbpl/sbpl:

    +
    +git clone https://github.com/sbpl/sbpl.git
    +

    In the source directory, checkout the electric branch of the repository to revert to the old ROS package version:

    +
    +git checkout electric
    +

    Ensure that SBPL is on your ROS_PACKAGE_PATH and type:

    +
    +rosmake sbpl
    +

    + 4.1.2 Binary install

    +

    SBPL is also available as a pre-built Debian in ROS Electric. To instal the Debian, run:

    +
    +sudo apt-get install ros-electric-arm-navigation
    +

    + 4.2 Build your ROS package with SBPL as a depency (rosbuild)

    +

    In the manifest.xml for your package, you need to add the following line to declare the SBPL package as a dependency:

    +
    +<depend package="sbpl"/>
    + + diff --git a/static/archive/legacy-drupal/content/pages/0054-building-installing-and-using-sbpl.json b/static/archive/legacy-drupal/content/pages/0054-building-installing-and-using-sbpl.json new file mode 100644 index 0000000..fcf608e --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0054-building-installing-and-using-sbpl.json @@ -0,0 +1,25 @@ +{ + "nid": 54, + "vid": 54, + "type": "page", + "language": "und", + "title": "Building, Installing, and Using SBPL", + "slug": "building-installing-and-using-sbpl", + "uid": 36, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1378234875, + "changed": 1382358322, + "url_aliases": [], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    \r\n\tBuilding, Installing, and Using SBPL

    \r\n

    SBPL is available as a standalone software library. SBPL itself has no dependencies other than the C/C++ standard library.

    \r\n

    These build and install instructions are primarily for Linux. For other operating systems, CMake can generate the platform-specific build and project files necessary for building SBPL.

    \r\n

    Versions of ROS older than Fuerte may contain packages that depend on a ROS package version of SBPL. The recommended method to install SBPL is to install it as a standard system library. However, if you wish to use the old ROS package version of SBPL, you may follow these instructions.

    \r\n

    \r\n\t1. Building and Installing SBPL from source

    \r\n

    \r\n\t1.1 Build SBPL

    \r\n

    SBPL uses git as its version control system. From the directory where you want the SBPL source to reside, clone the latest source from https://github.com/sbpl/sbpl:

    \r\n
    \r\ngit clone https://github.com/sbpl/sbpl.git
    \r\n

    In the source directory, build the SBPL library using standard CMake build conventions:

    \r\n
    \r\nmkdir build\r\ncd build\r\ncmake ..\r\nmake\r\n
    \r\n

    \r\n\t1.2 Install SBPL

    \r\n

    Install the built library and headers onto your local system (usually into /usr/local):

    \r\n
    \r\nsudo make install
    \r\n

    \r\n\t2. Installing SBPL from pre-built binary package

    \r\n

    A pre-built Debian package exists on Linux for ROS distributions Fuerte and newer. To install the Debian, run:

    \r\n
    \r\nsudo apt-get install ros-distro-sbpl
    \r\n

    where distro is the name of your ROS distribution. This will install the SBPL library and associated development headers alongside other ROS components (in /opt/ros/distro on Ubuntu distributions). A pkg-config file is also included to allow you to locate the SBPL library components in your build system.

    \r\n

    \r\n\t3. Build your (ROS) package with SBPL as a dependency (CMake)

    \r\n

    In the CMakeLists.txt for your (ROS) package, the following lines are needed to find the installed SBPL files:

    \r\n
    \r\nfind_package(PkgConfig REQUIRED)\r\npkg_check_modules(SBPL REQUIRED sbpl)\r\ninclude_directories(${SBPL_INCLUDE_DIRS})\r\nlink_directories(${SBPL_LIBRARY_DIRS})\r\n
    \r\n

    Then, after you've declared your binaries, you need to link them against SBPL with the following line:

    \r\n
    \r\ntarget_link_libraries(your-binary-here ${SBPL_LIBRARIES})
    \r\n

    \r\n\t4. Installing and Using SBPL as a ROS package

    \r\n

    The ROS package version of SBPL was deprecated with the release of ROS Fuerte. However, packages in ROS Electric may still require the ROS package version of SBPL. 

    \r\n

    \r\n\t4.1 Install SBPL

    \r\n

    \r\n\t4.1.1 Source install

    \r\n

    SBPL uses git as its version control system. From the directory where you want the SBPL source to reside, clone the latest source from https://github.com/sbpl/sbpl:

    \r\n
    \r\ngit clone https://github.com/sbpl/sbpl.git
    \r\n

    In the source directory, checkout the electric branch of the repository to revert to the old ROS package version:

    \r\n
    \r\ngit checkout electric
    \r\n

    Ensure that SBPL is on your ROS_PACKAGE_PATH and type:

    \r\n
    \r\nrosmake sbpl
    \r\n

    \r\n\t4.1.2 Binary install

    \r\n

    SBPL is also available as a pre-built Debian in ROS Electric. To instal the Debian, run:

    \r\n
    \r\nsudo apt-get install ros-electric-arm-navigation
    \r\n

    \r\n\t4.2 Build your ROS package with SBPL as a depency (rosbuild)

    \r\n

    In the manifest.xml for your package, you need to add the following line to declare the SBPL package as a dependency:

    \r\n
    \r\n<depend package="sbpl"/>
    \r\n", + "body_markdown": "# **Building, Installing, and Using SBPL**\n\nSBPL is available as a standalone software library. SBPL itself has no dependencies other than the C/C++ standard library.\n\nThese build and install instructions are primarily for Linux. For other operating systems, CMake can generate the platform-specific build and project files necessary for building SBPL.\n\nVersions of ROS older than Fuerte may contain packages that depend on a ROS package version of SBPL. The recommended method to install SBPL is to install it as a standard system library. However, if you wish to use the old ROS package version of SBPL, you may follow[ these instructions](#ROS Package Instructions).\n\n## **1. Building and Installing SBPL from source**\n\n### **1.1 Build SBPL**\n\nSBPL uses git as its version control system. From the directory where you want the SBPL source to reside, clone the latest source from https://github.com/sbpl/sbpl:\n\n```\n\r\ngit clone https://github.com/sbpl/sbpl.git\n```\n\nIn the source directory, build the SBPL library using standard CMake build conventions:\n\n```\n\r\nmkdir build\r\ncd build\r\ncmake ..\r\nmake\r\n\n```\n\n### **1.2 Install SBPL**\n\nInstall the built library and headers onto your local system (usually into /usr/local):\n\n```\n\r\nsudo make install\n```\n\n## **2. Installing SBPL from pre-built binary package**\n\nA pre-built Debian package exists on Linux for ROS distributions Fuerte and newer. To install the Debian, run:\n\n```\n\r\nsudo apt-get install ros-*distro*-sbpl\n```\n\nwhere *distro* is the name of your ROS distribution. This will install the SBPL library and associated development headers alongside other ROS components (in /opt/ros/*distro* on Ubuntu distributions). A pkg-config file is also included to allow you to locate the SBPL library components in your build system.\n\n## **3. Build your (ROS) package with SBPL as a dependency (CMake)**\n\nIn the CMakeLists.txt for your (ROS) package, the following lines are needed to find the installed SBPL files:\n\n```\n\r\nfind_package(PkgConfig REQUIRED)\r\npkg_check_modules(SBPL REQUIRED sbpl)\r\ninclude_directories(${SBPL_INCLUDE_DIRS})\r\nlink_directories(${SBPL_LIBRARY_DIRS})\r\n\n```\n\nThen, after you've declared your binaries, you need to link them against SBPL with the following line:\n\n```\n\r\ntarget_link_libraries(*your-binary-here* ${SBPL_LIBRARIES})\n```\n\n## **[]()4. Installing and Using SBPL as a ROS package**\n\nThe ROS package version of SBPL was deprecated with the release of ROS Fuerte. However, packages in ROS Electric may still require the ROS package version of SBPL.\n\n### **4.1 Install SBPL**\n\n#### **4.1.1 Source install**\n\nSBPL uses git as its version control system. From the directory where you want the SBPL source to reside, clone the latest source from https://github.com/sbpl/sbpl:\n\n```\n\r\ngit clone https://github.com/sbpl/sbpl.git\n```\n\nIn the source directory, checkout the *electric* branch of the repository to revert to the old ROS package version:\n\n```\n\r\ngit checkout electric\n```\n\nEnsure that SBPL is on your ROS_PACKAGE_PATH and type:\n\n```\n\r\nrosmake sbpl\n```\n\n#### **4.1.2 Binary install**\n\nSBPL is also available as a pre-built Debian in ROS Electric. To instal the Debian, run:\n\n```\n\r\nsudo apt-get install ros-electric-arm-navigation\n```\n\n### **4.2 Build your ROS package with SBPL as a depency (rosbuild)**\n\nIn the manifest.xml for your package, you need to add the following line to declare the SBPL package as a dependency:\n\n```\n\r\n\n```\n", + "body_html_raw": "

    \r\n\tBuilding, Installing, and Using SBPL

    \r\n

    SBPL is available as a standalone software library. SBPL itself has no dependencies other than the C/C++ standard library.

    \r\n

    These build and install instructions are primarily for Linux. For other operating systems, CMake can generate the platform-specific build and project files necessary for building SBPL.

    \r\n

    Versions of ROS older than Fuerte may contain packages that depend on a ROS package version of SBPL. The recommended method to install SBPL is to install it as a standard system library. However, if you wish to use the old ROS package version of SBPL, you may follow these instructions.

    \r\n

    \r\n\t1. Building and Installing SBPL from source

    \r\n

    \r\n\t1.1 Build SBPL

    \r\n

    SBPL uses git as its version control system. From the directory where you want the SBPL source to reside, clone the latest source from https://github.com/sbpl/sbpl:

    \r\n
    \r\ngit clone https://github.com/sbpl/sbpl.git
    \r\n

    In the source directory, build the SBPL library using standard CMake build conventions:

    \r\n
    \r\nmkdir build\r\ncd build\r\ncmake ..\r\nmake\r\n
    \r\n

    \r\n\t1.2 Install SBPL

    \r\n

    Install the built library and headers onto your local system (usually into /usr/local):

    \r\n
    \r\nsudo make install
    \r\n

    \r\n\t2. Installing SBPL from pre-built binary package

    \r\n

    A pre-built Debian package exists on Linux for ROS distributions Fuerte and newer. To install the Debian, run:

    \r\n
    \r\nsudo apt-get install ros-distro-sbpl
    \r\n

    where distro is the name of your ROS distribution. This will install the SBPL library and associated development headers alongside other ROS components (in /opt/ros/distro on Ubuntu distributions). A pkg-config file is also included to allow you to locate the SBPL library components in your build system.

    \r\n

    \r\n\t3. Build your (ROS) package with SBPL as a dependency (CMake)

    \r\n

    In the CMakeLists.txt for your (ROS) package, the following lines are needed to find the installed SBPL files:

    \r\n
    \r\nfind_package(PkgConfig REQUIRED)\r\npkg_check_modules(SBPL REQUIRED sbpl)\r\ninclude_directories(${SBPL_INCLUDE_DIRS})\r\nlink_directories(${SBPL_LIBRARY_DIRS})\r\n
    \r\n

    Then, after you've declared your binaries, you need to link them against SBPL with the following line:

    \r\n
    \r\ntarget_link_libraries(your-binary-here ${SBPL_LIBRARIES})
    \r\n

    \r\n\t4. Installing and Using SBPL as a ROS package

    \r\n

    The ROS package version of SBPL was deprecated with the release of ROS Fuerte. However, packages in ROS Electric may still require the ROS package version of SBPL. 

    \r\n

    \r\n\t4.1 Install SBPL

    \r\n

    \r\n\t4.1.1 Source install

    \r\n

    SBPL uses git as its version control system. From the directory where you want the SBPL source to reside, clone the latest source from https://github.com/sbpl/sbpl:

    \r\n
    \r\ngit clone https://github.com/sbpl/sbpl.git
    \r\n

    In the source directory, checkout the electric branch of the repository to revert to the old ROS package version:

    \r\n
    \r\ngit checkout electric
    \r\n

    Ensure that SBPL is on your ROS_PACKAGE_PATH and type:

    \r\n
    \r\nrosmake sbpl
    \r\n

    \r\n\t4.1.2 Binary install

    \r\n

    SBPL is also available as a pre-built Debian in ROS Electric. To instal the Debian, run:

    \r\n
    \r\nsudo apt-get install ros-electric-arm-navigation
    \r\n

    \r\n\t4.2 Build your ROS package with SBPL as a depency (rosbuild)

    \r\n

    In the manifest.xml for your package, you need to add the following line to declare the SBPL package as a dependency:

    \r\n
    \r\n<depend package="sbpl"/>
    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0054-building-installing-and-using-sbpl.md b/static/archive/legacy-drupal/content/pages/0054-building-installing-and-using-sbpl.md new file mode 100644 index 0000000..8a0733f --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0054-building-installing-and-using-sbpl.md @@ -0,0 +1,118 @@ +# Building, Installing, and Using SBPL + +# **Building, Installing, and Using SBPL** + +SBPL is available as a standalone software library. SBPL itself has no dependencies other than the C/C++ standard library. + +These build and install instructions are primarily for Linux. For other operating systems, CMake can generate the platform-specific build and project files necessary for building SBPL. + +Versions of ROS older than Fuerte may contain packages that depend on a ROS package version of SBPL. The recommended method to install SBPL is to install it as a standard system library. However, if you wish to use the old ROS package version of SBPL, you may follow[ these instructions](#ROS Package Instructions). + +## **1. Building and Installing SBPL from source** + +### **1.1 Build SBPL** + +SBPL uses git as its version control system. From the directory where you want the SBPL source to reside, clone the latest source from https://github.com/sbpl/sbpl: + +``` + +git clone https://github.com/sbpl/sbpl.git +``` + +In the source directory, build the SBPL library using standard CMake build conventions: + +``` + +mkdir build +cd build +cmake .. +make + +``` + +### **1.2 Install SBPL** + +Install the built library and headers onto your local system (usually into /usr/local): + +``` + +sudo make install +``` + +## **2. Installing SBPL from pre-built binary package** + +A pre-built Debian package exists on Linux for ROS distributions Fuerte and newer. To install the Debian, run: + +``` + +sudo apt-get install ros-*distro*-sbpl +``` + +where *distro* is the name of your ROS distribution. This will install the SBPL library and associated development headers alongside other ROS components (in /opt/ros/*distro* on Ubuntu distributions). A pkg-config file is also included to allow you to locate the SBPL library components in your build system. + +## **3. Build your (ROS) package with SBPL as a dependency (CMake)** + +In the CMakeLists.txt for your (ROS) package, the following lines are needed to find the installed SBPL files: + +``` + +find_package(PkgConfig REQUIRED) +pkg_check_modules(SBPL REQUIRED sbpl) +include_directories(${SBPL_INCLUDE_DIRS}) +link_directories(${SBPL_LIBRARY_DIRS}) + +``` + +Then, after you've declared your binaries, you need to link them against SBPL with the following line: + +``` + +target_link_libraries(*your-binary-here* ${SBPL_LIBRARIES}) +``` + +## **[]()4. Installing and Using SBPL as a ROS package** + +The ROS package version of SBPL was deprecated with the release of ROS Fuerte. However, packages in ROS Electric may still require the ROS package version of SBPL. + +### **4.1 Install SBPL** + +#### **4.1.1 Source install** + +SBPL uses git as its version control system. From the directory where you want the SBPL source to reside, clone the latest source from https://github.com/sbpl/sbpl: + +``` + +git clone https://github.com/sbpl/sbpl.git +``` + +In the source directory, checkout the *electric* branch of the repository to revert to the old ROS package version: + +``` + +git checkout electric +``` + +Ensure that SBPL is on your ROS_PACKAGE_PATH and type: + +``` + +rosmake sbpl +``` + +#### **4.1.2 Binary install** + +SBPL is also available as a pre-built Debian in ROS Electric. To instal the Debian, run: + +``` + +sudo apt-get install ros-electric-arm-navigation +``` + +### **4.2 Build your ROS package with SBPL as a depency (rosbuild)** + +In the manifest.xml for your package, you need to add the following line to declare the SBPL package as a dependency: + +``` + + +``` diff --git a/static/archive/legacy-drupal/content/pages/0055-arm-planning.html b/static/archive/legacy-drupal/content/pages/0055-arm-planning.html new file mode 100644 index 0000000..1c7b173 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0055-arm-planning.html @@ -0,0 +1,128 @@ + +Arm Planning + +

    Arm Planning

    +

    + sbpl_arm_planning

    +

    + Repositories

    +
    + ROS Diamondback
    +
    + Arm Navigation
    + +
    +  
    +
    + ROS Electric
    +
    + Arm Navigation
    + +
    +  
    +
    + ROS Fuerte
    +
    + Arm Navigation
    + +
    + (install documentation below)
    +
    + MoveIt! (only compatible with June 2012)
    + +
    +  
    +
    + ROS Groovy
    +
    + C++ API
    +
    + git clone https://github.com/bcohen/sbpl_manipulation.git
    + +
    + MoveIt!
    +
    + Coming soon!
    +
    +  
    +

    + How to get started (ROS Fuerte):

    +

    Download & Compile:

    +
    +
    +
    + 0) Install prerequisites:
    +
    + sudo apt-get install ros-fuerte-pr2-kinematics ros-fuerte-arm-navigation ros-fuerte-arm-navigation-experimental
    +
    +  
    +
    +
    + 1) Get the Arm Planner:
    + +
    +
    +  
    +
    + 2) Get the SBPL:
    +
    + +
    +  
    +
    + 3) Build the SBPL. Follow the directions here:
    + +
    +  
    +
    + 4) Build the Arm Planner:
    +
    + rosmake sbpl_arm_planner_node
    +
    +  
    +
    + 5) Build the test package (for testing the planner):
    +
    + rosmake simple_arm_utils
    +
    +  
    +

    Run Demo:

    +
    + Make sure you added this to your bashrc: export ROBOT=sim
    +
    +
    +
    + Terminal 1 - Bring up Gazebo & Right Arm Navigation Stack
    +
    + roslaunch simple_arm_control gazebo_with_right_arm_nav.launch
    +
    +  
    +
    + Terminal 2 - Bring up RViz (add display for visualization markers)
    +
    + rosrun rviz rviz
    +
    +  
    +
    + Terminal 3 - Launch the planner for the right arm
    +
    + roslaunch sbpl_arm_planner_node sbpl_planning_right_arm.launch
    +
    +  
    +
    + Terminal 4 - Request a motion plan
    +
    + roslaunch simple_arm_control goal1.launch 
    +
    +

     

    +

     

    + + diff --git a/static/archive/legacy-drupal/content/pages/0055-arm-planning.json b/static/archive/legacy-drupal/content/pages/0055-arm-planning.json new file mode 100644 index 0000000..ed4b3ce --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0055-arm-planning.json @@ -0,0 +1,27 @@ +{ + "nid": 55, + "vid": 55, + "type": "page", + "language": "und", + "title": "Arm Planning", + "slug": "arm-planning", + "uid": 11, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1379455741, + "changed": 1380759273, + "url_aliases": [ + "sbpl_arm_planning" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "full_html", + "body_summary": "", + "body_html_rewritten": "

    \r\n\tsbpl_arm_planning

    \r\n

    \r\n\tRepositories

    \r\n
    \r\n\tROS Diamondback
    \r\n
    \r\n\tArm Navigation
    \r\n\r\n
    \r\n\t 
    \r\n
    \r\n\tROS Electric
    \r\n
    \r\n\tArm Navigation
    \r\n\r\n
    \r\n\t 
    \r\n
    \r\n\tROS Fuerte
    \r\n
    \r\n\tArm Navigation
    \r\n\r\n
    \r\n\t(install documentation below)
    \r\n
    \r\n\tMoveIt! (only compatible with June 2012)
    \r\n\r\n
    \r\n\t 
    \r\n
    \r\n\tROS Groovy
    \r\n
    \r\n\tC++ API
    \r\n
    \r\n\tgit clone https://github.com/bcohen/sbpl_manipulation.git
    \r\n\r\n
    \r\n\tMoveIt!
    \r\n
    \r\n\tComing soon!
    \r\n
    \r\n\t 
    \r\n

    \r\n\tHow to get started (ROS Fuerte):

    \r\n

    Download & Compile:

    \r\n
    \r\n\t
    \r\n\t\t
    \r\n\t\t\t0) Install prerequisites:
    \r\n\t\t
    \r\n\t\t\tsudo apt-get install ros-fuerte-pr2-kinematics ros-fuerte-arm-navigation ros-fuerte-arm-navigation-experimental
    \r\n\t\t
    \r\n\t\t\t 
    \r\n\t
    \r\n\t
    \r\n\t\t1) Get the Arm Planner:
    \r\n\t\r\n\t
    \r\n\t\t
    \r\n\t\t\t 
    \r\n\t\t
    \r\n\t\t\t2) Get the SBPL:
    \r\n\t
    \r\n\t\r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\t3) Build the SBPL. Follow the directions here:
    \r\n\t\r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\t4) Build the Arm Planner:
    \r\n\t
    \r\n\t\trosmake sbpl_arm_planner_node
    \r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\t5) Build the test package (for testing the planner):
    \r\n\t
    \r\n\t\trosmake simple_arm_utils
    \r\n\t
    \r\n\t\t 
    \r\n\t

    Run Demo:

    \r\n\t
    \r\n\t\tMake sure you added this to your bashrc: export ROBOT=sim
    \r\n
    \r\n
    \r\n\t
    \r\n\t\tTerminal 1 - Bring up Gazebo & Right Arm Navigation Stack
    \r\n\t
    \r\n\t\troslaunch simple_arm_control gazebo_with_right_arm_nav.launch
    \r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\tTerminal 2 - Bring up RViz (add display for visualization markers)
    \r\n\t
    \r\n\t\trosrun rviz rviz
    \r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\tTerminal 3 - Launch the planner for the right arm
    \r\n\t
    \r\n\t\troslaunch sbpl_arm_planner_node sbpl_planning_right_arm.launch
    \r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\tTerminal 4 - Request a motion plan
    \r\n\t
    \r\n\t\troslaunch simple_arm_control goal1.launch 
    \r\n
    \r\n

     

    \r\n

     

    \r\n", + "body_markdown": "# sbpl_arm_planning\n\n## Repositories\n\n **ROS Diamondback**\n\n Arm Navigation\n\n svn co [https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/diamondback/](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/diamondback/)\n\n **ROS Electric**\n\n Arm Navigation\n\n svn co [https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/electric/](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/electric/)\n\n **ROS Fuerte**\n\n Arm Navigation\n\n svn co [https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/fuerte_arm_navigation/](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/fuerte_arm_navigation/)\n\n (install documentation below)\n\n MoveIt! (only compatible with June 2012)\n\n svn co [https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/trunk/](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/trunk/)\n\n **ROS Groovy**\n\n C++ API\n\n git clone https://github.com/bcohen/sbpl_manipulation.git\n\n [install documentation](https://github.com/bcohen/sbpl_manipulation)\n\n MoveIt!\n\n Coming soon!\n\n## How to get started (ROS Fuerte):\n\n**Download & Compile:**\n\n 0) Install prerequisites:\n\n sudo apt-get install ros-fuerte-pr2-kinematics ros-fuerte-arm-navigation ros-fuerte-arm-navigation-experimental\n\n 1) Get the Arm Planner:\n\n svn co [https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/fuerte_arm_navigation/](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/fuerte_arm_navigation/) sbpl_arm_planning\n\n 2) Get the SBPL:\n\n git clone [https://github.com/sbpl/sbpl.git](https://github.com/sbpl/sbpl.git)\n\n 3) Build the SBPL. Follow the directions here:\n\n [https://github.com/sbpl/sbpl/blob/master/README.txt](https://github.com/sbpl/sbpl/blob/master/README.txt)\n\n 4) Build the Arm Planner:\n\n rosmake sbpl_arm_planner_node\n\n 5) Build the test package (for testing the planner):\n\n rosmake simple_arm_utils\n\n**Run Demo:**\n\n Make sure you added this to your bashrc: export ROBOT=sim\n\n **Terminal 1 - Bring up Gazebo & Right Arm Navigation Stack**\n\n roslaunch simple_arm_control gazebo_with_right_arm_nav.launch\n\n **Terminal 2 - Bring up RViz** (add display for visualization markers)\n\n rosrun rviz rviz\n\n **Terminal 3 - Launch the planner for the right arm**\n\n roslaunch sbpl_arm_planner_node sbpl_planning_right_arm.launch\n\n **Terminal 4 - Request a motion plan**\n\n roslaunch simple_arm_control goal1.launch\n", + "body_html_raw": "

    \r\n\tsbpl_arm_planning

    \r\n

    \r\n\tRepositories

    \r\n
    \r\n\tROS Diamondback
    \r\n
    \r\n\tArm Navigation
    \r\n\r\n
    \r\n\t 
    \r\n
    \r\n\tROS Electric
    \r\n
    \r\n\tArm Navigation
    \r\n\r\n
    \r\n\t 
    \r\n
    \r\n\tROS Fuerte
    \r\n
    \r\n\tArm Navigation
    \r\n\r\n
    \r\n\t(install documentation below)
    \r\n
    \r\n\tMoveIt! (only compatible with June 2012)
    \r\n\r\n
    \r\n\t 
    \r\n
    \r\n\tROS Groovy
    \r\n
    \r\n\tC++ API
    \r\n
    \r\n\tgit clone https://github.com/bcohen/sbpl_manipulation.git
    \r\n\r\n
    \r\n\tMoveIt!
    \r\n
    \r\n\tComing soon!
    \r\n
    \r\n\t 
    \r\n

    \r\n\tHow to get started (ROS Fuerte):

    \r\n

    Download & Compile:

    \r\n
    \r\n\t
    \r\n\t\t
    \r\n\t\t\t0) Install prerequisites:
    \r\n\t\t
    \r\n\t\t\tsudo apt-get install ros-fuerte-pr2-kinematics ros-fuerte-arm-navigation ros-fuerte-arm-navigation-experimental
    \r\n\t\t
    \r\n\t\t\t 
    \r\n\t
    \r\n\t
    \r\n\t\t1) Get the Arm Planner:
    \r\n\t\r\n\t
    \r\n\t\t
    \r\n\t\t\t 
    \r\n\t\t
    \r\n\t\t\t2) Get the SBPL:
    \r\n\t
    \r\n\t\r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\t3) Build the SBPL. Follow the directions here:
    \r\n\t\r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\t4) Build the Arm Planner:
    \r\n\t
    \r\n\t\trosmake sbpl_arm_planner_node
    \r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\t5) Build the test package (for testing the planner):
    \r\n\t
    \r\n\t\trosmake simple_arm_utils
    \r\n\t
    \r\n\t\t 
    \r\n\t

    Run Demo:

    \r\n\t
    \r\n\t\tMake sure you added this to your bashrc: export ROBOT=sim
    \r\n
    \r\n
    \r\n\t
    \r\n\t\tTerminal 1 - Bring up Gazebo & Right Arm Navigation Stack
    \r\n\t
    \r\n\t\troslaunch simple_arm_control gazebo_with_right_arm_nav.launch
    \r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\tTerminal 2 - Bring up RViz (add display for visualization markers)
    \r\n\t
    \r\n\t\trosrun rviz rviz
    \r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\tTerminal 3 - Launch the planner for the right arm
    \r\n\t
    \r\n\t\troslaunch sbpl_arm_planner_node sbpl_planning_right_arm.launch
    \r\n\t
    \r\n\t\t 
    \r\n\t
    \r\n\t\tTerminal 4 - Request a motion plan
    \r\n\t
    \r\n\t\troslaunch simple_arm_control goal1.launch 
    \r\n
    \r\n

     

    \r\n

     

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0055-arm-planning.md b/static/archive/legacy-drupal/content/pages/0055-arm-planning.md new file mode 100644 index 0000000..80addb5 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0055-arm-planning.md @@ -0,0 +1,89 @@ +# Arm Planning + +# sbpl_arm_planning + +## Repositories + + **ROS Diamondback** + + Arm Navigation + + svn co [https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/diamondback/](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/diamondback/) + + **ROS Electric** + + Arm Navigation + + svn co [https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/electric/](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/electric/) + + **ROS Fuerte** + + Arm Navigation + + svn co [https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/fuerte_arm_navigation/](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/fuerte_arm_navigation/) + + (install documentation below) + + MoveIt! (only compatible with June 2012) + + svn co [https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/trunk/](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/trunk/) + + **ROS Groovy** + + C++ API + + git clone https://github.com/bcohen/sbpl_manipulation.git + + [install documentation](https://github.com/bcohen/sbpl_manipulation) + + MoveIt! + + Coming soon! + +## How to get started (ROS Fuerte): + +**Download & Compile:** + + 0) Install prerequisites: + + sudo apt-get install ros-fuerte-pr2-kinematics ros-fuerte-arm-navigation ros-fuerte-arm-navigation-experimental + + 1) Get the Arm Planner: + + svn co [https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/fuerte_arm_navigation/](https://mediabox.grasp.upenn.edu/svn/penn-ros-pkgs/sbpl_arm_planning/branches/fuerte_arm_navigation/) sbpl_arm_planning + + 2) Get the SBPL: + + git clone [https://github.com/sbpl/sbpl.git](https://github.com/sbpl/sbpl.git) + + 3) Build the SBPL. Follow the directions here: + + [https://github.com/sbpl/sbpl/blob/master/README.txt](https://github.com/sbpl/sbpl/blob/master/README.txt) + + 4) Build the Arm Planner: + + rosmake sbpl_arm_planner_node + + 5) Build the test package (for testing the planner): + + rosmake simple_arm_utils + +**Run Demo:** + + Make sure you added this to your bashrc: export ROBOT=sim + + **Terminal 1 - Bring up Gazebo & Right Arm Navigation Stack** + + roslaunch simple_arm_control gazebo_with_right_arm_nav.launch + + **Terminal 2 - Bring up RViz** (add display for visualization markers) + + rosrun rviz rviz + + **Terminal 3 - Launch the planner for the right arm** + + roslaunch sbpl_arm_planner_node sbpl_planning_right_arm.launch + + **Terminal 4 - Request a motion plan** + + roslaunch simple_arm_control goal1.launch diff --git a/static/archive/legacy-drupal/content/pages/0056-aram-ebtekar.html b/static/archive/legacy-drupal/content/pages/0056-aram-ebtekar.html new file mode 100644 index 0000000..5dd381e --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0056-aram-ebtekar.html @@ -0,0 +1,7 @@ + +Aram Ebtekar + +

    Aram Ebtekar

    +

    Phd. student. C.S.

    + + diff --git a/static/archive/legacy-drupal/content/pages/0056-aram-ebtekar.json b/static/archive/legacy-drupal/content/pages/0056-aram-ebtekar.json new file mode 100644 index 0000000..26c54db --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0056-aram-ebtekar.json @@ -0,0 +1,27 @@ +{ + "nid": 56, + "vid": 56, + "type": "page", + "language": "und", + "title": "Aram Ebtekar", + "slug": "aram-ebtekar", + "uid": 1592, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1382042307, + "changed": 1382112277, + "url_aliases": [ + "Aram Ebtekar" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "

    Phd. student. C.S.

    \r\n", + "body_markdown": "Phd. student. C.S.\n", + "body_html_raw": "

    Phd. student. C.S.

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0056-aram-ebtekar.md b/static/archive/legacy-drupal/content/pages/0056-aram-ebtekar.md new file mode 100644 index 0000000..686742c --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0056-aram-ebtekar.md @@ -0,0 +1,3 @@ +# Aram Ebtekar + +Phd. student. C.S. diff --git a/static/archive/legacy-drupal/content/pages/0057-kush-prasad.html b/static/archive/legacy-drupal/content/pages/0057-kush-prasad.html new file mode 100644 index 0000000..e630255 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0057-kush-prasad.html @@ -0,0 +1,7 @@ + +Kush Prasad + +

    Kush Prasad

    +

    Research Staff

    + + diff --git a/static/archive/legacy-drupal/content/pages/0057-kush-prasad.json b/static/archive/legacy-drupal/content/pages/0057-kush-prasad.json new file mode 100644 index 0000000..4abba7e --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0057-kush-prasad.json @@ -0,0 +1,27 @@ +{ + "nid": 57, + "vid": 57, + "type": "page", + "language": "und", + "title": "Kush Prasad", + "slug": "kush-prasad", + "uid": 1596, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1382043303, + "changed": 1382117324, + "url_aliases": [ + "Kush Prasad" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "

    Research Staff

    \r\n", + "body_markdown": "Research Staff\n", + "body_html_raw": "

    Research Staff

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0057-kush-prasad.md b/static/archive/legacy-drupal/content/pages/0057-kush-prasad.md new file mode 100644 index 0000000..e47e15c --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0057-kush-prasad.md @@ -0,0 +1,3 @@ +# Kush Prasad + +Research Staff diff --git a/static/archive/legacy-drupal/content/pages/0058-sung-kyun-kim.html b/static/archive/legacy-drupal/content/pages/0058-sung-kyun-kim.html new file mode 100644 index 0000000..aa5a09a --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0058-sung-kyun-kim.html @@ -0,0 +1,7 @@ + +Sung-Kyun Kim + +

    Sung-Kyun Kim

    +

    Phd. student

    + + diff --git a/static/archive/legacy-drupal/content/pages/0058-sung-kyun-kim.json b/static/archive/legacy-drupal/content/pages/0058-sung-kyun-kim.json new file mode 100644 index 0000000..f81c921 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0058-sung-kyun-kim.json @@ -0,0 +1,27 @@ +{ + "nid": 58, + "vid": 58, + "type": "page", + "language": "und", + "title": "Sung-Kyun Kim", + "slug": "sung-kyun-kim", + "uid": 1591, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1382043402, + "changed": 1382112256, + "url_aliases": [ + "Sung-Kyun Kim" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "

    Phd. student

    \r\n", + "body_markdown": "Phd. student\n", + "body_html_raw": "

    Phd. student

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0058-sung-kyun-kim.md b/static/archive/legacy-drupal/content/pages/0058-sung-kyun-kim.md new file mode 100644 index 0000000..21d880d --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0058-sung-kyun-kim.md @@ -0,0 +1,3 @@ +# Sung-Kyun Kim + +Phd. student diff --git a/static/archive/legacy-drupal/content/pages/0059-soonkyum-kim.html b/static/archive/legacy-drupal/content/pages/0059-soonkyum-kim.html new file mode 100644 index 0000000..bb400ba --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0059-soonkyum-kim.html @@ -0,0 +1,7 @@ + +Soonkyum Kim + +

    Soonkyum Kim

    +

    Post Doc

    + + diff --git a/static/archive/legacy-drupal/content/pages/0059-soonkyum-kim.json b/static/archive/legacy-drupal/content/pages/0059-soonkyum-kim.json new file mode 100644 index 0000000..780441b --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0059-soonkyum-kim.json @@ -0,0 +1,27 @@ +{ + "nid": 59, + "vid": 59, + "type": "page", + "language": "und", + "title": "Soonkyum Kim", + "slug": "soonkyum-kim", + "uid": 1590, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1382043628, + "changed": 1382112221, + "url_aliases": [ + "Soonkyum Kim" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "

    Post Doc

    \r\n", + "body_markdown": "Post Doc\n", + "body_html_raw": "

    Post Doc

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0059-soonkyum-kim.md b/static/archive/legacy-drupal/content/pages/0059-soonkyum-kim.md new file mode 100644 index 0000000..4070d55 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0059-soonkyum-kim.md @@ -0,0 +1,3 @@ +# Soonkyum Kim + +Post Doc diff --git a/static/archive/legacy-drupal/content/pages/0060-siddharth-swaminathan.html b/static/archive/legacy-drupal/content/pages/0060-siddharth-swaminathan.html new file mode 100644 index 0000000..670763a --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0060-siddharth-swaminathan.html @@ -0,0 +1,7 @@ + +Siddharth Swaminathan + +

    Siddharth Swaminathan

    +

    Masters Student

    + + diff --git a/static/archive/legacy-drupal/content/pages/0060-siddharth-swaminathan.json b/static/archive/legacy-drupal/content/pages/0060-siddharth-swaminathan.json new file mode 100644 index 0000000..24fd79b --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0060-siddharth-swaminathan.json @@ -0,0 +1,27 @@ +{ + "nid": 60, + "vid": 60, + "type": "page", + "language": "und", + "title": "Siddharth Swaminathan", + "slug": "siddharth-swaminathan", + "uid": 1595, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1382043736, + "changed": 1382117198, + "url_aliases": [ + "Siddharth Swaminathan" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "

    Masters Student

    \r\n", + "body_markdown": "Masters Student\n", + "body_html_raw": "

    Masters Student

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0060-siddharth-swaminathan.md b/static/archive/legacy-drupal/content/pages/0060-siddharth-swaminathan.md new file mode 100644 index 0000000..12d5593 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0060-siddharth-swaminathan.md @@ -0,0 +1,3 @@ +# Siddharth Swaminathan + +Masters Student diff --git a/static/archive/legacy-drupal/content/pages/0061-chen-gao.html b/static/archive/legacy-drupal/content/pages/0061-chen-gao.html new file mode 100644 index 0000000..4d750fc --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0061-chen-gao.html @@ -0,0 +1,7 @@ + +Chen Gao + +

    Chen Gao

    +

    Masters Student

    + + diff --git a/static/archive/legacy-drupal/content/pages/0061-chen-gao.json b/static/archive/legacy-drupal/content/pages/0061-chen-gao.json new file mode 100644 index 0000000..32be931 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0061-chen-gao.json @@ -0,0 +1,27 @@ +{ + "nid": 61, + "vid": 61, + "type": "page", + "language": "und", + "title": "Chen Gao", + "slug": "chen-gao", + "uid": 1589, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1382043949, + "changed": 1382112198, + "url_aliases": [ + "Chen Gao" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "

    Masters Student

    \r\n", + "body_markdown": "Masters Student\n", + "body_html_raw": "

    Masters Student

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0061-chen-gao.md b/static/archive/legacy-drupal/content/pages/0061-chen-gao.md new file mode 100644 index 0000000..45160e4 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0061-chen-gao.md @@ -0,0 +1,3 @@ +# Chen Gao + +Masters Student diff --git a/static/archive/legacy-drupal/content/pages/0062-ellis-ratner.html b/static/archive/legacy-drupal/content/pages/0062-ellis-ratner.html new file mode 100644 index 0000000..5295085 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0062-ellis-ratner.html @@ -0,0 +1,7 @@ + +Ellis Ratner + +

    Ellis Ratner

    +

    Summer Intern/Off-site Develepor

    + + diff --git a/static/archive/legacy-drupal/content/pages/0062-ellis-ratner.json b/static/archive/legacy-drupal/content/pages/0062-ellis-ratner.json new file mode 100644 index 0000000..a613e38 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0062-ellis-ratner.json @@ -0,0 +1,27 @@ +{ + "nid": 62, + "vid": 62, + "type": "page", + "language": "und", + "title": "Ellis Ratner", + "slug": "ellis-ratner", + "uid": 1588, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1382044111, + "changed": 1382112175, + "url_aliases": [ + "Ellis Ratner" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "

    Summer Intern/Off-site Develepor

    \r\n", + "body_markdown": "Summer Intern/Off-site Develepor\n", + "body_html_raw": "

    Summer Intern/Off-site Develepor

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0062-ellis-ratner.md b/static/archive/legacy-drupal/content/pages/0062-ellis-ratner.md new file mode 100644 index 0000000..019d28d --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0062-ellis-ratner.md @@ -0,0 +1,3 @@ +# Ellis Ratner + +Summer Intern/Off-site Develepor diff --git a/static/archive/legacy-drupal/content/pages/0063-krishna-sapkota.html b/static/archive/legacy-drupal/content/pages/0063-krishna-sapkota.html new file mode 100644 index 0000000..a71074f --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0063-krishna-sapkota.html @@ -0,0 +1,7 @@ + +Krishna Sapkota + +

    Krishna Sapkota

    +

    Summer Intern

    + + diff --git a/static/archive/legacy-drupal/content/pages/0063-krishna-sapkota.json b/static/archive/legacy-drupal/content/pages/0063-krishna-sapkota.json new file mode 100644 index 0000000..be53094 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0063-krishna-sapkota.json @@ -0,0 +1,27 @@ +{ + "nid": 63, + "vid": 63, + "type": "page", + "language": "und", + "title": "Krishna Sapkota", + "slug": "krishna-sapkota", + "uid": 13, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1382044177, + "changed": 1382117363, + "url_aliases": [ + "Krishna Sapkota" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "

    Summer Intern

    \r\n", + "body_markdown": "Summer Intern\n", + "body_html_raw": "

    Summer Intern

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0063-krishna-sapkota.md b/static/archive/legacy-drupal/content/pages/0063-krishna-sapkota.md new file mode 100644 index 0000000..1ef6d24 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0063-krishna-sapkota.md @@ -0,0 +1,3 @@ +# Krishna Sapkota + +Summer Intern diff --git a/static/archive/legacy-drupal/content/pages/0064-burak-yucesoy.html b/static/archive/legacy-drupal/content/pages/0064-burak-yucesoy.html new file mode 100644 index 0000000..76b02cc --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0064-burak-yucesoy.html @@ -0,0 +1,7 @@ + +Burak Yucesoy + +

    Burak Yucesoy

    +

    Summer Intern

    + + diff --git a/static/archive/legacy-drupal/content/pages/0064-burak-yucesoy.json b/static/archive/legacy-drupal/content/pages/0064-burak-yucesoy.json new file mode 100644 index 0000000..7e89846 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0064-burak-yucesoy.json @@ -0,0 +1,27 @@ +{ + "nid": 64, + "vid": 64, + "type": "page", + "language": "und", + "title": "Burak Yucesoy", + "slug": "burak-yucesoy", + "uid": 13, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1382044250, + "changed": 1382117341, + "url_aliases": [ + "Burak Yucesoy" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "

    Summer Intern

    \r\n", + "body_markdown": "Summer Intern\n", + "body_html_raw": "

    Summer Intern

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0064-burak-yucesoy.md b/static/archive/legacy-drupal/content/pages/0064-burak-yucesoy.md new file mode 100644 index 0000000..c68878d --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0064-burak-yucesoy.md @@ -0,0 +1,3 @@ +# Burak Yucesoy + +Summer Intern diff --git a/static/archive/legacy-drupal/content/pages/0065-arjun-menon.html b/static/archive/legacy-drupal/content/pages/0065-arjun-menon.html new file mode 100644 index 0000000..d42ccff --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0065-arjun-menon.html @@ -0,0 +1,7 @@ + +Arjun Menon + +

    Arjun Menon

    +

    TBF

    + + diff --git a/static/archive/legacy-drupal/content/pages/0065-arjun-menon.json b/static/archive/legacy-drupal/content/pages/0065-arjun-menon.json new file mode 100644 index 0000000..10847b6 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0065-arjun-menon.json @@ -0,0 +1,27 @@ +{ + "nid": 65, + "vid": 65, + "type": "page", + "language": "und", + "title": "Arjun Menon", + "slug": "arjun-menon", + "uid": 1587, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1382044738, + "changed": 1382112300, + "url_aliases": [ + "Arjun Menon" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "

    TBF

    \r\n", + "body_markdown": "TBF\n", + "body_html_raw": "

    TBF

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0065-arjun-menon.md b/static/archive/legacy-drupal/content/pages/0065-arjun-menon.md new file mode 100644 index 0000000..ff9a491 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0065-arjun-menon.md @@ -0,0 +1,3 @@ +# Arjun Menon + +TBF diff --git a/static/archive/legacy-drupal/content/pages/0066-hao-wang.html b/static/archive/legacy-drupal/content/pages/0066-hao-wang.html new file mode 100644 index 0000000..4896345 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0066-hao-wang.html @@ -0,0 +1,7 @@ + +Hao Wang + +

    Hao Wang

    +

    Masters Student

    + + diff --git a/static/archive/legacy-drupal/content/pages/0066-hao-wang.json b/static/archive/legacy-drupal/content/pages/0066-hao-wang.json new file mode 100644 index 0000000..043019d --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0066-hao-wang.json @@ -0,0 +1,27 @@ +{ + "nid": 66, + "vid": 66, + "type": "page", + "language": "und", + "title": "Hao Wang", + "slug": "hao-wang", + "uid": 1586, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1382044789, + "changed": 1382112106, + "url_aliases": [ + "Hao Wang" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "

    Masters Student

    \r\n", + "body_markdown": "Masters Student\n", + "body_html_raw": "

    Masters Student

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0066-hao-wang.md b/static/archive/legacy-drupal/content/pages/0066-hao-wang.md new file mode 100644 index 0000000..3ac3384 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0066-hao-wang.md @@ -0,0 +1,3 @@ +# Hao Wang + +Masters Student diff --git a/static/archive/legacy-drupal/content/pages/0067-victor-hwang.html b/static/archive/legacy-drupal/content/pages/0067-victor-hwang.html new file mode 100644 index 0000000..b50dd03 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0067-victor-hwang.html @@ -0,0 +1,7 @@ + +Victor Hwang + +

    Victor Hwang

    +

    Masters Student

    + + diff --git a/static/archive/legacy-drupal/content/pages/0067-victor-hwang.json b/static/archive/legacy-drupal/content/pages/0067-victor-hwang.json new file mode 100644 index 0000000..fb43f6b --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0067-victor-hwang.json @@ -0,0 +1,27 @@ +{ + "nid": 67, + "vid": 67, + "type": "page", + "language": "und", + "title": "Victor Hwang", + "slug": "victor-hwang", + "uid": 648, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1382044955, + "changed": 1382112369, + "url_aliases": [ + "Victor Hwang" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "

    Masters Student

    \r\n", + "body_markdown": "Masters Student\n", + "body_html_raw": "

    Masters Student

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0067-victor-hwang.md b/static/archive/legacy-drupal/content/pages/0067-victor-hwang.md new file mode 100644 index 0000000..0f22e93 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0067-victor-hwang.md @@ -0,0 +1,3 @@ +# Victor Hwang + +Masters Student diff --git a/static/archive/legacy-drupal/content/pages/0068-margarite-safonova.html b/static/archive/legacy-drupal/content/pages/0068-margarite-safonova.html new file mode 100644 index 0000000..6d5363d --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0068-margarite-safonova.html @@ -0,0 +1,7 @@ + +Margarite Safonova + +

    Margarite Safonova

    +

    Software Developer

    + + diff --git a/static/archive/legacy-drupal/content/pages/0068-margarite-safonova.json b/static/archive/legacy-drupal/content/pages/0068-margarite-safonova.json new file mode 100644 index 0000000..4c8ac53 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0068-margarite-safonova.json @@ -0,0 +1,27 @@ +{ + "nid": 68, + "vid": 68, + "type": "page", + "language": "und", + "title": "Margarite Safonova", + "slug": "margarite-safonova", + "uid": 1633, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1382374632, + "changed": 1382374890, + "url_aliases": [ + "Margarite Safonova" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "

    Software Developer

    \r\n", + "body_markdown": "Software Developer\n", + "body_html_raw": "

    Software Developer

    \r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0068-margarite-safonova.md b/static/archive/legacy-drupal/content/pages/0068-margarite-safonova.md new file mode 100644 index 0000000..6eabf52 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0068-margarite-safonova.md @@ -0,0 +1,3 @@ +# Margarite Safonova + +Software Developer diff --git a/static/archive/legacy-drupal/content/pages/0069-discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances.html b/static/archive/legacy-drupal/content/pages/0069-discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances.html new file mode 100644 index 0000000..e4b6fe1 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0069-discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances.html @@ -0,0 +1,14 @@ + +Discriminatively-guided Deliberative Perception for Pose Estimation of Multiple 3D Object Instances + +

    Discriminatively-guided Deliberative Perception for Pose Estimation of Multiple 3D Object Instances

    +Abstract + +We introduce a novel paradigm for model-based multi-object recognition and 3 DoF pose estimation from 3D sensor data that integrates exhaustive global reasoning with discriminatively-trained algorithms in a principled fashion. Typical approaches for this task are based on scene-to-model feature matching or regression by statistical learners trained on a large database of annotated scenes. These approaches are fast but sensitive to occlusions, features, and/or training data. Generative approaches, on the other hand, e.g., methods based on rendering and verification, are robust to occlusions and require no training, but are slow at test time. We conjecture that robust and efficient perception can be achieved through a combination of generative methods and discriminatively-trained approaches. To this end, we introduce the Discriminatively-guided Deliberative Perception (D2P) paradigm that has the following desirable properties: a) D2P is a single search algorithm that looks for the ‘best’ rendering of the scene that matches the input, b) can be guided by any and multiple discriminative algorithms, and c) generates a solution that is provably bounded suboptimal with respect to the chosen cost function. In addition, we introduce the notions of completeness and resolution completeness for multi-object pose estimation problems, and show that D2P is resolution complete. We conduct extensive evaluations on a benchmark dataset to study various aspects of D2P in relation to existing approaches. + +Software + +D2P is available as a ROS catkin package and requires ROS (Hydro or later), and PCL (1.7 or later). +Source code and setup instructions are at https://github.com/venkatrn/perception/. + + diff --git a/static/archive/legacy-drupal/content/pages/0069-discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances.json b/static/archive/legacy-drupal/content/pages/0069-discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances.json new file mode 100644 index 0000000..b3d69e8 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0069-discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances.json @@ -0,0 +1,27 @@ +{ + "nid": 69, + "vid": 69, + "type": "page", + "language": "und", + "title": "Discriminatively-guided Deliberative Perception for Pose Estimation of Multiple 3D Object Instances", + "slug": "discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances", + "uid": 34, + "status": 1, + "promote": 0, + "sticky": 0, + "comment": 1, + "created": 1462225713, + "changed": 1464101202, + "url_aliases": [ + "Software/d2p" + ], + "tags_tids": [], + "field_image": [], + "field_page_file": [], + "body_format": "filtered_html", + "body_summary": "", + "body_html_rewritten": "Abstract \r\n\r\nWe introduce a novel paradigm for model-based multi-object recognition and 3 DoF pose estimation from 3D sensor data that integrates exhaustive global reasoning with discriminatively-trained algorithms in a principled fashion. Typical approaches for this task are based on scene-to-model feature matching or regression by statistical learners trained on a large database of annotated scenes. These approaches are fast but sensitive to occlusions, features, and/or training data. Generative approaches, on the other hand, e.g., methods based on rendering and verification, are robust to occlusions and require no training, but are slow at test time. We conjecture that robust and efficient perception can be achieved through a combination of generative methods and discriminatively-trained approaches. To this end, we introduce the Discriminatively-guided Deliberative Perception (D2P) paradigm that has the following desirable properties: a) D2P is a single search algorithm that looks for the ‘best’ rendering of the scene that matches the input, b) can be guided by any and multiple discriminative algorithms, and c) generates a solution that is provably bounded suboptimal with respect to the chosen cost function. In addition, we introduce the notions of completeness and resolution completeness for multi-object pose estimation problems, and show that D2P is resolution complete. We conduct extensive evaluations on a benchmark dataset to study various aspects of D2P in relation to existing approaches.\r\n\r\nSoftware\r\n\r\nD2P is available as a ROS catkin package and requires ROS (Hydro or later), and PCL (1.7 or later). \r\nSource code and setup instructions are at https://github.com/venkatrn/perception/.\r\n", + "body_markdown": "**Abstract** We introduce a novel paradigm for model-based multi-object recognition and 3 DoF pose estimation from 3D sensor data that integrates exhaustive global reasoning with discriminatively-trained algorithms in a principled fashion. Typical approaches for this task are based on scene-to-model feature matching or regression by statistical learners trained on a large database of annotated scenes. These approaches are fast but sensitive to occlusions, features, and/or training data. Generative approaches, on the other hand, e.g., methods based on rendering and verification, are robust to occlusions and require no training, but are slow at test time. We conjecture that robust and efficient perception can be achieved through a combination of generative methods and discriminatively-trained approaches. To this end, we introduce the Discriminatively-guided Deliberative Perception (D2P) paradigm that has the following desirable properties: a) D2P is a single search algorithm that looks for the ‘best’ rendering of the scene that matches the input, b) can be guided by any and multiple discriminative algorithms, and c) generates a solution that is provably bounded suboptimal with respect to the chosen cost function. In addition, we introduce the notions of completeness and resolution completeness for multi-object pose estimation problems, and show that D2P is resolution complete. We conduct extensive evaluations on a benchmark dataset to study various aspects of D2P in relation to existing approaches. **Software** D2P is available as a ROS catkin package and requires ROS (Hydro or later), and PCL (1.7 or later). Source code and setup instructions are at https://github.com/venkatrn/perception/.\n", + "body_html_raw": "Abstract \r\n\r\nWe introduce a novel paradigm for model-based multi-object recognition and 3 DoF pose estimation from 3D sensor data that integrates exhaustive global reasoning with discriminatively-trained algorithms in a principled fashion. Typical approaches for this task are based on scene-to-model feature matching or regression by statistical learners trained on a large database of annotated scenes. These approaches are fast but sensitive to occlusions, features, and/or training data. Generative approaches, on the other hand, e.g., methods based on rendering and verification, are robust to occlusions and require no training, but are slow at test time. We conjecture that robust and efficient perception can be achieved through a combination of generative methods and discriminatively-trained approaches. To this end, we introduce the Discriminatively-guided Deliberative Perception (D2P) paradigm that has the following desirable properties: a) D2P is a single search algorithm that looks for the ‘best’ rendering of the scene that matches the input, b) can be guided by any and multiple discriminative algorithms, and c) generates a solution that is provably bounded suboptimal with respect to the chosen cost function. In addition, we introduce the notions of completeness and resolution completeness for multi-object pose estimation problems, and show that D2P is resolution complete. We conduct extensive evaluations on a benchmark dataset to study various aspects of D2P in relation to existing approaches.\r\n\r\nSoftware\r\n\r\nD2P is available as a ROS catkin package and requires ROS (Hydro or later), and PCL (1.7 or later). \r\nSource code and setup instructions are at https://github.com/venkatrn/perception/.\r\n", + "revision_log": "" +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/pages/0069-discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances.md b/static/archive/legacy-drupal/content/pages/0069-discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances.md new file mode 100644 index 0000000..13633d1 --- /dev/null +++ b/static/archive/legacy-drupal/content/pages/0069-discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances.md @@ -0,0 +1,3 @@ +# Discriminatively-guided Deliberative Perception for Pose Estimation of Multiple 3D Object Instances + +**Abstract** We introduce a novel paradigm for model-based multi-object recognition and 3 DoF pose estimation from 3D sensor data that integrates exhaustive global reasoning with discriminatively-trained algorithms in a principled fashion. Typical approaches for this task are based on scene-to-model feature matching or regression by statistical learners trained on a large database of annotated scenes. These approaches are fast but sensitive to occlusions, features, and/or training data. Generative approaches, on the other hand, e.g., methods based on rendering and verification, are robust to occlusions and require no training, but are slow at test time. We conjecture that robust and efficient perception can be achieved through a combination of generative methods and discriminatively-trained approaches. To this end, we introduce the Discriminatively-guided Deliberative Perception (D2P) paradigm that has the following desirable properties: a) D2P is a single search algorithm that looks for the ‘best’ rendering of the scene that matches the input, b) can be guided by any and multiple discriminative algorithms, and c) generates a solution that is provably bounded suboptimal with respect to the chosen cost function. In addition, we introduce the notions of completeness and resolution completeness for multi-object pose estimation problems, and show that D2P is resolution complete. We conduct extensive evaluations on a benchmark dataset to study various aspects of D2P in relation to existing approaches. **Software** D2P is available as a ROS catkin package and requires ROS (Hydro or later), and PCL (1.7 or later). Source code and setup instructions are at https://github.com/venkatrn/perception/. diff --git a/static/archive/legacy-drupal/content/site_variables.json b/static/archive/legacy-drupal/content/site_variables.json new file mode 100644 index 0000000..f2d01bc --- /dev/null +++ b/static/archive/legacy-drupal/content/site_variables.json @@ -0,0 +1,14 @@ +{ + "site_name": "Search-Based Planning Lab", + "site_slogan": "", + "site_mail": "searchbasedplanninglibrary@gmail.com", + "site_frontpage": "node/9", + "site_default_country": "US", + "site_404": "", + "site_403": "", + "theme_default": "bartik", + "admin_theme": "seven", + "date_default_timezone": "America/New_York", + "user_register": "2", + "user_email_verification": 1 +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/content/users.json b/static/archive/legacy-drupal/content/users.json new file mode 100644 index 0000000..9157520 --- /dev/null +++ b/static/archive/legacy-drupal/content/users.json @@ -0,0 +1,390 @@ +[ + { + "uid": 0, + "name": "", + "mail": "", + "created": 0, + "access": 0, + "login": 0, + "status": 0, + "language": "", + "timezone": null, + "picture_fid": 0, + "roles": [], + "authored_pages": false + }, + { + "uid": 1, + "name": "stareagle", + "mail": "f********w@gmail.com", + "created": 1339538913, + "access": 1415918345, + "login": 1415918426, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 4, + "name": "ben", + "mail": "b****n@seas.upenn.edu", + "created": 1340252438, + "access": 1342203902, + "login": 1342203858, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [ + "super admin" + ], + "authored_pages": false, + "_mail_redacted": true + }, + { + "uid": 11, + "name": "bcohen", + "mail": "b*******2@gmail.com", + "created": 1342203764, + "access": 1435067089, + "login": 1434545939, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [ + "super admin" + ], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 13, + "name": "brian", + "mail": "b************5@gmail.com", + "created": 1342204265, + "access": 1395170530, + "login": 1395170301, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [ + "super admin" + ], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 26, + "name": "ME", + "mail": "t**************a@yahoo.com", + "created": 1344123145, + "access": 1346697640, + "login": 1346697640, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": false, + "_mail_redacted": true + }, + { + "uid": 27, + "name": "mlphilli", + "mail": "m******i@andrew.cmu.edu", + "created": 1344135111, + "access": 1407466755, + "login": 1407465912, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [ + "super admin" + ], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 28, + "name": "eduardo", + "mail": "l******9@gmail.com", + "created": 1344145538, + "access": 1344192121, + "login": 1344192121, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 31, + "name": "stevegray", + "mail": "s**********4@gmail.com", + "created": 1344439547, + "access": 0, + "login": 0, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 32, + "name": "jbutzke", + "mail": "j*****e@andrew.cmu.edu", + "created": 1344464473, + "access": 1425454185, + "login": 1425152419, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 25, + "roles": [ + "super admin" + ], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 33, + "name": "bneuman", + "mail": "b*****n@cs.cmu.edu", + "created": 1344490937, + "access": 1346809979, + "login": 1346807520, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 34, + "name": "venkatrn", + "mail": "v******n@andrew.cmu.edu", + "created": 1344545158, + "access": 1473694085, + "login": 1473694085, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 36, + "name": "adornbush", + "mail": "a*************h@gmail.com", + "created": 1346437222, + "access": 1453313748, + "login": 1452288727, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [ + "super admin" + ], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 648, + "name": "vhwang", + "mail": "v************g@gmail.com", + "created": 1370989196, + "access": 1386260017, + "login": 1386259747, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [ + "super admin" + ], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 1571, + "name": "test1", + "mail": "b***a@andrew.cmu.edu", + "created": 1382042879, + "access": 1382111491, + "login": 1382111541, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": false, + "_mail_redacted": true + }, + { + "uid": 1586, + "name": "hwang", + "mail": "h***1@andrew.cmu.edu", + "created": 1382111735, + "access": 1382116335, + "login": 1382116335, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 1587, + "name": "agmenon", + "mail": "a*******n@gmail.com", + "created": 1382111831, + "access": 1382112239, + "login": 1382112239, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 1588, + "name": "eratner", + "mail": "e**********r@gmail.com", + "created": 1382111904, + "access": 1382208407, + "login": 1382116572, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 1589, + "name": "cgao", + "mail": "y*****t@gmail.com", + "created": 1382111940, + "access": 1382114701, + "login": 1382112551, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 1590, + "name": "ksoonkyum", + "mail": "k**********m@gmail.com", + "created": 1382112019, + "access": 0, + "login": 0, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 1591, + "name": "skim", + "mail": "k***k@cmu.edu", + "created": 1382112048, + "access": 1382133482, + "login": 1382112135, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 1592, + "name": "aebtekar", + "mail": "a********h@gmail.com", + "created": 1382112072, + "access": 1382119593, + "login": 1382119593, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 1595, + "name": "sid", + "mail": "s*****s@gmail.com", + "created": 1382117167, + "access": 1383845635, + "login": 1382117484, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 1596, + "name": "kprasad", + "mail": "k*****d@seas.upenn.edu", + "created": 1382117290, + "access": 0, + "login": 0, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": true, + "_mail_redacted": true + }, + { + "uid": 1633, + "name": "rsafonov", + "mail": "r******v@nrec.ri.cmu.edu", + "created": 1382374795, + "access": 1383933904, + "login": 1383933983, + "status": 1, + "language": "", + "timezone": "America/New_York", + "picture_fid": 0, + "roles": [], + "authored_pages": true, + "_mail_redacted": true + } +] \ No newline at end of file diff --git a/static/archive/legacy-drupal/data/comments.json b/static/archive/legacy-drupal/data/comments.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/static/archive/legacy-drupal/data/comments.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/static/archive/legacy-drupal/data/contact_categories.json b/static/archive/legacy-drupal/data/contact_categories.json new file mode 100644 index 0000000..c63d512 --- /dev/null +++ b/static/archive/legacy-drupal/data/contact_categories.json @@ -0,0 +1,11 @@ +[ + { + "cid": 1, + "category": "Email Us", + "recipients": "b*******2@gmail.com", + "reply": "", + "weight": 0, + "selected": 1, + "_recipients_redacted": true + } +] \ No newline at end of file diff --git a/static/archive/legacy-drupal/data/drupal_variables.json b/static/archive/legacy-drupal/data/drupal_variables.json new file mode 100644 index 0000000..eadae3a --- /dev/null +++ b/static/archive/legacy-drupal/data/drupal_variables.json @@ -0,0 +1,554 @@ +{ + "additional_settings__active_tab_article": "edit-menu", + "admin_theme": "seven", + "anonymous": "anonymous", + "authorize_filetransfer_connection_settings_ftp": { + "username": "***REDACTED***", + "advanced": { + "hostname": "localhost", + "port": "21" + } + }, + "authorize_filetransfer_default": "ftp", + "block_cache": 0, + "cache": 0, + "cache_lifetime": "0", + "clean_url": 1, + "comment_anonymous_article": 0, + "comment_article": "2", + "comment_default_mode_article": 1, + "comment_default_per_page_article": "50", + "comment_form_location_article": 1, + "comment_page": 0, + "comment_preview_article": "1", + "comment_subject_field_article": 1, + "contact_default_status": 1, + "contact_form_blocks_site_wide_categories": { + "1": "1" + }, + "content_access_page": { + "view": [ + 1, + 2, + 3 + ], + "view_own": [ + 1, + 2, + 3 + ], + "per_node": 1, + "priority": "0" + }, + "cron_key": "***REDACTED***", + "cron_last": 1523040071, + "cron_safe_threshold": "3600", + "css_js_query_string": "nf1ur5", + "date_default_timezone": "America/New_York", + "dblog_row_limit": "1000000", + "default_nodes_main": "10", + "drupal_http_request_fails": false, + "drupal_private_key": "***REDACTED***", + "email__active_tab": "edit-email-admin-created", + "error_level": "2", + "field_bundle_settings_node__page": { + "view_modes": { + "teaser": { + "custom_settings": true + }, + "full": { + "custom_settings": false + }, + "rss": { + "custom_settings": false + }, + "search_index": { + "custom_settings": false + }, + "search_result": { + "custom_settings": false + } + }, + "extra_fields": { + "form": { + "title": { + "weight": "0" + } + }, + "display": [] + } + }, + "file_default_scheme": "public", + "file_extensions": "", + "file_private_path": "", + "file_public_path": "sites/default/files", + "file_temporary_path": "/tmp", + "filter_fallback_format": "plain_text", + "google_cse_cof_google": "FORID:1", + "google_cse_cof_here": "FORID:11", + "google_cse_cr": "", + "google_cse_cx": "014600116566457882338:du1gpat0foq ", + "google_cse_domain": "www.google.com", + "google_cse_gl": "", + "google_cse_hl": "", + "google_cse_ie": "", + "google_cse_locale_hl": 0, + "google_cse_locale_lr": 0, + "google_cse_lr": "", + "google_cse_oe": "", + "google_cse_results_display": "here", + "google_cse_results_gadget": 0, + "google_cse_results_prefix": "", + "google_cse_results_searchbox_width": "40", + "google_cse_results_suffix": "", + "google_cse_results_tab": "", + "google_cse_results_width": "600", + "google_cse_safe": "", + "google_cse_sitesearch": "", + "google_cse_sitesearch_default": 0, + "google_cse_sitesearch_form": "radios", + "google_cse_sitesearch_option": "", + "googleanalytics_account": "UA-34051775-1", + "googleanalytics_cache": 1, + "googleanalytics_codesnippet_after": "", + "googleanalytics_codesnippet_before": "", + "googleanalytics_cross_domains": "", + "googleanalytics_custom": "0", + "googleanalytics_custom_var": { + "slots": { + "1": { + "slot": 1, + "name": "", + "value": "", + "scope": "3" + }, + "2": { + "slot": 2, + "name": "", + "value": "", + "scope": "3" + }, + "3": { + "slot": 3, + "name": "", + "value": "", + "scope": "3" + }, + "4": { + "slot": 4, + "name": "", + "value": "", + "scope": "3" + }, + "5": { + "slot": 5, + "name": "", + "value": "", + "scope": "3" + } + } + }, + "googleanalytics_domain_mode": "0", + "googleanalytics_js_scope": "header", + "googleanalytics_last_cache": 1415914200, + "googleanalytics_pages": "", + "googleanalytics_privacy_donottrack": 1, + "googleanalytics_roles": { + "1": 0, + "2": 0, + "3": 0 + }, + "googleanalytics_site_search": 0, + "googleanalytics_trackadsense": 0, + "googleanalytics_tracker_anonymizeip": 0, + "googleanalytics_trackfiles": 1, + "googleanalytics_trackfiles_extensions": "7z|aac|arc|arj|asf|asx|avi|bin|csv|doc|exe|flv|gif|gz|gzip|hqx|jar|jpe?g|js|mp(2|3|4|e?g)|mov(ie)?|msi|msp|pdf|phps|png|ppt|qtm?|ra(m|r)?|sea|sit|tar|tgz|torrent|txt|wav|wma|wmv|wpd|xls|xml|z|zip", + "googleanalytics_trackmailto": 1, + "googleanalytics_trackoutbound": 1, + "googleanalytics_trackoutboundaspageview": 0, + "googleanalytics_visibility_pages": "0", + "googleanalytics_visibility_roles": "1", + "image_jpeg_quality": "75", + "image_toolkit": "gd", + "install_profile": "standard", + "install_task": "done", + "install_time": 1339539694, + "login_destination_immediate_redirect": 0, + "login_destination_preserve_destination": 0, + "mail_system": { + "default-system": "SmtpMailSystem" + }, + "maintenance_mode": false, + "maintenance_mode_message": "updating", + "menu_expanded": [], + "menu_masks": [ + 501, + 493, + 250, + 247, + 246, + 245, + 125, + 123, + 122, + 121, + 117, + 63, + 62, + 61, + 60, + 59, + 58, + 44, + 31, + 30, + 29, + 28, + 24, + 21, + 15, + 14, + 13, + 11, + 7, + 6, + 5, + 3, + 2, + 1 + ], + "menu_options_article": [ + "main-menu" + ], + "menu_parent_article": "main-menu:0", + "minimum_word_size": "3", + "node_admin_theme": "1", + "node_cron_last": "1464101202", + "node_options_article": [ + "status", + "promote" + ], + "node_options_page": [ + "status" + ], + "node_preview_article": "1", + "node_rank_comments": "0", + "node_rank_promote": "0", + "node_rank_recent": "0", + "node_rank_relevance": "0", + "node_rank_sticky": "0", + "node_submitted_article": 1, + "node_submitted_page": false, + "overlap_cjk": 1, + "page_cache_maximum_age": "0", + "page_compression": 1, + "path_alias_whitelist": { + "node": true + }, + "preprocess_css": 0, + "preprocess_js": 0, + "rules_event_whitelist": [], + "search_active_modules": { + "google_cse": "google_cse", + "node": "node", + "user": "user" + }, + "search_cron_limit": "100", + "search_default_module": "google_cse", + "site_403": "", + "site_404": "", + "site_default_country": "US", + "site_frontpage": "node/9", + "site_mail": "searchbasedplanninglibrary@gmail.com", + "site_name": "Search-Based Planning Lab", + "site_slogan": "", + "smtp_allowhtml": 1, + "smtp_debugging": 1, + "smtp_from": "searchbasedplanninglibrary@gmail.com", + "smtp_fromname": "", + "smtp_host": "smtp.gmail.com", + "smtp_hostbackup": "", + "smtp_library": "sites/all/modules/smtp/smtp.module", + "smtp_on": "1", + "smtp_password": "***REDACTED***", + "smtp_port": "465 ", + "smtp_protocol": "ssl", + "smtp_test_address": "", + "smtp_username": "searchbasedplanninglibrary@gmail.com", + "theme_STARTERKIT_settings": { + "toggle_logo": 1, + "toggle_name": 1, + "toggle_slogan": 1, + "toggle_node_user_picture": 1, + "toggle_comment_user_picture": 1, + "toggle_favicon": 1, + "toggle_main_menu": 1, + "toggle_secondary_menu": 1, + "default_logo": 0, + "logo_path": "sbpl_logo2.png", + "logo_upload": "", + "default_favicon": 0, + "favicon_path": "favicon.ico", + "favicon_upload": "", + "zen_breadcrumb": "yes", + "zen_breadcrumb_separator": " \u203a ", + "zen_breadcrumb_home": 1, + "zen_breadcrumb_trailing": 1, + "zen_breadcrumb_title": 0, + "zen_skip_link_anchor": "main-menu", + "zen_skip_link_text": "Jump to navigation", + "zen_html5_respond_meta": { + "respond": "respond", + "html5": "html5", + "meta": "meta" + }, + "zen_rebuild_registry": 1, + "zen_wireframes": 0, + "favicon_mimetype": "image/vnd.microsoft.icon" + }, + "theme_bartik_settings": { + "toggle_logo": 1, + "toggle_name": 1, + "toggle_slogan": 1, + "toggle_node_user_picture": 1, + "toggle_comment_user_picture": 1, + "toggle_comment_user_verification": 1, + "toggle_favicon": 1, + "toggle_main_menu": 1, + "toggle_secondary_menu": 1, + "default_logo": 0, + "logo_path": "public://sbpl_logo2_transparent_70percent.png", + "default_favicon": 0, + "favicon_path": "favicon.ico", + "favicon_upload": "", + "scheme": "default", + "palette": { + "top": "#0779bf", + "bottom": "#48a9e4", + "bg": "#ffffff", + "sidebar": "#f6f6f2", + "sidebarborders": "#f9f9f9", + "footer": "#292929", + "titleslogan": "#fffeff", + "text": "#3b3b3b", + "link": "#0071B3" + }, + "theme": "bartik", + "info": { + "fields": { + "top": "Header top", + "bottom": "Header bottom", + "bg": "Main background", + "sidebar": "Sidebar background", + "sidebarborders": "Sidebar borders", + "footer": "Footer background", + "titleslogan": "Title and slogan", + "text": "Text color", + "link": "Link color" + }, + "schemes": { + "default": { + "title": "Blue Lagoon (default)", + "colors": { + "top": "#0779bf", + "bottom": "#48a9e4", + "bg": "#ffffff", + "sidebar": "#f6f6f2", + "sidebarborders": "#f9f9f9", + "footer": "#292929", + "titleslogan": "#fffeff", + "text": "#3b3b3b", + "link": "#0071B3" + } + }, + "firehouse": { + "title": "Firehouse", + "colors": { + "top": "#cd2d2d", + "bottom": "#cf3535", + "bg": "#ffffff", + "sidebar": "#f1f4f0", + "sidebarborders": "#ededed", + "footer": "#1f1d1c", + "titleslogan": "#fffeff", + "text": "#3b3b3b", + "link": "#d6121f" + } + }, + "ice": { + "title": "Ice", + "colors": { + "top": "#d0d0d0", + "bottom": "#c2c4c5", + "bg": "#ffffff", + "sidebar": "#ffffff", + "sidebarborders": "#cccccc", + "footer": "#24272c", + "titleslogan": "#000000", + "text": "#4a4a4a", + "link": "#019dbf" + } + }, + "plum": { + "title": "Plum", + "colors": { + "top": "#4c1c58", + "bottom": "#593662", + "bg": "#fffdf7", + "sidebar": "#edede7", + "sidebarborders": "#e7e7e7", + "footer": "#2c2c28", + "titleslogan": "#ffffff", + "text": "#301313", + "link": "#9d408d" + } + }, + "slate": { + "title": "Slate", + "colors": { + "top": "#4a4a4a", + "bottom": "#4e4e4e", + "bg": "#ffffff", + "sidebar": "#ffffff", + "sidebarborders": "#d0d0d0", + "footer": "#161617", + "titleslogan": "#ffffff", + "text": "#3b3b3b", + "link": "#0073b6" + } + }, + "": { + "title": "Custom", + "colors": [] + } + }, + "css": [ + "css/colors.css" + ], + "copy": [ + "logo.png" + ], + "gradients": [ + { + "dimension": [ + 0, + 0, + 0, + 0 + ], + "direction": "vertical", + "colors": [ + "top", + "bottom" + ] + } + ], + "fill": [], + "slices": [], + "blend_target": "#ffffff", + "preview_css": "color/preview.css", + "preview_js": "color/preview.js", + "preview_html": "color/preview.html", + "base_image": "color/base.png" + }, + "favicon_mimetype": "image/vnd.microsoft.icon" + }, + "theme_default": "bartik", + "theme_lol_settings": { + "toggle_logo": 1, + "toggle_name": 1, + "toggle_slogan": 1, + "toggle_node_user_picture": 1, + "toggle_comment_user_picture": 1, + "toggle_favicon": 1, + "toggle_main_menu": 1, + "toggle_secondary_menu": 1, + "default_logo": 0, + "logo_path": "sbpl_logo2.png", + "logo_upload": "", + "default_favicon": 0, + "favicon_path": "favicon.ico", + "favicon_upload": "", + "zen_breadcrumb": "yes", + "zen_breadcrumb_separator": " \u203a ", + "zen_breadcrumb_home": 1, + "zen_breadcrumb_trailing": 1, + "zen_breadcrumb_title": 0, + "zen_skip_link_anchor": "main-menu", + "zen_skip_link_text": "Jump to navigation", + "zen_html5_respond_meta": { + "respond": "respond", + "html5": "html5", + "meta": "meta" + }, + "zen_rebuild_registry": 1, + "zen_wireframes": 0, + "favicon_mimetype": "image/vnd.microsoft.icon" + }, + "theme_zen_settings": { + "toggle_logo": 1, + "toggle_name": 1, + "toggle_slogan": 1, + "toggle_node_user_picture": 1, + "toggle_comment_user_picture": 1, + "toggle_comment_user_verification": 1, + "toggle_favicon": 1, + "toggle_main_menu": 1, + "toggle_secondary_menu": 1, + "default_logo": 0, + "logo_path": "sbpl_logo2.png", + "logo_upload": "", + "default_favicon": 0, + "favicon_path": "favicon.ico", + "favicon_upload": "", + "zen_breadcrumb": "yes", + "zen_breadcrumb_separator": " \u203a ", + "zen_breadcrumb_home": 1, + "zen_breadcrumb_trailing": 1, + "zen_breadcrumb_title": 0, + "zen_layout": "zen-responsive-sidebars", + "zen_skip_link_anchor": "main-menu", + "zen_skip_link_text": "Jump to navigation", + "zen_html5_respond_meta": { + "respond": "respond", + "html5": "html5", + "meta": "meta" + }, + "zen_rebuild_registry": 0, + "zen_wireframes": 1, + "favicon_mimetype": "image/vnd.microsoft.icon" + }, + "tracking__active_tab": "edit-domain-tracking", + "update_last_check": 1415682044, + "user_admin_role": "3", + "user_cancel_method": "user_cancel_block", + "user_email_verification": 1, + "user_mail_cancel_confirm_body": "[user:name],\r\n\r\nA request to cancel your account has been made at [site:name].\r\n\r\nYou may now cancel your account on [site:url-brief] by clicking this link or copying and pasting it into your browser:\r\n\r\n[user:cancel-url]\r\n\r\nNOTE: The cancellation of your account is not reversible.\r\n\r\nThis link expires in one day and nothing will happen if it is not used.\r\n\r\n-- [site:name] team", + "user_mail_cancel_confirm_subject": "Account cancellation request for [user:name] at [site:name]", + "user_mail_password_reset_body": "[user:name],\r\n\r\nA request to reset the password for your account has been made at [site:name].\r\n\r\nYou may now log in by clicking this link or copying and pasting it to your browser:\r\n\r\n[user:one-time-login-url]\r\n\r\nThis link can only be used once to log in and will lead you to a page where you can set your password. It expires after one day and nothing will happen if it's not used.\r\n\r\n-- [site:name] team", + "user_mail_password_reset_subject": "Replacement login information for [user:name] at [site:name]", + "user_mail_register_admin_created_body": "[user:name],\r\n\r\nA site administrator at [site:name] has created an account for you. You may now log in by clicking this link or copying and pasting it to your browser:\r\n\r\n[user:one-time-login-url]\r\n\r\nThis link can only be used once to log in and will lead you to a page where you can set your password.\r\n\r\nAfter setting your password, you will be able to log in at [site:login-url] in the future using:\r\n\r\nusername: [user:name]\r\npassword: Your password\r\n\r\n-- [site:name] team", + "user_mail_register_admin_created_subject": "An administrator created an account for you at [site:name]", + "user_mail_register_no_approval_required_body": "[user:name],\r\n\r\nThank you for registering at [site:name]. You may now log in by clicking this link or copying and pasting it to your browser:\r\n\r\n[user:one-time-login-url]\r\n\r\nThis link can only be used once to log in and will lead you to a page where you can set your password.\r\n\r\nAfter setting your password, you will be able to log in at [site:login-url] in the future using:\r\n\r\nusername: [user:name]\r\npassword: Your password\r\n\r\n-- [site:name] team", + "user_mail_register_no_approval_required_subject": "Account details for [user:name] at [site:name]", + "user_mail_register_pending_approval_body": "[user:name],\r\n\r\nThank you for registering at [site:name]. Your application for an account is currently pending approval. Once it has been approved, you will receive another e-mail containing information about how to log in, set your password, and other details.\r\n\r\n\r\n-- [site:name] team", + "user_mail_register_pending_approval_subject": "Account details for [user:name] at [site:name] (pending admin approval)", + "user_mail_status_activated_body": "[user:name],\r\n\r\nYour account at [site:name] has been activated.\r\n\r\nYou may now log in by clicking this link or copying and pasting it into your browser:\r\n\r\n[user:one-time-login-url]\r\n\r\nThis link can only be used once to log in and will lead you to a page where you can set your password.\r\n\r\nAfter setting your password, you will be able to log in at [site:login-url] in the future using:\r\n\r\nusername: [user:name]\r\npassword: Your password\r\n\r\n-- [site:name] team", + "user_mail_status_activated_notify": 1, + "user_mail_status_activated_subject": "Account details for [user:name] at [site:name] (approved)", + "user_mail_status_blocked_body": "[user:name],\r\n\r\nYour account on [site:name] has been blocked.\r\n\r\n-- [site:name] team", + "user_mail_status_blocked_notify": 0, + "user_mail_status_blocked_subject": "Account details for [user:name] at [site:name] (blocked)", + "user_mail_status_canceled_body": "[user:name],\r\n\r\nYour account on [site:name] has been canceled.\r\n\r\n-- [site:name] team", + "user_mail_status_canceled_notify": 0, + "user_mail_status_canceled_subject": "Account details for [user:name] at [site:name] (canceled)", + "user_picture_default": "", + "user_picture_dimensions": "1900x1200", + "user_picture_file_size": "1024104857", + "user_picture_guidelines": "", + "user_picture_path": "pictures", + "user_picture_style": "thumbnail", + "user_pictures": 0, + "user_register": "2", + "user_signatures": 0 +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/data/file_usage.json b/static/archive/legacy-drupal/data/file_usage.json new file mode 100644 index 0000000..8c08d54 --- /dev/null +++ b/static/archive/legacy-drupal/data/file_usage.json @@ -0,0 +1,23 @@ +[ + { + "fid": 3, + "module": "user", + "type": "user", + "id": 13, + "count": 1 + }, + { + "fid": 25, + "module": "user", + "type": "user", + "id": 32, + "count": 1 + }, + { + "fid": 26, + "module": "user", + "type": "user", + "id": 33, + "count": 1 + } +] \ No newline at end of file diff --git a/static/archive/legacy-drupal/data/files_managed.json b/static/archive/legacy-drupal/data/files_managed.json new file mode 100644 index 0000000..5da66e6 --- /dev/null +++ b/static/archive/legacy-drupal/data/files_managed.json @@ -0,0 +1,32 @@ +[ + { + "fid": 3, + "uid": 13, + "filename": "picture-13-1342204530.jpg", + "uri": "public://pictures/picture-13-1342204530.jpg", + "filemime": "image/jpeg", + "filesize": 480098, + "status": 1, + "timestamp": 1342204530 + }, + { + "fid": 25, + "uid": 32, + "filename": "picture-32-1344464691.jpg", + "uri": "public://pictures/picture-32-1344464691.jpg", + "filemime": "image/jpeg", + "filesize": 246438, + "status": 1, + "timestamp": 1344464691 + }, + { + "fid": 26, + "uid": 33, + "filename": "picture-33-1344493553.jpg", + "uri": "public://pictures/picture-33-1344493553.jpg", + "filemime": "image/jpeg", + "filesize": 9710, + "status": 1, + "timestamp": 1344493553 + } +] \ No newline at end of file diff --git a/static/archive/legacy-drupal/data/node_types.json b/static/archive/legacy-drupal/data/node_types.json new file mode 100644 index 0000000..34020b3 --- /dev/null +++ b/static/archive/legacy-drupal/data/node_types.json @@ -0,0 +1,32 @@ +[ + { + "type": "article", + "name": "Article", + "base": "node_content", + "module": "node", + "description": "Use articles for time-sensitive content like news, press releases or blog posts.", + "help": "", + "has_title": 1, + "title_label": "Title", + "custom": 1, + "modified": 1, + "locked": 0, + "disabled": 0, + "orig_type": "article" + }, + { + "type": "page", + "name": "Basic page", + "base": "node_content", + "module": "node", + "description": "Use basic pages for your static content, such as an 'About us' page.", + "help": "", + "has_title": 1, + "title_label": "Title", + "custom": 1, + "modified": 1, + "locked": 0, + "disabled": 0, + "orig_type": "page" + } +] \ No newline at end of file diff --git a/static/archive/legacy-drupal/data/page_field_image.json b/static/archive/legacy-drupal/data/page_field_image.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/static/archive/legacy-drupal/data/page_field_image.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/static/archive/legacy-drupal/data/page_field_page_file.json b/static/archive/legacy-drupal/data/page_field_page_file.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/static/archive/legacy-drupal/data/page_field_page_file.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/static/archive/legacy-drupal/data/page_field_tags.json b/static/archive/legacy-drupal/data/page_field_tags.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/static/archive/legacy-drupal/data/page_field_tags.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/static/archive/legacy-drupal/data/pages_index.csv b/static/archive/legacy-drupal/data/pages_index.csv new file mode 100644 index 0000000..e992602 --- /dev/null +++ b/static/archive/legacy-drupal/data/pages_index.csv @@ -0,0 +1,56 @@ +nid,title,type,created,updated,uid,slug,url_aliases,file_html,file_md,file_json +3,People,page,1340117914,1415994753,1,people,People,content/pages/0003-people.html,content/pages/0003-people.md,content/pages/0003-people.json +9,Home,page,1340166841,1434546172,1,home,Home,content/pages/0009-home.html,content/pages/0009-home.md,content/pages/0009-home.json +10,Publications,page,1340167429,1344455725,1,publications,Publications,content/pages/0010-publications.html,content/pages/0010-publications.md,content/pages/0010-publications.json +11,Videos,page,1340167533,1376604486,1,videos,Videos,content/pages/0011-videos.html,content/pages/0011-videos.md,content/pages/0011-videos.json +12,Robots,page,1340167840,1357941235,1,robots,Robots,content/pages/0012-robots.html,content/pages/0012-robots.md,content/pages/0012-robots.json +13,Ben Cohen,page,1341599028,1344290038,11,ben-cohen,BenCohen,content/pages/0013-ben-cohen.html,content/pages/0013-ben-cohen.md,content/pages/0013-ben-cohen.json +14,Brian MacAllister,page,1341599070,1344388676,13,brian-macallister,BrianMacAllister,content/pages/0014-brian-macallister.html,content/pages/0014-brian-macallister.md,content/pages/0014-brian-macallister.json +15,Andrew Dornbush,page,1341599102,1344135530,1,andrew-dornbush,AndrewDornbush,content/pages/0015-andrew-dornbush.html,content/pages/0015-andrew-dornbush.md,content/pages/0015-andrew-dornbush.json +16,Subhrajit Bhattacharya,page,1341599156,1344135548,1,subhrajit-bhattacharya,SubhrajitBhattacharya,content/pages/0016-subhrajit-bhattacharya.html,content/pages/0016-subhrajit-bhattacharya.md,content/pages/0016-subhrajit-bhattacharya.json +17,Jonathan Butzke,page,1341599235,1425152701,32,jonathan-butzke,JonathanButzke,content/pages/0017-jonathan-butzke.html,content/pages/0017-jonathan-butzke.md,content/pages/0017-jonathan-butzke.json +18,Chris Clingerman,page,1341599421,1344135561,1,chris-clingerman,ChrisClingerman,content/pages/0018-chris-clingerman.html,content/pages/0018-chris-clingerman.md,content/pages/0018-chris-clingerman.json +19,John Drake,page,1341599446,1344135568,1,john-drake,JohnDrake,content/pages/0019-john-drake.html,content/pages/0019-john-drake.md,content/pages/0019-john-drake.json +20,Steven Gray,page,1341599474,1344452675,31,steven-gray,StevenGray,content/pages/0020-steven-gray.html,content/pages/0020-steven-gray.md,content/pages/0020-steven-gray.json +21,Kalin Gochev,page,1341599493,1344135581,1,kalin-gochev,KalinGochev,content/pages/0021-kalin-gochev.html,content/pages/0021-kalin-gochev.md,content/pages/0021-kalin-gochev.json +22,Bradford Neuman,page,1341599525,1344493624,33,bradford-neuman,BradfordNeuman,content/pages/0022-bradford-neuman.html,content/pages/0022-bradford-neuman.md,content/pages/0022-bradford-neuman.json +23,Aline Normoyle,page,1341599547,1344135596,1,aline-normoyle,AlineNormoyle,content/pages/0023-aline-normoyle.html,content/pages/0023-aline-normoyle.md,content/pages/0023-aline-normoyle.json +24,Mike Phillips,page,1341599574,1345840108,27,mike-phillips,MikePhillips,content/pages/0024-mike-phillips.html,content/pages/0024-mike-phillips.md,content/pages/0024-mike-phillips.json +25,Venkatraman Narayanan,page,1341599594,1344545585,34,venkatraman-narayanan,VenkatramanNarayanan,content/pages/0025-venkatraman-narayanan.html,content/pages/0025-venkatraman-narayanan.md,content/pages/0025-venkatraman-narayanan.json +26,Alex Kushleyev,page,1341599726,1344135537,1,alex-kushleyev,AlexKushleyev,content/pages/0026-alex-kushleyev.html,content/pages/0026-alex-kushleyev.md,content/pages/0026-alex-kushleyev.json +27,Harsh Pandey,page,1341599759,1344135614,1,harsh-pandey,HarshPandey,content/pages/0027-harsh-pandey.html,content/pages/0027-harsh-pandey.md,content/pages/0027-harsh-pandey.json +28,Kavan McEachern,page,1341599780,1344135621,1,kavan-mceachern,KavanMcEachern,content/pages/0028-kavan-mceachern.html,content/pages/0028-kavan-mceachern.md,content/pages/0028-kavan-mceachern.json +29,Matthew Mac Allister,page,1341599803,1370637730,1,matthew-mac-allister,MatthewMacAllister,content/pages/0029-matthew-mac-allister.html,content/pages/0029-matthew-mac-allister.md,content/pages/0029-matthew-mac-allister.json +30,Contact,page,1341860373,1407243685,1,contact,Contact,content/pages/0030-contact.html,content/pages/0030-contact.md,content/pages/0030-contact.json +31,Login,page,1341861515,1344145057,1,login,Login,content/pages/0031-login.html,content/pages/0031-login.md,content/pages/0031-login.json +32,Software,page,1341862175,1452290132,1,software,Software,content/pages/0032-software.html,content/pages/0032-software.md,content/pages/0032-software.json +33,untitled-33,page,1341862226,1344633456,1,untitled-33,Files,content/pages/0033-untitled-33.html,content/pages/0033-untitled-33.md,content/pages/0033-untitled-33.json +39,Eduardo Barrera,page,1344136653,1344184701,28,eduardo-barrera,EduardoBarrera,content/pages/0039-eduardo-barrera.html,content/pages/0039-eduardo-barrera.md,content/pages/0039-eduardo-barrera.json +42,Old Software,page,1344526290,1344526321,1,old-software,OldSoftwarePage,content/pages/0042-old-software.html,content/pages/0042-old-software.md,content/pages/0042-old-software.json +43,Sandip Aine,page,1344546132,1344546132,1,sandip-aine,SandipAine,content/pages/0043-sandip-aine.html,content/pages/0043-sandip-aine.md,content/pages/0043-sandip-aine.json +44,Calendar,page,1344610832,1344656638,1,calendar,Calender,content/pages/0044-calendar.html,content/pages/0044-calendar.md,content/pages/0044-calendar.json +45,Tutorials,page,1366912385,1382110193,36,tutorials,Tutorials,content/pages/0045-tutorials.html,content/pages/0045-tutorials.md,content/pages/0045-tutorials.json +46,"Navigation with SBPL (in X, Y, Theta)",page,1367353102,1373331954,1,navigation-with-sbpl-in-x-y-theta,,content/pages/0046-navigation-with-sbpl-in-x-y-theta.html,content/pages/0046-navigation-with-sbpl-in-x-y-theta.md,content/pages/0046-navigation-with-sbpl-in-x-y-theta.json +47,SBPL overview,page,1367353485,1370995035,1,sbpl-overview,,content/pages/0047-sbpl-overview.html,content/pages/0047-sbpl-overview.md,content/pages/0047-sbpl-overview.json +48,Kinematic Constraints and Motion Primitives,page,1367353663,1373332005,1,kinematic-constraints-and-motion-primitives,,content/pages/0048-kinematic-constraints-and-motion-primitives.html,content/pages/0048-kinematic-constraints-and-motion-primitives.md,content/pages/0048-kinematic-constraints-and-motion-primitives.json +49,Primer to the Search-Based Planning Library (SBPL),page,1367356916,1367357394,1,primer-to-the-search-based-planning-library-sbpl,,content/pages/0049-primer-to-the-search-based-planning-library-sbpl.html,content/pages/0049-primer-to-the-search-based-planning-library-sbpl.md,content/pages/0049-primer-to-the-search-based-planning-library-sbpl.json +50,Primer to Search-Based Motion Planning,page,1370992592,1373331899,648,primer-to-search-based-motion-planning,,content/pages/0050-primer-to-search-based-motion-planning.html,content/pages/0050-primer-to-search-based-motion-planning.md,content/pages/0050-primer-to-search-based-motion-planning.json +51,"Planning with SBPL: Example in X, Y, Theta State Space",page,1370993106,1386260017,648,planning-with-sbpl-example-in-x-y-theta-state-space,,content/pages/0051-planning-with-sbpl-example-in-x-y-theta-state-space.html,content/pages/0051-planning-with-sbpl-example-in-x-y-theta-state-space.md,content/pages/0051-planning-with-sbpl-example-in-x-y-theta-state-space.json +52,Generating Motion Primitives with SBPL,page,1373327335,1373331662,648,generating-motion-primitives-with-sbpl,,content/pages/0052-generating-motion-primitives-with-sbpl.html,content/pages/0052-generating-motion-primitives-with-sbpl.md,content/pages/0052-generating-motion-primitives-with-sbpl.json +53,Forward Arc Motion Primitives,page,1377632966,1377704838,13,forward-arc-motion-primitives,,content/pages/0053-forward-arc-motion-primitives.html,content/pages/0053-forward-arc-motion-primitives.md,content/pages/0053-forward-arc-motion-primitives.json +54,"Building, Installing, and Using SBPL",page,1378234875,1382358322,36,building-installing-and-using-sbpl,,content/pages/0054-building-installing-and-using-sbpl.html,content/pages/0054-building-installing-and-using-sbpl.md,content/pages/0054-building-installing-and-using-sbpl.json +55,Arm Planning,page,1379455741,1380759273,11,arm-planning,sbpl_arm_planning,content/pages/0055-arm-planning.html,content/pages/0055-arm-planning.md,content/pages/0055-arm-planning.json +56,Aram Ebtekar,page,1382042307,1382112277,1592,aram-ebtekar,Aram Ebtekar,content/pages/0056-aram-ebtekar.html,content/pages/0056-aram-ebtekar.md,content/pages/0056-aram-ebtekar.json +57,Kush Prasad,page,1382043303,1382117324,1596,kush-prasad,Kush Prasad,content/pages/0057-kush-prasad.html,content/pages/0057-kush-prasad.md,content/pages/0057-kush-prasad.json +58,Sung-Kyun Kim,page,1382043402,1382112256,1591,sung-kyun-kim,Sung-Kyun Kim,content/pages/0058-sung-kyun-kim.html,content/pages/0058-sung-kyun-kim.md,content/pages/0058-sung-kyun-kim.json +59,Soonkyum Kim,page,1382043628,1382112221,1590,soonkyum-kim,Soonkyum Kim,content/pages/0059-soonkyum-kim.html,content/pages/0059-soonkyum-kim.md,content/pages/0059-soonkyum-kim.json +60,Siddharth Swaminathan,page,1382043736,1382117198,1595,siddharth-swaminathan,Siddharth Swaminathan,content/pages/0060-siddharth-swaminathan.html,content/pages/0060-siddharth-swaminathan.md,content/pages/0060-siddharth-swaminathan.json +61,Chen Gao,page,1382043949,1382112198,1589,chen-gao,Chen Gao,content/pages/0061-chen-gao.html,content/pages/0061-chen-gao.md,content/pages/0061-chen-gao.json +62,Ellis Ratner,page,1382044111,1382112175,1588,ellis-ratner,Ellis Ratner,content/pages/0062-ellis-ratner.html,content/pages/0062-ellis-ratner.md,content/pages/0062-ellis-ratner.json +63,Krishna Sapkota,page,1382044177,1382117363,13,krishna-sapkota,Krishna Sapkota,content/pages/0063-krishna-sapkota.html,content/pages/0063-krishna-sapkota.md,content/pages/0063-krishna-sapkota.json +64,Burak Yucesoy,page,1382044250,1382117341,13,burak-yucesoy,Burak Yucesoy,content/pages/0064-burak-yucesoy.html,content/pages/0064-burak-yucesoy.md,content/pages/0064-burak-yucesoy.json +65,Arjun Menon,page,1382044738,1382112300,1587,arjun-menon,Arjun Menon,content/pages/0065-arjun-menon.html,content/pages/0065-arjun-menon.md,content/pages/0065-arjun-menon.json +66,Hao Wang,page,1382044789,1382112106,1586,hao-wang,Hao Wang,content/pages/0066-hao-wang.html,content/pages/0066-hao-wang.md,content/pages/0066-hao-wang.json +67,Victor Hwang,page,1382044955,1382112369,648,victor-hwang,Victor Hwang,content/pages/0067-victor-hwang.html,content/pages/0067-victor-hwang.md,content/pages/0067-victor-hwang.json +68,Margarite Safonova,page,1382374632,1382374890,1633,margarite-safonova,Margarite Safonova,content/pages/0068-margarite-safonova.html,content/pages/0068-margarite-safonova.md,content/pages/0068-margarite-safonova.json +69,Discriminatively-guided Deliberative Perception for Pose Estimation of Multiple 3D Object Instances,page,1462225713,1464101202,34,discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances,Software/d2p,content/pages/0069-discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances.html,content/pages/0069-discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances.md,content/pages/0069-discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances.json diff --git a/static/archive/legacy-drupal/data/raw/README.md b/static/archive/legacy-drupal/data/raw/README.md new file mode 100644 index 0000000..6b7d585 --- /dev/null +++ b/static/archive/legacy-drupal/data/raw/README.md @@ -0,0 +1,38 @@ +# Legacy SBPL Raw Drupal SQL Dumps — Not Checked In + +The original sbpl.net `data/raw/` folder contained two MySQL dumps +totalling roughly **184 MB**: + +| File | Size | Date | Tables | +|------|------|------|--------| +| `dump-2018-04-12.sql` | ~161 MB | Apr 12, 2018 | 112 | +| `drupal_dump.sql` | ~23 MB | Nov 2014 | 88 | + +They are intentionally **not committed to this repository in the initial +import PR** because: + +1. Git LFS could not be configured in the migration environment (the + GitHub release-assets host required to download `git-lfs` was + unreachable), +2. Drupal dumps contain old `users` rows with hashed passwords, email + addresses, and 27 000+ spam-bot registrations from the open- + registration era — they should be reviewed and sanitised before + public re-publication, and +3. The content of the dumps has already been extracted into the + human-readable `archive/legacy-drupal/content/` and + `archive/legacy-drupal/data/` trees, which are committed. + +## To add the dumps via Git LFS (optional / private mirror only) + +```bash +git lfs install +git lfs track "static/archive/legacy-drupal/data/raw/*.sql" +git add .gitattributes +git add static/archive/legacy-drupal/data/raw/*.sql +git commit -m "chore(archive): add raw Drupal SQL dumps via LFS" +git push +``` + +If publishing publicly, please first strip the `users`, `sessions`, +and `comments` tables (or at least the password / mail / IP columns) +so the dumps are safe to share. diff --git a/static/archive/legacy-drupal/data/roles.json b/static/archive/legacy-drupal/data/roles.json new file mode 100644 index 0000000..cb405c3 --- /dev/null +++ b/static/archive/legacy-drupal/data/roles.json @@ -0,0 +1,174 @@ +[ + { + "rid": 1, + "name": "anonymous user", + "weight": 0, + "permissions": [ + "access comments", + "access content", + "access site-wide contact form", + "search Google CSE", + "use text format filtered_html" + ] + }, + { + "rid": 2, + "name": "authenticated user", + "weight": 1, + "permissions": [ + "access comments", + "access content", + "access content overview", + "access contextual links", + "access site-wide contact form", + "access toolbar", + "administer blocks", + "administer ckeditor", + "administer image styles", + "administer url aliases", + "allow CKFinder file uploads", + "cancel account", + "change own username", + "create article content", + "create page content", + "create url aliases", + "customize ckeditor", + "delete own article content", + "delete own page content", + "delete revisions", + "edit own article content", + "edit own comments", + "edit own page content", + "post comments", + "revert revisions", + "search Google CSE", + "skip comment approval", + "use text format filtered_html", + "use text format full_html", + "use text format php_code", + "view own unpublished content", + "view revisions" + ] + }, + { + "rid": 3, + "name": "super admin", + "weight": 2, + "permissions": [ + "access administration pages", + "access comments", + "access content", + "access content overview", + "access contextual links", + "access dashboard", + "access jupload", + "access overlay", + "access rules debug", + "access site in maintenance mode", + "access site reports", + "access site-wide contact form", + "access toolbar", + "access user contact forms", + "access user profiles", + "administer actions", + "administer blocks", + "administer ckeditor", + "administer comments", + "administer contact forms", + "administer content types", + "administer filters", + "administer google analytics", + "administer image styles", + "administer menu", + "administer modules", + "administer nodes", + "administer permissions", + "administer rules", + "administer search", + "administer shortcuts", + "administer site configuration", + "administer smtp module", + "administer software updates", + "administer taxonomy", + "administer themes", + "administer url aliases", + "administer users", + "allow CKFinder file uploads", + "block IP addresses", + "bypass node access", + "bypass rules access", + "cancel account", + "change own username", + "create article content", + "create page content", + "create url aliases", + "customize ckeditor", + "customize shortcut links", + "delete any article content", + "delete any page content", + "delete own article content", + "delete own page content", + "delete revisions", + "delete terms in 1", + "edit any article content", + "edit any page content", + "edit own article content", + "edit own comments", + "edit own page content", + "edit terms in 1", + "grant content access", + "grant own content access", + "opt-in or out of tracking", + "post comments", + "revert revisions", + "search Google CSE", + "search content", + "select account cancellation method", + "skip comment approval", + "switch shortcut sets", + "use PHP for settings", + "use PHP for tracking visibility", + "use advanced search", + "use text format filtered_html", + "use text format full_html", + "use text format php_code", + "view own unpublished content", + "view revisions", + "view the administration theme" + ] + }, + { + "rid": 1000, + "name": "megauser", + "weight": 999, + "permissions": [ + "access administration pages", + "access content", + "access content overview", + "access site in maintenance mode", + "access site reports", + "access user profiles", + "administer actions", + "administer blocks", + "administer content types", + "administer filters", + "administer modules", + "administer nodes", + "administer permissions", + "administer site configuration", + "administer software updates", + "administer themes", + "administer users", + "block IP addresses", + "bypass node access", + "cancel account", + "change own username", + "delete revisions", + "revert revisions", + "select account cancellation method", + "view own unpublished content", + "view revisions", + "view the administration theme" + ] + } +] \ No newline at end of file diff --git a/static/archive/legacy-drupal/data/taxonomy.json b/static/archive/legacy-drupal/data/taxonomy.json new file mode 100644 index 0000000..f0225e6 --- /dev/null +++ b/static/archive/legacy-drupal/data/taxonomy.json @@ -0,0 +1,15 @@ +{ + "vocabularies": [ + { + "vid": 1, + "name": "Tags", + "machine_name": "tags", + "description": "Use tags to group articles on similar topics into categories.", + "hierarchy": 0, + "module": "taxonomy", + "weight": 0 + } + ], + "terms": [], + "node_tags": [] +} \ No newline at end of file diff --git a/static/archive/legacy-drupal/data/text_formats.json b/static/archive/legacy-drupal/data/text_formats.json new file mode 100644 index 0000000..efc49f8 --- /dev/null +++ b/static/archive/legacy-drupal/data/text_formats.json @@ -0,0 +1,222 @@ +[ + { + "format": "filtered_html", + "name": "Filtered HTML", + "status": 1, + "cache": 1, + "weight": 0, + "filters": [ + { + "format": "filtered_html", + "module": "filter", + "name": "filter_html_escape", + "weight": -10, + "status": 0, + "settings": "a:0:{}" + }, + { + "format": "filtered_html", + "module": "filter", + "name": "filter_url", + "weight": 0, + "status": 1, + "settings": "a:1:{s:17:\"filter_url_length\";i:72;}" + }, + { + "format": "filtered_html", + "module": "filter", + "name": "filter_html", + "weight": 1, + "status": 1, + "settings": "a:3:{s:12:\"allowed_html\";s:74:\"

    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 literal 0 HcmV?d00001 From d78d48e6e48b01f59f194b2e06156eca64ee48e4 Mon Sep 17 00:00:00 2001 From: PegasusGTV Date: Mon, 11 May 2026 18:35:11 -0400 Subject: [PATCH 2/7] feat(archive): import verbatim sbpl.net Drupal snapshot under /archive/legacy-drupal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop the cleaned, extracted snapshot of the old Drupal 7 site (sbpl.net, last DB dump from Apr 2018) into `static/archive/legacy-drupal/` so it ships with the published site at `/archive/legacy-drupal/...`. This is what the Tutorials page and the cross-links from imported content rely on. Inventory (~31 MB on disk): - `content/pages/` — 55 page triplets (.md / .html / .json) including the original Home, People, Robots, Software, Tutorials, and 25 individual member pages. - `content/blocks/` — 2 custom HTML blocks (private/public file upload forms). The plaintext `username: sbpl password: arastar` credentials in `001-private-files.*` have been REDACTED — the old `/private/SBPL/` upload endpoint is offline. - `content/users.json`, `content/menus.json`, `content/site_variables.json` — Drupal user list (passwords already stripped upstream, emails masked here), navigation tree, curated site variables. - `data/` — taxonomy, file-managed, file-usage, roles, permissions, comments, text formats, page-field tables, and 180 Drupal variables. - `media/images/` — 77 source images + 77 thumbnails (~22 MB). - `media/logos/` — SBPL logo (transparent + 70% variant). - `media/pictures/` — 3 user-avatar pictures. - `media/uploads/` — misc Drupal uploads (~7 MB), plus `media/uploads/SBPL/{sbpl.tar.gz,sbpl.zip}` — the legacy software download tarballs (kept; they're public). - `reference/` — original Drupal `settings.php` (DB password already redacted upstream) and the install procedure. - `scripts/` — the Python 3 stdlib-only extractor/manifest scripts so the dumps can be re-extracted from scratch. Redactions applied before commit (see `static/archive/legacy-drupal/README.md` for the full list): - `content/users.json` — email local-parts partially masked. - `data/drupal_variables.json` — `cron_key`, `drupal_private_key`, `smtp_password`, FTP `username` replaced with `***REDACTED***`. - `data/contact_categories.json` — contact-form recipient masked. - `content/pages/0030-contact.*` — `andrew.dornbush@gmail.com` masked. Two large subtrees are NOT committed here because the migration environment couldn't install git-lfs: - `media/videos/` — ~559 MB of 5 .mp4 files - `data/raw/` — ~184 MB of 2 raw MySQL dumps Both folders have a stub README explaining what's missing and how to add the files via Git LFS. The repo's `.gitattributes` already declares those paths as LFS-tracked so dropping the files in and committing will Just Work. See `LEGACY_LFS.md` at the repo root for the full follow-up checklist (including a note on the free 1 GB LFS quota and the option of moving the large blobs out of `static/` to keep them out of every GitHub-Pages build clone). Co-authored-by: Cursor --- .gitattributes | 4 + LEGACY_LFS.md | 71 + static/archive/legacy-drupal/README.md | 175 ++ .../content/blocks/001-private-files.html | 8 + .../content/blocks/001-private-files.json | 10 + .../content/blocks/001-private-files.md | 6 + .../content/blocks/002-publicfiles.html | 7 + .../content/blocks/002-publicfiles.json | 9 + .../content/blocks/002-publicfiles.md | 3 + .../legacy-drupal/content/blocks_index.json | 20 + .../archive/legacy-drupal/content/menus.json | 910 +++++++++ .../content/pages/0003-people.html | 61 + .../content/pages/0003-people.json | 27 + .../content/pages/0003-people.md | 91 + .../content/pages/0009-home.html | 21 + .../content/pages/0009-home.json | 27 + .../legacy-drupal/content/pages/0009-home.md | 11 + .../content/pages/0010-publications.html | 7 + .../content/pages/0010-publications.json | 27 + .../content/pages/0010-publications.md | 3 + .../content/pages/0011-videos.html | 133 ++ .../content/pages/0011-videos.json | 27 + .../content/pages/0011-videos.md | 55 + .../content/pages/0012-robots.html | 26 + .../content/pages/0012-robots.json | 27 + .../content/pages/0012-robots.md | 23 + .../content/pages/0013-ben-cohen.html | 7 + .../content/pages/0013-ben-cohen.json | 27 + .../content/pages/0013-ben-cohen.md | 3 + .../content/pages/0014-brian-macallister.html | 9 + .../content/pages/0014-brian-macallister.json | 27 + .../content/pages/0014-brian-macallister.md | 5 + .../content/pages/0015-andrew-dornbush.html | 7 + .../content/pages/0015-andrew-dornbush.json | 27 + .../content/pages/0015-andrew-dornbush.md | 3 + .../pages/0016-subhrajit-bhattacharya.html | 7 + .../pages/0016-subhrajit-bhattacharya.json | 27 + .../pages/0016-subhrajit-bhattacharya.md | 3 + .../content/pages/0017-jonathan-butzke.html | 59 + .../content/pages/0017-jonathan-butzke.json | 27 + .../content/pages/0017-jonathan-butzke.md | 43 + .../content/pages/0018-chris-clingerman.html | 7 + .../content/pages/0018-chris-clingerman.json | 27 + .../content/pages/0018-chris-clingerman.md | 3 + .../content/pages/0019-john-drake.html | 7 + .../content/pages/0019-john-drake.json | 27 + .../content/pages/0019-john-drake.md | 3 + .../content/pages/0020-steven-gray.html | 7 + .../content/pages/0020-steven-gray.json | 27 + .../content/pages/0020-steven-gray.md | 3 + .../content/pages/0021-kalin-gochev.html | 7 + .../content/pages/0021-kalin-gochev.json | 27 + .../content/pages/0021-kalin-gochev.md | 3 + .../content/pages/0022-bradford-neuman.html | 8 + .../content/pages/0022-bradford-neuman.json | 27 + .../content/pages/0022-bradford-neuman.md | 5 + .../content/pages/0023-aline-normoyle.html | 7 + .../content/pages/0023-aline-normoyle.json | 27 + .../content/pages/0023-aline-normoyle.md | 3 + .../content/pages/0024-mike-phillips.html | 7 + .../content/pages/0024-mike-phillips.json | 27 + .../content/pages/0024-mike-phillips.md | 3 + .../pages/0025-venkatraman-narayanan.html | 7 + .../pages/0025-venkatraman-narayanan.json | 27 + .../pages/0025-venkatraman-narayanan.md | 3 + .../content/pages/0026-alex-kushleyev.html | 7 + .../content/pages/0026-alex-kushleyev.json | 27 + .../content/pages/0026-alex-kushleyev.md | 3 + .../content/pages/0027-harsh-pandey.html | 7 + .../content/pages/0027-harsh-pandey.json | 27 + .../content/pages/0027-harsh-pandey.md | 3 + .../content/pages/0028-kavan-mceachern.html | 7 + .../content/pages/0028-kavan-mceachern.json | 27 + .../content/pages/0028-kavan-mceachern.md | 3 + .../pages/0029-matthew-mac-allister.html | 7 + .../pages/0029-matthew-mac-allister.json | 27 + .../pages/0029-matthew-mac-allister.md | 3 + .../content/pages/0030-contact.html | 22 + .../content/pages/0030-contact.json | 27 + .../content/pages/0030-contact.md | 16 + .../content/pages/0031-login.html | 6 + .../content/pages/0031-login.json | 27 + .../legacy-drupal/content/pages/0031-login.md | 3 + .../content/pages/0032-software.html | 229 +++ .../content/pages/0032-software.json | 27 + .../content/pages/0032-software.md | 222 +++ .../content/pages/0033-untitled-33.html | 7 + .../content/pages/0033-untitled-33.json | 27 + .../content/pages/0033-untitled-33.md | 3 + .../content/pages/0039-eduardo-barrera.html | 7 + .../content/pages/0039-eduardo-barrera.json | 27 + .../content/pages/0039-eduardo-barrera.md | 3 + .../content/pages/0042-old-software.html | 60 + .../content/pages/0042-old-software.json | 27 + .../content/pages/0042-old-software.md | 26 + .../content/pages/0043-sandip-aine.html | 7 + .../content/pages/0043-sandip-aine.json | 27 + .../content/pages/0043-sandip-aine.md | 3 + .../content/pages/0044-calendar.html | 7 + .../content/pages/0044-calendar.json | 27 + .../content/pages/0044-calendar.md | 3 + .../content/pages/0045-tutorials.html | 28 + .../content/pages/0045-tutorials.json | 27 + .../content/pages/0045-tutorials.md | 29 + ...046-navigation-with-sbpl-in-x-y-theta.html | 14 + ...046-navigation-with-sbpl-in-x-y-theta.json | 25 + .../0046-navigation-with-sbpl-in-x-y-theta.md | 15 + .../content/pages/0047-sbpl-overview.html | 32 + .../content/pages/0047-sbpl-overview.json | 25 + .../content/pages/0047-sbpl-overview.md | 35 + ...tic-constraints-and-motion-primitives.html | 12 + ...tic-constraints-and-motion-primitives.json | 25 + ...matic-constraints-and-motion-primitives.md | 13 + ...he-search-based-planning-library-sbpl.html | 48 + ...he-search-based-planning-library-sbpl.json | 25 + ...-the-search-based-planning-library-sbpl.md | 47 + ...rimer-to-search-based-motion-planning.html | 30 + ...rimer-to-search-based-motion-planning.json | 25 + ...-primer-to-search-based-motion-planning.md | 49 + ...sbpl-example-in-x-y-theta-state-space.html | 63 + ...sbpl-example-in-x-y-theta-state-space.json | 25 + ...h-sbpl-example-in-x-y-theta-state-space.md | 76 + ...enerating-motion-primitives-with-sbpl.html | 109 ++ ...enerating-motion-primitives-with-sbpl.json | 25 + ...-generating-motion-primitives-with-sbpl.md | 152 ++ .../0053-forward-arc-motion-primitives.html | 536 ++++++ .../0053-forward-arc-motion-primitives.json | 25 + .../0053-forward-arc-motion-primitives.md | 271 +++ ...54-building-installing-and-using-sbpl.html | 74 + ...54-building-installing-and-using-sbpl.json | 25 + ...0054-building-installing-and-using-sbpl.md | 118 ++ .../content/pages/0055-arm-planning.html | 128 ++ .../content/pages/0055-arm-planning.json | 27 + .../content/pages/0055-arm-planning.md | 89 + .../content/pages/0056-aram-ebtekar.html | 7 + .../content/pages/0056-aram-ebtekar.json | 27 + .../content/pages/0056-aram-ebtekar.md | 3 + .../content/pages/0057-kush-prasad.html | 7 + .../content/pages/0057-kush-prasad.json | 27 + .../content/pages/0057-kush-prasad.md | 3 + .../content/pages/0058-sung-kyun-kim.html | 7 + .../content/pages/0058-sung-kyun-kim.json | 27 + .../content/pages/0058-sung-kyun-kim.md | 3 + .../content/pages/0059-soonkyum-kim.html | 7 + .../content/pages/0059-soonkyum-kim.json | 27 + .../content/pages/0059-soonkyum-kim.md | 3 + .../pages/0060-siddharth-swaminathan.html | 7 + .../pages/0060-siddharth-swaminathan.json | 27 + .../pages/0060-siddharth-swaminathan.md | 3 + .../content/pages/0061-chen-gao.html | 7 + .../content/pages/0061-chen-gao.json | 27 + .../content/pages/0061-chen-gao.md | 3 + .../content/pages/0062-ellis-ratner.html | 7 + .../content/pages/0062-ellis-ratner.json | 27 + .../content/pages/0062-ellis-ratner.md | 3 + .../content/pages/0063-krishna-sapkota.html | 7 + .../content/pages/0063-krishna-sapkota.json | 27 + .../content/pages/0063-krishna-sapkota.md | 3 + .../content/pages/0064-burak-yucesoy.html | 7 + .../content/pages/0064-burak-yucesoy.json | 27 + .../content/pages/0064-burak-yucesoy.md | 3 + .../content/pages/0065-arjun-menon.html | 7 + .../content/pages/0065-arjun-menon.json | 27 + .../content/pages/0065-arjun-menon.md | 3 + .../content/pages/0066-hao-wang.html | 7 + .../content/pages/0066-hao-wang.json | 27 + .../content/pages/0066-hao-wang.md | 3 + .../content/pages/0067-victor-hwang.html | 7 + .../content/pages/0067-victor-hwang.json | 27 + .../content/pages/0067-victor-hwang.md | 3 + .../pages/0068-margarite-safonova.html | 7 + .../pages/0068-margarite-safonova.json | 27 + .../content/pages/0068-margarite-safonova.md | 3 + ...ation-of-multiple-3d-object-instances.html | 14 + ...ation-of-multiple-3d-object-instances.json | 27 + ...imation-of-multiple-3d-object-instances.md | 3 + .../legacy-drupal/content/site_variables.json | 14 + .../archive/legacy-drupal/content/users.json | 390 ++++ .../archive/legacy-drupal/data/comments.json | 1 + .../data/contact_categories.json | 11 + .../legacy-drupal/data/drupal_variables.json | 554 ++++++ .../legacy-drupal/data/file_usage.json | 23 + .../legacy-drupal/data/files_managed.json | 32 + .../legacy-drupal/data/node_types.json | 32 + .../legacy-drupal/data/page_field_image.json | 1 + .../data/page_field_page_file.json | 1 + .../legacy-drupal/data/page_field_tags.json | 1 + .../legacy-drupal/data/pages_index.csv | 56 + .../archive/legacy-drupal/data/raw/README.md | 38 + static/archive/legacy-drupal/data/roles.json | 174 ++ .../archive/legacy-drupal/data/taxonomy.json | 15 + .../legacy-drupal/data/text_formats.json | 222 +++ .../legacy-drupal/data/url_aliases.json | 651 +++++++ static/archive/legacy-drupal/manifest.md | 423 +++++ .../legacy-drupal/media/images/17K4g.png | Bin 0 -> 681842 bytes .../legacy-drupal/media/images/1FghC.gif | Bin 0 -> 1909081 bytes .../legacy-drupal/media/images/1IOLc.png | Bin 0 -> 695423 bytes .../media/images/2012-07-05-212032.jpg | Bin 0 -> 132566 bytes .../legacy-drupal/media/images/2822.jpg | Bin 0 -> 81165 bytes .../legacy-drupal/media/images/2uktC.png | Bin 0 -> 63702 bytes .../legacy-drupal/media/images/3ptkg6.jpg | Bin 0 -> 138002 bytes .../legacy-drupal/media/images/3pyrjf(1).jpg | Bin 0 -> 90636 bytes .../legacy-drupal/media/images/3pyrjf.jpg | Bin 0 -> 90636 bytes .../legacy-drupal/media/images/4ty7b.jpg | Bin 0 -> 370490 bytes .../legacy-drupal/media/images/9oIuo.jpg | Bin 0 -> 66882 bytes .../legacy-drupal/media/images/Awesome.png | Bin 0 -> 188161 bytes .../media/images/BasePrim(1).jpg | Bin 0 -> 194990 bytes .../legacy-drupal/media/images/BasePrim.jpg | Bin 0 -> 194990 bytes .../legacy-drupal/media/images/DSC00420.JPG | Bin 0 -> 144071 bytes .../legacy-drupal/media/images/IMG_2895.JPG | Bin 0 -> 2227052 bytes .../media/images/IMG_2895_small.jpeg | Bin 0 -> 14898 bytes .../legacy-drupal/media/images/IMG_2896.JPG | Bin 0 -> 2432695 bytes .../media/images/IMG_2896_small.jpeg | Bin 0 -> 17711 bytes .../legacy-drupal/media/images/IMG_2897.JPG | Bin 0 -> 2355629 bytes .../media/images/IMG_2897_small.jpeg | Bin 0 -> 26447 bytes .../media/images/LatextDoc10x.png | Bin 0 -> 399 bytes .../media/images/LatextDoc110x.png | Bin 0 -> 364 bytes .../media/images/LatextDoc111x.png | Bin 0 -> 192 bytes .../media/images/LatextDoc112x.png | Bin 0 -> 209 bytes .../media/images/LatextDoc113x.png | Bin 0 -> 1948 bytes .../media/images/LatextDoc114x.png | Bin 0 -> 1354 bytes .../media/images/LatextDoc115x.png | Bin 0 -> 254 bytes .../media/images/LatextDoc116x.png | Bin 0 -> 262 bytes .../media/images/LatextDoc117x.png | Bin 0 -> 1632 bytes .../media/images/LatextDoc118x.png | Bin 0 -> 1425 bytes .../media/images/LatextDoc119x.png | Bin 0 -> 1653 bytes .../media/images/LatextDoc11x.png | Bin 0 -> 879 bytes .../media/images/LatextDoc120x.png | Bin 0 -> 2421 bytes .../media/images/LatextDoc121x.png | Bin 0 -> 210 bytes .../media/images/LatextDoc122x.png | Bin 0 -> 2545 bytes .../media/images/LatextDoc123x.png | Bin 0 -> 1654 bytes .../media/images/LatextDoc124x.png | Bin 0 -> 2375 bytes .../media/images/LatextDoc125x.png | Bin 0 -> 997 bytes .../media/images/LatextDoc126x.png | Bin 0 -> 349 bytes .../media/images/LatextDoc127x.png | Bin 0 -> 201 bytes .../media/images/LatextDoc128x.png | Bin 0 -> 210 bytes .../media/images/LatextDoc129x.png | Bin 0 -> 781 bytes .../media/images/LatextDoc12x.png | Bin 0 -> 197 bytes .../media/images/LatextDoc130x.png | Bin 0 -> 207 bytes .../media/images/LatextDoc131x.png | Bin 0 -> 406 bytes .../media/images/LatextDoc13x.png | Bin 0 -> 197 bytes .../media/images/LatextDoc14x.png | Bin 0 -> 197 bytes .../media/images/LatextDoc15x.png | Bin 0 -> 272 bytes .../media/images/LatextDoc16x.png | Bin 0 -> 221 bytes .../media/images/LatextDoc17x.png | Bin 0 -> 226 bytes .../media/images/LatextDoc18x.png | Bin 0 -> 197 bytes .../media/images/LatextDoc19x.png | Bin 0 -> 197 bytes .../legacy-drupal/media/images/MC-UAV-1-2.jpg | Bin 0 -> 46305 bytes .../media/images/MC-UAV-1-2_small.jpeg | Bin 0 -> 6009 bytes .../legacy-drupal/media/images/MC-UAV-3.jpg | Bin 0 -> 742730 bytes .../media/images/MotionPrimitives.jpg | Bin 0 -> 262686 bytes .../legacy-drupal/media/images/PathGen.jpg | Bin 0 -> 44657 bytes .../media/images/Screenshot-69.png | Bin 0 -> 723929 bytes .../legacy-drupal/media/images/Screenshot.png | Bin 0 -> 142135 bytes .../legacy-drupal/media/images/VdayFinal.jpg | Bin 0 -> 4853239 bytes .../media/images/VdayFinal_small.jpeg | Bin 0 -> 30888 bytes .../media/images/_thumbs/17K4g.png | Bin 0 -> 13802 bytes .../media/images/_thumbs/1FghC.gif | Bin 0 -> 5962 bytes .../media/images/_thumbs/1IOLc.png | Bin 0 -> 17076 bytes .../images/_thumbs/2012-07-05-212032.jpg | Bin 0 -> 1614 bytes .../media/images/_thumbs/2822.jpg | Bin 0 -> 3265 bytes .../media/images/_thumbs/2uktC.png | Bin 0 -> 9287 bytes .../media/images/_thumbs/3ptkg6.jpg | Bin 0 -> 3983 bytes .../media/images/_thumbs/3pyrjf(1).jpg | Bin 0 -> 3437 bytes .../media/images/_thumbs/3pyrjf.jpg | Bin 0 -> 3437 bytes .../media/images/_thumbs/4ty7b.jpg | Bin 0 -> 1436 bytes .../media/images/_thumbs/9oIuo.jpg | Bin 0 -> 3704 bytes .../media/images/_thumbs/Awesome.png | Bin 0 -> 10960 bytes .../media/images/_thumbs/BasePrim(1).jpg | Bin 0 -> 1259 bytes .../media/images/_thumbs/BasePrim.jpg | Bin 0 -> 1259 bytes .../media/images/_thumbs/DSC00420.JPG | Bin 0 -> 3711 bytes .../media/images/_thumbs/IMG_2895.JPG | Bin 0 -> 2175 bytes .../media/images/_thumbs/IMG_2895_small.jpeg | Bin 0 -> 2159 bytes .../media/images/_thumbs/IMG_2896.JPG | Bin 0 -> 2653 bytes .../media/images/_thumbs/IMG_2896_small.jpeg | Bin 0 -> 2653 bytes .../media/images/_thumbs/IMG_2897.JPG | Bin 0 -> 2745 bytes .../media/images/_thumbs/IMG_2897_small.jpeg | Bin 0 -> 2714 bytes .../media/images/_thumbs/LatextDoc10x.png | Bin 0 -> 399 bytes .../media/images/_thumbs/LatextDoc110x.png | Bin 0 -> 364 bytes .../media/images/_thumbs/LatextDoc111x.png | Bin 0 -> 192 bytes .../media/images/_thumbs/LatextDoc112x.png | Bin 0 -> 209 bytes .../media/images/_thumbs/LatextDoc113x.png | Bin 0 -> 1462 bytes .../media/images/_thumbs/LatextDoc114x.png | Bin 0 -> 1136 bytes .../media/images/_thumbs/LatextDoc115x.png | Bin 0 -> 254 bytes .../media/images/_thumbs/LatextDoc116x.png | Bin 0 -> 262 bytes .../media/images/_thumbs/LatextDoc117x.png | Bin 0 -> 3107 bytes .../media/images/_thumbs/LatextDoc118x.png | Bin 0 -> 1640 bytes .../media/images/_thumbs/LatextDoc119x.png | Bin 0 -> 3126 bytes .../media/images/_thumbs/LatextDoc11x.png | Bin 0 -> 1479 bytes .../media/images/_thumbs/LatextDoc120x.png | Bin 0 -> 2933 bytes .../media/images/_thumbs/LatextDoc121x.png | Bin 0 -> 210 bytes .../media/images/_thumbs/LatextDoc122x.png | Bin 0 -> 2186 bytes .../media/images/_thumbs/LatextDoc123x.png | Bin 0 -> 3586 bytes .../media/images/_thumbs/LatextDoc124x.png | Bin 0 -> 2863 bytes .../media/images/_thumbs/LatextDoc125x.png | Bin 0 -> 1332 bytes .../media/images/_thumbs/LatextDoc126x.png | Bin 0 -> 349 bytes .../media/images/_thumbs/LatextDoc127x.png | Bin 0 -> 201 bytes .../media/images/_thumbs/LatextDoc128x.png | Bin 0 -> 210 bytes .../media/images/_thumbs/LatextDoc129x.png | Bin 0 -> 1633 bytes .../media/images/_thumbs/LatextDoc12x.png | Bin 0 -> 197 bytes .../media/images/_thumbs/LatextDoc130x.png | Bin 0 -> 207 bytes .../media/images/_thumbs/LatextDoc131x.png | Bin 0 -> 406 bytes .../media/images/_thumbs/LatextDoc13x.png | Bin 0 -> 197 bytes .../media/images/_thumbs/LatextDoc14x.png | Bin 0 -> 197 bytes .../media/images/_thumbs/LatextDoc15x.png | Bin 0 -> 272 bytes .../media/images/_thumbs/LatextDoc16x.png | Bin 0 -> 221 bytes .../media/images/_thumbs/LatextDoc17x.png | Bin 0 -> 226 bytes .../media/images/_thumbs/LatextDoc18x.png | Bin 0 -> 197 bytes .../media/images/_thumbs/LatextDoc19x.png | Bin 0 -> 197 bytes .../media/images/_thumbs/MC-UAV-1-2.jpg | Bin 0 -> 1765 bytes .../images/_thumbs/MC-UAV-1-2_small.jpeg | Bin 0 -> 1771 bytes .../media/images/_thumbs/MC-UAV-3.jpg | Bin 0 -> 2574 bytes .../media/images/_thumbs/MotionPrimitives.jpg | Bin 0 -> 1481 bytes .../media/images/_thumbs/PathGen.jpg | Bin 0 -> 1579 bytes .../media/images/_thumbs/Screenshot-69.png | Bin 0 -> 8075 bytes .../media/images/_thumbs/Screenshot.png | Bin 0 -> 6626 bytes .../media/images/_thumbs/VdayFinal.jpg | Bin 0 -> 3645 bytes .../media/images/_thumbs/VdayFinal_small.jpeg | Bin 0 -> 3634 bytes .../images/_thumbs/andrew-mike-kenny.jpg | Bin 0 -> 2977 bytes .../images/_thumbs/brian-kenny-shooped.jpg | Bin 0 -> 3547 bytes .../media/images/_thumbs/brian-kenny.jpg | Bin 0 -> 3569 bytes .../media/images/_thumbs/brian.jpg | Bin 0 -> 3013 bytes .../media/images/_thumbs/fig1.jpg | Bin 0 -> 1296 bytes .../media/images/_thumbs/fig2.jpg | Bin 0 -> 1824 bytes .../media/images/_thumbs/fig3.jpg | Bin 0 -> 1868 bytes .../media/images/_thumbs/kin2.png | Bin 0 -> 8412 bytes .../images/_thumbs/matt-ed-jon-kenny.jpg | Bin 0 -> 3434 bytes .../media/images/_thumbs/mprims.png | Bin 0 -> 5601 bytes .../media/images/_thumbs/primer1.png | Bin 0 -> 2218 bytes .../media/images/_thumbs/segbot_small.png | Bin 0 -> 18072 bytes .../media/images/_thumbs/tree.png | Bin 0 -> 10648 bytes .../tumblr_inline_mkp8yrkzjm1qz4rgp.png | Bin 0 -> 8173 bytes .../media/images/_thumbs/unaligned_mprims.png | Bin 0 -> 3924 bytes .../media/images/andrew-mike-kenny.jpg | Bin 0 -> 409962 bytes .../media/images/brian-kenny-shooped.jpg | Bin 0 -> 196260 bytes .../media/images/brian-kenny.jpg | Bin 0 -> 198725 bytes .../legacy-drupal/media/images/brian.jpg | Bin 0 -> 393315 bytes .../legacy-drupal/media/images/fig1.jpg | Bin 0 -> 116459 bytes .../legacy-drupal/media/images/fig2.jpg | Bin 0 -> 23291 bytes .../legacy-drupal/media/images/fig3.jpg | Bin 0 -> 23796 bytes .../legacy-drupal/media/images/kin2.png | Bin 0 -> 103005 bytes .../media/images/matt-ed-jon-kenny.jpg | Bin 0 -> 909516 bytes .../legacy-drupal/media/images/mprims.png | Bin 0 -> 15798 bytes .../legacy-drupal/media/images/primer1.png | Bin 0 -> 25901 bytes .../media/images/segbot_small.png | Bin 0 -> 107963 bytes .../legacy-drupal/media/images/tree.png | Bin 0 -> 127376 bytes .../tumblr_inline_mkp8yrkzjm1qz4rgp.png | Bin 0 -> 41458 bytes .../media/images/unaligned_mprims.png | Bin 0 -> 8892 bytes .../media/logos/sbpl_logo2_transparent.png | Bin 0 -> 37668 bytes .../sbpl_logo2_transparent_70percent.png | Bin 0 -> 30351 bytes .../media/pictures/picture-13-1342204530.jpg | Bin 0 -> 480098 bytes .../media/pictures/picture-32-1344464691.jpg | Bin 0 -> 246438 bytes .../media/pictures/picture-33-1344493553.jpg | Bin 0 -> 9710 bytes .../media/uploads/Images/3jZ04.png | Bin 0 -> 15946 bytes .../media/uploads/ImagesImages/VdayFinal.jpg | Bin 0 -> 4853239 bytes .../media/uploads/SBPL/index.html | 24 + .../media/uploads/SBPL/sbpl.tar.gz | Bin 0 -> 626119 bytes .../legacy-drupal/media/uploads/SBPL/sbpl.zip | Bin 0 -> 703863 bytes .../media/uploads/_thumbs/Images/3jZ04.png | Bin 0 -> 2197 bytes .../resize/site/all/images/segbot-284x231.png | Bin 0 -> 111824 bytes .../uploads/site/all/images/hexarotor.png | Bin 0 -> 49075 bytes .../uploads/site/all/images/pr2_grasp.png | Bin 0 -> 90350 bytes .../media/uploads/site/all/images/rtfm.png | Bin 0 -> 41949 bytes .../site/all/images/secretary_part_3.png | Bin 0 -> 126026 bytes .../media/uploads/site/all/images/segbot.png | Bin 0 -> 397993 bytes .../site/all/images/steal_this_comic.png | Bin 0 -> 45418 bytes .../legacy-drupal/media/videos/README.md | 44 + .../reference/original_settings.php | 527 ++++++ .../website_installation_procedure.md | 130 ++ static/archive/legacy-drupal/requirements.txt | 7 + .../legacy-drupal/scripts/build_manifest.py | 151 ++ .../archive/legacy-drupal/scripts/extract.py | 1626 +++++++++++++++++ 372 files changed, 11277 insertions(+) create mode 100644 .gitattributes create mode 100644 LEGACY_LFS.md create mode 100644 static/archive/legacy-drupal/README.md create mode 100644 static/archive/legacy-drupal/content/blocks/001-private-files.html create mode 100644 static/archive/legacy-drupal/content/blocks/001-private-files.json create mode 100644 static/archive/legacy-drupal/content/blocks/001-private-files.md create mode 100644 static/archive/legacy-drupal/content/blocks/002-publicfiles.html create mode 100644 static/archive/legacy-drupal/content/blocks/002-publicfiles.json create mode 100644 static/archive/legacy-drupal/content/blocks/002-publicfiles.md create mode 100644 static/archive/legacy-drupal/content/blocks_index.json create mode 100644 static/archive/legacy-drupal/content/menus.json create mode 100644 static/archive/legacy-drupal/content/pages/0003-people.html create mode 100644 static/archive/legacy-drupal/content/pages/0003-people.json create mode 100644 static/archive/legacy-drupal/content/pages/0003-people.md create mode 100644 static/archive/legacy-drupal/content/pages/0009-home.html create mode 100644 static/archive/legacy-drupal/content/pages/0009-home.json create mode 100644 static/archive/legacy-drupal/content/pages/0009-home.md create mode 100644 static/archive/legacy-drupal/content/pages/0010-publications.html create mode 100644 static/archive/legacy-drupal/content/pages/0010-publications.json create mode 100644 static/archive/legacy-drupal/content/pages/0010-publications.md create mode 100644 static/archive/legacy-drupal/content/pages/0011-videos.html create mode 100644 static/archive/legacy-drupal/content/pages/0011-videos.json create mode 100644 static/archive/legacy-drupal/content/pages/0011-videos.md create mode 100644 static/archive/legacy-drupal/content/pages/0012-robots.html create mode 100644 static/archive/legacy-drupal/content/pages/0012-robots.json create mode 100644 static/archive/legacy-drupal/content/pages/0012-robots.md create mode 100644 static/archive/legacy-drupal/content/pages/0013-ben-cohen.html create mode 100644 static/archive/legacy-drupal/content/pages/0013-ben-cohen.json create mode 100644 static/archive/legacy-drupal/content/pages/0013-ben-cohen.md create mode 100644 static/archive/legacy-drupal/content/pages/0014-brian-macallister.html create mode 100644 static/archive/legacy-drupal/content/pages/0014-brian-macallister.json create mode 100644 static/archive/legacy-drupal/content/pages/0014-brian-macallister.md create mode 100644 static/archive/legacy-drupal/content/pages/0015-andrew-dornbush.html create mode 100644 static/archive/legacy-drupal/content/pages/0015-andrew-dornbush.json create mode 100644 static/archive/legacy-drupal/content/pages/0015-andrew-dornbush.md create mode 100644 static/archive/legacy-drupal/content/pages/0016-subhrajit-bhattacharya.html create mode 100644 static/archive/legacy-drupal/content/pages/0016-subhrajit-bhattacharya.json create mode 100644 static/archive/legacy-drupal/content/pages/0016-subhrajit-bhattacharya.md create mode 100644 static/archive/legacy-drupal/content/pages/0017-jonathan-butzke.html create mode 100644 static/archive/legacy-drupal/content/pages/0017-jonathan-butzke.json create mode 100644 static/archive/legacy-drupal/content/pages/0017-jonathan-butzke.md create mode 100644 static/archive/legacy-drupal/content/pages/0018-chris-clingerman.html create mode 100644 static/archive/legacy-drupal/content/pages/0018-chris-clingerman.json create mode 100644 static/archive/legacy-drupal/content/pages/0018-chris-clingerman.md create mode 100644 static/archive/legacy-drupal/content/pages/0019-john-drake.html create mode 100644 static/archive/legacy-drupal/content/pages/0019-john-drake.json create mode 100644 static/archive/legacy-drupal/content/pages/0019-john-drake.md create mode 100644 static/archive/legacy-drupal/content/pages/0020-steven-gray.html create mode 100644 static/archive/legacy-drupal/content/pages/0020-steven-gray.json create mode 100644 static/archive/legacy-drupal/content/pages/0020-steven-gray.md create mode 100644 static/archive/legacy-drupal/content/pages/0021-kalin-gochev.html create mode 100644 static/archive/legacy-drupal/content/pages/0021-kalin-gochev.json create mode 100644 static/archive/legacy-drupal/content/pages/0021-kalin-gochev.md create mode 100644 static/archive/legacy-drupal/content/pages/0022-bradford-neuman.html create mode 100644 static/archive/legacy-drupal/content/pages/0022-bradford-neuman.json create mode 100644 static/archive/legacy-drupal/content/pages/0022-bradford-neuman.md create mode 100644 static/archive/legacy-drupal/content/pages/0023-aline-normoyle.html create mode 100644 static/archive/legacy-drupal/content/pages/0023-aline-normoyle.json create mode 100644 static/archive/legacy-drupal/content/pages/0023-aline-normoyle.md create mode 100644 static/archive/legacy-drupal/content/pages/0024-mike-phillips.html create mode 100644 static/archive/legacy-drupal/content/pages/0024-mike-phillips.json create mode 100644 static/archive/legacy-drupal/content/pages/0024-mike-phillips.md create mode 100644 static/archive/legacy-drupal/content/pages/0025-venkatraman-narayanan.html create mode 100644 static/archive/legacy-drupal/content/pages/0025-venkatraman-narayanan.json create mode 100644 static/archive/legacy-drupal/content/pages/0025-venkatraman-narayanan.md create mode 100644 static/archive/legacy-drupal/content/pages/0026-alex-kushleyev.html create mode 100644 static/archive/legacy-drupal/content/pages/0026-alex-kushleyev.json create mode 100644 static/archive/legacy-drupal/content/pages/0026-alex-kushleyev.md create mode 100644 static/archive/legacy-drupal/content/pages/0027-harsh-pandey.html create mode 100644 static/archive/legacy-drupal/content/pages/0027-harsh-pandey.json create mode 100644 static/archive/legacy-drupal/content/pages/0027-harsh-pandey.md create mode 100644 static/archive/legacy-drupal/content/pages/0028-kavan-mceachern.html create mode 100644 static/archive/legacy-drupal/content/pages/0028-kavan-mceachern.json create mode 100644 static/archive/legacy-drupal/content/pages/0028-kavan-mceachern.md create mode 100644 static/archive/legacy-drupal/content/pages/0029-matthew-mac-allister.html create mode 100644 static/archive/legacy-drupal/content/pages/0029-matthew-mac-allister.json create mode 100644 static/archive/legacy-drupal/content/pages/0029-matthew-mac-allister.md create mode 100644 static/archive/legacy-drupal/content/pages/0030-contact.html create mode 100644 static/archive/legacy-drupal/content/pages/0030-contact.json create mode 100644 static/archive/legacy-drupal/content/pages/0030-contact.md create mode 100644 static/archive/legacy-drupal/content/pages/0031-login.html create mode 100644 static/archive/legacy-drupal/content/pages/0031-login.json create mode 100644 static/archive/legacy-drupal/content/pages/0031-login.md create mode 100644 static/archive/legacy-drupal/content/pages/0032-software.html create mode 100644 static/archive/legacy-drupal/content/pages/0032-software.json create mode 100644 static/archive/legacy-drupal/content/pages/0032-software.md create mode 100644 static/archive/legacy-drupal/content/pages/0033-untitled-33.html create mode 100644 static/archive/legacy-drupal/content/pages/0033-untitled-33.json create mode 100644 static/archive/legacy-drupal/content/pages/0033-untitled-33.md create mode 100644 static/archive/legacy-drupal/content/pages/0039-eduardo-barrera.html create mode 100644 static/archive/legacy-drupal/content/pages/0039-eduardo-barrera.json create mode 100644 static/archive/legacy-drupal/content/pages/0039-eduardo-barrera.md create mode 100644 static/archive/legacy-drupal/content/pages/0042-old-software.html create mode 100644 static/archive/legacy-drupal/content/pages/0042-old-software.json create mode 100644 static/archive/legacy-drupal/content/pages/0042-old-software.md create mode 100644 static/archive/legacy-drupal/content/pages/0043-sandip-aine.html create mode 100644 static/archive/legacy-drupal/content/pages/0043-sandip-aine.json create mode 100644 static/archive/legacy-drupal/content/pages/0043-sandip-aine.md create mode 100644 static/archive/legacy-drupal/content/pages/0044-calendar.html create mode 100644 static/archive/legacy-drupal/content/pages/0044-calendar.json create mode 100644 static/archive/legacy-drupal/content/pages/0044-calendar.md create mode 100644 static/archive/legacy-drupal/content/pages/0045-tutorials.html create mode 100644 static/archive/legacy-drupal/content/pages/0045-tutorials.json create mode 100644 static/archive/legacy-drupal/content/pages/0045-tutorials.md create mode 100644 static/archive/legacy-drupal/content/pages/0046-navigation-with-sbpl-in-x-y-theta.html create mode 100644 static/archive/legacy-drupal/content/pages/0046-navigation-with-sbpl-in-x-y-theta.json create mode 100644 static/archive/legacy-drupal/content/pages/0046-navigation-with-sbpl-in-x-y-theta.md create mode 100644 static/archive/legacy-drupal/content/pages/0047-sbpl-overview.html create mode 100644 static/archive/legacy-drupal/content/pages/0047-sbpl-overview.json create mode 100644 static/archive/legacy-drupal/content/pages/0047-sbpl-overview.md create mode 100644 static/archive/legacy-drupal/content/pages/0048-kinematic-constraints-and-motion-primitives.html create mode 100644 static/archive/legacy-drupal/content/pages/0048-kinematic-constraints-and-motion-primitives.json create mode 100644 static/archive/legacy-drupal/content/pages/0048-kinematic-constraints-and-motion-primitives.md create mode 100644 static/archive/legacy-drupal/content/pages/0049-primer-to-the-search-based-planning-library-sbpl.html create mode 100644 static/archive/legacy-drupal/content/pages/0049-primer-to-the-search-based-planning-library-sbpl.json create mode 100644 static/archive/legacy-drupal/content/pages/0049-primer-to-the-search-based-planning-library-sbpl.md create mode 100644 static/archive/legacy-drupal/content/pages/0050-primer-to-search-based-motion-planning.html create mode 100644 static/archive/legacy-drupal/content/pages/0050-primer-to-search-based-motion-planning.json create mode 100644 static/archive/legacy-drupal/content/pages/0050-primer-to-search-based-motion-planning.md create mode 100644 static/archive/legacy-drupal/content/pages/0051-planning-with-sbpl-example-in-x-y-theta-state-space.html create mode 100644 static/archive/legacy-drupal/content/pages/0051-planning-with-sbpl-example-in-x-y-theta-state-space.json create mode 100644 static/archive/legacy-drupal/content/pages/0051-planning-with-sbpl-example-in-x-y-theta-state-space.md create mode 100644 static/archive/legacy-drupal/content/pages/0052-generating-motion-primitives-with-sbpl.html create mode 100644 static/archive/legacy-drupal/content/pages/0052-generating-motion-primitives-with-sbpl.json create mode 100644 static/archive/legacy-drupal/content/pages/0052-generating-motion-primitives-with-sbpl.md create mode 100644 static/archive/legacy-drupal/content/pages/0053-forward-arc-motion-primitives.html create mode 100644 static/archive/legacy-drupal/content/pages/0053-forward-arc-motion-primitives.json create mode 100644 static/archive/legacy-drupal/content/pages/0053-forward-arc-motion-primitives.md create mode 100644 static/archive/legacy-drupal/content/pages/0054-building-installing-and-using-sbpl.html create mode 100644 static/archive/legacy-drupal/content/pages/0054-building-installing-and-using-sbpl.json create mode 100644 static/archive/legacy-drupal/content/pages/0054-building-installing-and-using-sbpl.md create mode 100644 static/archive/legacy-drupal/content/pages/0055-arm-planning.html create mode 100644 static/archive/legacy-drupal/content/pages/0055-arm-planning.json create mode 100644 static/archive/legacy-drupal/content/pages/0055-arm-planning.md create mode 100644 static/archive/legacy-drupal/content/pages/0056-aram-ebtekar.html create mode 100644 static/archive/legacy-drupal/content/pages/0056-aram-ebtekar.json create mode 100644 static/archive/legacy-drupal/content/pages/0056-aram-ebtekar.md create mode 100644 static/archive/legacy-drupal/content/pages/0057-kush-prasad.html create mode 100644 static/archive/legacy-drupal/content/pages/0057-kush-prasad.json create mode 100644 static/archive/legacy-drupal/content/pages/0057-kush-prasad.md create mode 100644 static/archive/legacy-drupal/content/pages/0058-sung-kyun-kim.html create mode 100644 static/archive/legacy-drupal/content/pages/0058-sung-kyun-kim.json create mode 100644 static/archive/legacy-drupal/content/pages/0058-sung-kyun-kim.md create mode 100644 static/archive/legacy-drupal/content/pages/0059-soonkyum-kim.html create mode 100644 static/archive/legacy-drupal/content/pages/0059-soonkyum-kim.json create mode 100644 static/archive/legacy-drupal/content/pages/0059-soonkyum-kim.md create mode 100644 static/archive/legacy-drupal/content/pages/0060-siddharth-swaminathan.html create mode 100644 static/archive/legacy-drupal/content/pages/0060-siddharth-swaminathan.json create mode 100644 static/archive/legacy-drupal/content/pages/0060-siddharth-swaminathan.md create mode 100644 static/archive/legacy-drupal/content/pages/0061-chen-gao.html create mode 100644 static/archive/legacy-drupal/content/pages/0061-chen-gao.json create mode 100644 static/archive/legacy-drupal/content/pages/0061-chen-gao.md create mode 100644 static/archive/legacy-drupal/content/pages/0062-ellis-ratner.html create mode 100644 static/archive/legacy-drupal/content/pages/0062-ellis-ratner.json create mode 100644 static/archive/legacy-drupal/content/pages/0062-ellis-ratner.md create mode 100644 static/archive/legacy-drupal/content/pages/0063-krishna-sapkota.html create mode 100644 static/archive/legacy-drupal/content/pages/0063-krishna-sapkota.json create mode 100644 static/archive/legacy-drupal/content/pages/0063-krishna-sapkota.md create mode 100644 static/archive/legacy-drupal/content/pages/0064-burak-yucesoy.html create mode 100644 static/archive/legacy-drupal/content/pages/0064-burak-yucesoy.json create mode 100644 static/archive/legacy-drupal/content/pages/0064-burak-yucesoy.md create mode 100644 static/archive/legacy-drupal/content/pages/0065-arjun-menon.html create mode 100644 static/archive/legacy-drupal/content/pages/0065-arjun-menon.json create mode 100644 static/archive/legacy-drupal/content/pages/0065-arjun-menon.md create mode 100644 static/archive/legacy-drupal/content/pages/0066-hao-wang.html create mode 100644 static/archive/legacy-drupal/content/pages/0066-hao-wang.json create mode 100644 static/archive/legacy-drupal/content/pages/0066-hao-wang.md create mode 100644 static/archive/legacy-drupal/content/pages/0067-victor-hwang.html create mode 100644 static/archive/legacy-drupal/content/pages/0067-victor-hwang.json create mode 100644 static/archive/legacy-drupal/content/pages/0067-victor-hwang.md create mode 100644 static/archive/legacy-drupal/content/pages/0068-margarite-safonova.html create mode 100644 static/archive/legacy-drupal/content/pages/0068-margarite-safonova.json create mode 100644 static/archive/legacy-drupal/content/pages/0068-margarite-safonova.md create mode 100644 static/archive/legacy-drupal/content/pages/0069-discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances.html create mode 100644 static/archive/legacy-drupal/content/pages/0069-discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances.json create mode 100644 static/archive/legacy-drupal/content/pages/0069-discriminatively-guided-deliberative-perception-for-pose-estimation-of-multiple-3d-object-instances.md create mode 100644 static/archive/legacy-drupal/content/site_variables.json create mode 100644 static/archive/legacy-drupal/content/users.json create mode 100644 static/archive/legacy-drupal/data/comments.json create mode 100644 static/archive/legacy-drupal/data/contact_categories.json create mode 100644 static/archive/legacy-drupal/data/drupal_variables.json create mode 100644 static/archive/legacy-drupal/data/file_usage.json create mode 100644 static/archive/legacy-drupal/data/files_managed.json create mode 100644 static/archive/legacy-drupal/data/node_types.json create mode 100644 static/archive/legacy-drupal/data/page_field_image.json create mode 100644 static/archive/legacy-drupal/data/page_field_page_file.json create mode 100644 static/archive/legacy-drupal/data/page_field_tags.json create mode 100644 static/archive/legacy-drupal/data/pages_index.csv create mode 100644 static/archive/legacy-drupal/data/raw/README.md create mode 100644 static/archive/legacy-drupal/data/roles.json create mode 100644 static/archive/legacy-drupal/data/taxonomy.json create mode 100644 static/archive/legacy-drupal/data/text_formats.json create mode 100644 static/archive/legacy-drupal/data/url_aliases.json create mode 100644 static/archive/legacy-drupal/manifest.md create mode 100755 static/archive/legacy-drupal/media/images/17K4g.png create mode 100755 static/archive/legacy-drupal/media/images/1FghC.gif create mode 100755 static/archive/legacy-drupal/media/images/1IOLc.png create mode 100755 static/archive/legacy-drupal/media/images/2012-07-05-212032.jpg create mode 100755 static/archive/legacy-drupal/media/images/2822.jpg create mode 100755 static/archive/legacy-drupal/media/images/2uktC.png create mode 100755 static/archive/legacy-drupal/media/images/3ptkg6.jpg create mode 100755 static/archive/legacy-drupal/media/images/3pyrjf(1).jpg create mode 100755 static/archive/legacy-drupal/media/images/3pyrjf.jpg create mode 100755 static/archive/legacy-drupal/media/images/4ty7b.jpg create mode 100755 static/archive/legacy-drupal/media/images/9oIuo.jpg create mode 100755 static/archive/legacy-drupal/media/images/Awesome.png create mode 100755 static/archive/legacy-drupal/media/images/BasePrim(1).jpg create mode 100755 static/archive/legacy-drupal/media/images/BasePrim.jpg create mode 100755 static/archive/legacy-drupal/media/images/DSC00420.JPG create mode 100755 static/archive/legacy-drupal/media/images/IMG_2895.JPG create mode 100755 static/archive/legacy-drupal/media/images/IMG_2895_small.jpeg create mode 100755 static/archive/legacy-drupal/media/images/IMG_2896.JPG create mode 100755 static/archive/legacy-drupal/media/images/IMG_2896_small.jpeg create mode 100755 static/archive/legacy-drupal/media/images/IMG_2897.JPG create mode 100755 static/archive/legacy-drupal/media/images/IMG_2897_small.jpeg create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc10x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc110x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc111x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc112x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc113x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc114x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc115x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc116x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc117x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc118x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc119x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc11x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc120x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc121x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc122x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc123x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc124x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc125x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc126x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc127x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc128x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc129x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc12x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc130x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc131x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc13x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc14x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc15x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc16x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc17x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc18x.png create mode 100755 static/archive/legacy-drupal/media/images/LatextDoc19x.png create mode 100755 static/archive/legacy-drupal/media/images/MC-UAV-1-2.jpg create mode 100755 static/archive/legacy-drupal/media/images/MC-UAV-1-2_small.jpeg create mode 100755 static/archive/legacy-drupal/media/images/MC-UAV-3.jpg create mode 100755 static/archive/legacy-drupal/media/images/MotionPrimitives.jpg create mode 100755 static/archive/legacy-drupal/media/images/PathGen.jpg create mode 100755 static/archive/legacy-drupal/media/images/Screenshot-69.png create mode 100755 static/archive/legacy-drupal/media/images/Screenshot.png create mode 100755 static/archive/legacy-drupal/media/images/VdayFinal.jpg create mode 100755 static/archive/legacy-drupal/media/images/VdayFinal_small.jpeg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/17K4g.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/1FghC.gif create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/1IOLc.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/2012-07-05-212032.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/2822.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/2uktC.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/3ptkg6.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/3pyrjf(1).jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/3pyrjf.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/4ty7b.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/9oIuo.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/Awesome.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/BasePrim(1).jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/BasePrim.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/DSC00420.JPG create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/IMG_2895.JPG create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/IMG_2895_small.jpeg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/IMG_2896.JPG create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/IMG_2896_small.jpeg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/IMG_2897.JPG create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/IMG_2897_small.jpeg create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc10x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc110x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc111x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc112x.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc113x.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc114x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc115x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc116x.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc117x.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc118x.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc119x.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc11x.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc120x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc121x.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc122x.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc123x.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc124x.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc125x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc126x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc127x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc128x.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc129x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc12x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc130x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc131x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc13x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc14x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc15x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc16x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc17x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc18x.png create mode 100644 static/archive/legacy-drupal/media/images/_thumbs/LatextDoc19x.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/MC-UAV-1-2.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/MC-UAV-1-2_small.jpeg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/MC-UAV-3.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/MotionPrimitives.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/PathGen.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/Screenshot-69.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/Screenshot.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/VdayFinal.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/VdayFinal_small.jpeg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/andrew-mike-kenny.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/brian-kenny-shooped.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/brian-kenny.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/brian.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/fig1.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/fig2.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/fig3.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/kin2.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/matt-ed-jon-kenny.jpg create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/mprims.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/primer1.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/segbot_small.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/tree.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/tumblr_inline_mkp8yrkzjm1qz4rgp.png create mode 100755 static/archive/legacy-drupal/media/images/_thumbs/unaligned_mprims.png create mode 100755 static/archive/legacy-drupal/media/images/andrew-mike-kenny.jpg create mode 100755 static/archive/legacy-drupal/media/images/brian-kenny-shooped.jpg create mode 100755 static/archive/legacy-drupal/media/images/brian-kenny.jpg create mode 100755 static/archive/legacy-drupal/media/images/brian.jpg create mode 100755 static/archive/legacy-drupal/media/images/fig1.jpg create mode 100755 static/archive/legacy-drupal/media/images/fig2.jpg create mode 100755 static/archive/legacy-drupal/media/images/fig3.jpg create mode 100755 static/archive/legacy-drupal/media/images/kin2.png create mode 100755 static/archive/legacy-drupal/media/images/matt-ed-jon-kenny.jpg create mode 100755 static/archive/legacy-drupal/media/images/mprims.png create mode 100755 static/archive/legacy-drupal/media/images/primer1.png create mode 100755 static/archive/legacy-drupal/media/images/segbot_small.png create mode 100755 static/archive/legacy-drupal/media/images/tree.png create mode 100755 static/archive/legacy-drupal/media/images/tumblr_inline_mkp8yrkzjm1qz4rgp.png create mode 100755 static/archive/legacy-drupal/media/images/unaligned_mprims.png create mode 100644 static/archive/legacy-drupal/media/logos/sbpl_logo2_transparent.png create mode 100644 static/archive/legacy-drupal/media/logos/sbpl_logo2_transparent_70percent.png create mode 100644 static/archive/legacy-drupal/media/pictures/picture-13-1342204530.jpg create mode 100644 static/archive/legacy-drupal/media/pictures/picture-32-1344464691.jpg create mode 100644 static/archive/legacy-drupal/media/pictures/picture-33-1344493553.jpg create mode 100644 static/archive/legacy-drupal/media/uploads/Images/3jZ04.png create mode 100644 static/archive/legacy-drupal/media/uploads/ImagesImages/VdayFinal.jpg create mode 100644 static/archive/legacy-drupal/media/uploads/SBPL/index.html create mode 100644 static/archive/legacy-drupal/media/uploads/SBPL/sbpl.tar.gz create mode 100644 static/archive/legacy-drupal/media/uploads/SBPL/sbpl.zip create mode 100644 static/archive/legacy-drupal/media/uploads/_thumbs/Images/3jZ04.png create mode 100644 static/archive/legacy-drupal/media/uploads/resize/site/all/images/segbot-284x231.png create mode 100644 static/archive/legacy-drupal/media/uploads/site/all/images/hexarotor.png create mode 100644 static/archive/legacy-drupal/media/uploads/site/all/images/pr2_grasp.png create mode 100644 static/archive/legacy-drupal/media/uploads/site/all/images/rtfm.png create mode 100644 static/archive/legacy-drupal/media/uploads/site/all/images/secretary_part_3.png create mode 100644 static/archive/legacy-drupal/media/uploads/site/all/images/segbot.png create mode 100644 static/archive/legacy-drupal/media/uploads/site/all/images/steal_this_comic.png create mode 100644 static/archive/legacy-drupal/media/videos/README.md create mode 100644 static/archive/legacy-drupal/reference/original_settings.php create mode 100644 static/archive/legacy-drupal/reference/website_installation_procedure.md create mode 100644 static/archive/legacy-drupal/requirements.txt create mode 100644 static/archive/legacy-drupal/scripts/build_manifest.py create mode 100644 static/archive/legacy-drupal/scripts/extract.py diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..7202fa2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +static/archive/legacy-drupal/media/videos/*.mp4 filter=lfs diff=lfs merge=lfs -text +static/archive/legacy-drupal/media/videos/*.mov filter=lfs diff=lfs merge=lfs -text +static/archive/legacy-drupal/data/raw/*.sql filter=lfs diff=lfs merge=lfs -text +static/archive/legacy-drupal/data/raw/*.sql.gz filter=lfs diff=lfs merge=lfs -text diff --git a/LEGACY_LFS.md b/LEGACY_LFS.md new file mode 100644 index 0000000..ef32803 --- /dev/null +++ b/LEGACY_LFS.md @@ -0,0 +1,71 @@ +# Legacy Drupal Import — Files Tracked for Git LFS + +The initial import of the legacy `sbpl.net` Drupal 7 site (see the +`feat(legacy): import sbpl.net content` PR) drops the entire extracted +snapshot into `static/archive/legacy-drupal/`. Two subdirectories of +that snapshot are **not** committed in the initial PR: + +| Path | Size | Reason | +|------|------|--------| +| `static/archive/legacy-drupal/media/videos/` | ~559 MB (5 `.mp4`) | Too large without LFS; migration environment couldn't install `git-lfs` | +| `static/archive/legacy-drupal/data/raw/` | ~184 MB (2 `.sql`) | Same as above; also need sanitisation (passwords, spam users) before public hosting | + +Both folders have a stub `README.md` explaining what is missing and how +to add it. + +## Adding the missing files on a workstation with Git LFS + +```bash +# 1. Make sure git-lfs is installed locally +git lfs install + +# 2. Tracking rules are already in .gitattributes: +# static/archive/legacy-drupal/media/videos/*.mp4 filter=lfs ... +# static/archive/legacy-drupal/data/raw/*.sql filter=lfs ... +# (no additional `git lfs track` needed — but it doesn't hurt) + +# 3. Drop the files in +cp /path/to/extracted/newwebsite/media/videos/*.mp4 \ + static/archive/legacy-drupal/media/videos/ +cp /path/to/extracted/newwebsite/data/raw/*.sql \ + static/archive/legacy-drupal/data/raw/ + +# 4. Commit on this PR's branch (or a follow-up) +git add static/archive/legacy-drupal/media/videos/*.mp4 +git add static/archive/legacy-drupal/data/raw/*.sql +git commit -m "feat(archive): add legacy videos and Drupal dumps via LFS" +git push +``` + +## GitHub LFS storage / bandwidth budget + +Free GitHub accounts get **1 GB of LFS storage** and **1 GB of LFS +bandwidth/month**. The `sbpl` organisation may already have a paid +plan; if not, the 743 MB total of videos + dumps will fit under the +free quota, but downloading them through the `sbpl.github.io` site +deploys (GitHub Pages clones the repo into the runner) will consume +bandwidth on every build. Two options to keep bandwidth low: + +1. Keep the LFS files in the repo but exclude + `static/archive/legacy-drupal/media/videos/` from the published site + via `[markup] -> [outputFormats]` or by moving them out of `static/` + into a non-static folder like `archive/`. +2. Host the videos and SQL dumps on an external archive (Internet + Archive, CMU Box, etc.) and just link to them from + `/archive/legacy-drupal/media/videos/README.md`. + +## What is in the snapshot + +See `static/archive/legacy-drupal/README.md` and +`static/archive/legacy-drupal/manifest.md` for the full inventory. The +short version: + +- 55 page triplets (`*.md` / `*.html` / `*.json`) +- 25 historical lab member pages (already promoted to + `data/members/alumni.yaml`) +- 77 site images, 3 user avatars, 12 misc uploads (~22 MB, **committed + to repo** under `static/archive/legacy-drupal/media/`) +- 5 videos (**deferred to LFS**) +- 2 raw SQL dumps (**deferred to LFS**) +- All Drupal metadata: users, menus, taxonomies, comments, roles, + permissions, contact categories, text formats, ~180 site variables diff --git a/static/archive/legacy-drupal/README.md b/static/archive/legacy-drupal/README.md new file mode 100644 index 0000000..5b77935 --- /dev/null +++ b/static/archive/legacy-drupal/README.md @@ -0,0 +1,175 @@ +# SBPL Website Asset Bundle + +This folder contains everything that was salvaged from the old +**Search-Based Planning Laboratory (SBPL)** Drupal 7 website so it can +be used as the source-of-truth for building a new website from scratch. + +The original site lived at `sbpl.net` and was a Drupal 7 install. The +two snapshots on disk were: + +- `dump-2018-04-12.sql` — the latest MySQL dump (Apr 12, 2018, 112 tables, 161 MB) +- `drupal_dump.sql` — an older MySQL dump (Nov 2014, 88 tables, 23 MB) + +All site-relevant content (page bodies, menus, user list, file refs, +images, videos, logos, and install notes) has been extracted and +copied here in a clean, human-readable layout. + +> **Privacy / security note for this snapshot inside `sbpl.github.io`:** +> Before this archive was committed to a public repository, the following +> redactions were applied: +> +> - All user email addresses in `content/users.json` were partially +> masked (first + last character of the local-part kept). +> - The Drupal `cron_key`, `drupal_private_key`, `smtp_password`, and +> the FTP `username` in `data/drupal_variables.json` were replaced +> with `***REDACTED***`. +> - The legacy contact-form recipient in `data/contact_categories.json` +> was partially masked. +> - The `andrew.dornbush@gmail.com` address that appeared on the old +> Contact page (`content/pages/0030-contact.*`) was partially masked. +> - The `username:` / `password:` credentials in the +> `content/blocks/001-private-files.*` block were redacted (the +> `sbpl.net/private/SBPL/` upload form no longer exists). +> - The two raw MySQL dumps (`data/raw/*.sql`, ~184 MB total) and the +> five legacy video files (`media/videos/*.mp4`, ~559 MB total) were +> **not** committed in this initial PR — see `media/videos/README.md` +> and `data/raw/README.md` for instructions on adding them via Git LFS. +> +> The original, fully-unredacted extraction lives on the migration +> workstation under `~/Desktop/newsite/newwebsite/`. + +--- + +## Folder map + +``` +newwebsite/ +├── README.md this file +├── manifest.md full inventory of every file in here, with sizes + sources +├── requirements.txt Python deps (stdlib-only) +├── scripts/ +│ ├── extract.py re-runnable extractor (parses the SQL dump) +│ └── build_manifest.py regenerates manifest.md by walking the tree +├── content/ +│ ├── pages/ one Drupal node per page (55 pages × 3 files) +│ │ ├── 0009-home.md Markdown rendering +│ │ ├── 0009-home.html original WYSIWYG HTML (links rewritten) +│ │ ├── 0009-home.json {nid, title, type, dates, url_aliases, field_image, body_*, ...} +│ │ └── …(55 pages) +│ ├── blocks/ custom HTML "blocks" (sidebar / footer text) +│ │ └── -.{html,md,json} +│ ├── blocks_index.json index of all custom blocks +│ ├── menus.json decoded navigation tree (4 site menus) +│ ├── users.json real users (passwords stripped, spam removed, with roles) +│ └── site_variables.json curated subset of Drupal variables (site_name, theme, …) +├── media/ +│ ├── logos/ sbpl_logo2_transparent.png + 70% variant +│ ├── images/ all SBPL photos / figures from shared/Images +│ ├── pictures/ user avatars +│ ├── uploads/ misc Drupal uploads (sites/default/files/…) +│ │ └── SBPL/ sbpl.tar.gz + sbpl.zip software downloads (+ index.html) +│ └── videos/ all 5 video assets (manip, flight, crashes, icra2, beam_graphs) +├── data/ +│ ├── pages_index.csv nid,title,type,created,updated,uid,slug,url_aliases,file_* +│ ├── url_aliases.json every Drupal URL alias, grouped by node id +│ ├── node_types.json Drupal content-type definitions +│ ├── files_managed.json decoded `file_managed` table +│ ├── file_usage.json which entity (node/comment/user) uses each file +│ ├── page_field_image.json per-page image-field values +│ ├── page_field_page_file.json per-page file-attachment values +│ ├── page_field_tags.json per-page taxonomy tags +│ ├── taxonomy.json vocabularies + terms + node→tag links +│ ├── comments.json page comments (subject + body + author) +│ ├── roles.json Drupal roles + their permissions +│ ├── contact_categories.json Drupal contact-form categories +│ ├── text_formats.json text-format / WYSIWYG-filter definitions +│ ├── drupal_variables.json all 180 `variable` rows (PHP-decoded) +│ └── raw/ +│ ├── dump-2018-04-12.sql verbatim copy of the latest dump +│ └── drupal_dump.sql verbatim copy of the older dump +└── reference/ + ├── website_installation_procedure.md original install guide + └── original_settings.php original Drupal settings (DB password redacted) +``` + +--- + +## How to use this for a new website + +The cleanest input for a static-site generator (Astro / Next.js / +Hugo / 11ty) is the per-page triplet under `content/pages/`: + +- **`0009-home.json`** — front-matter (title, dates, author, etc.). Use this to feed the build pipeline. +- **`0009-home.md`** — Markdown body, ready to drop into a Markdown-driven SSG. Asset URLs have been rewritten to point at `../../media/`. +- **`0009-home.html`** — original WYSIWYG HTML, kept verbatim (with rewritten asset URLs) in case the Markdown conversion lost some formatting and you need to re-render parts. + +`content/menus.json` is the original Drupal navigation tree — use it to +seed the new site's nav. Items pointing at `node/` map to the +matching `-.{md,html,json}` file. + +`content/users.json` lists the 25 real user accounts (anonymous + admin ++ 23 lab members who either authored a page or logged in at least +once). The 27,466 spam-bot registrations from the open-registration +era are filtered out. Combine with the `pages/` triplets that match a +member's name to assemble the new "People" page. + +`data/files_managed.json` is the original Drupal file-tracking table. +Cross-reference its `uri` field (e.g. `public://Images/3jZ04.png`) +with the asset paths under `media/uploads/` and `media/images/`. + +--- + +## Re-running the extractor + +```bash +cd newwebsite +python3 scripts/extract.py # rebuild content/ + data/ from the SQL dump +python3 scripts/build_manifest.py # refresh manifest.md +``` + +The extractor streams `../dump-2018-04-12.sql`, decodes the relevant +tables, and overwrites everything under `content/` and `data/` +(except `data/raw/`, which is just verbatim copies of the SQL dumps). + +Both scripts use **only the Python 3 standard library**, so no +`pip install` step is required. + +## Quick stats + +- 55 pages × 3 files = 165 files under `content/pages/` +- 2 custom blocks × 3 files = 6 files under `content/blocks/` +- 77 source images in `media/images/` plus 77 thumbnails in `media/images/_thumbs/` (~22 MB total) +- 3 user-avatar pictures in `media/pictures/` +- 12 misc upload files in `media/uploads/` (~7 MB; includes `sbpl.tar.gz` + `sbpl.zip` software downloads) +- 5 videos in `media/videos/` (~559 MB) +- 25 real user records in `content/users.json` (passwords stripped; 27,466 spam registrations filtered out) +- 52 navigation links across 4 site menus in `content/menus.json` (admin / management menus dropped) +- 46 URL aliases in `data/url_aliases.json` — used to rewrite intra-site `` links to local page files +- 4 roles + 144 permissions in `data/roles.json` +- 4 text formats in `data/text_formats.json` +- 180 site variables in `data/drupal_variables.json` (curated subset of 12 in `content/site_variables.json`) +- 85 local references across all extracted page HTML, **all** verified to resolve under the bundle (zero broken links) + +--- + +## Provenance / notes + +- The Drupal core code (`drupal-7.33/`, `drupal-7.58/`, `*.tar.gz`, + `sites/all/modules/`) is intentionally **not** included here — it is + generic Drupal 7 + contributed modules and not SBPL content. The + original folders on disk still have it if you ever need it. +- Image references in page bodies originally pointed at + `/shared/Images/...` (served from a sibling Apache alias). These + have been rewritten to `../../media/images/...` so all links resolve + inside this folder. +- Each page JSON keeps three forms of the body: + `body_html_raw` (verbatim from the SQL dump), + `body_html_rewritten` (asset URLs pointed at `../../media/...` _and_ + intra-site URL aliases like `AndrewDornbush` rewritten to + `0015-andrew-dornbush.html`), and `body_markdown` (the cleaned + Markdown rendering). Use whichever fits your build pipeline. +- Custom HTML blocks in `content/blocks/` include one labeled + `private files` whose body still contains the original + `username/password` from the old site. That's how it lived in the DB; + we kept it verbatim so nothing is lost. **Don't reuse those credentials** + — they need to be replaced with proper authentication on the new site. diff --git a/static/archive/legacy-drupal/content/blocks/001-private-files.html b/static/archive/legacy-drupal/content/blocks/001-private-files.html new file mode 100644 index 0000000..b2cd420 --- /dev/null +++ b/static/archive/legacy-drupal/content/blocks/001-private-files.html @@ -0,0 +1,8 @@ + +private files + +

PEmZWh<(uAb~YfA`d(-(ZVH{9PRt2p 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\u10mZ^Kvzc zvgCP+vLxR2bz&^ z^?o{@roYO*L9&q}4`jS5QaKq-=fyfCO*gDo0N6?lTz}D8?m*kW6Uiy6!v2BmHSxUf z3pRVI0Qs6a*NEA!UbkQ6)U=-y6~yLJT6^umSMA>m7lzeNd90apzHLgxrse+N3R@yX6L7y+1y~+r-lv))EM+fn zYh_y6f|;O=cADv=B))}oovt3cY4&xV!SYi9ISWuue?+S9;_!RxHzLVVYNr{--6rKN z2M5^GxR#y$6bagquZJAObttCDQy!Q}oTT{FMuf8V+l_{V>JQrU*%`@A_E8}iF7}q4 zThu=yHqoXqY2_w4Zc!ay-#!We_-BiC`~Ga+h)1pHpZB0I278(1g)#72%ebO2;%G>E z3wfqY#%;Bne4wDGsRxSRC&sq6s;6h8DIe$O=oDZAU=X+z*iM?`^#rI1tfOlYt2p};v7;t^8* zE{fT1FF&ZhaCMcJT!YX;P13CB8!T&;l7jeR+w|hDZjnH=)q{iiZ9axg#6BvcW?y%| z$7(2J1(nE7L|TPzM%-#Vd-?R$9?6;y)@8ltmFecSruw9BNOf7Z)E0vsnTqwylZKiv z;I^I}4=`3I;^|gh7?JWd`ww6?3!+@=Oveo#ybN>C8)r>^8TQqF zCiptuoLr)D%%qp(K0ldT{F#FNX+)7`=sG8O>3eOLDy5eDOkS?I?jWPFURZGByMmeA zDkuHj3W;MY&Qa^;F;Sgs>b!*B{K z8yVT?(bol(Of_mY3i2i?-BK|efTa=)sC;&WtI2u?-I?Vh_wFPQ0ocZMh9C9Ci>+0w zDmlbcRM;0PPo2?~Y}UMCp?1d&0`M`It#%B5_X!8@gnXPZ=<>GhUC2r9l)Q(A65Ctx_S&Rd6`*Rz<0I$-18Re*tF0k+sSaWu`(+RfB2Fq z*{{xsxi~7Z%g2oo9xVL`CbA&NNZ{<5T?e8+DbPi~Q?mh7vv`PB|NSP}I0KAV6bxb||nna-k z^;w_Jm#~gXHuhd^Ef@Q}x|F#dOCcc~hGjr!$ZBFtHqw$6PT=5C)}FSn9~64fR(EkG z_$2SERov(V3a?vK70cW?(ksOWh5pO2_vsSQtgnSz(`7cV;B0mYP4zNiV~ zeYJ_Jsu?d|p|dp3c1Rh-yJ-;nGZ(xE&f3rFazXev{fHaXZ%-xac-y>7ClBn|^v_I1 zU>)q=+g8cLgX7PV*t=EBv&uq^1DQ#>7u^5MlS+?>*d|pRJ%l5hhxZltr!^btssqlH zmtMRJ&m;CNjM4@C0_M!=|G44EKsc2gK5WJB&IYPAKjn1XGnFqMo`}O13gJLNj#pb@ z*?-(;Iu^y&F?c3?40Lq`*!)A=ViC(0mZ}t=Y>RKHE}lSAcCfIlCgkd_6R(p9?whJ(unA*KAC+UCro2p=&D?)4SWW^kni z5@D>4v5wk>9SGgzy>iC(BD&A}_m^ycdMgqWuKnX+vtunr$5889Wys)<(FpXV#%u!; ze={r?OW<{`LnQE}m{zt!b72s9Uu;1qp;nK?`M^t|D=~&pvsYi2b0@&hJm)i5l#ZdY zmZ*5E?C?UK%x~?Rf{{4JJG)Sdjnkd5VJZVFCbs{Mi)ZGRw|hx#s{+v*K2}IWE#8W5 zi=tfH=%nSm%~i$`M5Ve@1)?8&LStRW5%OKfhr^mbjhhXXAoUCQskb%me5JHNNjs>X z^kD5##t3>StTMJ+T~|Sc6oKZfl@zb;p&6|zhrj8%)phnvwXWTZksczQ)}Kb!uZZHw znRM(udeo|!Xn8!3?@_MhK21DuUqddk=auCI)~1%B5Wf|EH^f~s&!6grUek~{usXd? z9q43YFh&(Dyq?5iB+aRF;|2kl_SMCcsIX1oZ z3Z%V})h-4o=wsBCl&tsDe-3-BUcbzm*|%DnQ+r>!rY9mSu8*K$S4s69+G6_7MbmJ|D zEos0m*T)>NW2bRwk{o4xdPg&%ehk2$Y)+&T8e>dQ8ML4LsCJl1is7q(FoE&_?%EYr zvnme%I!IR9KxwWWVWiB%d=;!g^djJ}N(wHZuU;tc<|+#Qr{VzAO@|DF-S^wcGy$0^ znE>fMqo~1u>wV^8k$9ngZT*=thL~V1(HuPKx*~paPtk6t4un<+aZ(54Bl;~)l$Z4! zxihDN>FIB`?8TLCu&B>!{m9q%fSWTNUrAn*5gY*EGFr?~?M+bfWncC6F_Jy!DpH|` zPni3?YkOAFw%nrN!pwUrB`Zch%WIcYL%Vbd*jVAxr18cVa%C*ABME)JuUbg?7_rX` zRR_@%EJgrdJVTn?O)>tyZw+qfye|&K0Slq|O*9@pqnQ%tMdjajrj4i7%6dDcX~oHF zV4ztfS}m`mMT^t49#k%BkH7klOqz_-yssYJD#K7q@f1ZZ3R0j z9Qa#!o1Ko{m+?&aRR?hjiLMz8WmrGZ(PSzx0REI;1Wyiv+U4C@dNM8()N|(#(W~o@ znPN~(g9;78tC!$sT0v_?nDsPb-m{a@2r)G^GEc^tGLDtMI08#w9c7wqZp^ScNM6j1 zDYY4hm|s(o>bt8Ao&E@QDAOE;WTXa38iv^W)vmpKf! zW)csxV}?-9-ZU4iNVM9;{$*2fqMl9IkAVBu%DRf=FtsU-FFbOHLT~HamsH_>p zfmJ%tazVw;N*uU!NnAvG=C{NnU1~vg`!sFyBl>BtJe)Kp7{A#$s<5=5US? zyHARSnS|-(#2lsvQ;$;zs;+#aH;Z%bL5k|yassb%IJi-KHx{LfB$bQ%mqlKd7dPR` z`>ifcUNF$Mef>9q_A{>aYT~URsWTfd(yT8$y4RWl+sNl+&Bx>`79;!b7>g`N7X0)4 zKX0{6eEkqG9Ohs?;2H6SDkRd5eqT=OYj)5Z9ZK7AQTd3(o)0qddA9lZoAO5z0x4}7r@K1L5iYYv#~-!@>`=LX+DuUU6TE9(1}bUm6d z{BS}pV+}LUf?3F5;q*&LCocSJG!UN~jeL{9BEn<`_eCGn8J-itNg*(+czmC^uib z_e#anyslNtw1^~$IkPE>2Xvw~BqwJ{365-p_cou4RJ8N0VWpD@f@noAb?bCA9Dg#s zY*#TNRpsDyVx9MH6JrQ?xv!YuTAGOKa`F@mwLATJG(r-RGtyY=8%V(*9}b)aeZ-v? zO`ha1;lV;R@GZ2iAnL8ouctA_F`Mo(Q?&BY??1s8g}VQZ1O~D^bEhfjk3#pOrl<)? zLts+lT)7th`D6@EQwz&t`?If|U2!-T7|D^;dJZ6#ObGO$ zcTDitTWr4$QgHpjb0VvcG_if_A({5l4;Z%L;brBP@K`SAcM?R*#b!K$ML@M6$W<$i z2g%VJnSdnM-Cj4uK=o_BF>0C$D8wnO4eiJ7e_}*6P_OY^6G?RkN-c4DC4bwON+s|{ zh+j5Gc;hFjB1cT(ajWc_ECa#EF$mAAl))d+%wBG*`}d4l8Jdvcqp>c^9z@ zbs>r;zr~~x!7F`81!rMX{P|D2(22#bzxhTP|H#ZFX$18+kQAFL$@W1k%t#*xBl|iP zQYkKQrEzH|0x*7fec_JX_w{|c9*Ftsa|;%8N0qbG?qPmlWsOu1=D|=Xa<4h$kDnLI zu(6kyP(zUwC_v=K_De z=q_P_ayZF6ghmX(H`Ot1k$LvOwj|nVsA_=p>!$0BAB)d(4K7)SWvBJT-14gt*?DG? z4h!`(m`SmCKjMuHkn5RI^aoYBVs0pC}(k0Lm8H*mW?QnDm2fgvlsB2 zf2!~kSAN{$s;QPkKhs#fso)A{yCqCdh|^5XISbAZ%#s4t)qJL?!+~D2wd#?A+|lqW zSwD4nSi%SqoGM4FeFA1puO7?Mg>%gxwj5-b+nk6}E z-q5LM&m7g)T5FodMzOwE@Ho2gfdm8PX_#!$d)v*I7v>M=`7MK>>t5?;OKLsH>RTs@yT;f=RgAjSvcrX%)WzC;dKjrCc>zUt4jo@KQ%ew_)ONxWUt zl{gb7Cr>6fm*NuC&JHpYYn7sh%uE{*>Z+r2|0z~cAzU_l--$?Xz7-%gCW%8Gq^jhP zb*hp?Xt%lok2#P@W{qvvDy$?orjZ#Gy#P)hP2s+P8*MhX+;7>07bD z-H1?nhwOrSU2ta1uAn z&`!QNv6xwp`VCk=0AEpF1GlC8x&QqwLXgC-){69P=U;$KwWoO4lOrv~(z?m$V-9iR zkMFSk5_gIQf+W+#FWB@6mV2gxvW+MBt@5Ue#CoO;S%_62RRYPwo>ZRBJZTjMJ(sd? zpAhpmV8<+W%D)L|Tzfe-Ey`qb^q!F%`5Q=}%m{8afA;zgKZ z?`p1u!z;qW7SA(EwA_O9Bz8jU`TrCN5YVaWmxu4jyR8(`un1I>ExsG9-o@*3Sk>48 zh~eB&4+XdFK;bmBd&GEbO0}CDJv5go&4r;wmOJI29QZtaj-fJh&CTn1U@hg1oX}tqIJP<^h>$BD2gpjK}e%ow15*gBC*rP?=JPf!^Mdq`!~U0;v31 z#H?s7bM{&ahCfptLq)i}#673Qraatea@)SEneNFU?$b$&QXIA8>4;_!j(Znyk`s7) z<)E9Na6!iP04cN$)oFh7Mtc2x?W#H1tO!E$)Xa$8Dkk@Nj@yqoqK}{#u>B7hSJBW? z5JlwAg*sKxWrr+xP9}2|7I&i;*9M;nkE@(BVqm|FGx_ns1o$CIQ+LO2eMuht(m=u# z49V<)g{w3 zm`z~*_;rnsqy)$=+R^_~bE_$JOQ-!w>$^H#T^( zzkHf@(7n-t%!Z#)E*dA;9H2*gVRC~om0gC(!tr@xI&SNTsNY*;^L?nc%{wy&5pd3V z!Ni1fTE?kGsvDeJ?R(q8#Lx)4_BhZJoK+ceQ()2e;korSikTwSoBHV1>=2t23ezux zmxA3{%TDIJMp>hlgI%+NyXozpNE>yPmp-?*IJNt+ibn~PxZoLM#m?<{5^BxvC1vvbFgzcP}Oj_bm7+|>ThJM zi}4BKVe0K>8X253IA&B*U}`Sj+8Zh0i}XLow9S2vpR@@tTEi9CO3zZ_Kd71S=Fhiv zQX}Isc(S7^0)FP-g7nl2PR}?)@YnKrZ$YgzDFJ-)Auk>DlwdY#RPnO9Vpahkt5*5t znv>JS@=X&9N2^Oc&kq_u@pmAJ2cZObo=6ZI9W9)fItHMwqNUGvRlXc?v}e3hOcfLb3uv3$Z0mO5{Ptv5BpjLsdk71Y%$*&=i6gv5#kvHy z{p@6%g6m!spL`s|xqgw<%<0K7gPDFJ1`chBC2IZtw8Flxox&?uZ93cy16cb9qz{ME zv})Xj+4wVYYRL&{ea9amsCTe=w*uK4Gvx5rVthSy%AcB7v$i&(y6uAP6N4^oYcF~^ zpQyr;NB?U%@K5Ur7mt6ep=6L0s)ccxB>&O0^Ke3&bRB&{PxTN{(dIgU>DMaZrtl37=cH?-3k)8@F+us6;r}$V2o~C$~jYN z;J>M+8FHQLNG=f$I5HUZ;^Yuyhz$OxVDSUGT4sicx|XR=-?6Dz8R@Qgp6atbG{JLO zgamf!Zfhn|x_`!}xgB~Ld~>uOXuA(n!TdDQU{%7G&(w>w-rZC=^tfR+X_paHm+k{2%OP*#UUN6u=4ec2Km-|3xmYnMu-H_80Ioy#A z%v|AoSdb%G8N)>0dI&Guj1y@#iw4=|yl0Gn^dG&jSr`zM*T2n>!J2Z1tOgWJmA9q_Ng<|AN91xq1xe|7mE3+xq3$onA*)*`$#IIp3q14yYG; zcqP#M8#$SEnCgoo{3GtGy(=EU+5Do)7+S+oupeH_!}qcn1i#gxGO%R$PhsP~n^WEL zk_?w5Gnbo*?EL2a3vgNcV9WyC2atx;k43skf3?`%FcNK`9rvgn=eAnC$Bc(0$XQHrw~NP!i#Sfk3@)oFs|?2W>#w@qSzZfAs~ zmV}J&!A!$(N4VbyF=ccCAM18E5vw}>XH-Ne{ru$1qUp}(WXfJQgNz-*G56t6B8%t) zhN~8u7l6}MvC(1#JIqXb#=L7wnJFTy%He>|b!Qhi#**S}u0z$(rq16pc1T_3^-mo^ z6Qi9%1T6XxHC_`0gC5;$$B8Btiu(E(f#y9mAJ>iErA=irMCwsROWotzng>nkcXmKt zLgZzP1gmoSj6Eg}KZTB3C7*D`@ttyX8m=f)M;@8T8Tq)smZn$fu)Dt)1tH5{s`#65 zB~Vc7<6|WbUH&P92u3S;M&fvN<5`|YqxZ`%{3eS^*sGfHq(?*Re~X#c_4SL3IqG=7 z@n0^FvL*937T#Lfz$8b&_Q=X~su zwSO8{W**k?cCv5EbBHl~%Mw}qBlyUjJ3VgV3jeXyukFlUzC0i0VGq=KJwz|NAjp41 zS68570}DxAWcBYm(*IF&r#3ICN*NNoTAoVc@Y9!e<^J`An1xBLU^?G5hwYYCCcwev zr&Yb%W{P)~8$-FTv9EA&J?2i3^WzZZVw?ZtvYpah+-rxFD%>2I)H^5mOTX?*(hQ+m zOfUm~>^GSuEVu<1Vl*?0fG%{~$A+|EC(hB;yhSycWT8N?pmkQq7rkS>$4gbKEVw~8 zQP@5ERB0h4w)Haag=4DJc$slmOYR~iKG#SP>Ur>@aIBCJwhv`TzMl=}CT*rHZIY&f zGnS`x#S{+%ClA->8exQe*kevK*ZQP4u*wS`)B}e>2>8X2W}w>gAC^Fd83n!%fMQ|? z=?km5{=hGy>Y|xyxVJUNMrL909GP8Twgo{gPX2Xl8Vk7VIQ<-()xl|o^!dHsQdq@P z)(iexU0$L)b`rQF>Y<0{4kDwdcdY*;uabtQ`}WDGGG~7ouCuqWu$6VbWa0g6*x^M+ z;kRMWx}Q?kq&l)Xoisl)^rc4GYHPmtG=t$>LrqcXnhz#xs}`I_)>Gy?f2R0LQcBt4 ztNRf;LSyA*(g|x!mwgRNi)a3E$c!p~)03+h1&(o8@p&cX^f6ppr`1U3>X z-pE5aPOZ2(;U}AjZ}(^wp96(pY3#-PrAyl`0t~!rIp6Sa-eHwmX~srPSL`4CYlb4d zpDrfElnRe*Yyd5B=E~+iOgu*iIq3pv{-_Dj`6|H+79-EwnR5ZFKc|1oge~yc#P~ie z3{1O6Uu^p&PF+u*#pk0NVW%(d1z7euNpBG@!40&g(x5`YAjYWth0o??$N+(QLqM)WGN@`*)(jG+w zd?)1h3Wush>c4Wq>iV!)9C`c3%gaj3wH2tlW3Gk8C)B43KUjTPK#h6HqXdUa3@f#K z{OXO4xUCbz8vx^;>8wwXcB}-Y&ZC48v!&CFmIXxgrr3M&KbK$rWM9|F+ZZb2X=1N34RqtTSTu z&%uLhm*gZ+ooc^lc%nSZof~=ycOnZSM*^r6l}&4HWE&H6Z9dJ;iXjGUq;=(DYGry8S zWQdfCCDfo!$C(~1hz6V6iAPER3BT@V8u_ppblh0`{4kT*7i&f#>O*+f7XQ_knb?&9 zzw|5*N$JSO-76eXQY&F9tIJ!uyiYj&-2ON?aS(yh#aoSze~&xFt>kma5w zXPLUYn0xG6*m%dY%lAM_=5B)z7T7aNHKGfXY{b2Pp)Iq&MpR6xtD@b-gAra)AtJFW z{Zqz`^bt{>4s8nI^JQF zQb(V8W+;$%1=GNiqX346R6uAXcxCea;kn`%e)EJ#xjFn~yY%>c=bDl7=TpW>%Cw4f zQokTnej|QImQ~;$sF;6x5$78kpa>CMnsM&nn}Snga;mYY#KRc#);ku$iyS;SwK;zd3+t6 z3lPlIlq<*h-0%(9`)?m@n40T|`FDOIK@dsxqvGayki;9!_t<`&V9i-652L|*n&YJ> zxS8vblS9dmi`ZWmWd7+OPSIAQ0^B_M`pNc<$SH-z&G~Wan${1i-Tr5WM|T9u`U~zM zg+&YrbDW3rwe1R2v30Sla?$pv!9o(#*=~?r`{UtDK?m0Ku%*De%kih#$Ak{F75G~| zO45}+4^(ly`|(qJN3Drl?TK{RALGc_qZLBqb_W;jjWb1G9Trs4)%Aop&e{E*-YQBN zdc9C?l9LBjg_I(Y8-;1rHjPQ%oUu-fgbg8x{&3#k1BLiA5s)_CGA-BvSTXyFf!>?Y zk<`_Y0|8u1we3AJbOq9boPR>1E!M+RO7L7Mkvln^fY{H3yNh^M$oGl=P3^;Ud>GS_ zQKxn!#z|IGU#)~KMYbhqc>F5Q922ob{kE+BZJ27<3y+>3aUeV{@HCEdaPOHX$J=r% zs#N()t59SLGHFC`i?7i!D<8J|OC=E9?WRU;1~95zeO>pN;-pD^Jp%(qfXEW4%CVI8*NEJMk!1|frmx@dh0XF_nq@JrwMLn%9E;mr z=Ot+o?o&GUn$JPdz&I<1r3YEY`s?tAsC{gC!KYgKTUWFs!VVU8;g2is`wzgUMPVr0^((pHg19esljJ}!4AGK6s0t{6G&rA(5IIUJXrUAEz z&s)SZxG*7YM-h4X8Zy#lu7w9x@mKxR7ry$Oag~jXIq?6(+*>|0`NwUbQ%WgmNl`&5>F)0C8c4?o=@g_<7&Ury zGuTFs20?nH#OUsp7DaxC=f!!>`4gTO-}m>s`}$nj5~Bc7S$XTw?X9T@GcDZ1jP6TF zZp5nZw&p24UKmHIx}Z6KokNAL&9BRZo)(rllyE9%IxX9Lv5 zyKSAhkVehGcNDE!h8>DtNHs{|4KC{HKL90PJ@Xomq;}9`^RK3?l2N-$JlzZtcy@=B zzWxgBSH%3kGc_jBny;2q&WDL{7b3oS0#TBIuV%ZC+Bmmg)Fs!tM+eWjl_|bUa}^#q zG>IPGo*hY{hbIVVvTl)N60#d}{E!Oc5t8PRB^w_VL8b5oUeES_fM zYgtZDh1RS>2_c@0VhLGA5e|#x?((&NR)0aA?vf!NP4m z#co!sJ00G~D>D+)UtDAMP8Veoah;VDPLBaO`AwRQX1??knA}3H@|*h!wP}?gI!?dV zg4;Xdk!)R#MWjYtvV3M*!nG4Y z&0OWvL~$K2LQ!MD9)a@3xh=H zl&8s|)|gfXiDl-4RuS8aIru^hRm$m6Q+r`f^g=PPPe{zZGlK6&*i&!4kIEDoiS_GT zV$cTQX-zfL@Qp|=+r;Rx2aeDnb6TL1lU`ZlMc?T&mYq+agD2Q_uQ(#Vo4a__n*(W7 z{_godZ9@=$64#dh?upWKO_3iCaP zB8Q(jFWXSA01ZtZ>aHCgtN{IN@2{K(Sf62PoSHL|+a*VB=~S>74%c&0WbF3T@)y?50!DX1D?)L&Gl490H z?_}IBVm>586jqy6tAn28G4?pBM@O0*M2QhHDyu7aYCjuiLI+u(U*Wxl*3f=SW{7I^%)N@u+jME$}scAD3x9?czeb;YH+E)1)i!@5K}ypaAi%K_c!Eg{v>CePp-zu6_N1RvFE(jvs0^IbIBZ=uF}!;-IcJci#hmeO zL!%}Yx|<-XJd;(P7&O<%XTBf^GqAHx%5tPQV&Hl{Gr_%b$iE5$C7THq>iry13Q<<; zC{=VKE!zloDE8W&J+=H(=l+4ST#MJ$-@(F<)vj`AAQSIO$j{4*S0^ zq2Qhyu?j3x<1_C1p<1%GUmSNN_Wy-O{_h30a64RH_Y#74^Asrn2K?Rc=jn=@KwTxU zo(lOcqrLh+bBuvo1Qp)f8!s1;JfCzg*1S9Ls{#NHd6xb!WHo8zHFA_eM*0EI_ z|K-^^9*?|D1@)^t2<%ZB8&8|v{8?k+-NUx2Hve7UU+NHmZt#7LNi)02y57uq!37s4)ww|cE2`t$rdWdg zEw;4}7n&;*YB6w>k}nhWk*(NYo6p5Oq~f@ga-fidYdYF;+9|iSe`1vF=;;Dga-wK?AF)XI#vP=oKm#E3NysTGw=_We6+DY$~~EKoPJL zqYWarY2Y8oW0k1gzJY}f+0t+p6e3j7$ywA@r%GZ;<1s5eZ;R(4Pq+eastK&Z105s} zz0gIt#+Mamz>tl*$t6a%rzWqlc0u`^LZa_%Tf=R&RbPJkAT0)6wIg#3y1p()(wD9M zRJ{rBtt0JMjQQ!6K(ySl4~U)66-{>LAz{deCew_J;F-$S{# z4#qT|$$0%(j8bD@|I2F?7{N^+g!S@2fMw^?fFkR3-w8~$EU9|5cqXIS=hEOg(V1UF z6UlNbO5W4#ips*_C_&djWo_$HKv2>8uQp*GrNr8T{9(M&4&`2 z`>MRTaDjy-AI%S($6nHAd1|{ZMSJH@Ya+V^=L2ZG5sp7;i`st~p0unHR*Qvq4-kF) zrP@T61+T*Gk~dypp?vfC zFLO)P3Yh#S%=)!)+nk33fZ23;IY9yEb6QI&<+K-&Wg zWcJ3AiNJQ8%1kSbjk0KUQ=5TN#>7*f$ASj$HLq5Od1rRbD8-&}@!5~0&+TiS5O>L5 zfrFIDuS_!WlZ5*A;qQ#FUu0R$HZ8z6mt8$nn*GY>Mw2sAaSZ%++lP{~G6RPP)ka#T znaoE5vt#CC)u!W4X=LZuw-Dk@sP_dz9X*n$j!K0(nB^U1@9&h)tr*Nunv59kX3de= z^@z%WYb+XkF^_z8X$aMnQRg7@9!bV->L;gBd*~a$dni*gX3! zmwUCRun}tkiQP6g z41Ug&A5y7Bq+H)}+)g(&=jiAV05{rTucdfH=Cfs1yI4@Xx_ z{o1GvbNj2A9&d?cN?_E)`^sT2>m)j@snA=561S1gTZ;vj#DMD5)Rn~JX)nxqVC;8L ze+%(6KMNBL;yHGGnv&}bSC=_o4O6GwWPX`?AVb#K$1>Lg%szxk^zRC&)LJb((M6F# z?@j7-nOQ~|Q|(VT>(-eqk~j0!;}^tI>HGLa22bXVQ=MrW7J*Df+o7lfsCxcxfMhq~A49T5I`zg35IfJ?_fMmUVuq9cDbGO53%^+V+wd&ujzwHp{^^ z)l3JZw~!7I>gAR{FvLelqP5NQ1`2O8e#SzNGHDi-@b(OR0xgepbU7adYA>@^bp+_* zJW`#5=V%zV(e4<_+8VkiF{{)7Zk{A>SiZ_rx)p*?j?vgLd>&}pRo4Sfrz9HxIO-78lW&MNA6+!4z9>e&XC z`_o;~BI{Dlj?@63YuJWOY9!FY zDE94%F;>*q24YYe2^P!i0=0H#lEH8$-g_6rca%2M6f5e2U9%JPp_IVL=}xCNQB`n5 zEQK{ECP%XYy_t-G!B<1ID#HhcXN^nnBkxj4V$4Z=!E%v)B89*_Y$KL|J(wd{#`|pp zAc)++mnIL0Bcbo+o(JTh$1)x8TH%{E&wHwD<-R4967N63^<3nhO+vBaqb0Dne&g&0 z{HvuK-g=6S#f~R+O?&8{VE;NwYEsJYRr)l3?(oMVt}&Cfk0gtW&L8bj4Q&3+&elN5 z?Qutk^c+vo9%TCu^2LxMaLO?AUJ>xz^cC-l5F(o#lz7K-EohjkuZifnSG^UT*Fe0v zm~0>)z|~|P^Q5Cp79*Vzrkpwm@-a(E#Qd0ZtvJ&d^^%Gxo&C(nnQxcj@VQC!O#j`8 zOFA2C?zX?4TKuciJa&DGaYUODL&TiMDs64u6lA?Y)$1RgJ$$YqJ<}_i`nob*%NRX4 zhDa)6Esi@7`oCzw{oij&+_Y~F-*J!Q*E16Sw!`am7MU;>=WH=g{L*x$w5!A4L1f}- zJwt+&5p(Vgry-lgxAyp!+Y-;~%1b5h#}ddl3DLb3?t3|*JeaYYze5NVq2 zaHDWrz|_NgNSEvx8|Yu1C2UP5z>`J(#l~Am(Cm;wKZ$o9(i{9s1qM3ZROJL8X%oh< z&q22Eq=3MJiNb#_WeqW_BTt`AJ(3HV(g`}k%v@fil0ilxJRytJuZbBnGibjqR5_HIU;VlP)cP$+@24(q(iUYwFCBO z?vE(+OA zTbl3El<9ENE1mu>&EE*qWrvxdP3f_JZNTXMi9ZYg%iXC{Q#~FDHEC*kJpdl}GN(-S zSOVtyFjQ-vV%G|pV-u&xa|qO1`3UCaU6U{8*qTzQMe_OZO zz&HxF?zwBn{8VwyiHhxgrv=t<_3}2&P#jnp#5*!GPHhAc5SM@r)Wr4)k*%p-Dqa<< zc_mH+Ays!?YI<11pFoj;3M}+cAAfy??`#|eYEwjRP56fj`=Si)!N_$xbUq&y;w)sW?_!Y z=(7_!8DNYdCwR6-7=X*b!TFMm1Iw&;B;A+=H?{uhzasED*!auFkn|+sdGi^b>s&5e zNl?oC#Xxi8Cz9cEB^|Wr-(Cg|WVA}->@m=c<2UjlxO$GP{0Fhn93A96I-lP{sNwS> zY6R8zg30#7{BCRPH*oGYqqf>!aMqya?fdjaJ=`Dze)YFpd}Tuq*LO{ta%8`fF4To=kF=a!&y;oLwc65=22U+|V%+nkA2ubajQpx=v>k?+nqEsQfi9OqOiNz#_An5cVSKYst-*milf*fmN#|925woOh?G_Aq z{{g<1HPx*qi!*%ZkG@mh0V*#c&UQ1@vk9bsg*|7U<(IfvDsHEgpK;7JfB+Au>TI5| zI1efZ@V?n~>viwo_G*O|xRe6#WNK$&lsXs85~4o^9PT zw%2Y0^m~qx$_*146cFA^{KFDMMe%Ea_@;`& zg^x>$2z5Rn9=L}2+~k4j+^(7H<`=I?>=BT2pqjUJI~{v_6Fxu6+^)>FOSnfgm9FYt znvube+Cn!8e9)L08s);axSNnpci;D%_`+Y-Hy<8)?$8Z4FHb1@hrV-NkuyR>2I>Ur ztVDf~3K@ZV6tp{-%_BBrrWbc?Q1gbk&vpB~{E05_^YBnUBV{T4s)6KH(Q01{QvKweVq$J5d7>2;O6-}dZZ~$D3+sw2$e-^Xi?jmrpghHF>gVJ_che4~W&R%_hZHZ=~Ob z>4ZjMVp=zGrl0Fnw-9$~dg>jXz*YiNVZL~s-iB4B#}Q`xQM1?9{$%|WPX%NLRpk!%uQ%S@-`=p>WU8*PF_9n}XO#YeXG;WW{35WG^h>~P6>D*OVr_98 zE8zd?Lpl!VQPw6rIn=&FLR-%0R3q`fG(am)@rZYeLQzcg&~Gq4h2hc%A6o6Q*9-+_ ze4d(PZv+6xiRD?^qGikMd@}&5b$x$5GDY5{I6&$bL8_unS)2~PbHxmegn_JyXwfTV z=#KhO-$UA&bzzP{YkM-D_XNmmU}6#qBl}WXi5Ouu5NjvqpGwO^e{inLnsXsmrnIvi z)58-af|-G$!Zu+qX*maez3+_Njtg68`>Y?Zz|=lFndJ8ivZJ zPQ(Ps!A5RDkuTSAtIroRV!>;;c-+#Vb9hPcQG171*J-A|%wOPNv3B zeyiu##10^!8Wa?}65V^BR%tR(LqS;b1z#ZBU8dg*6~hx}9BGJ5yFZD#vTYtY}TI>hqTsnWf{L}uu z>OX+l6yd8uM@0&K{{Kbj98$N&O?7Vd!qR5QE~dKIp_i#=GQduu5@+|FcX^btwt79D zl%t_`S_~nIfx>Zu+~R%Yf!gU4jLFEQ9{#{KU|8wUaJFP9 z_H^SFBB#c8+z~%#!$tOR^HR+~LTR(vdw(8c-H0Yq-7e}Z{ai)0p|jjjj-Viu?~?^UQTU z-*l$>Vt6v#(2goU7!EohVPs`_pBj}>-Z4=pR8$4DSW*U!c9|e8t$wO?Q!+`APBn6w z%7}``mN`P;3z9hRm-80LW|tLLVpei#UF{TEKSYIrerPy6ecdTqmbv$-^-f>4iKTD} zBC+H4Js4%!#_)u4N>dWml~xy$jooKAv<&Sv!Kj#AdpQrA#_H9VywrPv)oBVbO8$I* za$v;yCTYaZ=~hMS$%I;HNyUUC^<^wphHKF&*^QTonPe3A1$o$M?-Z+;2*#>V9m_(DeA1iH=OD{({kk#u`4s)p@)Xn(fB)Ml7_ zWDyH)j;&Bz+LXq1hpI&WyS;32~fu|?35*Cu~Y6* zD*8mEW^KdU!+edj-0CGADQ}!?Ixx=ATM12{5V=qr9aijVM5z>&n2dPlAodM}+45cH z8kYi!Q3+G;60(&%IQkKv?CLW|uwnb2mfy;Lmy9%r+r7!8mMU&L=uvxhx~IX}Iyd%E z_K?0)?{o+I82kpkA)TITJR^%n(?j5>Vr)0c;jDbk&&TDk_uV3dQ=rQb6roo zm3>_}(oR3CTL~<@jaYN7f04zFmR8$jPC;g+Z_&>c9(Li!OlbOrWxpHu=N){N-n(>g zK`{6=UBixSFz(x;{$k(i1qwdI3E#~<`@kb!cVKLF=O23O;@5qod&ek@o zgw&;q9ITc=mngjylv~KgKjPprcnq4JwJJYXJ`Ac9-0YAds}nupNOrgsa2Jk2+^T4y^%8WL8tS6+QAfX=->B2ZgW2|cVizVn(wR{!Y6Pah7!$&&(JeQ)t8^pq?25*ji$Rt+xqf9c$MxE&a zc%hc>=EKFc1LNc@Pw*(^l}L8}+2IF%8pgX?{n%_JA8y2Xb%#=&Vl`-QF2g^w{`2Cm z*50MT<^0sY&d4+GOMlUdL#W*!yLduaW0E|k-oXoxLdlJn?MA$l?1USQI6kapk>;&% zS$!S8E+iBcsNQY8+CtHqTu%9w(tVQ3YTQfm=rKTFVkav2&U#fL#@@m5(f_`)ZAwTA zc{J8Vu)Tl71bl3*DD%Z`@;(X3wv#GuwOKjl-~|5-!07sfniw^KFpdvx!cf2ei#`vwQf%hgzO3vxH2u^|~OGc)0#zT2hlt~G4h?w!o|7*Enyk48a8A9axAH|a6JTQ#iy)!NJHIEF#p+KebY=hNb_V=k zeZ~Y^#$%h@#rUVy6QAuCW~m(u8HWrNG;cJWdurUXP{8aV$0Z0#q3>g<+KSSR_7Sz~nW!2ExQi^3C$zpH+Q@rTFN zy<8LgP-?;wnPTAhdg!}ZdqMI!wDdQBlB^!qWCXkHZ7dVTlM6@2XjYnG2`hcM_gXeA zBCoC~P8IB)^s7ARVvQjgENE~g3KhrO8+Va`;8^R~dz9p^xF$n8HgYms< zN!Js%%7mX7eWP~Mt}GW%M~>StQ4hm5C~8#p*O6{ORD9(Rf5Jo} z=?6*-9PecOb&3hH|6M263<7okyxen!rKNU$di;Q=6U(Tv_zHe9_VU^9c{s#zW z{8jQm!r)5G(k%Up|AE3=|Cs*#7Z92343b%w0A8T>!CWLh-AFIF{{RD`Se-!@H;I`S zjSyc#p#rt;bH5BdftCc^SvqqD7igJqwJ4(i*XkhN2Y5oVr-gD1s`X8a%E&$3!v*hn z(@Mr-5HGHEV?|17hA`>{J7adkJ!~>nuTIS`=oR9F?usmGV8?o@W3O+H*KFmE)Vw%N zbQSM?JCU+w;*T*43U{V3%|Hw+$d@3S#ntYQKJvI@&}dGRG-od_)L+7nrOY_ro+DjU zYBu5Bay-+CM3An%&*xs~-fjLy@Tpn)iUBVpTY1GOx-jH4ojDVbPCdj@=J!DV3z1Re zaszu#l+sB2qplyN5M82W6j=h%a;=4F0MAJ#x_4PMB zE+H`CG}K=ATj<9f3-;%f$0aitlAt#?Fj*igOWXkQP{PiDmUy^j{FXRt=otOi>f!Cg ztF9OIjrnMW3~bwcFEI>$yjzwWUwe{4;A(a#W=_g=B{9hGT@oI-2#KxhL>0#Wx<6^_Hb|nK|(*KL1D!?XN z7$poY=eW4uT5Txx1D}X;ES9Z`y$lwA`TkkBou!hOb6di_w+tmYUMtJ{1};G!Pdd*? zL#T(HT!n}vtGS6A2~ae;uKB#uK6OktJk|J9DY;gH2$p1Q83?%K^dDg1yfZm-eDI9m z75hoqFlK@r$O_N+CgbnzHhGUvQTe1$wawaO%1_u5FpZL<~>e;?fuSt))n?&l!fm`r{_ZoA&^L2FM>!-Z0}|_^%pq%Ko;ni(7uaBa2V|L| zyHPZY&&Io=$vj1bz)e$h;%NRq7g53ZsG(4Un<`_X*H&N;JW%*^PVgLk>F(*UX1p&= zZ~>o`|7DWA8OBp9CE~I3h=DI?MvK$U&Gw7%=e@jeCA=+d^NcjEfA&Q(1c-K?VIC;`*oh~^+=1V zVrU0iFGPJYN+`(wdONebO{3*wW~aAXNcocU7@^vLDcuL}rK#+iqtwItCv11dg;Tpg#M`)47a-gRtCvf07e&n-eJSBA zlmz@v<3ndicP{SI=Ps}2XD*qpq}A51=ZU&1*xq;rZk8nVHP-^-`2n2`8ZJ2rUe^kv zh0Szfl`u-~=;d$9+2#4=IHQO?J8+zj%G2#z#K;-p7$MmZL0;@@w?mHnY#?cb=VaWT zdh7Ewd9B_N^XLy={FV(RD@)6!#oYlqxE%d%WgL9q+kXF5hFOHGTNxPyiHC=2-@o|# zzMXE`(dV+Can1K5tkR+Lo6QFZ3&Ze%rLQ*vxMm@0%GbJC(J+&iN;obgjEAW=B*zg) z5T}8>R3DL9oW)o|m{nY4KUIQf1x|u#sU!gDzPQOjYX~WUQYY_No1(gQ0YNnN_ff6b}@_CGzsc|psldOkFNQux^fLZloRR#WnbM< zJIt%Q9zh^y0#;-omY!QAE|MxkhG6& zW0aW68gKDKX2|i`sW)`EC2Zig=$JoLIHovNTiDq{q44IIBO8NI)BNz2A&s8O)=-a_ zYr@O!_}H7DIr>M@fFygL@FsOSe+FKvZhN!1qJFkE8gS^O$W)2KV3RTD=k7Ke_mQlk zk(`)7nI7k$7e894xF`)Ur&+%gO4G$J$DH;?7~&5c{N7%yE@`INXaJ>e@t(Fu+Ivg( zKs0+>@gj{&(%S7*Yl(kXjQDt{Cf5yqaLFiB751`dW}`!eHwDT(84!o&oUpzB*%%Sx z!m|u-#@k`aFGrX+pGmpz(d**PsO?!79%2@4cmpm5TdKukzv*2l>e#6$uM*76(ZNDD zlHpm{o^deF-jLk;{{TYb_=m7>UMmzklebXT;^zO`y62@drTTZ{9LYqEX`(=_jt7S_ z-p2}!|7lV=?i=+Jq_e{J_N}_C!|~vs5Qvf%AkTL${Uxqjpau}b*Vv8lV&gwju^}I% zB$agTyVR{Ke6|b)H?fT?$}RicSCT9wohCS9%|Y8e2GN2V9v!}AHj^g;xLr2EM!6X_ z1PAXJXaf4}or&VVQD2X9c->fygwMoj;3{}S>ljyA1l5S6_Tm~y?@VUu<7JY#1yvYs zIR~GXtIGd)(X3Ye+*UjVtdpGWQ;?>IHDMWYz~BCuFI$?)&7H*V>0!319u56eru72N z!+U1vfKz}8d)tD8K*M_AM|kO_DJBp+N(A^kEHvGGgn&7gdYFN2ncx?j`Ahe0+v{pv z&APBa0N6k`*OX^KEL39J-GNtuPl;cJ;Pn~1%pvHlG$w>C1uaxk?T$Sw?=u|8EUx;| z>;q15s2MDT%|Oe8{m~-59DHtKw%z}+c8O`6AjqJRLVYW*3t%D?;l?zX zJQBcJG`G{wO11Sd*s9G0yiQeWP03q8M~oL1UYAQZ>I$G0kr z6Vt+2;lckx2`mmpt=9y{uH|8ZDxenQAuc7f2HK| zvvCE4ITTP?h|gbfK?n-^xaa+>(bdNGC(YW{K?g zQ06A-m~pN=O;NEtB)$w_k3c12ku?MnP{|a(s!CF z#7Ug_FRm+hZJ#Wo_RaibKGbmUB;vha_!9p+!Sl}m#0|yv8oYx=@?5lxd8-v)TfO8h zU2Nb$knzW|--){;Ah~UB%F)K>uEr9n7Pv`e%r^~|zzk9)k)8oFRE02ujajPsD_99= zIK&}=qcU|eA5}U=!^o>AITnCEocP2w#?belRx@#aY=s1c<Q<38-n#u{quF=`2>p~EFhAoD$kcwn z(3i-mk~CUDS5Fr&nupV%*`?~^THe#8{4L5v?$5(RfD=jftIAh6%r zO!^6sv6pf&AarwaP$}O$`?>L*j4n{Bc$jm#L*aOWraBkMoJ!XQQQFP>Lh>!DI_gvB zQCx3Fmu%3m!zf8UUtncXRwH57$SXi40uBV){~``W1*aV^w9u~DCUK4LoyE|<7|7UM ze3vvTA9Jd%PF$1vnEDk>oBbB;FkG>k&Onb$P1 znn%~s&j?n=E;rVA0X?2iP}UTWv9G)t6pz*?Ou%;s@F2b#1-MzIHwAv_O+@{aL#uYi zG>UiHD8(!C)zYD_Pb|&(zgc8Gfw;hDCDd5rqQt4&RUb1u#`$a3^lW#+c?Xbizcgtg1{M(oP z<=+s^$9*rHw*+~&ZK#}Hc*m`%qF;^D>S;-iBvtgjO1g=Oj;!10*{o%twMOZmUUu)c z<;l>gU_zth$8U6GW9$WClDSypV&azCKj)G#5d8>>i6&upUgF z4~@9LZG3dQ`&-@8I7k8ni~Kh(ovYO8;Z;v2C@F{jJ|m9PZlyQ=Q08l=VONSY>Y83p zROCtO6_`nWFOx)MNc2}CHgJ3PtHUKRuYv(&Hr*jXT#nH7B0t^ygf|;VK37*SM0%^{xctH;G9j1ZsP~F2Aj`DnDQc_; zXK~-cT+-EKD7L^q(EIJ_KL&0xLrW>T`M+Uw2&G4f%!Xadt1BJ%X`d<#`GTS9xz=mZ z2{nyUVb$%{qag%a4ws9ts`Qs%2+^0|nYtqD?vDfI#7`N6!imYDc|1S=&QQd%KRX!^ zsYEQD{R5d!oXYJMg?%plJ5Bx}5=xE`*rrXUf1>exArmVflm@2N@mwoYJ5}v|j42tv zzKcnwa+~&sh~dX3@kAaO6^^R)B7-rWscx%5Fo{XrLj4;d5v&x0YwR_^M#Z~4FGwH+|uV0A=&q(>+Uqe)qofEWZD9Nf!EwpsEH#|8h6sL zp+UiR<~YiRNkhWYDaYE)FpdSTp%N@nmNJ*z2SK@2KKGJAfJ4m)%GPfJ%|Av2E|YLN zhpfoLNIl86rptKvRNdun`_;OiouA0WE}akK;g*F(db1tkiuNng&;aN|h_qdzF6n4? z%Xi+&C~Xz|$PM*bnhXIUIyN2b8T>tsO8*un&O9Mdp*2zzCBU?u5rdse{%rvTxUi?6 z5_>~W?uAsRUrNr;76#K!h|9@ySVdx*1rVWhO(wjT7`_F>b_A78RZxoNPal?8Bj1#v zg=xlqP2phriyS@m)@383&dR2O3W>PVI%;e`gn-4@m&{w3)&d$47t&`Q1ilp8$4E+Z z-O2U6&iq{(bHeRh2%g$Fp`mv!uL%8|b&qp?Zq4ruIyDBa~c(wrDdSoL(I4R2o_md9i85$Z&vDO|$z z`ruYy0Wdt6>f7d5+sH&u(gn>M`$7ZaXc=3e|IsI&^ey*6_ANo2|&m z%&ey5_?fY(xn`Q&2C*p1RL7$Dfh)$Bm1g@1@rgNxB#CVWzBY3{Jz zX~NjZo|qbWB@R%AER_GriZ5QWXoZ+Ma1BN&RvBjq(+Z5&bFk1@JPr&@$p=?ZWT;p& z&8kwSR9R@kTKVd1m!UmceK79&VZ^;6&(}bf5pln~4u>jjrlFne2lrCwI7xlov*)j7 zt|4+!IPcmFTSYn5-FN@~7jP6cC<7+)T1D108WyF)D z)kq3^nk^DVGRS`JhSPylSCK@nv6R!T-(auJvxS7w&j&c9o|`V8x~CsNDe4SR zmZkp`mUsMK_?L!GRg#ZfLpeIWgn=yzIF{QM`$xsR<)W}91FE1lomai0OZlD$hFr|L zq#D2mmMm>lpvw65!5MUDvO}jSV|P`% zrNAfLf-|wkrP5qnO;_fqWe$eUbww#9LOpks4E&5doLRIxE~XP1>uzh<=G-&}&P2zw2)G^4)h+OVWtQa$d;>xpXp97Jdw_7B+(njyTo>11%Dx<87j>?nf_ zp9I>*)qJ8h#Zn11%kIvu?c`s~%C4wTN)<6&--UyIjk&O!56OrO^^EB@MW4)hu;i!Z zpQ#bW2&!~;kIEY#b;sc|Ru}ZU;)lXcawQ!zMC63g#OkQhcOpYTS;oct3SS>yawO34YU7lA4F-+sttn z+8U^_%v5I&e8b@%#vsnRx$T?A2swp(!n$VxLQE9h1rRx~zRaX@mdp;IYK!Kd!Q$Nd*ENzIin<-b z%vX}mnu|tq{=0Q*;%xR2s*zm%BHI@rtRGvQDoE9h+SVOVU(?$DriTp80IO>?<*HjP z>!G6Q!)$IZz3W=LW&DA`a$+S_p6105)>9*4vxlp^b6XP%sa7&i zzv#wI%d{4dyR@%M^wt?)uqd5Qky!YV(Zdplf;s#AMn9{&X&mj zue0kif`@mwEMnk|t7CAQ@o}DNS>m2e`rwv6M^Q#ea~wYyD-q=-zQ#%DNmh7^M`?*! z4PJ(Gbk;!=S2Cv7|CRACxsiBT$o(TF(Bwn+%qIs!t3Pba!^EROA1%z62kQEt$$anQ zPrZi2bPdDJGOlNG=2c{d1~q1L!s-j3M>8R0s^3fL_Dd*od|uL&cXCUXWrBATMOvGTT0k zF$;ZPP^Mk^(X`;jvkZV8-Wk0y-=DtbXO(+zLiexAnSTVP+xwYZP6#Gsa>ViN{Ol`! zlc*l8^xE!^(LY#Yj5HT(FNvrPd%_r^sBNr)UkT5Mx+;?&{qw8sok5U4(zJg>4(Y1u zja9AODRK)>1?9|Ft`w+E;JE~09@0N&9MWtV*)y^VC_!SH34Hlp@l;r^M^4Vpqlev@ zuBvFkCxVwkauDx+(v(b)ErLX$(>RN#6hiY~N z8J=uhDWc^{D((@bwe0_&L}^y(1eAn);tsGwa?aP0chLajd=ZZLQ zdi@uY2hW_3R56*I!kqxz6qvWBK$xw88>ZA9MOyf5u~_0C$U$O8838bA-Ez}w5efUp zzBBmY(M#W<+^E+oe+4GIG;83}vBlIkrb`PExeR54y{}8r3L1VtJcnV3=T64{`a0i9 zat(7_KgiE}>hX!k+T#qe{<+&G8{9IeX8d3te+3WNLy(eGLv6SU*(+L)OkeUgXI0>$wupA9n3$*EDe)3ku1`__wSNKXPLw&& zV)s)K+Dc4+pTEw?8M{hdQN+nKm{{Um+Fd%&oPH3O3~^JTqz&Uu9cO#{ZrVvgzlF$- zo7{WG(4_F9`AKeS?(7BbGNW4f*AF4AvNn0}k((JKw@%RP+L@ajelRI?xGB7BCMz{e z3?JiqN2jbtjc)sl;|3(ZmqQGBP>@62kW{M*{{cYXM0^3Zl1?_S%8cYx_Sr`n57n`5 z6AXNpqr9{v+55W`u+{{bXus8aD2dG?_PlCPvIT4QU&Q<{cz#|XtTakOj4s(<;vaXH ze7^M6NtJh8%xvz;tp!|KCKch(0!8*^SuU$(Za9I5L{|IV>*Qk~(}4U%7x0~l$iU%F zhx~g&_3KK+f)Vkv2_$<6A`i@U8f1}Q{VC`fcq7&p$QZ}HlcVQUu=BjTswoIwYx%a@ z>mjn!S6(LKLATQ4_G5OiF88X^PyXsL4zFBE!nN!$?sEpkMi85SyZ+JBhz>E6X?c8ZP$?Zq6v8TbV-_u08o+ zN%0eY72R*$;6zVz-H&-%B^`ZH#KvWeRA~`3DsG(y3_HiEP=AL69h%42LR}8P~2z7nsGgZ_CwTMd(d$< zb6vCZHvTJVBB8PZQ9Bu(`X&*91nyNKQ=09`QiDee||1kHKOL4W~+AU6SZCrvo!5W9)H100J-Q9x(4c0h~yEfi9 z1b3Il3BjGG(*OM{k-ZB?a+Ci>Z)PU$cHJcx|; zbcQ~_!*#;&WhivG`-@{X1>7CyJ%yM%! zSNN2}vB9z+HY*xLb)UZ?4591y!(#v&xB_{K?K$3yTeVyhDpIEA|JJkR8^V2XIa&JB zWwvk~q!3YKZo1=cxa-l^x}ZzLy;RnT%D;1#&$6{f>VHliHBWV!<2aleQ|~tOMDFqd!fwT_+F&@+ zZd^ZNP$!Zkt@sVZB^m^C(%R^G#;e^P^R4phN2j5AjH_*a3%#8Oe&B>V&;fAn-yIwI zVMw|eU>7Rb?3T%*%$@7WH0Yo(_pm0s5zt2Z~djgBI#8L9yjWT|5G_sI`B)m011>QA;ghm<@6 z6di8W-v^_NFgJ3g=BJ!LWhN59+iXoci~8u$gdb~(*dqO~wxCRX3r0iDC$LYs;K76R z-PYD^eSXFa)Is9*0ro70bd3OH!F}PnEE4Tc>Z!6xmmWe?dQ2Xm`g^4|HYz;j5I$>k zVPMJU@@>ZsG_0hG@#nz$jm*_>g#E&BNHF1cS2|`@@*|~boBlCxku@lH4g**Wo^vH9 zd|Rm{|8$|oD2BV_+5jZi7EVo5=U5f^y6yvI+}iFQL zGy~G>+@guCJCx}4{Vp~O*iFW!TX@I4wbcl>n57Rc^gu>|J5frKmJSnDDV(N=DNdzJ zS0Pqy$(Y2zJWe`X?>T2s1Zxf{Wl-UxCmG+~y-^Jo(NKPoQ!7QUgYGKdSG8s$GL&U{ zdbKHePS(4(3xht2n55-qYkzsXb6}{u5ZFn%#}f=MsBsjnEG*r><8(h^JkG=UzR@7J z7cy{MxhgIjSg+V(H}yd}!dQ8Zt*W}bpv_L#A0_<_MP+AM_-Le+dVQ!rqG}UC`Wu$t zP9Z~XOg4aw1a=!{7Ork6h@|lzwRyS37(7{O((I(P8I?py;NJqGv`e?b_`+c7Y)0kU zUc5KPV>(B5$vcjBz@|&?&`DQ$6 z%q@}VNfi)Gz4f;|kwnMDp9dw@?(xm=?AMxwI*H)L=IFWor7LX@l?=Io{bHgTDcsx0 zl`b-@>lF^I;~X_1&UeGp?vZI^KAxC0iH5Um5%GR{s(J3A(32a7m)heu{YfHOz>-v+ zB0n6bMtfV8R3fn0Opt!AKW&gH%teRSkG}Vks!nr7yz$YJ4`Pw}-?nu&X+t14=Q%KI z@#eginPf{GnK`+xrh@DQd`ZN*LzmV)iKgo$q({sBr&Tx<$uhgp(4A3A(%BhD|3OLt z*O@?E|EqX(DX!s9r}>0GN3eK?32YD0wKJ{S0?Ti;t{e-HkmtJYl$t~0kye#kW#3b) zM;2K5x7Ds!HJ&h(i^DkK7-&R^XIRJ>v!luV^BH@X{G(5huFg7B1*|ElnF9fDcBSw^ z@LJN5+3i=QR5!=xwqd|gTE|QnZ0%z0=5Ky`@`jIl9&oJdxJ^S=<&l9U!JfHLovok- z0r>(X&l04X>WDx)lm{{Yvm_{{iHrdt-!B|kCi9dcps9p-u$|BSDV(A2d$v7*y|tu*9^fRiEm~kN+n%ELF-#tf%_g(OHGLte?3#wy=DmQko@+4EP9*rj zQUuLbo#Mv@#MbN>HJJVn#3MdQ#s=?Q$xDa0C1y0o5X?HM&pV!4QoxzYg^zQ)J8A)! zvVfE(Kz6@gh?~F?R#}fpIGLz5z@eQ=iTuUXUh;9~%s=teDwQxSvlY8)+VEchYWxTo16{_UJKh$7=O8g5SC`SD zwikB=yEdWpKzMvAu*Tp7(R&o>74+ORVuTPwN$gEJdy1aO?Ro|0`h^bl`X-Wk zKT3!&jLw*x!JaIJl>Rm~-r;6++=!o?takOoSmV?Sl^0-`q~RZ9tHHj-<9CxOtZeP? z;9n%wH=>7t7B@;*Vi?Hl;6ZKOmT91;Gy`;?_SoicgM4{+ilpLv8dUZ(1Mg`@c{0Ax z9|@}>LOuqf@46^ zNzx0pdvC=pKbN8Ac&jg7L)FWR9AC;<812a$Jd4BB*|?0Qc^D*|OMt;G4UK*&pVatO zdOG!&HZt1}%LEldTUBpa;`W>YO`!h}0?M!r4G3(jO-=BvQ)3>h%!OT)I7q==ECT9I zaJfkiBbTY=xp;2Gn!=s(F9I$gpbSX0D}#o8x5yioz<(rF&s7--`m&{hfsowCKEmII zOZ;4Ax^rVe9gp=KT1Wr-Gro^^w^qoO1EM{XFiS_yxaz7LD8r@`kvvwc-~}ij(9vyV zni+Q#zS79nY;LYFee3zl^OI=u@awv{{+ne0P}z4?o(XXg6$;mVaUjMo-`4zc)S!;n8v$b$EQM)pjq~(Nw8nZ0{ zZdo5w_2igeq=F*U{g)j_APn?pQqbb3(^%e*_5>{Fi>@Ce(C3KBad?Y;Uq?GUfAfkb z_P`yfql~z+>q|j-P;Wm;TYr|)wWOa1QjxUj$yb3s_PG&xXF?2v8vxZmW?0*7;PGCc_#{iXnn{ghuJ(!%m$wdzQ~?|EuW#<54j}F z`s(1@bi>{E%NEPrf8yQ}^jV{i&JH{q+obsvLxiRcoH;PojckD}zqDJf?Mww18+b~5 z8^~ueYO6k4IkEZBu7wd^*_+Ggg*Jz_fW`q+GvB=*=FVm^x`iq5srjf=t-NHNc8zwL zxuu9k5KkGqTv1Ei7}V=o+JlLI+bnYnY*kx1?jkj%4>ISWe5G)8Ni-18ig@F!YXndn zzQpz^FSWT<;2D?j)whx)da!>I=%jk6e^F8>7-kxM(`VKRj980I{&BjLH{UV6b6PIf zmLYBw-g|Q~Vv&{2+)Eus89UpgUO8%#h~ICPBz$1Em=UI~b?#!!J2@?FFfQ#Ts=2vOW}w4QmRfgXJ6wu4=Hp!|gD7xIsOd$HMoP(#GwR;XjC$}O)K)7H z`wN_~o3evPRmeJUZFWvMm{f8vq}LFOX+7EK--GSA=%b;h*UcJt>8=S zi5JUNdF#n^=IvDPS?%O@vX+;Y*<-gopX##CP9w~#7sa5nwr@B)yW>=~Iq`XJH~(Np zx3sbL3z)#3W?T^$#DtD(Hx?%9IY$;hM1mNlYsdZ1jLp{RSDIfP^;J`q#M5;Y9Zw{e zJeF9x3twfROiDRWpi#s4h_E8c!%VIchPc_O9A1rT(#QB9{5j1-C2 z8`2z=S%lBMwLu_R*jr{oFlXMoHW+eM9WjWp3snn{+#u%l!J1=tzOXaQT{M_WKVtdA zL3n*mjeCnR+@$JxaU*+eT^p1mG|Skr)T~YE->3`=tuou+fy%Wsr3BwEL;9TksV@zL z2&3gw!?An-b{~ihx85tgV^Y{fH%`{y87X5~*>|(cl2R?dp2KyDqF94-|LE;03)qq( z9q@-F&SKBhFCdmwngZJCxh4!1_H#nY=oO#5r|%O=XX8Uh>9QUglFlFtdB+I;wG{et zHYYW8Eh%~DY`n$N;kC~4!s^cA*6)Jt+6;1PmDwf>E*`5Z71AV%A8RU5lu_9}W&gZV zm94jC!>68A={T0`&uGG_6*<%9#$Ze_=0-NOB4Lo=_@IqLUFP=)=!yO<#(J^a(zs7p zLfM_1VX7$XHpQxuVcl76W4I(UrZyuoP`R_!(t%VPcW8%zq@i3wX>9t^bJFKFaxiZp z(hxMo3`;*IbK84@{uK$D*g4|^7YF813lrm`l%d1;1iyRCggVX*&jFF?Gx>)5)mT;k z5&vt6xKS(Ut=<_IE|z!nj`!5Ym(kw($Ml|vroQ_A+VIMg#PWyIjdOpOP_J+sG}>9pD0xkfSb89rzFBA06r1K zB2vHdQ{VO=f_GDY82(SZE?fo;S7a z*|v13WG$}G zl{x-&e0AC~-xOl;WV8wMEqCnb?sbi+`t0t^9}i{v zz7b`u@mIn%CAIjjF^`heW(DP|0r;Hs?wk~l@zN}>MnD}?45LnYV#*Pp>V&M^Xn{>+ z@(T2%J#$Gf^Icl?H^(q5s&bJGyBd*vk66~dEXk%KJ#2r)I5=9!%@*rf`b>}OvY7YA zJL{>&h#}siCXHR9))+YyH(`HS?W?lV)$vCM_ukm5AEp_VmR{DjE{}&+4aR1QOjFR2 z7y)WS?ENIir)`eE<*MXi`t!oCekG$4n)$xn{NHEe4m<}h+3IQJe)nR!7jCX zW}=57Udb%jqV^L+Mj!`6nybD86Js1!jn=I*=h&E=q_EfqU-f1`$P2k(FtUp0>-aJN z`~-&B^!54hk$ER8w}o==YWBO)7OWC>;;egd5zkDoHVD%41i>p5b3jWSEAvAZA1(a8 za}^&pGAq%gt+Dix%cWXWDzuv`Z4p8lq@TP7)l;o$Tdm8mw}>imfLs_F7{N-+#;}4} z?3ziQ^VWTO?;K;RHIG#6Wz>XF^)b)2rUl4XZnXd z*a)~9OYMCL+dG}TS)t4v!p!Lozo&NiO&@2IMhhoZn8_aI)QofloUrZRKS3#RMAh`q zSmup-r%WRtb}WG9Hq9-{IXmFIJqO_94hd| zYjPVBB>pxqs2X*xWFNDM8(&Yx4a;n1$Jl?NMM);}Hk!)tm%hwwNWoD99Ih5_2q_e& zN}598iw|A2`YJ}-CHkjBeduaS@7sDH=XQi3rRgSQz+6CRO$Wt0?FkbI$E< z>RfKX_UFC)thz>0eH_)&O!A#g=6Y7R6B8}4Hf<(kw^ui3w`(5gNQuV+hNR9QY?2); z)unC;?k$Pirek_IbXyZN=oKM>=XT%HEls8_r5KH%W`A4WI2Fn|mSXXgp(3t`)2Nvd z+iYZbahfehCyk?ZM}EUXqW6`SL|vsnHo+#;kO*MPcj#MA%WqTYG@G358?wc<&$&Ji zlY-w3dfd+B_+BWTlA653z)9Ckn`HBxb22i;4q9PI?_6rSR3RQ_6w*=DNp%F2&MO-j zu6j`-EMcK<8Luj_l7%{Dq}MmtNY4e(WSmL*uH(wfRnsMQ1eIS^Q%gqgQ~u>ufTISp z9mCv1%mm9?ICAL0h;zKAoc`+5^Pikhrw3V6Y4Q`{a~;48u-bQppoRiTFi#-2MGUF$ zW;JO-)W{}Nz28rXq!!LJ&y0WU`#MIQy@=(OnP(Bn9NtRbvW^z7S(vODoU)LMDs(C^ z+qD*QW%#ya#=t*JIvc)U!6)f!Z`e&z=DPay06+{9GCAi$VjsXoP;xn!z~?pr3xW8E zbW<#8;Dh^9fVOJLXeZepHE+G73fqNvmRZ|{<3f@&r1x1yN70sgeruBh->s|LcHnuO#JK->#XNtI(5C#Y z!E8qz{9J#fGu$Xxe7xd2INt@O?Db(UTRNe$WQF|DKL5;(;3aSJRW{FnUjt!i3h%h|(i}+2;ZW#0cUDbQkj#V-1Gg0$IFve-`D~eqjGO$8{v*k=-hOG);zU_Mb6RbI>?kOl)2(oG(KlA38V)}EH$YHwi zi=hRbI>H&K{v9J5$_gnV&UryF_)7VRX#BnWIgSe64ddivEy3GJL<9-CRfnYRV9kV$ zIxu+c$TU4PEaB8UGc71RPJG+>dYp>iLQGJ}J8Lq>U;#RNSs}z(rY}+s#!F2xMldB6 zMuq{=00Y-f@_W9c3Yai*@U7lMd; z`=SaG3V{KRUhCWPIQ}k8K2LS2FqhY-O2cNMrM<#T25u9UKdN-JR}p3p)=csqf{LOe z$Racr4gV0c0G`CjLyLZ!auWF3X4_cK{;7$3cJa0(@QMjW`iDmGwO%FQQg>j#X(&?i zqqZYQE5@v%dij#+nZG}w+4r6p^k^M;*Va*6UqACUN?a47(s6Zn?*QR1S$&I^r0-5V z=naNz9Q73y$zi&$l#q(7ys9%t>MlHw0XLC34v5NUVZnU`G<7E(##x~({MHi$Oczb{ zH9BT(O7WWgj3WL;oXuAPMLQW%wmW;M&o1Sn%g*fVb^?J2vV>E6MfK)q`vOTa07zsz zD9T7*h`)Z&u$5WDscag(MtO3hV5}_Emgzy=-W#b0?iQzDwzDIFN7ElT@oD?p zCittZ_s|meqz%0}{{p6Wov)>k&uYvh3MpUcep#RKa(%JM3aDZ${W(Rra&tYV7nIIP z-XwKlOc9grU9JJsTC_c#k)EioB7qU6CD&iluQWbPNCk{MT?|e2{f{oWuWf;23ftsc zKd*UcO=#(~dfV)e(2JrE%a1h&YyFF*lgQoV*%_RHfUTMCJhndl#`{RnABvgxC=hXM4{+vJd*LW@0n>(_aWU@q=ka9WJsJdqGWs)T-3_Cc@DGB*l zPj%(5ZQE_hKT+GN=TWI{ydW?p{)aG78ynC0NZNDX$QcrOB90hkOv0~LYNpz{8Jk^t zb9H0p6Y{Uurr+ zTHc2AF#aaLdQFt(43rNmYoaM$9jvXB-a^@!w((bb<;jL_6e3>rRjJ!nFfI#{`@rZJ zek~^j3~p@jn2ux>5c)vTIqsvPikvNhULn_-i7eK6oYR9v^;j8aFU`#FQNXyIi`~WSFJQfp7`tC6vwmNUbQZYIMuHl9PhH@7E{98@04!@1D zrR=tc*BBqOg`OKR6rL~{F#65Py-x>R^O@Kr%z);~{5A3DYe#FoWpT;cy`A%GuIW2T zMpRq|Xb%SevU4#n!A*)gnB_k`p{e-|nwH-*pB7TKFDu5fKnzD(XpB7PIKZof)GE62 zEzKZB2CKJL--9cyR$~9Gq|sH-m36Dfp9^$zBhH46{rIcHk9RXs8GnLTS76J{L`Pn# zvui#epY_EzGf+L>Y1ws=^2wf62j;JdSx1Sat4lmV>Y=-_))9?&Vx84X2POr6x$N{e zdXo$=r@yrfh^eW(@U8+9$AUj?7HFdT&{09wG|L06f#rDu(PcI|hAIf1h2^UJ4J5torqpb1~2ttq5 ze%9?LP4eo}nR_~_Thu*Lga$?z&dNBHEtc8Xe#%Kt4ukEUIeKv#T&Zg7?d7lOz&R$C za9kYP9CmbRtE-JkV!6=O&o*0OwD=}x(HvO)I@7|_7PX*2a7X~HN;trGm^eU&&6xj?&*EVsUml*=~B)4Fnn;$Pfz)q>?S z7Pq(LtOnGI_h>TLn0FXw4{E#SHcrPveXk9L#uGOf5@u$Nt?`buO@7=32#%_E%K$~<>VmG7Fi;G-)mM01n_n*nrn z{Mrd*jY5hn*W31(-U&70Lk7DTuiDTDwAE5)p6eiGqX^?&-WDus{}`La9r?b2&%EE_ zCiFflm+iZX&dps2W@FHI{EXpLJTUDg{eWG>!_HCjv#<0Vk{=w-imM(BzpJc;O;^OS z)&O1S+{CcH)@Xo<`bGEbIvX6X+qD{@FID!;zetfDP)VFdPqzIlnoC9Ifq% zWSvUpc+*EM8Po1DIJk@spI?2lh}ztrv!fDbvi!!j*FI4n`nOIVk5a~KaGtAwpKA7% zpgEq?UXs%nJTf6e(RVs?Qg&tX7TvY*%JUlEEMok?jr=D(=(+CItWEP8oIxUiQGHXX zn1>ikld;8pq|s9QXRGrPmBGYaW`kBaliQjwT&l)a3eoo?7b$^sZmC6Cq%-vAal*3} zdD4u>)k|#d0C1e2Bp;s-5qb(!(qC6FY7)i1HCe8itbU~)h4)}*saTw2eZZj;F&=Eo z5?s|2V#(~u_xbBg4s+zTTK52ivca2`JhROaBw=|qjv{T;fw>j?b$QN#5Dw}s+BAN! zsfoE7aS=zV_Zo0jje`+4jh){*X&5*)lbhQ7SkI>GY((v4<7!QHB7g&9eQv1#SoqX2q97yW*N~`wfMy+Z3|96tE*VCK4;W39; zjAc}LV;a$Ev&QgwpFHF{`-e;oDvAp3I277GJE&lb|<7qRFqRNB$+v)-^kF6kZ$2f`}2o1*K5; z&?lv@*l5SSr!PkvT2mwAKyhyYqFM|rRtcv}x#&>Nd3m@^`&YGl5IVY7#D!^wL-+0r z4685ddaU?f+bO6`y-D$#k2In!4Q$@DZlW-RF0$q@c{fuVB3sY^a-&tr7)v{n-b;Rj zI~3A$>M>bt+?ZlNV=tyouay96%4XfEdjfyI83+fjcAND$9|$wsMZe?6^z=ndlG&cH zB!q#>FvveN6!m*JOWqr__ku`v-q{NO;ZQg+iP=^p8PX%Y{tbUtyQb<$?;8J=EcIG{ z_&MaQ?mXf?)_Bez*unj4%mgT1r&uRQzLXASE5Et{A*4sC&a#zDt{}uBL+SQ29xC%S zdHbCBHLO+bj&ov2o+_0hD+?wsw5B}C%iqnVChCWLL0T>OK#(SHr>rz5;ULfNtV(-Y z_gI%RPF@RnD_6^#t`2!=R99QenwiYV^nEk#qkBQ1(hCj|NHl38tK;+e-K(3Si~O7z zS{pFHs`Lj{?j82kHQVX1+glt=VmU7?@F>h6QPX}&ZbC*jE9AF!0g;k00YjvpQ>@tX z356vb6)BU2i!nQ_Bl%U6JW4dAwau<1S|=*rp{uL$5MP~&>50%jFWFP!z#Ov?4$?35 z=;a-z^N->M5J?KiHLtz+0ss{RC`4zPhx8$30Q&y*@GWfto+3VT38w*5wzu*O-i(TM z#GI3!B?In&ZCFDv+n{sNFj^u5l@tt|+Bv~#0*1tPuoye&B<2KzN3kd4+g1(Yg z)@09Bo@sLGl-mg^NZNNYie!h&nn$KT(VT(dmx%&FAY9B(>P+?8*x(+J_ZWDLZ6)t9|Uu5Niyuway>cr8Zxab>Dz2Im6Pefh0v>K@}o! zA&O2(c(T@0Z9Svla%!_8e{uWAz`*Z%QGyHYhD@fhLO1g}*2o9_bLVdQ7h^G`J> z(b;t2;+Xd@sv2S@Z{+#JWsf6%|F5lF0s6l$jf?FyL{gA?et*ZCuaiFBHtp``11DNK zGYt0=es%3TOD(+on8ne91w%?6>Zb48;x`e8cLVINjZ)Y}BxTcXK+Cx|rs_;>bdkn^i^EZdd)rs#JW zOm!#g3tY){<$y7%3bn#YvhRZTfL@BA39(Kn+X=&mGYkeYt-~3IdT%6f$QWfLb&5RJ z-dm~Or=Q7XgEUt^33#SD)$7HWDlDdwHbPC?q7T_cVFpXHM2?ZO#&rtPh4|PHpy=W?N;r zw#$%tzvYF+rP+h%RQ7!W8(9`x!ceHf>*&L}4gmOt3I4Xy+``c)ojxj#c)qiaaH zjYw&a9nOhlomr=i%q9t_u0Hbp(>s29bBF!iJTqYT#Dkz@*oIoQGlY>@Y@+vY6|G659g|up6V+I)NEb7N1W&EMBAaji?iM z_Yctdwj#C&s>0O*XW`$fOkCqrBJX{nHJ19Wd)5rVXfw2lvP_bNeMYYQYX-2+G~?o# z2B#-sY>e<5qcLtH<8t2InM1#)OBcUBk>RXETz6bMBwpYK&-8qf@r;omT0Ay{qQu+s zDL6I})Z!|<-G?K&c118CBnjvm3tDLGONfGO^p679L+j(H5lpRXYAOpzT>PL#cxQqg zh~))XsR87Bx@)h3S+fjmxn>%OX!2GU3Vf|Z-GaT8(BaA$RNQBV!U2O||LRSrc6Ta+ ze(7<}fJW*_YbQQ5%w$A>K+u=Vuv_e41CAG?eg`UH{zP znWH{-j??4&xd+ame5w`C3I1mfR7=429Ok%+y`TO9h_@?P@2~8rkipaK0NMa4%3B+6 z-grA_Yz7GmZL?`YY)*Wk2x(g()x>$QB<^=~K0U@3@Agm2$h(I~EbU^QuFb28w6o9=jX+B-f_ z>D!inbq!0)(8mlS0GqS~lmZvWim)-udVSe@GKdSCilNY~-+N1H@WZ}xdzSdcOocx0XPQ9;Z z{E{MLVp{y1&6j>6wY5hYRNDN6@_I1>TN6|$hX!UpVC^kRsE?gsMl#_+`es+OADvHi zo||Sn{NlWziTq~j=#S3RzRoctoAnUaNfVU-Hu7W{rtoZ$N*;5dH#gNc zGij5?%(?;4E49wT)aZA%Gt{=sr9>;?8K+`#CS+fUu~53}b2OQJiu+=pcsr`_lswKV zWY^~6lb4eN`pKg;uiOb+;WlsnX?r!AHy0Ohh$J=f=Yl;T5!c#7+MJ^~W%S-;OWxWg z9C6TcWjRE)B=?d?TRUM!(wEx%p{@@1Q_#nERlc?Bd$K|W%^GMOSEUYIF}N7V)s^|@ zTM$06!$kerm?Ft~{Y^Bz&)Na?`L;|B(bsMKElhr>EkmszMzkijOjtUhXW}1yt%DZL zgp+=g?9q;O&6=|weB1o`e&D4;SVVH2nl(|LQbjv*$i{WM(7Apob#pzI)l1QMpe;=x zo6!b$wH=7w6J>=TPBYY?qCx_P(8|4mce^_Oza6v5i;)r>eW?v~a7JY75)iTyYG1!# z{4uJXua}cNofYE|IIS0g=loqvfHK$czZptN0CVXckHoMktQXnP1AVL2BlGeltO5Wa zousAe22uZDg)Zz@G51#=9TJD{Wtd^!QbP&6ADK;aLnq&^E<5X3Vmfk1O;k)JNkx0zfcvT~ zNas;P@Bq{kpuS(cC&_~&#vL(}wLj_X@4(V7`(M8E=(vQ4(r3X@ke|A(L-SnN>Z z@gG9ZfN=dy-}_Jcb*)7^>AHX?b+QHzZ+Jv&DNGa0id+R?6;DsFZFQ4c-%DJHkY;>^ z#Aq{jATvU8Cm;875y-}+)h&3}5;FK&nwZ9d7w!VJvLq1BwC=E|aNCqC4mJZ(R^JKq zRAnjREF8k4qQ8$<*lck~d)0pPd4%$KX?U>l5DSrwiloM^N2!@_`;UsJSq~gQ@Bxfu zScMhQ>K=OtJi!oW+YLpX$r`Ys^~X#ES>X-0Lq7nO7W-I~M9o_M7(Q*URE;pTE(Jo2 zT8ZD@VPTsXibjaedW{XDRHa5FF8Wd`#_?BY9R?o;;tK=9@q8~e-Tp6=P7FKA@+Pf` z@-_%3$PnvyQm)%~Y8tFeQsb)kS_3(HK&}Z%!vQknK2oe)A-8-&&tR!Qt%W zn(vg5QI?=ft060N#QeYsS~|I|5pGC+X?8da(x;6f=_1RX))t|!R{0&{@a2s%xd|96Uen38 z?BHh3CmH~vukS>G;?%!OYs=6C>b*laL4Z$xAGCZImuhoO5*rZRoxj34ICuLCl7^MW z!h1dDw0gj_zC)48veXJ8qI5?_@dtWl4oV*Vy(`TZ(vUSa=6t$g%W_mEK1AGY)|y8b zr-(T5!)q|3o@Gn{2TEDZ29?z-g;S18|hGczo<@?TT=~lG>M~xol#WZ+JA39A< z+7n$FVuW_?`P~ln!PSR<_iY+p3fsks-mr36sC22_9F|HC(5by%LOE{`iFS3_HRPfZ z2;zd8>wyg$$!4c!G!b2mjaNkv%TEl@YYbLP%|7q{Of zu?PlSH6Zxfk#(+(!Xe;Fi_NPp^~70>CYLIn9ZfdX@o_%D{O7g_U%MBqHPHKwLY~8Y zRVEBj=+N&H2+vu^?Q9VK<;L+luLg#KTbEkQO9h`ziF0+EG$KRyJMk8VP=RNie9%Au548@D({u`At7=G#MshK71w!ZPi|3lEO|X&eU3_fsMj? z{fEH8{y=?BR=&ZE zaiM%1?(#*5GM2tRPT_l}NR4vtI~J(JS@UMwzS#B`hR7-iFc@IK|l$fGxv8f4cseUVy? z_%W!oxobmmCZ9l0zSAi|+wnALCp+$nW+JpYP3q7ZI2us9Vm?PJzuW-Gu}z>u?7P*a z@7?I+-S5`G`IW|srN~aszwL|EN2akE$dj+9(9J*NMr73V;aFPW{o@oEG7Jf%F$G6D zpH5#u`L&jr5;HZ=1APvF`xNbI@aOq(Ot-y8xqnt~&8uZbcRh(PNg?OT;a`gufp zfNa0j=X6PcDO)nKu@@ZYF^;~}Re8gawShTf9gA=eN!}N}zREj#xdo5viEZknbc^bK zchHMss4mZ3hwv_|_koheGsZX%{GDKBCSQB*8tR3~oyUM$E=i zoz)lUlCW%$c+K?Q?_El|8CCaJfkwG>IhBbK$Ji;&*l#p*j}nfo$r!JzE4$3B>Wrg%3R~K%BZt-qcZIOq=s0q*^GUdSGU+1DOi?qw6C_GJ$gTJC>^IK>L#G4F8eM58#FmU4UIMv zj}}o5krS4Dy~@rH{znmaPk@ZWf0Hg*`UKR?Qx{uMd(&LJT`NVXlS-9_KyViQM~eAE z@-KG$CydO`q=;HG%zYRqja2<*G;8oXtT^{i_AJmlaaM3Fo)t`xWYSoALza;+z`337xNvz zHY!;oh|&>IW5!*zocDPHoN*g9QI~3_CKgz9u9dQ*j%on8V*C=$=lGR_Op3*w%0fTn z?vnAl=IV8><(-aumO4my)_!BY-6C+*#M+S^kb2F~HOq-#(ez;~m_Y4}U~_b|AH~|8 zCZ^5_hb$3Pj(p0N;)&A9^es?Z(b=8v=5yYPUDpd&4VR#uz&Sm45M-iI(J`vQ(+u^g zpwQwg#u;QZV1p`IK}VFc9{lywcf#_A$12HORw`vdc!+3X?MN~}f$i2wyUV4+ z*o~{DgLCkW*pN2Bdi-Wda0I;#{f|yjtwX!Av^w*Hm(&6xdS~o6W6_?mNGtVW`D&DZ zb`)VovF1J5Y@D%fVJ`QOkvttzP680}ZXVX3-?C`HdM4I7-g3X7?08p}C6f7R)C>y| z^UO~}2JH*y%6C&!;g8106>RU>P0*4A=CLcDU8O#YZWh>Lh`>4z+}y0c-NJUF&%!IF zTJZWhsv9L&uC8o5X>I*&slP)VoNWH4&g4tjo-GQrxO?#hr3GQ0RN4DQlQC{_on`5x z-t$iTnLC5H3o+ypaW~LvceaO#>A1>FA2`b(RW1pi0^JmWggwCtCri3o@_q&Xm)(xs zV$@QIjn-;3&$e8jsU}LBo?UlV*vtA1RA4eSf zt!a)k7o2?Y>PJK|8(vS*BTWAtfRw6yDDv!${7*eKC9Bx}F&JsJW1y_`^=Kbskr=<~ z|6|aEtwi_VR>x}wT70B{O3d)$tA1UBe{H_Y4uQK>rV?Ek&DNQ)$S6Gkj5Y9Ce}n(| zGh@f7YZ#p^T#Rq{mL`?)n6g9j;xe(%gV!xc|(t73|t8vxHYW**pE##Bkcz) zpRxFAFB6k!{z7S#02opt%=J#) zKUd1+3D~bb2Kd$o`lIpQk#^R05Ha;85L;@P!bw|N_ z+ZSg&B$bX#) z(MMv_hT$DRldc;sh8UxdK2Zp`tNHeZSMn`mU)*+jsQ&qSc{)pNSzaQ^*kFN`o^tgO zzM!Jt7tgY9!M4kC?M;s#CmUk2LK{g3OSseM#wOoPpsd!S(r3;NNCD_lN z7((0#61AmK3&XnxC4bnR`Tv1CZ|{nZbWDel=Z=Y@=X8ZCWZl91_DxX2Rw^ULSV(w! z=SquzbqaHb02M{z5~h0)niy0dnU$DUbpaXlw4b9Uo=Ia+{R3VAjrat zi{d6~TGO1cqVA4k`1$sdI_qcBxg1R`Vua6(CX{mQlO3ey3U~ZQqNVoFZtq#+ z-}PG>#Oqd@Ck)8&d*1+s(3s1&dPn?I>=?zELQG3N&{nnAl9+H*s6L|giO%73DFA5Tm zl*n<8&+iN0og>NRwS*erirO=yjP+4)!s!DC(+<^U0x`@@dVcq5zxk3g%OPZv)+t53 z3p(M4BaBhu_ZGzX0CksCon|(A@h2jwNtS$5A1&11)h?Z7`w7N-1}xpo`4J4f=C7)J zCfM2RGV#!soKklZyK)MZUr_~(nx2nxkqerUJB8}}R^NaGj($tyrKmjt$|?l7`3fht zhQDc=jVLPqZFwSfP_~A%XOK#25-PrZJsdzClV<4kyynVd9;iW&%kFMHQLGWEtLG~0 z*p^3NX1b6A&$AnBLx}I0#-6x_n{9a6cBHQ%N66g{lgtZiK(M9y(S-&pzP0SjCzgwj z+tlan@bxk| zM4N+K+In?m4^Cz0^yjH2ujz{2PohKIm>(3k4bva0i$;am!s7DutSO1R zA6^rx-jzw3Ja+7V`Z*rS)yUcV`ynjs6rD<+^lLAlz}6}WG;UyGcYw%PC`_WOJ!M)^ zx}zHx$BUvdzQNZ~NPV>V+@Xl8ja|#w>sne|iP5s7*>kI@nkltcM$)Sf$8k#m>Oh`- z?Bpy<(KLauMpRh50m!(1zpi_`3sq#zxO})$*NfZYM~eLw|^^WOJ$b?-^s>uJCaYVlbNV>COZs>gGCyOePchQV}o{;|fR<$9EF@~4E;Wh)<* zbMlAy*KEzdmffUp_{B$K1EVWmiRWcYe(!W-inCaBTx!eCx%Z47(95mcp|lwf=B%|C z^#neyXF8`9Vc8k-rRfvkyZS_gr)87bQ3t%i=OPpkX^QFE%za)C_7ROc90_->87U27 zF85=1uFq5O6}j3>ylEhZHCt^+A1gmnbv*7{9l&T`~KK(~PlCv1(GEGi@sgr)mcXn0a6B zH#R)K1m4Ztw5(4!YJkQWs%y*PSubxa;npWRYd?Sq!GMU!EJC=+UKW!wE%okgP5Eyz zo>n0t##wYaA#Au7W@b&^*+vXhPBish*^Uh)0|w$n7eI{CS|&`xQY%_H5TNlHAjJ~m z-f1fOjo!!CrtbdbeSM1#@;=f_ub#jl>w#0T>OG|kxt9v^06m9+pQw?AKe2rqsb`zw%oZf_MnsP z%B)u}{A#x-n>Bjsb=5dz`vJx?M!v|omd^R*iI-hb>bWCeP$Q)PFks&j79C@Tu36S`<8A?ayA%Jds|sNkLdb-=Ghy%Q+=-E4zj`|*a8 zG1aY&o2N`!UR20|@gLB@Us!#`zkmXgN^jc42OUh2m?=4=B!YXuY zXaJ`)HLD2eAw7`%G4HchxzWZ)VX_rNL9Dk1gwRr-4aOYc9olnqjj?oxa_|UlZWcZ6 zCs4}Gu_bQFEFr@spQh~Yx1(>Vsr$&%Q(G7={cSGy5S8L9cowVpMlkMU8^si5{3s5s2Ox6UM!(EuHZtO?jE9HqT* zk+5cdLAH_kiz> z+9GzQ7IkFu|4k8co%Oo6jQW>M@mpi>;^${6+Ww#KyfTdpUlCg9V$oH%PB>GWWs!Is zEOM(}S>Du#`=SAJK8tH_V5+l=!nImE!xpb+^$5VURzV`|9|hmhsjv94?Mc1d9O|=r z8;}y}Rm$^1ZPhP(>f&Ae!s`*m(`Z2j-?2^uhn-S+Eg+P%3E1YD?*Xm`~AN zQ15E_NW1}ymE3K(rjG1XV@w~X%Y6|EiQ?{9LfUhy%QE2kL%7;3p85>X;hDKfGB@Ir zRxxnOn{oCY2&7yHmI@lYS2^k^uKUU*VUOCH;oclhgdg*#k3a&s-IptN1P(VnxZ<0R z{f(r$0D!~R1-CEug?uWqC>m0R&o1nXMk8knAe22V_*|8)jV8j|2L2H|LIvOQ*_|O0=bm4?$NI-Q%l}fYdCQ^ z(t}~g-kjwZtYv*y|1(Tmb9m@Q+2A2WsiO0DJ{W1h!hk!rU)7+ue4FHUP9~-)KFS77 zJzU@3US9ThKT>d&Wr;W}F)yzX*Ec9l*AZIL%hJv8opQY1a}XFQ1;BvbS zHe$>NB+{xDa&V;vrp;WVNK*}ZhtpGa{5oJ+^h0bGV_XsK9o*&;R3S)AWStVK5gw7G{7 zlt;7+$;N5Rx%#wL4$O}TV0|eL#Xgw0p6_}jkva^uLJVn1jjh^dEp&C_lKa|NM|5st z_aBy3={8Ddjr``jDXOdU#dj5gfVvG%g)72xInKwnNt;yqgQM?Q<L?=~Q3t z?eknKD>!FUEO{}glkfX9V?w2fKYT%w%+IdiFt?ad?+I<=-~F9Lk5}*D$py3cT?}fT z)8ZOosThKG<0Ak0kBb;m0xm{i1ipsLr>~Yl;1|hZhL79v-mVVKK5RNiQcryi zrVg#~e|=S(T(5Ct>dl?)$cu;LcCZ-_R;*4g@^8xuCqQv`spkHDnmE?= zP=rNopN45|me=7o_Bi^8V^wo}a@QFprL5d8UJMl6&{f<|G~&wnjwQGJBQuQpJBzWH zW4qh8^}iQf+f)8*mv7t}UnywTOj*1Up0< zGU2?h8!4E;Hcl&d8M6@aFCwS1#tX0s^CIcf533Fifa8EML3JaYj)ZO)3V!%hv!zVl zB-87tCQ_@G_Q!)tqvO@V6C%GaSVc?fBUIe|)IOCT>(>Uf&fplX|=nT|j)_WNP$*7n%Tc|fR#KAMA?z9&)U$ zLr)EL>;qmO9rV{+*L`-~JlzcD>_nI?n&~KI8?EWxJ97a zJ(a3C+^Fyc*g*-4+Ut?C(Q@&rUcVUQn49wM$oP~bgxum=SXmx!IWe)TC-;>GUrHKY zV1+K85q%zWB~Ob?!Y0*;8H)ufacESw?4GdNJgdmAtx;f6bn}s4-dT{b8c=6~unbQ} zL>1pi^|%R?KE&~IC9YHZhKWL%8ezfNNwIke!=`(2P`fd%;$JJ^vQGt)?m4|; zufL>h>H6H~yy_DxrJ@fHgS2_S3*F?|dazJGT@OfMC>4+q&{s8Uos8?izIuThZMb7C z)U2NFC5A=7uzV5gvApi;;?FF%D{HX&hhJ5rSpCf2{jc+=)jVWog4BO&1XM@g6g3v3 zHVGe>g6y$1?KH-!+cIOv4@e32)~Slku)qXmcmtSTgP|Cgzs~zJQY>Gvw!}`1zR+la zJt7x}Dn@2#cgP)4GW5H#_H^n2zb2xMnS)fA@TEzPFd{)XYn(Q z-_0i0nhTp66mw0S9plfjGPbiBmlDX6@6ZlBm<9uS<<-QhgIO}*xa%1M!)E? z*Al+Q_$MDw2!{FjL2N&$s*Be9h!R(zNqN~ZrhID&``4&d$<=kNc^$v7Xj4HAh&!wrM3^^bn{a7i^2zl z?wEfj+0BYu;|b2G?E2eYS<%AP5d>i3S~`#*_+9a%gTCN*{}ogjyctUd&6K+$Eb%i|57+Y4m&)GfJn~@! zKd(VnjJ_jx$o~!O{)NSs7pu`ahx?hasEGvRwu4SMDgMPRLfYYPxLZOk28-IV4H8oQ z(N-P$H!&l=+wDpGtT`X^!FQmpD@{!HvHL7XPg{43*s#Eu%I-=!bfjsh;kqCZd1ir- zGXFaCcJ~TaZj&F!$qYkNxt}oEOc~-(`i`QUHzo``gFrlmQmaUVPLWZR^y#vb@@dgN za?j=>d7A0~;!>5j`5zWlnYh?@i&2vfn-pZsZPlVr+gA0$$13x~^us2-o)6uWFC837uA)NACc(G z&&%3|T+m#5m^sqm^ABaIJ#DZ46A00LyCer#VV{}`g{egr{BT<%{V;a2Gt@*u2dgXM zeYeX{=hVvGcWTdqVHuvf8530UM=pm3qQ2kFJ*{sqru{JFYe-S3Ua(V z823tDr}?9Jc_Vd1U;}awR*h(jP#s?aBWx)+t!KKNDJHq|Fx@K5rdiAb2i7|O5R-db zE3O`vdM_SO4ppSkXnaQRvG%rNQo^T%2~!HWoxB3egy ziOQU;J#5)jkT0RtN%(zVm}y+IXL0%yx>{gTqm!S85kDN8M|`!O*xvCMW4q%;5zW<= z#5zi{SucV@7DeB#+0O;nvkbXTCwL>sYc^J>HMc8}QYt$FQ%`g8f~lOQOdQc3=c85T z`LI~=pSg3_@JkD5WHFrSBGv{U&q&;Z1GMB;A{t`D$3OUOt$x0e0jz zzL``38{lh~&vbm;7Fj#0if&?#n(F1IL)L}HR%cLF>QtI_l_;u=B)YY;?CbI&yT#jT z_m~B#PS)&B*=N07_r z{ihES7r$%!(e6vS>YG+;V8&^pb6rI+qFW*F;`zLE_VZ^}D^BI^*}f+`C%~RxY+46x zD2l@oTv-*vSU>qUu+dnxnxX5>`n!Z+K1Jd>1k4Py&-;e>LW+oc$=?n~9pDLKU{r9< z(VVr>wE?{@;T!|XgsodM3EPK=?7!mIl%Kf2sjaFI_S@d1rk1_DJ<}b{+k|{N&Yn@# zegm_NNr8y>V#(qyWqjPIFUg7jXz_vpr*++Y-+HS5iIH2if)RphDgH((NaoH^cJj^ihmP*CmZ7D1oGt2RxPvl~lqJ9nPJ{_~Vj)6F82pD+4le=VA> zj#m_wy|qY@&OpEj;Cg<3uqlX4$CV76(XSYR4+(!{%abt;b8LC~N$yC{oIoKpkk#0W z#VvB-vd^a7o{iDjQXO@F-%ly^m)nivZnsAD2*`+i*e?CUe}N5LbO51r@gJ)h<^H-L zv?y)BUWUSaqN*kV0=t4KRIx^47?(j`axj$rrV`+st6z?T6LMI!RUms)8wbCw`<;=e zdHzCks>{O*w@=maV|@m1pVD{U$}@1~>y?Ca4P`meKaW7(YRa3crbr`opHQjCF)0ii zttR&Hq)&_Jtmqbc(8$adSr$92HYlPG%ao?2=w0N~Ot3_0#_@t`fL)&j)4Y}#_6fPp zv?{qiYdNdy@ndt1RrMD64$JsrQvJkC8%RT6s*7(LjdI1LSiK(dSBq$;z0Q_wuBM_6 z!}8VL8Xruaw`$+8P+U$Qv2^%WMQC%=dyZMKmrZ#=dzn(oC5Z(m5uZ7p>`@i4cPq#%ESh-U(lbC88J23_baZ*7=`of4{Amr7%oN zAW&xHsj{{T6_3HKI)f%LUNgo$GL8&dg5bbWI{t`z>)9j5{)&m>Uec3kF~}=SJA0~f z4SZ|?&cOiczpD`c))<=opl}J-Z6~Mc5k1ACvvnC4AmmLAl5%LMm;HuwkQY`Qk<2?2+tpQTCw1e8>l^Ll- zb>q38WEgAsfYJCEtWVss$uPkO69#y`#>Evhm`h z5dpLR7Q?y}elF|_o6ys&p&C5v;X<~)XU|Lj)3tG;?W5B^6n#x``|2DUxcWt5ukPiL z7`v0cgGu^C5?6i@JOS%%Yqw*yP&tryy|OEi|DXiB^V$@#G5$(SAFZ!WFp!3Mc%o{C zx&?nt9s;sERJhYm>l8=;J{Ut*sG4NAiWVE}8yrgJ0~1=&({Qdl0wue2L1v@RU7=&6 z&!!2r5-oBqT5!x*1oDuP%}3)_e`N!Tz-Q*v?ef z6*RLx%D`pl3pu=~_1iNpy)Ww51=&D~!?ttJ-41v(z0(QWaG}0TtT}Q6CA$NJK_CN) zif6>vR?^ZkLSwdptY&tW*~qMl4_~j{DUJ$T3S1rwVCG8)>7&e|S1Xl`s3dC@ybfO` ze(&#(&N`SZ59FRl8_wiGx`OaWYj%iD!WVxn^MCLOCNByz5!<%c|D@(`-8Z1E{nU&5 zg*?Lt3c0zU4Xu45RNAN z?b5cuLt*}aPF8~du(bY(bt3oA9r<|$o-ovUAJRVf)ofYPl{q3>m|GxnwesHNRvW!J z^6N*0)$F+EiH8^SvL%@u-$&;gPCh#>WcC_K=xA`KUDdtOGebDr&851TW;))`BD!6x zRu1{3rPbvZB%2g(e>KPxe>b#NXO&`KT-Uv}JQOa?SOFxmXI)HaIP8(*f)^wW4*l*c z$)r2<2RlJzIb8RZ>;ZH;C(xKOs<9Pm_-3{Zf^3Dk#(S{=^IMXXVP@+^grJ3AWq`Jx z_?45c+@N;t2Occ!e}P?2Qqwur0tEb=1x(Sp3*I+fkgpa7cZx7K_RgZem06RxlhX1_ zHGfhsojTmj&o5q^`o8fJHg*NtrG~9Y&zHqy{=GPCF+Ui$+F#CoU59P(XUiWsXml9t zIKH)&p;%@Nm1kT8f5?_tT+-I|%&=>w@HH)UM(Ba}=j((JFaM7d~taqnbXc97$FU>M})z1meH9#hSFU~89v1^Bj-B*81X zI=`|cKWj!n5M~7Q&io3gLX|=@8tG?z_*s9{IcZ{+(AD2eFO*KOn4876tF?~22=G;| z$0`}QbxHcAEz8}BqSX9pG%3RV!sG+QtUPQr$^*L<+uF9j_%e;u&h=xK-^CkYwmuFv zKO>qDgPZbXH0Ha`Am8)`)qIzKaKwgE9$!u1Aqu`L)?OL{Wj@)ap>Ht;I{d5nkUV^|iH?O7LA zC8cL6sA)BJuobp@QzEVR<@uWhkUKEeK&Ro(55x2tZ7o|x933wt#>yyH||y&~7(E}TVvGhV20 z5F<<#G^v$k&OJw)v@W=G*zslqQe*Vgth#!$mC{pw{;3h**^aoA0>2#5mAcq7>;UYw zkev%2NhZrQ9U*U|C54i*$P0XtO?TJH*e0gRr~F6Qq2&R1g9rJ%Z7&qAJcT5px64w} z)i?jqE_q83$+?ujtSRG+o;c{LIEY8v^t9{l^f2xt9Vz*zFJ!Cl<``|HoX;Q&7_??n z6~k>=4*}6is;=x(a?}cbPEqSV->8kdsMgfaV}UQKBI3nOk6O+Y?;B+V=?4*M z9p}>2tujA-Em$;7mL1xXIyVQ_06j#Rj((-djn;e8Z%b5dH$P6ugVLZ%=W@Zjf}uNI zH)DVI)n=UeUud}~`jWojH{t^`s^h!wtk-R(G8HGTKD@wUWYG=Opn1yN+*N1vm|X-O zB26RvjiES;BYv8-#FXC?-&vUP7JN|^@~g$(!D+AO*zrE?_tgnXeqF9SOzu}3L7`FZ z1gVtJC2m@V;Fl=bUn4D(h>8Us8Ev%R9AJr$;`c!yAOfeu7ITrTuk4JV zZ|@KM$Ic9-1_!8wl)T!qrRJDB)i6bZ9}vc?aY0^Nw6PM1khDNP+q5Dyq^6P@gaiSYTNGb|OtHfX zomW;njoOZ&yKRwTt@D*#X$&LZ=6uE z#q7&3rfcBmEc5R1jVTW(Rqy;d)HG%+*VRlllAEdCXpYzod`Z-hpP?O$PZ<)T{KGm+S^;?PGf-0 zb*wP>Y$n?ImzK2bE*0lg57bsm`aQ{tEDmP-KhdgQFfvFQD$_R9m2|Zrd2z}5ew%$* zca_i=o>%#4{($>?^QJ*7OJ-yuJaK$ZD5b^9i^Y;w(J)1GTQf~H*U}A7OFH*gwACT1 zP7+!&!$>?@?%-TptUjqEe+ zrxK+KucJ)k{|Y|SMqXKV*(~srTm`d6<#~IDR>Ee@H?u+p#ti((UC)dvQkVw_3BGo) z*`28L%$gb9_W-v0>SlcT<2BKgisb%o_`_S%oXMX+{WtY-7O}&~O(?y%c$&n5)T$dR zQ{pq8bKh%?ww2|~tkn(AWBZ?wrP7X`eD9e9c(Q3y+LKZL65`hpP7onIkkZn!TbPl# z^7w#|A8a%G?9Mq+tb;R#HnzIGO+m#|I^dd@Qv4+|fC68^WlZ17tZ~~d=*lh4!+}}z zm@w=LrM2-bhk#XmA(2+NhG@hv$k{TAKjODZ!}xtw{9)B9am79|Sj&x96048zT!S`u z7>kQ3{`X?aa;efHHnZ^)m_J)s8sMm*4~zfAVueeB>C-4K65Z*41R!DNXY6n!`|B3a zlt0XwAEHd~q5RtShOx9bP!8)+nWEi;tH_@+=T@h!zWQ8is&%sX!aySo<>w1G-T+v# zPs7?4oZ|1xBAaypd~|XVpD>GB!I4D*2BI%&sAQ&SFNYt?5NGF_mh7|1GJ$1c^L)T` zQ3^q&^9sxOJF@8cR?NVQG-v~-=<4qEd~QPN_sh2-l6tgTDChm4Gb{H6JJZ9LBI`H8TdV=*fK-2ZLhXrOIupnX45Y~yrpclqvzYl0`jdS_5;)U<+vJdrT<}#@jMBv(>40~Z;o@wXKetrC4aEMZsqt5 zU?wOp0W(Hay7?z2_Ar`CurdPEqso5m22_fqFmi0oEYSHKUUC|6y~=%*e%_~bO8bs# z9rboI(7CiAm#reS-h~8I4*N`q>K~X1dn??!eqddUoxPY)2Lz*NyT$7bJD-U%l%>3y z9FbdGsLTxWoN+KLpPqferiDfO7b#=#_8w@T@9UEey#P9<;;TF1{W;=kc@~LKv)v3c zRsp_`!(SykQkc72G3z%>d@T=E2;8e3Ic?6~80|B#YPT>aCc-LOOcD3&KZQvpD>$q1 zo|rCadc2hca=u;LYQ3u^=E{9g6iCW}kH`*db&yh@gSfgX?NdneUS?M_{gcXFP2;Ul zgxQ~7A}a9$>aMO7QhIc`?fyIGT1I$TzABM2%#{ z%(bTvsjHGX=lLKyzCYQbv$|mLdD3Qu2zfh1InAmLsAAYKW+39cIm*;d`aTr<`}S(e3Ba92&e!`vat znJ>}S<@B0beu=v`6u4T^v8n3K?)Yx&BWp$czW5NG2KqZxU!a?v7wO@L&7p6Txq#;q zuUjRb>m~Kkfj76)Yst(YN^@k-?@3tH^06g9Mc5K_H-!|=1ma>)tVx;zU#%qnGBMhE zsM9q=1f{A4G7e)qR4oK_W=myzAVP=rt3&;=QkdOvD`68%1=~>R>8+E`?rvP-8P`W} zs|#^If{fW$Es}op{vQrZF0!V+E{)8sw+h!Axk7n=kL39}V5&UVwpJlc-J8;4KkkEB zp_ETx3-i75)z(&YQCL^cWH-euYVe*$S-G&(*3U_eM7@$`%j!R|raU;6E&GLVyVGWw zjfOn)82Z{s027>K5PIgM9kliIM~Bt#r9MlOe``)MRK-rm6QZu#xpuAYfr;YGj6sag z3k6ceQ_}0!uO*NmM;&iq&|$W4Rk@Q_UyM*oNx+Hbm3mO|fRJDw57Ebf|FC3F$~iE*w`H@DGoiMUz|;bk zz}wP*HVF0M$)36tK!VZpPrrKjlH145!o+mVyTdYNPgJ|7?U#Br$CFx;sWAIPp3RNi zcci8aUlEoF3YFAo$>XwTyrknd6&>rI7ad;{|MD4r6Qn<4)!`1E2}@LXuuvU8H`vtm zv!c_T*t(oYERltm`9~?9$V!T#uyzhXo?FAxSAiTffJf9z+aWPk!EPF~BoN@pnJT|m zL-LKjq69B-6)fms_=l%@)19huz3FSX|8hx$ZVi7TyN&uT4lKL8 z^b`l|pt_knuS;z;Qt}ved`?oN%jRR!StRSgHb|kX+yQmYu4^1xcz$1YV(KWq)eDX3 z>olJ$>=7>#m@VLV)s{Z}rLx=~5t4XyX#KIB*R~X=)$_tRTd}#(;kcj4leg0q?UX_n zdS(m-dX&c>!zwIN$t8PKHdL7cMV6zVNxqT}8K^42QNO?kaX&g=*^M#T)cwEAxT=M7 z^Yp&uGEj|GedSRXp%6n`WOxq6x&AWIc4y}$Or(wX2rw@A6k1KyalKxA71d-FvBdfE zSRx}akK|ipyv$RZt?KC!%(>mLI9E51z=kf-QDkbN?n|%2kvv?B-N$hF{K70}`!2cI zx&*5q79E~McedbsYvyKF(xJ8X;X3F*Vwa_&R`=QWC=s!9LtL56i8_X)V_@AtCcC!G>8s?_?-d}{QYuR+a`(lsbOn=BLO*>wSl)ty5N}(#IAiD$Yj1RrYUoSVv$`fcL+A@ zytcD0bT33a-84^JiX3XjKUF*tu{X(yUO^fxD65-I5p2Vpg^p=&YFX9Uf@G`dDMvs4 zS{_NDrRQ3pgWw{zvEX}CzN1;T$~;~Oh~c4@{-p)6=c=NQd#$#*;|9lGb0CXo0(N}hxn7Fe zV^<`3uDNPVRw?tRX(U;1q<&|jrU~J>Ze&s;BTje6>c{!1jZtP@U5et%-Pqxm&73+f zb8Y!MI7p+ZDO<67+#ArW;+tU*bVs~>IyU>C+N8)*qJhZq6HRWx^e0+Ert6BF%)dh~ z+h6=#N?*e;U7Oc$fymTcH{5fmsIC!;C+46W;~oo(Fo0=p8?l3eSiK$_6_+pj(ITYq z(?@U72O#53dDXYPrH!-HPBMR}k2~df$|lpkDuxX3mw%FjFgj6$-t{|TkDqX2uN>`@ zzCFpv-~g5Wg@Nyija59As}U5~fhOwr4Zlh~{GWFsH<5|hXj-iQe+S73i|~cE8kW(g zh0;$~_y1wxI-_c042o?jGEY(Ae!`we)s1qzHD150Wn{}4r4=0;J7zKLU$T^Z;5uP$ z9A~XL3>_FiS8#r+>#gBSo0R3FMxy>2j(F=LUlro%LeI|>(PS%42s`0Su}?7!Ara;O z>ss8oVCY#~lE^2dBHO@q$+%TB{chv=be|9W3>|XOxzR=(`i~QqJ*6}HwyWxTn*SS2 z4o%kxXiFK{)ac)$Hly#%e@_pSiQqqv`Hoq1GyZTPEq#~{I$T_| zz)!SZ@NsEc+2!cD=Khx-+}HoGL#8F?mb-;IH5Cfodoz`AXiHH~sx?`l@1$ zAdwYUix{W^e=m$8s&;dKCW1l_Tz!}PYp)g^TO^ih3O+2u$9w9Pd34}bd;bA2A6ek& zf+SEJqe_=Edheocms)_djG&{~&V*B&T#nL41k9GIyf{(Swfncxe92PFd2?bp6%F_0?9>7D71)gS*nBNSXXnoVB zN}d-#5S=VY<;VIh4KGoj#wYO0pZ@xuR|>D0*^*`S5xO9PyP=~I_}4A632>;{@q2z- zjCv#0N7twYUeccOiq{vjG}&cXj}l81uHyRCV$d#Dw1NFsFtW3U=a(ZdZYXEZQkJpa zlU0om^Sz(Wo&`)R`Wst16jdD7l=NKiN~!;~;8;REAVjf;Qp!g+OcqRMQb;Jbn(w2o*<3+>|%Bf{ENBM{NaFEHzQ_ww87* za!6+7Df9C!HZQ%+1uqWliN_!Pf;5^-55B{P)TL>k=40(Wfq<=K~^L zlm10lNNrl{r`1o#b(7f+vJWlMI>Z-_l=xhI>WHVt@bo48$=15ERD5NgK-p2+ZxZfr z5Nb>+Y*Pa}J(XWgc-~9}{mZlz)EOmtN3zoL;{d(r$?51&1!LCsWxQNPlNa}}zRK29 z`nmNGSk2CAOGe1ktt&s6-s+dXF+gOPHFL?P<@71v`!PA?no6ZfHs$xEk7P=>rQ*lG zlxi3g4K&|1rY8zwX5jO#&^KqD9GzXVJYP*g0b*!yVM4`beXQg6DYECGr8w+8{O7&} z{j)i_$V$wxSMSAtIxJt!DcC@K%H;VzSOU+rfQ&M<2J9d?_EJnDi;+X!N721A$+F`O zx#zQwp%w%(PqYqGZh}%c+Jj8qrgpuqSSE_i(|QuDdFGGuZ~-imsImD`B;3>hiX!0v|*PoAn2CHc307Jaag zhG@#l$2+SW@g{YHuvC5&zI|CSKZ~zc4v~{`8B<6?(PATZ#Mxs#S?yn8l#kqUlHrcA z%}q2$A}6!B55y&y&!o;+3_@<;ZO0k*|Xk{ z1$@8kTkNP+gIIEi!bs+z!(4CwnZNuP?tn!y-RV!}n7q3<&rzt*FBec__7qP=HLxx- zkh{bkJZ+i=UGDb0jDvu1%l#qu*w}UhGpbOr&8Km^$w4)4$#7x&T!iJ(O)X@W*`c=x zUzNFRnZKTUPBfsI)+hv4P2v}Uu>vjT}x)ewQVI=!Lb(YD4M0VFC;c@WL24B|U zKf09L*o(_XV?p~2boMmYxDlb>_0xkS9dkv|%JV%qPjK>t$}t%1Z}<|^lQipy_}FUe zpDeIV%ML6x1HtR3Y~?zLZt_*0!dMUTqy@$*ZV`~G#YnJkPcYgTs)NZ&|0@8nq~Ul> z==$KN&F3Nt$RC}1Yn+`~!7OE$8D@dxBsf#t++?rMId;7n!H7oZ!! z?4>>v{nd|8U5Ay8*6{O}_5@a!mG^iVC?)x zDoOhM=TT8xHU4Z%8wte|6u-?nxmD)Yma51aY1XK^6#mFZPH791qc&Zk6a~xvZRHud zgs=-sAHvkdl8sF>=g1}L(Kginz}@Io&6U-<$JU)~*I8SN(bMZzdrlg+vvdjlws1(V zTGx2mb5Vl!_g)j4>$B*NBBsqLKv4nH*=?ctkx@rv<-$1on;&03pls{bh5Xh2<^Zac zkHT?nBAxcM@fWh?t6z7ShHT5N=)y&>lB@d(rKl1%I;4t4Y+dhzaWW@q)9G~_N$9|I{$eg-T*TOD z^A0g9$9p>6xxDH9mE{uq<>5YZa(?{Db56l?;~A8={Aj|OxpP$<#CD*ocHk><_DJ~L zM0z}TI#}e-KC_Ggi7G z73WXYA^2ToXC&oXSO%SP7 z-6mYXc(z@cy+9J|BR3C$a){j}12gG8p1pNf!>HNMr3WQqlADEM41SQizIY2)|CkTF zrK95yq*BNcM+Xt}V%^lP1ScI-8IPTrGM4Z;G2k-R{q8CM4O%CXA^~jSxzhmVo^o*( z;#X6)Mm}n&&4X4N?(9ERprk8h+pY|Ls0(y42nNzy_p`)(fVpqt#~nQvWjSeIv9WTQ zGJ?j%cysWUL)&gyqlLV=QdKOgFJR#BFMtI7Qt6l7nku&+OVjtOr7DGjAK{4?7O{k{ zpfS!F(?&zP;fpFDy3`kYMRc3H&*-2;MW??H9>RVt;kl8;jPoLw69=VYbP9F#{~{Bp z?2=7>YohSh^p=fy$t;ocp)x9upaha}O+stx<}~#M?SKn|CF$sq({!af>{xPZ z_kdNph=Do*(_ro%IJCd6EG^e1(UoRRzPsL_NFb!#(uWI|o#~l~79F!M9GU3)rN1A~_*rD1Q6Mf{5ZE z+9M0KRpzFAT5@p-q40>uRG&`^HoJh_wPm(0OPAp4trYYhU1zR1AgFGc=c;8Dra767 zf2|z%IP#$!-ADk{_o%E$+f?y>^4=@C1vI*~xh6Thje6*LbJQW-kTbzXk3wJ-;#4zj zY&12tTN@>}eoHWp(|N2BHr6@kRl-QzOL1mRnIq{nqO@Yu8O;XbdR$Px)=S39ddGxu zOqtz{Mk*tMj7{yXCFY8kgk63&W4$?D_4y+3f_3STSOMNHt}bxf-sSHV;{OwARqiiR zSqgj~TwU7xSW0iIS6UfnkKkdvr)%=AU7tzTr2PPe7S9!$ergj4RDhH*VZ0;uk^A$? zUj+L93MgZOOTIb>!?(UX+w%Rn*dIN+LXcy`t1k7H+}V6=TypT+Syi3o8(-!)I`7{Q z9A!dKvB;~EJU}gH?4zURhU|ZYd;+QUh5>8Ig<@v4fEk{_1(>B(a7f-m|EZeOM6lRlYo!d(MAN2pcVY9=FdEq$aa(rGZ@HdV zFpoV5?<`F=)`w!Lgj9`Hc4#^H@JBNCOMY2gm{I*OU+NI8Je=$WH(Ojb`6&(_2|a_t zrPox+Fn;6?(?jyM_vOB&0^k1KwYDk~W$v}`dUT~?bdN;n8*EO8_B=N@m7h3qxtH)(7r-R@EXjv>e?5{~f>M*+1z_S2s3a^{ zM0L30O6lg6bv@q#7-O%;3p;X+R)$T)ZY{6dZ<3L{4QvWf6^{s`xK**I7NSW;Qr1}- z(W9+3rU*i-fX;|hLdJ7sKqXV~Qd&z4>(6WL7JyxH-qYQ%rL(%iv^N$*R! z-X}oUBlxU5O%`pqsD?%|Y>P81hMSD|WG5ij6c=ZqFF{yEQ6J&)35@wc-^0dod;7s$ zj;V`tfgA?q&4l`}dS%V+wq69M120yxsdlaK?=pzOFB8raU`*)4uuXI41EW3{oz`)y zef@Y7Qm^SDC0^(aS-md>+^_X{ws zYY$wX8G@4TMV{#)c2h&vk*y*a58TMeil!*H(#6+0O}pz)`!=TN&!VXHmm@X>iH2g? znuVz`QmjWjN~X9VwZ7F-*;5&%d0NWK=+y-vfdO+6VY!py$l%j@cNf)|K+@JIGZNIu zp)5|TfwvthKn+wn=oB7UxxO_r4Zj#Tet{Bp2Q!(DcRUr_Bw!Qdb`U8%a0Wk7j1lB6 z{2*7s;grAg#3$Tpx+U{vYUv^CEjZ)8 zXRKc_vP$>M%b$9GbzeIA{9a3#@mNR>OC8Q}+9|Mgi9~K>uX&$yh0C(N*3KisrJMP< zT^`3AdWf<(MW~#$rb{fEmcL@w*yKk9Hmcb5RxWr<$ykQ$Nb|$r8fG<&0wOG@3;f4fst9o=Y+}xXV zQe2!0X1$_bX>x|SRbAYSHfp(A)rquYBxxYpau3q3rL=KGFwM9QxZ zLY!^&%~L2sj!8M|+|w2p2PYV*Jk?+Tsh19+QzgBqKxt_Da$e4{Jc}47t8}iPTkxFg zX&Hhjm=F2pyqe@K9!Mqmfm7}=UYVl!p3vDx71J`v2UZ*!-`J_cO~J)UTJ}7~O(N+g zDdezW)lUYXA(BjE1a+@#oM}3QL^Sab!w2TUu2O9$Nz*PKRM~Z&5+HXP!P9B#LsE;> z;o*F~3F5EEF61f*_NU)y`i!!?@#(UpXOI#zfmy@MwK zc&P3skPYu6DIK#~`Zc5%TAD>NvxCMLgHG{Qg0>Q>LeepiU&5?gJ;c)Ff2$s~99nJ6E#=Px#k-+#is{qCvaXDiM=JHf6y~2T%Wq4V&oq!B zb$nx-0a=$i<-D7O_QFs0umP^oJS+Z;w-L9I<=@;{h}~!n+=Y4OsAU1jt5I%sh!Q#`c=48Bs(|mJr6@{kU4-L)r#lP0(e5hV`4uwRnPX%3c*)Ndyfnxz^^dYcaVthg z-eI)o=xZNQj^jwXcqC^9P6l|*V(F!8^(OHlnhz}rR{Dy~j^aSYazGs^$#l}(Y-7PV zsia8ZIXqLfw-OctXOriBqO4wsO|b#8-Kw*yltPCay(zaPVNhF|OL3-AjtBEF3HsHR zfx*sc68;VAj+J_O5TIl{VyU-rGLzmLc=jstYUZ7ACS12rd933qI+EaV?M$_~5R!3> z^rYc*J<+GCB7D5?O=U@JHWmXT6*bJpRmmq69lP$0lRavqbcfJ}(jYQV4Oe`}i1IkA z7BaVvH_W2#NN^O>u6hgFQ`9wP_@~4mizp32tU>&)9UV>PwZ0 zyE3FUke~`qO;0U~#sLGGK^Kv7S-KANNvJHcFd5o7u77#G1#5`*s?mluEH))quLree z%`L;=0zzlCXba53qjoz}YDjh=p2%)J%|{ic8)+PNtvDJzrKDk>dRwBg#pWUF(w981 zU?@pspk#qit+Jj*II8n%a_uS9ReMXf`$x=93FfurorlV5wWG$S(A8VE_kN3nyUh&{c1b1OR8__+O@J{v7rX4 z%Q~PKOyaegMYtdU8Bbc|_OKX5B>L8ct?OGtcZ0gJoh9}~V@~4DVauZYzLlOI%OK+e zHF7;bNo%!_CYX_<rz`f7dwsxOI<)%_T_`9!02kN+Qjj`(g_^m zw53?y-O3TuHHB{$WF_ALy=!_-`h|s#)H5Lj!q$b*LJ7O~7(U0Ou8Hry5x*)_ugJPEmTTW>`xqBLpX&wJp`uaj+nrI)n%7^8V8|YQiJ!$2vna@ zR86$2jH&0-n&{J2g5|>8M65mgQ)RV=Q6j%W`}^(`T*^g9cE zX3}szeWdm^c_mjFRs?$*^VfxyiAgyfs(UNTwU|bZ+0Hnm)s@H1ZO-t>RQ1IxT{3V9 z%}|WWAy#JH?@g7Rm=zp~;;D&^v|?=9w$-knAhTr!ZCiMY%mZ))cQwGZ)yJL#XKC$M zZQX`?jP|8Mb8h_sGtyzyV3ZG>16G4841y2RyyiQZ5P%rggc`K* zRtBo-HWA<2v`^QlK8AxS(^mI)JnO^08F(+u*I`*AAeHN!)qfXVO%}4)j3B@O4&t`2 zt}ZlBHYQ-qSTM(W=C5v=`f&67&d2hsXE?=Knb}*+Y`2zIRx1+1KF|(JcgLkvjwz8D zjBH{b#f}ARXqr8f3#qSUz{kiz!OcymYEW2dLdFsurRC4^sO08X5>4x|iwvY8P{$p` zRDNGIW;7`q5-O{lpL)`gv9w6o=ZcKvQ{Sa9ob;`V4Cm`f+K`$l3@Hf*wJ9eQhn{Ew z4>cRp@tWAvJU4Zyfb2ZDzr1>y8v_A{ImI)ANIX}fL*VNKLFN~b`=Grg>c1?^{|jV%d*8 zn&_waWvPDz@VD0@rM2)*t!DyOfl_x%x1*mlmzq@f( zg8ZhM03mWH0T_%EnxIfgJc!*m2Cl!iYR^ePxsZ3yPr`sFv_*v&3a6^b!9h|+4_dn$ ze7!NoY9_ZAdEDVa9qC*Ivb{1`0@?f6B-X4hzh_cCI@V-X;@;C~!2>3y(`S{U!w-}W zGeFUH=0z~=W*iQ+N*SY+0EZ+BedsM}8e?Oiv7{4WNvAri_|ft|Sf)zJ8#;q-Rak;$gU%s|YUYB^gXQsq~+ho8p) zkwa~*Z8u7hPngZLH$|kIOu5tTFZqn$tQA7e)7>`C08Y?7_`|X ziQg)uc5bKXT^`u(P_o7YXEmetsP!g_4MS{j#=AozfIzO8Nj=83(BLDtaO4w;=(MdX zZMmA^SSx+j%}DwzDRy2Ni@}`W^~FymzE5&zQWnV@iRdcack#qLrjG@>5nTS&#oP`iSYF!X#UkN{T8RGgObmc4yL)R( zjI_}sgZxBtE0ERfW3#-(Qieh@Ij)#hQ!f3)ibJ@LK?8$V9o|e~$sl#C+?9)QIjfde z0E{*|af(ubEf0=csis81V!RG3PV&<7Skb(`Q=U#L#+s2rrfhO}s}~n#&H%#KH00B= z6^tjoV?NmwsmDrWQwc5`et8^Ly1{31<)n-j1CyLoZEb7;5TGsC=BY?5%zL1_4Q7T^ zY@VLg(8Z*Qr(tzW2#MuT!=499vmN6ktK~UY_B0I^ z=0sM?s6MBfn%72^ZWUxak}-;_u8gG3#*B!TS&r#3)~igfDsDW1=~gZf#yq2w=uJSu z(lS)zis$MlVUgVsr5B;=%~G0gA;AQKY0$_^w)0vxOAOJnylTtSky@bNV=L_vA>X{< z^HI&Hyn`7eFRfpbPkYOw1&mC@oCO_flwKdby1Hw4&5-kpHvwm@T*I((H^eWaa_0ddbotHK4VxO zW2@&U0M~Y&97!};=8zvb4+Ejc(zxj@Lb+b~q}837D|;PRh3#~mNbJ-RzF~mM_`$62 z6L@vBdy?_6duRKNkrE4+V%_v;%$p)`!?h9>x-7`>? z5lU3{H6^%THyz31f|%)}V=)AA*wy_m*Y}RhxyJ&W?l8YE%sSQBC4k$OjOG1}PQ(?S z##?L5x|JEu4;6M>JCCvprH?S@8-W~t6;0ib%xS-AX4*1J`e%VjYAY4vkiF0n916Ns z5Q#7j4nt221+wVV8D2^Fdjw?Fv#do(8JFJX> z`v&P$E$?C%Vtb?$0o5C!rzg(Wk(-Y-x>$5S*+1EYN+%b2;gtNpm1IiWn*iWe-m!P2 z&Z^c{e`kKA2P7ZEwR4g?7SC#y?#jNUw2x}_>st_7`4Go)vZLqtLF85(cN?P%{9cte z+Gd5+GEg*bDVFx&U^5?j^xq6wgQN)VAOsWqKpfWr;mupixlb}Ba7H;5>y|O1S|LCH zJn>yAa?`(Z;~wNK;q5L?O`-$-&R6+Tt&WwY{Qgu?AMYMbY4)xc#&-?oq-ww)tz#*; zlTpSNX&oirtzcm&lcN^k0Bg*APom9lKiWep#OF8%rD*9F3^v7cZyUzP8~fJgzoA&0 z1(*_yI&w~FRHb`J&Z4^KJnBs@lwXm->Dr00yIDsJy*+EL@XQixdW&CO{NWGFxK{(> z3&6KR-|UG5v78oOH&nN)m- z9M_r8b9V~tQpkg`HPh>!Dw20-<1zVTjH%9RkG_^ygAD(9tUwvcznUs=hmsclG~9b+`eE3Dzrsi-IkTz*?Jkg!{&V9 zO-Abwkjb@u~sBfgXa5e%^@=A)*%b{Y;sYxuXGl<7QQ$=%;*8;O5 zk>nm&h_iIatER&C7O}CJgW+ z6)a3!ZMN)MMFe)O{S#Q1Pq|s5Kyk>($gI07cy4YKNs_%tt@XN!%|b^I^8Emz)^O1U z+APnhOK~jM+qO(k8wLesq*Ce=8;hwVY>R&T4sXq`D*8nr+C89B^s&aP61o9D3JFu|wmyk|Lq=fzqS8xod&n9+hWMk|rS& z2OVmkI2jnEmr0jp(b@8gUvRsCSRO|ZGh*VX&N%1W73-p zk-m2tuw!kTfZ~u9Lofwffm7SasB&?NKn#R}C|gp*oZ^iKa!D^qkO=r5wR7##eV-jp zDx+J3PMp&Ote9M9CX+~!nCc598=~|DYG&-o)8#tM|y1LM{Vp$tr@MPQH*2? zr~@YDam7-V!7=u?al-0J8LcZ#OU=9F;cJ|@JKv5fNKw&pDkn-ZL$W%XyQt-17$crD zK(me<7U)HDX)CLOb6R&gp_180@d1kGbeho<%c-yA#21n_n#sCPoA-R+_NWc}c_DM{ zR-?FuApx*mg&eYoTE(ao&k~Y-s@#yVh;BJm6_Y&AZy4BqT-38_r^pDrwmCICl59#W zqje5$Fr$OmRoFD;ScAXbsy6q8+y-&puiW3Na1UD2PI@Fgb|Z&vyv)SlW36AdyoN+9 zM@qz=^UiIfh4rfDVvDviK<`P>a@;vh%c$eMjP2?xo{}jdp98V28#{(oE7Y|w*~oHP zPEA}_BC{UC!*L@<6x6X;l6=Pp1m`tXLqjp#4%*axMkrv)fI%3=Wj<%{i&wE?8(3Nm z{Q&D!?(I@V+>8hnQ~N*_Y-B0yDb`Xo(=ulRttAO9TOEia%yR9?z^$uT_rtk|8LAQ5 zk3GI%cAC2yJ26xz6zXgyEzFG!k&xSldQ|gECB#Q^?HH<4+04H)9MqA=JH%rx#yixc zm?8)z-r;)#ioUSMTWD@;C4jeclY$LefJx?gpyX9f9fd6mlWs_wA>35~2y0>sVV15e zhj=Z>HO^h!N-vlkfxDrnMl2Ds8OEMaemSZZl6{^>kb_c1ERzfXao(**Y3Hc`R? zhQ*t9j_%RsI0a2+6%t6h1CgaMnLEE zs&}xh!*2whD?`Xe`I)j0N_21{G0!wcNiw3$53$J~DVhnMH5pbo?_EdP0pt!Tk7BGa zYoaqosT|3uhmk~$1cVUW(llhLE7u(2sWNP6+v@T} zF(Ymr!K`r8Yh_9ogGl9atB^2y_}A-ZjthHRG_>+X9**mj-=JcXktM7hB4N; zWfo2EswTd}DcW$vWE#hdU7pTQE_K~clI*?G?K_YRny;=~#NJe@;1WLVc3~Tf<$X(x zn>Our+gZ=db`x5WO&p^!$Q$Tu%cXW#J5NfM4N~R~RoH$t>2j6KdWJ};7H3|JYlgJ( zT+!f4HxGK;wecOC;}4WRw5-RYI(T(S;yf|pwJp3v!-+YrUMb<2W;qqV8k3M{xLDTl z72TcXp_gtYUiIg4%^{d<7{RWd>n#Zw&2!qFxmG|pz|R$pRd;hK$6JoNmg)u(yo-eaGHP2}sI5ci?=awlP(rc2d4C4~tVR>fGZ;J?b9+;9#aTieQVh^D--=Vv;(!ycG-H}x)F}CY?Lg7L z;k_7M&F9K95+0tWyQD=$3ZMWzDvpb6w%TMWqXe!`)YgtEAq6HWXr=;Umja3?0Wm>Q zOF^Ip?H-hdG$ZbceG~d+I4OVXi5KotN`LF)~Ub{M4EEi`A-VeM`aV%~6 zRXIE>sV6HMx6z07uSLZe6uC!sd2HGasDP7d`S!uA$ntsGnMcr(Rpju6gL1xNeHxc5A35hYHyc<)3F(tm>>Ky2aCph$ zy$)Xj+eqca?g<#=RakrmZJE5gfWVAlmWvOa9$j^Fa`(*arx~u6!r`QaK_7H=u9D-x zlStVQ85H&Kh0H7R1U}iM9Lu@N-o|Bwfu6ai+JdM@U?o5Pxb;b70uil#IzLOuJf zWXIDq51AC02W_MDsAY_-iraDl>sKF6y+#Dv%l`m;nkBZEVci=JpTkbTF~|Ba$3vRU zc#<*)K+ZX>Hw_d6D90TIXWW89;c!Wz0n=GsZP4e1P!hxM9@wfHW`l94+!7*?#yXTt zkzGH5CbqXrgL93o9^QNNT@H__>AFi!uFD!TWkKZQ@T+k->P7RFyccC}V)vpU&3@Pb>fr`(ZBx|udd)DT%raeB`x*|ACC>hQ@eJh$LVi#^rb4_ch7PgGe zxn0s^6Q5dGFIqO_X9E=@--}Ro#)QZ)cMR1C*fTLb38iIXjr%Ktqj|;&=~gcYF=aqp z^VYB+k(89(kSkpkWq}6l6M<5rs92jzvcJ@2c&(!{VRCS3ucuyl>{b?IAKnACZNqVO z;k$c?VxBeg5HNB+@bm_-mi|koW-^di{KGwKNu-dP)QzTi?l(U{+Nw#Y2fWJ`0~}MX z=UC*xIjo6fCTxMgta%dyqmKEW7EF=pSvs1DT}xq2Eu`%ujl%-2OqTPIl3@CKQ-oAl z(lX$(xM&&DH<~s3#aB3`h7j2?kgPf6;<_C=#!Fb)t>$F)1HDtbh6i#uR~<+lYe`j( z#oR4gRYcy$ZtRg(?(X0WRSr~+xam+qAlM^panSnIGeCE7j%%Hy*$l4@`y{NRzZGGn zF|O^$H49nnbuHi0h6?OZHzKaUS{Dy0gS&z6Q`G)xJ*y^9GBvZ=_9nEFOe1dh20WQZIjb(YPCfFb4t#|PK?0QOSa01FtIPFxaiL|w5 zrTx1_YGfyK0i2OpHnW?E*;@gWb*uV)cC@-TCfdz#X)xwW^tBI*$=2ZFV6OQ_OkXQB9EuI;1Ltu922 zIe140@HK11-W!%jw|zbb^PNubo0IjfYed#0vebaLxG>w6{vvP(;a#=gjx7~YqY7tU zGI<8NWT4}qN(rRXvF7K)*HLN<9o%mdGjqHViu9cmLDKXmNyYNWti1fd;MJRrS{*}3 zTjL}#&mTO1bM07GivA?MV5<~pIa5L*ns~Sluea4o_g}lej2Vpf5xK+XGD#Aq9B~@4kCmi&o zn36T`?<_8aG1|n@C;%PJoS$Bmw{4>7mQ4iOgptW>B4=tp%%|TRisP>I`-@ABk}|#q zcSdp#(A0@L%mNlT9;U5WUWTpkw|mkp6eKzMdCwnHQC?Y_c@&u=elwJ8*Hht-3R!BF z!dWhI;PVemkF8wsM}uP1t^DmeDN5t!Qg;QVI&KS6U%0N$4PSd;6HqnI7^7zbi5Z}B z%rL{XQIg?VnU5r%^%fd0HpX4qs*J!fC90#ye}}(XU{`Pg}63u zX&dZe%b;KBlL=**6<$LvRn$CHE$zS9nE_yNyVkm27hM*%5XB;#^#Jo+ZkeV!YB9CK zs08Pe)}|72mo4-oSvL-cSK*tRt9Zh@E30%}$0P8rmQ6-0BrS46De1*?G0!4jdA8BQ z5+Q;-z@YwhmEsLnT|zf61A>E%j4(gOuC-gF`kP92j)pIfCe!Zkl51RV{w^yz3mKnF zH%oA#7pjcrx$Q#jo_0B<({5fuA!&-CJmOLKcmYrngDwDxqRK?x$VO&lm}w zxT@NftX52~4ZxHh;9{E$%wTK~PilmdDJ0AGt7FA+{NZgctOTOsI5zF3fAGgkL^JMu)uaqgY0>%ouD`>#~#MC zZRJgvBoJvS^7H4wGe2A;r{+J*bbGfEl@V~U|Xr&D%S5NGUo#w>Ur8$L+E40 zq?=2iORFgNtCA{63Xi>28uNX|?YSANGDxBl;c#)qC(id4rCrJtqMWySxoaDwBx3}g z^^prQId>S{+*YN%%S#($18=QuD7zHahE=jOryW+TO>R*zql&Ai+=R&KS7yFJ9@gfs zTZX1Iu`#MKk8@^J915t`gboKLx(T6TxD}Z^ za)ZL+nA}P+M#|$pwXE|5w7}$%R3i=>3@|fV3nVNAV+TFz8Jk6WLhQsS$u#9=hC*Ma zYU@NGfVv)QK5LIO2-m6WNjreIS4uEftx`7ynNB(y9v3V|39Acg77sAv=~Z-s#L-`u zbyqwJyCu>_xfPGFj2~LEk@=DJ%}Yp479wXWJ=Y*o3t(4{-D=d+8nIGB_b=$Q_^nHlFloj;fS!G-YfG^c5W^yruWxiL zIx92@^YChw+yy4uGDbKxJ>AiHfldHCinnWQ*GGBAD?7>>$Xghz3k>G0!DHbC-62rYT6d0}O+S(TsV|fU?5Nge|ET~FwJ*w-* zjnQeb#_Ny)t!B{LLu}#(d}ps(*p02=%PHV>tOYW`DPh5=o#q)K_%+W`gPXm{aq4t( z-K^*pR*yO;;>lh|wPaY|2-g!1dsX{o`*f^Oa64Blskm>k4)-X_65X>nTmw_Uq8Q3C z09DJ2Giz$nE;7BVF{Br2%v6A*1PazKnG(@+%R(}($mv}6q*Pv(W0A&dUfM-cP`3bc zT>aK%xn))u&r@9#mZOR^EN<2EpaDxI^T#ICJXT$}Fw72XMiCVEJ9B|rN+?Xymr%`+ z$jKv`%C=eNXLTPaJmRi8BB@TN6+V{9Zxinr1oy05lvaS4LeBeDRGfCJHxay8Y;oyR znP64(6Bx%@f=i(?jQPNG6;$3C|z_!2KP;G=d? zkF{(`rA9_}f%sJivhw61Sc*NO5gMG5uhqMnyZxBxQdp$q0g7z;dk9p<<=l>G6IGi} zPbzr2bgU{>bN(A8%KHt}p5ip$$sfg3wCzNFy-cly&ML*msF#qH7+m(ONg`x_<%+6s zZZ?_{M`Ik&-b(Ste(CG$OuJbGI~B44u5(GaWWE5l0qSe0wz-7LVq=yy&pKR>LL5rA z7flGLs^{6xPthFSJ)Ni)VLr<^_eAwtE`t>@T$l)Ay$& zc51C@VHKDjPz8_i8noo5N#J_a&b{Bd9PK>|(qFWSG6414ROY*mMJiJ#)b*+lcEQT$ zH4;jzlE$N&OdOjayn}lZcwW^)NE|ZvtM^l{m!7o*cLHLdcBY#Vr*9~0V4!1fA6iEH z)f@+EF!!e(YpNR>A%y<``st^yT5&vk(>jW>h0khE^oEK<6!hk$w_MDF)QXQjwLO~d zx{ZBEqz9;5F31sm6bhD`AKVn`XhB63v;b04(Lf1BEffIJ=}x2~jL-tnMHB#0MHB#0 zMHB^sih_IFYj5?lD*I=e$hz@Oq(F$2$bEVWmn63~r$VJqg&WkF0CH=Jxba=gnGt}4 z*j9A9t<>4wD<7$>op__N8D&@TXnG6X+sF6jKz%n=d39?P;LZv58LvJ!GCqD|P4isy zxYRsHWOPR=k69hz*Q^Kpv?uVR{t^ok2@ZcM;I|%gNw|SWw`QN&l>4*2{@=6pe0qUE z*Q`%hVf9+!Qbq%<23GZ>+p#>dncuFjV#A5R`h!*@yS9{kv&MhmRpxCoXQ`!Ims60$ zRVw~OJgPkz>H}%%gGkDtWQy~+b!(`wQdS?0X+h$9paRHM$NNI9R*O03mQ-6iorsNb z&~rhCHtL}M6^U=+dw2O|jH&iDs|KTKa6fl4=g^!QwIt3t;i^O8L!QRj{`4q*t5s&v zbomF*YZ3ndfQr)`ievO2TB92jVbN@$4dp_qxM1R{P2qb9NhMqp+%c`nI#4FAb4}pO zA`TuIbjt78(=)f@Gk=DJ5 ztgYLV5+A~%n@hBn0C*6A&=FGL*tt&|nql*yLAai$wNH1Wn|oNUW1S}sps+x4htSuk z%i)bGU%h7^<%)~`5luWs$cpHV)m6v_pC*CIc| zT2L+g$WXUT2JY(Co2#q#plrp2jTNXlIBJ*pCz+TFX~Tg@g~^|WS)A}Mz)@BnHPap?X4zXnqUGB=B*@Aq8TQMTRiltvs!Fo&Bl6C z$uIzUV;eeDGhV!)D-03oQEfd^{aMKO>m`y zsoT*>!9PmRg+oQxBnrEyN+P*N&T!RnS7Wi)6|+q)D|w@u8>8Hxl!{r_9}nEcErsu# z%rd}W?KOYIH@ar0q}xm+33VO=COV4Zt}ei0Bj`KPIW*ctHq@VTO=9NfRJ&2w{)`H(63e;)NBxzI(fELKumM{KPl@MJuYJq2J$B=dn>eha}AMb?UHnHji8*L z!n}h)@ny!C+hdUVZPa?#q-h>B({Hw{;6%W1bH#Pf_mNiUXxB7(Q#`B07LOIvGe#rN zJ8(fCT-QA)IpYSsH^%q+9ooN;hD($G04;Z%epThy4n(AF#w(3>Iq9~&-oUH3ty{Fa zTWOWzeXo7$mZ5l8fjx$V>-C?q8 zD`it4}#IMS4EnF=m9xyD-Qnw0jETr8j<>a5r%sN7%bA{SW8j1S?jMA9tYDSpp( z0ahGj)xBEA(@)c8k_%|_wDuJ0!bUt&tc@4uef*77^&7*{bxyRSipR2@V zy_Q7)0#8cLM8OIHB=r<0bW~m9i;~|o?htUItwO~iW1c{&Di%Hpb5b(z_|)=9e#)!~+)rA`v<)c>oT>D# zlT6dr`rE2zY3SOe4w^gVk) z(@%$)-LL(ees35o1u~Q3( zJiU^F!1@}S$yT@#ys$E_cH9*I09vPSW^ONCe30=e$q|!`dlSu6V{+3%G`5~mjKwAt z@$+;1s@0rE=%g{m_R;aL z8r`@(Ygr?0yo~072TY1)wkz4&0fSmfyGAigK#1H7Rfd&uQVA8x^(0kyKu=1%SP%{k zM#?&s;LtNM;0%2#skLNn!>Fxk6P$s-^r*le#Y|Q+{Mkb6Y~#|Z?F>oB&07x|asbU& zHk|OZiE%Tdk&*C0IH$tlN1dX45yxtN)u--)W@PpS zTLlhDr$o|PXKqg&>rN|}ldLN>Eued`%6ZBZ=Mo@ir?;DUWCE$(I{A`&ojin|58Gbfl^I5i}Z zLl!2$J+o06C8dRSFwZ2I1~L~I%^pgJ8DGYcwFsIP?SsWS3;3>4hB1oKN>Nuxq}nV) zZxQB}cm!Y+=xUw0nj*w<7}TvK$`139o&`**$-T$UnO=AS&IWVdsWqtI*0x<);_34m zqb01$39gD*g|jJ56{5F7`x^qSTS~T*jgC6=RCdWJ$OK}fhRLLpd4HR}Y1L`&$(H5& z-9aQCSUfjciq18Sh#+l$YN@C~kU|4KA3RcNlgTob-S;YE70Yx>cigM0<_Va^!kVpP zY_bC+gaB(pQ5)64>^QD;&glDh5V@|H-K_*~y^=gk$T;k4HA#j*z;d-|bwrBTM!b_$ z#lSKWM_y>N>IQ|ZsW~L@K&i~1X^g<5mF_DkNe6U%16np$kwF_Prdao>lG5k|c;<@O zpyxFE7V{(mPn0O;rZR{6Rb#b_ZR=5cjWeOONTflGA469RYmSwXXCaCOTvnWN?i?KY z*08;`H;%)+un!zmaz~TY{c3aTieiw*k%L5}HVCdbB-4ty@A_1nieZorrxjeuA&^VE zX;&EsxT;Fq7~~Aq*?Dpce5b8ec)(y26^oj=Esc`kI*=2Zs*yA0jC@tOBQYlar?{fh zL~#7zj&WI3t97BArE(CvdB!k1)6k9k)ZV0s$dj@=&INxP*f zM%xn61f*vK{GephTI*yx0N{=dRk)Fi<~Ha?D2S^oDLk!9g_YQv74O*su5xK4)Eawz zn8Ed?h+}1Mmo4gPsTMFe)2%Mk&mpBSjy= zF;SD&x?{1b5aOCg98#ZJP1&X~3G}0-AB`mg7oS?WrH%T8Bh`gdtql=(YPSCX?}|(h zOi#N`rm5glsfZ||j8Fmi(sTGzsGtPTwG^~a0Z2w^X(#{(9caxIgnCc|sR;mNoC?mr z)~&SlJJ>V-0CXDUbsrI2UgbkV-h7P4|R*34ayg_GX3WoC>c3S4Id`)$5 zN~3vc=(U3K7C9$0-0@t}ttNX^a{5&DYV4Y8i6m^Zl6}oYT%WBaFrH0f+1#R*!^4_z zW7DNWoCX2c5z?EH z>p?VQnq>~p7@%h~gE*%SC=l?(bv)D3caQF|9{H$q-k-P;ie$8F+H3cA}mDq5NdPU%epxjAFXtj z9wk>$E?52pD|ppR@~dU_A*^*rNkv5k#8aSXoG?C>EoyKy){H2kiUb&OGN-799Dj*rCaJ&trW-@9*5GjX)#HmHFLzZ%`R;o{h^a3Pbzy6 zS%JK;eNB4LjC7R0(@cO3@$wJ1dh;K#2=`@yJ+oLfW@N9kA7S^ml0uG1sjjB;<2!f* zrAN5O3ZOq+ccvmZ2O}w;%7WX_s`(fojCZQi5?_kFB*`9AXf+&98OSU2q(NWJF`*%G zj`dPYk2isw=hm*>F2X@01Xh2Owm?TpXl1){?H&tZXc*_}eqBy177HagLikmETO7u${uWMy%{G^uxNqb!Uu*9M(}!;QSlCL&XTNM&Hf zTPoS=1xX$BP8pCLzgl0kBQ8WE>P-VI!tTlgWwYL_eS&6%rc^#y?^P`flR6}4496HJ ziu4^jSxo~+dt2Ku9%cDoBbucI(_(8&o?-Tfic_^tL9KB)mf1-idm2do&iC@Wz#KM6 z1mho-G02C3&~zE7dkJ3Jll`d@9f-JY^-^ULsV+bttw#3&_{I%F?IGtRgHn(J!l-gd zIH`9enZV?F(<6#Twpq*BCwQTWk3u21ht$l!5S z1pfdr&u*0WM4t@9wKT>>8aa#=d{l`%@i!!#cNJaOqhU#>!>Qa@vof4yV~`Crz@09b z%o;63lB<_ zBs(}iT4Natu;7Zb<+jqmb5)FjK0z6&67idWb4+FH9Y$*@1d7;Tde=pD;-}OtRykS0 z1F^0-qGwG#!a){oWZj+?rtoJ)M z{{R5$YtmrTEc6=|^0#0Prmisde)NX_0GaG?ej{6(E5s{tCfsx^0Ts?Zux+lENal8s z9Fk3Rda+xp$u2KaWQ6_JUTccIjt@QjmMnzuPg=$mB%RFZ$?nej!&(~giD#F~+x$x0 z)IKQIUf$fk>PqT9+Dq6|-BDjbA5!YJ+J z5*6H|vFK|_b+c=Hv%zkuj?2YI=B(-EfT(_z0FTO@6~H|9G~rRFbQ+fRKNDT*EK9ju zbQHR4M|Bf4w?131MG9MS{KZ9iZ2-ghSO>V`mr7fEYuM$Gx0D+sjV7QK-%fjbWR^l#0p!5PSk%KLqu}KOnC>;*FEALYSuttv9h*>2l1*5ll8@K zYx<3zw8=bj2%Wfe&T>C0%heOZ_F7qvH5YdbGv*M>u>SyB=a)Awy$s#$XVB#B%Mj$Y z>esb~;9Cg_;-S;}wIapUCB}W7Dr5NeOB!GjHfl-FdQUUF= z>FrRxzVJ$lkZog()08T<15*N@l1Btop&3*W(yTHo4x>J_)IiIEdQb!`z%NQwkzb5d z>l%i^98mB^Fh(&z5S^gl^G$fro|Q8~4>`p`K@?a9c}k}uri`NyGma=!4Z#MUAOn%b zOqXF;MvSlo5NK;)$_OBuc!RiVaJC@lCz^}MH7gjAW6tax^rhH=hJI}Ksou;HkyRM9 zIU93RD9P+gOi3+=Cm>aC-$EN;Jkd477A1iKrM0_{ckdhJtfZ!vrcE*rDoJs?WYxQD zTSjs|Z%QV+Rg@TjIi^Q&lU#uR04VQSG}_pU5;fz9Ty!-QHvzNf9G_E9y=c}ZQ~|Tl zipE!V1#^yR#tEUDvLsVR3`gdu1Iur_89DD&;b9u8@5Xx8wYAl&NFoF?R7&fhjH{hW z;b8LEbLwgYyxyZY01kcX{;d+d%CG|%#YYXSPM{D5D@7=%>{Z6ad}D$31A=Ppw8<^L z*&E)f%?xoyL2NBjitIx+1_(a1xl`6CRxeKyG{GX|9<_Be{{Ss_BVbd}Vn|kA1D8?|PVW7yHX zm_RZQBc(w-@<{;O_m5hItk~qaCZk(5B!J^JtRn@vQE04WkvT#5)yV#6!3~0X(h`V_ zgmOPxgL*TC+(GoKn@?bq8+&MONCn9wy%w;wh`<@$)S9z39U?Fetd92u2O4lkB8uAit3u%ab;t)iptai1i(;8?_D&e_9-%?c0OY6 zAB7=@$ZWqO6w7T-$zT}#ql{IU<9$x#`G0U$t-hnNCA6`aF@eQE@+p{%aB9O@wY$_Z zKwa`W4z!h+C34Jflnb5(PiwSDRDyD8ws0XpTeVqPBZ@#s$45r4PHr9p>v#%TC4UpJ5J%pr4mT^ zDtcBjtIYHlJ2WG`h0efpLn`jgV5G|(#^7=R&IL;rrtfyD!wH^hX6E)6IiYadcu)eK zrnB9eIl*Q-YI*M>1TRv@im7{c%*AAcDHP!;TFnWvL3!pgDH&f{q30Bp!N||0ST~5U zD#s7ZM<%6?B$6W|fDKjDcSM#^5mHKDAuf2`)p&gP(fPk4p*x zcO>=2DM~x024S<2Ipm6H3lj!(Cl#%Ga}~Uit}&jxReR#95UPe&j8)+Y#t0>fvSqNZ5F$?4E)ti<#F8f~qTK+VxsB=uSDRlACpH zuZ)_7f-dKT{G+Wk?+sj~sM~qBj_403JXMPu*S3MJQKW2_8Nf^&l zngG~9C%;=+M)I<7=bx=ny`A#yoM6zR_6XR zlU8hii@>%$756>`qF+hrh}SbH1S6i6F@W! zGg{srQgw(i>zc|P1#S3YLu&DH(o-{O1h=kHNmxfk6@<>D@K4a! zJnHmEwS>!(_p1HGv&!z}oRUvG)pFc$X=GyjnrOy7>z%uv#A1@LyNUFq&N=3jr5XIG z6i5z!l^H)ZPK69F^7F}!dNU5qj^y~Qbzd6|zO zR*|UUa@WGbuITk8VB>O}gWi_7T{B*q(SorpAEB*iadRhllOah81qya?~cc21_D4+`0(Ftv2jPzw9yjtcrj{V~YAT@hs z$NGo*8u81$ruITdAezc%QuvCJF!K-cq9vATL{W^h905!SuEgZz)%`BaNMx0+k{64W z5Bx{cr7M(V-darrrDZ~_I@NW4G0kaR$t2S^n!x@wLP&C1m4_bm>?DGGNgrI0I@Bt= zQzwsVxeR!>AdHjRqPa1ZOL2^jri2?2K!bNYdQo;r#^b@HWicKbiiMxdJe=c-1Vj#7 zlabn!&rHs0Nb1EpV{58SGb2&%}%cq8e>TUIR?4UE*b z79h5cSlk`h9kEt!rX zO+d34_$Hm^31#5*J*uU^D{+nBk7}eeETehdn$prV_;nX!CFF20>E;82`Bpe=F;Z&7 zOB6`BVoB{*ir9VpZEZ8fxg3Lxp~y7o7YWl9atU|lq!4h>W#XK|-v(QY(<4eB>P zX|cEn>4$Wi0bAH&qw!ybEN(Q^yVK!_5HjKdaKDFY;juHuvctQc!n!{U>yp}Ux4ezo z8GcsD?N-v1Y=q#NYC1EQdp&~ykVR+6AI>UzitP34TR87o?OlA99}X|tvfZbX+(Ew(MR2fBvdm+ryGYzq;_6`kN8#I z#aO`-Z#U#<-z+gt6xzTQXOA6iGq&9ZoWkRU=zY+av&ZB$b`EP{N-9-Lcg%Oy^ zT#um@i+8TuUgj%XSYwTPnACuOT62_nEY;Z$Ycms3@X?D=TWeyjta#dUS^Cd~wGAo! z=C*SZ;Fkk|U0#oU_B}vIrZ1$1uXwk_YpH2ZZ43bk87%F?eK_W(q*P#>UD!(MH(QvQ z=jRlXL>zplifM8!U@$}1+Eb{4~Ah)2PwK~iuUuYnZq0XaCPwVL3awBu1d$8x`wv~CU! zG?D4~Q`#m&m2N2nYW~Krodw1c-LpV;U}{4Hrf@TlN)u?#<>H;w0f`_3=A~r}*;AS% zME(}Y^r0}IGVo})4;kCio8~f%9z`gTiR5Hcx5tiYfWavp0TnXLNTgOl>Cderl+P4^ zQt~mtrb!z=29+lOkU==7HNt_yng&po)rjO~v!}ISG8Bs1YmxoaP)RB<KqE$mNWISe;a2q>F`c)=JUNhIdX6fHkHv?kcTX%)BMn_!KDv?}g%3Qa#Wf-JT z${6CMwz-zfk8@c%O>9GnpxR@fzHwF72eY|W&j+V9pxT|jSu)#C13hTJx16vn$29_4vkZ~It?AN@ zib*|TKU#G5 z3n3CJ_UTwi*D~CJy@{>cd&yQs67r*p=AAbVq%~rr>CU|U(VmrM6u?x;$>=K0&CGWQ z$sbWw(6h}Ll<>ULS9_6UK|RThiIgzO;Nq!X#HIq{_=Rd}YO}KddVEo&qa}|WsnQY{WMef7vZUKXj%bs* z&~27{#I|6;x%8(Swv!n+sxn&;3zwyiL?Z{N6^|k_Hovt}6hvN06t{9bk%J#O70ru* z=VYIhS3@1reSu^{_2#maIbMOOoo$$|$C^L~gPPKZ?6bMrK_k+zZ|@d!l^7t^dppT3 zSiX5RyQ1W;)NVI6?>0jyV8E&z^HDwEyq|Lr1!pwPbO4_eAm<$9588ByJ`Oof<@rnRm$ zP^Aixaw>(@yl)m0gX>v_DOOFS=M>dA)G2Cd>etIO$P=g>noqYVL@k0q#tml`W?&C` zxR#2j3v$M)P>NOwD;i25o-kFhpGu{0l7z%gNCt$pnN+^)FF-2&n1&cLAsNkL?Hx%n z3roB^ESFyt`=j};r7UtUhGg75(#)HgZv{bByMfp<))~8EQB_Q%UX0Iv&y#{M& zd-~kgD&}pStHc;F3|RFPt!fOUW36Zv0OzODqS{MjR`wgFnT@MkGVCeC0n}Cn(7KRd zvEsWMh}ur0HJd%Ut8xH8O1s$yEsk>H)X!iY@~)h8>s2)GGwtxkPC;-hr!eL+gaQv* zrv;its7Ap@2Q_@x28}rgE@_7tr#~&4XY;KP2zl>8AC)1X{;akj3aL zpzxT^st=-?=j)~LdglGlqEcXYBc&8l(-2Wb6aZ006aZ00XX=`yT5Y*@Idk_`hV82= z5p#U8AE@e3>F^hj{N0z zF~uP?J8}Fe+29I<9(gq);}i*@`$LQxi44}07lGLis5NCa?C5t;M()+5Wy*5Zr5c-| zJlXCKnLLc=+~$>rMJNDqLk=or?#rhI1!P8`Zy7vyr!X6iI%bm~9+aaLtY|chQt`;3 z<2+MyKnsd@Ar2@MazPXcjOu9oChWq3;~``nMQK-C!Bu%G?I{Hw_>w+Ps0f_hd{+=scBZ!r5#*88W5Wc*CPF(Wh*h}}kM1faj&$UfC5 zL$(J4p<;W~vBhkXY?pD*_fHiy)sx$*HsoN-k+k%uSld7&X)ZZG!a=JkT#>AzjwX>G z<|E}+u3q3cxF@(Z(B56d{A86Kjb|6OX8V~w=8&05-bRcLzSSBA$ifn9O>QBNq)YhF zx2`@^KnHFqhJ;Z;Jd5&1-;HTR9U@g65lE7|MyNjbty>muZM$zhIjL<4l;pLU&hq5iX{!>;`&UH<)NLT6JpZ0MQ?P5ti>Ku_Rl*|AhyvNe5K@pII+y~N{P=Z&|h~#Ll zQ)_XaXj+0Jo+;8|5es9msTyEm{o>$`#!zj9a`<60toACyFe=UfP-W8+_(u7!?K; z{Z+tfmgi71v2RS@f2Q!cXQ`)4nc98AK$Q0YUu%4>Sv1e^@adwc0E0clG z716ze=r@F3NM+iYQyv&+-nrzOOL>*gI619NYsFGt*)6nDtWkl22XpIBri1CBkuIQG z;F8!wKVz`;Lo7ohrK1Z;u+iyWe zP2Doyv2`1;R6qx?q_BxhSQz=eO=qcTTg;V-$3av1<`3SHgO8L{+Q_uKm*=#G*oJ8V zZ%k4}wn4ZIA8Mg4q36ej9Q4gkr`#d=7~uA%kP=?rGoVJt9sO%OTztSQ)c01xSsUlT zs2fa|0Hdk;8flQXFUKnfSM;jaH}gA`4~0EJs}Zim+IoRfY2F^xHCf5Ei_FJSnza`8 zE$mgXOQ)21N`KxJ=>8e;18I>M@8eeoqmH%9>ed(99lCjtg=5A$);eC!=uCvxYP{9r zlCcqL(cNwaYZ`_c*JTcgS**XRk`=G|eYMyN*Y@a)%ih&1VQ%3Nhtc z90kUF(n06YRf|IMf~Bg?tENX3?qMfjCkC>hXO2JvU{9JeW>dKm;$40JWo+G{r&WJXvR2OTm2tgSlU!I6^o z;b9#^mB}Bdq`A7&)^8~;1c;}pTxO--8xrpwirV*yH9bYQTwE#0#x{I4UNPTg0VX&>xIoIPA!ubu5{X6@Pb5<;Eq$=ILI|)T+`vY zvHsDsFk9gK(Fei&1!Y0zV0lPObmxk<15Izc&bNYPVU4l^Yf6HLKIjxE5(x8e)ne&_qciT*IlsxfSds(NUJjG|XIXF0`%LA&66Nzml1$_i%{T&9m<=NX zkSU;`>rOEdoYYSbaA*Qes^bHSts)>K4wT{;bUi2$s|S>^{j?5J?j%r;tMM;M7#%k=AYR9EQ z)|&{&6%vAK#%>0k#oSTEOA&)uvs@E%wRv20qUJVq0Jj2`#SlmXpTyQ4&y^74WIib6 zX?Pn2XpKE395!3MSGX&)asX-$fv z7TwTuP^7L!nA-&@ZzH}>99Bg3D?a8ObDGeG@J8l5@#|TWUwLgVI6r;2bgOcW?{K;~$r4kLqk&fKrI}&!$gO9z zNWsnxM{jJ8E(aB_w2g|;&-)|4J87S1WqdLk=>!09xTeVhh2#p>Gff(#nTnz!Jt;!u zHyeQOSKiqOIRh13!04^9un$_M!qzh!EOLh9Z*f|G+Q}WimlESVR4-&CUV8Q-qKelN zY;16N_o#7^d^s2qxpct>GfBQoeTL0deY z)Z=`@FniUDi&k^fnyqna>k#0aRP#nmhVEFly?JKZ=K%Jm-(05R5S}X~OUEV-deyHj zT#kCyikcdTPkkh|{z=Ivy+;glM7<78TWcZ!kPby&K&1v(<~^z6OqSq~PX`{?v!ADE6QQ9cbxE>xu;f9tX;6sPJm$>SiON{{UL$f#SOF1*qLS zdkRbrz*5ptieeUuD4+t0DjS=GwSlFO;Xu#Ufu(n3L#XNzY4*lPKR57?TJx<(P?q}P zrI3@)0;kpWNi_?i%t&5=Yc^Hba7GW-xhhnCd(s|g?MeZxk3@|9 zXk5~f-!!T@prGwd_NjJ}){_*4ah~+2rg2W%N#IfyAv#bO9K}4K0K<1Qk`I(NMzaEpI3AS1c8Uo(=}gU`;~l}`o037#K}rb6G@V5NH?K65q~oOkP*4%rb*AH! zPVb(S0m0^g9;@;;DZQz~{abTPY-6ni4C_mi=}F$4K9q|Tb4@&+DZn2}L)L*@GuD&8 zT2LttX^e0@ikjZ#?dA@QK?bX+`Kjc5#+r5$N$7X_KC+k5h}?lFADwJwyuRAu?c`TR zAdgD!^o?0Bp$bUzK;(MYRXUv7Gr`8-`5!zsH9hHQ6jrC06tt930Ywy00YwxV0Hdm$ zX}1UcgI-gpL{M&1UZ<@#-6rGx!(Lme$`t@TYdI0r#b!nXkfDdQAe`;OupfmsK^qT7 zr~wh2(o8N~h|O^*Qu+RsEV3QDLHSTqZ2m~vZb2i8sWs5reaX!XeG2a>azUk7nN% zCm8zHZ;Njh;^m|ayZRIhj8s+$s9u0A2~q}J_Q$)xTekjVMz?Ng+ygShf2Ff5=P zb*Ut*72FOutM*Z4lqW2EQjL%<-U&Tvw&5Od18w%A;9b48lmexGVc1mz3G)7RAlAVf zN8ZoYg;cm=r?9DV1YsLrlx`UwwPFbx92mhHdy3NxptMDEp2DI_ZKZ+S6#ld+*c&E` zT$PARi5cS^vruZfm7I>RWeY+8!)3|It1#)d%nNy7_j@<><@yOYwLZ40v<>UgTw&=r^!IOnZtOQ^lL+KQz5;;gk|L9T3%W)6oV-mOh_E102s=CcebZ>3aAC#~Q{M5If?u>}8P30TqjHH`(qsN;CAU z(CQeFkh?(bSi4_hO)IurS;M!=4_a$oLnz2QhqYnqnz6lb0_`0!OJv|GuI_y)DrxQt zCCS3PpD+U*Gg(*JmBb{$(x~g@kWb~-w2F4nHZT;O z#ZGftFu9fuhdYH?O)hz)5v{u!x^2b{K+X0GmWJs}EDjDuQVZPl0KtzPDXkDEJ?gr# zM%tj7vFEC~sqb8n#93-=q%g^km8jjE?Kz_0E1YARhBYxCnB*GXHR8%r2^mS`V9)}v z!Nnu0x%Q@o+B)%8q@KgM9MOTw^{95VymYIB1YnAZ_QrAzSnNW!?1v(eq4~3%nzAQW z91dwPTZ+n1xh)i3<%RxHfNC)`rr;Ib7$`uBi;<5y+rNf__oWE@XhDC1zk>BCZ)kk>KMs9I=9Nj8jq*nwc>% z44iEum{@ic_Cg;FDSV{hspf?wJB?WhJgK5joA_#F1smp3ikVDhdJ3R1C6ANEQ`@p_ z-K%Ah%n-1lQdf=3OGBhYPbDM-b4bOKP3pW6ip7Tg;sQRv*0I#1 z2^hvt2BuMHO%_$9F$5ryoYnJcvqHND2ps#9jIs9+X8XZc@pstFr%?m1t4qcBU(yzQxz=gu`jPY5M+5Mfv^%U`{ zEWaa>j+FTu*hvjbviUs?O!3PkdxLR6w~d$x$6oZUbYO2Om$oXd*TPb4dPW%re;Q^*IrODqv^5YFo;e0A;X9=~{EnI;gOCAz^fM4z{9)~g*_`7S?WdZTb|Kb zP@lX-Q*;ZJboQoPUOcj@DaPIoDY9HV%rG;Gl^HEWGF>Af)o>CPLRId~t=s@tlg1OnHh`c&SyOKQX`+3tvXF zEN1{3&9?SLvix^Zvk1uQD!kVa8H7M#y=yY+;72|apQR9K_Y)HQrEss=$-rLvK>vl2k;D(p9ryq-%9qz?3X ztwnOYZy-Ws;8R0~R$)M%4W7HaH0~~r+sEr2q zr0+}36bwo}l)2AJP7hiJ2lTGf!GrfRpK<+bi|<{}gOq)aQ~uDT#B}`zX#vQkz@u-a zF$+Z}B93SPVgMwZ0bECjHJ`Lx7?Hnpy)oXk{7b6+n%vvQ*moTJ3gHWHe78C4SXG_0 zN3oY-Z~NJNglRW6MK3bQGv1m&&jOziJIB_!k7?N>skiWgPiq{a;gq_D#@zL$zk_B` zgt$ZXTvuCWp={wEh(DD*=ZZE0Nl{7cPAjcajgOsp{6dpSoGhLZzXRnlx6syg#*2Ms zb1VcesN`3sERnz5b#I}~DgCuCIn|EiuFkB?VwCY3Md|enVgNk~JVq}^1q&YO<^rhOzqVY(JjUBVvpVz+> zY&oPL^N~QVG=L2yC=}qN^FZz}k9q*$)5@IC5RpJ!7nL-_^r?}4Q;K5`YGmAECQoW{ zQYio~2GX zaol@Xe{FD=P%N>Wf-ABU=10!sFs_WQwq(?_lvSKTMHEm0MHEm5X1sBv&-DJa2e0}uu(%Pv8~XB8C9A;B4?VwpxvZy{5G)}bVZqBBRFWb$`qGt#c* zQXF*S6`367JEbktJm#-Wws_9hRcv=PDH2nLAuZzIWM;iS+d$H<^s8?utXGYIeqn?7 zSD9(E$!l_D2MoOpZ^NzJzo%U17&WY1Qq+8@t25X%zYfQyX{`dVZR_(guO_^I#MZ{s zRhr*xs^sH;TIkoux`n-ular7z7}qp)Snsdi=TMBy7+?*=VwBpGCQ-c8k3*TYwVL+i z!ET00N#RF&ihFr&rD)|st_}z_r9S;PQ2SM>DhbH;s<&5feRR`FjqGx1dKP8KNTh< zkU1(owSLX$-%&Q>tJvUS@V2Rb;bFCvnEP{Dv-m7&)-YVX$ooS!8Z7d)+v;8?va_|f zlTVayjBLXXm=8+j^^IN~M(Qb-D=GWKKP^q8dm<&-33=eVsB|%?JlF&RBMZ(w>zTA+ z<}&vkYtZ%I62lLM;<6L0lI{7*{{SlUc9&xpPvYxYR7;(x>@8H<=r~9syDhs0txt6u z+dj+|^{n{dg5hQ}&e6DBpbMOzN~r;mNYP}FcpmjODH;}2%252=dR3Dq^2o=A98?zY zOKmWQXxTozRnu;%AtksR)bb(Nqa<-zK+M=K-*kFbbWxmduVdeLDUBWO>Q=BUs2@!z#q zif4hoVsYN4X`_&i=BC7!t>k0?fzqqXbD8pb=dDTS1vmpB`cp1#_s6^pHCilN+mE#> zu#HCF?)Rvk)=80MUIshVRxq>3QS*%RT91Z|#{j@zTB4FxGYfejuYYQ8?cXt`%MdbU zq`~x|m?Cxpq?U{JcfLxToQkb+dFEV`fCWMb3OTCJ^FBs;(y**(M|4BrRMTQGtZ|yB z6kG-;9`z#uDcT7&EeVnkj4%LWH4;T2IOr?76{6Orsze4X09C2NS5CZ&dk0s;4ANyt(Aw-D&bLey8WnP>Jp%Ob^bdv)*UjAT^t$*Sy4)jRaX*9D$Qc5y0|@}&MTU% z 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

TYaV|2zRp5E^*DoZeadv`TN8 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