https://cstwiki.wtb.tue.nl/api.php?action=feedcontributions&user=S131974&feedformat=atomControl Systems Technology Group - User contributions [en]2024-03-29T05:40:30ZUser contributionsMediaWiki 1.39.5https://cstwiki.wtb.tue.nl/index.php?title=Mobile_Robot_Control_2021&diff=114925Mobile Robot Control 20212021-05-03T11:59:24Z<p>S131974: /* Design Document */</p>
<hr />
<div><div align="center"><br />
<font size="4">'PICO in the Hospital'</font><br />
</div><br />
[[File:Gostai-Jazz-500x500.jpg|center|thumb|350px]]<br />
<br />
----<br />
<br />
= Introduction =<br />
This course is about software design and how to apply this in the context of autonomous robots. The accompanying assignment is about applying this knowledge to a real-life robotics task.<br />
<br />
= Course Schedule and Lecture Slides =<br />
<br />
<br />
'''[This schedule may be changed during the course!]'''<br />
Online sessions such as live lectures will typically take place on the wednesdays between 15:30-17:15. Except for the week of may the 5th as it is liberation day; the Q&A session of lecture 2 will thus take place on the 7th of may between 10:45-12:30. The course schedule is as follows:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 5em;"<br />
|-<br />
| April 21 (LIVE on MSFT teams; link via canvas mail)<br />
| width="325" | Introduction by ''René van de Molengraft'', [[Tech United]] , ''VanderLande'' and ''Lely''<br />
| width="325" | [[Media:EMC_tooling_infrastructure_2021.pdf | Tooling, Infrastructure and Assignment]] by ''Bob Hendrikx'' <br />
|-<br />
| April 28 (Live on MSFT teams; link via canvas mail)<br />
| colspan="2" | Q&A session about Tutorial 1 videos. One should have watched tutorial 1 videos before attending this live session. These videos can be found in Panopto in the Tutorial 1 folder of this course. <br />
|-<br />
| <span style="color:red">May 4</span><br />
| colspan="2" | <span style="color:red">'''Deadline: design document''' </span><br />
|-<br />
| May 7 (Live on MSFT teams; link via canvas announcement)<br />
| colspan="2" | Q&A session about Tutorial 2 videos. One should have watched tutorial 2 videos before attending this live session. Tutorial 2 videos can be found in Panopto in the Tutorial 2 folder of this course.<br />
[[Media:Mrctut2_handout.pdf | Localization slides]]<br />
|-<br />
| May 12 (live on MSFT teams; link TBD)<br />
| colspan="2" | '''Escape Room Competition'''<br />
|-<br />
| May 19 (Live on MSFT teams; link TBD)<br />
| colspan="2" | [[Safe and affordable collaborative mobile robotics]] by '''César López'''<br />
|-<br />
| May 26<br />
| colspan="2" | TBD<br />
|-<br />
| June 2<br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| June 9<br />
| colspan="2" | '''Final Competition''' <br />
|-<br />
| June 16<br />
| colspan="2" | No Lecture<br />
|-<br />
| <span style="color:red">June 23</span><br />
| colspan="2" | <span style="color:red">'''Deadline: Wiki Pages''' </span><br />
|-<br />
|}<br />
<br />
<!-- {| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 5em;"<br />
|-<br />
| April 21<br />
| width="325" | Introduction by ''René van de Molengraft'', [[Media:MRC2020-TechUnitedEindhoven.pdf | ''Tech United'']] , ''VanderLande'' and ''Lely''<br />
| width="325" | [[Media:MRC_tooling_infrastructure_2020.pdf | Tooling, Infrastructure and Assignment by ''Bob Hendrikx'' ]]<br />
|-<br />
| April 28<br />
| colspan="2" | Tutorial Lecture #1 - [[Media:MRC2020-TutorialLecture1_1_1_2.pdf | ''Part 1-2'']] - [[Media:MRC2020-TutorialLecture1_3.pdf | ''Part 3'']]<br />
|-<br />
| May 7<br />
| colspan="2" | Tutorial Lecture #2 - [[Media:EMC2020_localization-handout.pdf | ''Part 1'']] - [[Media:MRC2020-TutorialLecture2_Object_Detection.pdf | ''Part 2'']] - [[Media:2020-05-06_Mobile_Robot_Control_-_Motion_Planning.pdf | ''Part 3'']]<br />
|-<br />
| May 14<br />
| colspan="2" | '''Escape Room Competition'''<br />
|-<br />
| May 21<br />
| colspan="2" | No Lecture<br />
|-<br />
| May 28<br />
| colspan="2" | No Lecture<br />
|-<br />
| June 5<br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| June 12<br />
| colspan="2" | '''Final Competition''' <br />
|-<br />
| June 17<br />
| colspan="2" | No Lecture<br />
|-<br />
| <span style="color:red">June 24</span><br />
| colspan="2" | <span style="color:red">'''Deadline: Wiki Pages''' </span><br />
|-<br />
|} --><br />
<br />
<!-- ==Presentation Schedule==<br />
<br />
As you have seen in the course schedule, the presentations of the final software design will take place on June 3rd. As we did last years, each presentation will take no more than 6 minutes, followed by a 4 minute discussion. Given this years circumstances, we have decided to do these presentations for each group separately. However, your entire group is required to be available for the discussion session. Therefore, we plan these presentations during the regular lecture hours of the course.<br />
For the presentations of your final software design, please take the following into account:<br />
* Pick a time slot in the table below. First come, first served.<br />
* Send an invitation to all your group members, as well as René van de Molengraft, Jordy Senden, Bob Hendrikx and Wouter Houtman. These mail addresses can be found at the bottom of this page. Make sure, your invitation is accompanied with a meeting room of Microsoft Teams.<br />
* As long as your presentation can be shared via the Teams meeting, you are free to chose the medium you like.<br />
* In order to not waste time, make sure all team members are present, and both microphones and cameras are tested BEFORE the start of the presentation. Make sure your microphone is muted when you are not speaking.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 3-6-2020 || 15:30 - 15:40 ||group 3<br />
|-<br />
| || 15:45 - 15:55 ||group 1<br />
|-<br />
| || 16:00 - 16:10 ||group 7<br />
|-<br />
| || 16:15 - 16:25 ||group 6<br />
|-<br />
| || 16:30 - 16:40 ||group 2<br />
|-<br />
| || 16:45 - 16:55 ||group 8<br />
|-<br />
| || 17:00 - 17:10 ||group 4<br />
|-<br />
| || 17:15 - 17:25 ||group 10<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
--><br />
<br />
= Getting Started =<br />
<br />
To get started, please do the tutorials on the [[MRC/Tutorials| Tutorial Page]]. <br />
<br />
= Design Document = <br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with e.g.: <br />
* Requirements<br />
* Functions<br />
* Components<br />
* Specifications<br />
* Interfaces<br />
* Etc...<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 4th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2019}}<br />
<br />
<!--Please note:<br />
<br />
* '''Do all tutorials, and all steps. Missing one step may cause a different behavior or incorrect working system later'''. If something is not working as expected, make sure you correctly did all previous steps.<br />
* Of course, things may still go wrong. If so, do not hesitate to contact us.<br />
<br />
* See [[Embedded_Motion_Control/Using_Pico | Using Pico]] for a quick overview of how to use Pico.<br />
<br />
= FAQ =<br />
[[Embedded_Motion_Control_2018/FAQ | Here]] you can find a collection of Frequently Asked Questions. Please check this page before contacting the student assistants or the tutors! If you find any issues or questions you had to deal with, please add them as well so your colleagues don't run into the same problems.<br />
<br />
<br />
= Design Document = <br />
<br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with: <br />
* Requirements,<br />
* Functions,<br />
* Components,<br />
* Specifications<br />
* Interfaces.<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 4th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2019}}<br />
<br />
<br />
= Map For The Final Challenge =<br />
* The simulation environment for the Hospital Challenge, with static and dynamics objects, [[Media:MRC2020_Hospital.zip | can be found here]].<br />
* The JSON file for the map for the final challenge can be found here:[[Media:Mrc2020_finalmap_corrected.zip | FINALMAP.zip]] (version where gridmap cabinets are corrected)<br />
* You are free to annotate / change this map to suit your software design <br />
* The start area is shown in the image below<br />
* A simulator gridmap of the environment is also provided<br />
* Clutter will be added (both static and moving) on the day of the challenge, adhering to the rules specified under "Hospital Competition"<br />
* Run `mrc-update` to get a sliding visualization and a safety stopping radius making the moving objects stop<br />
<br />
<br />
<gallery widths="500px" heights="500px" style="text-align:left"><br />
File:Finalmap_json_2020.png| Final map as provided<br />
File:Finalmap2020.png| Start area (1m x 1m)<br />
</gallery><br />
--><br />
<br />
=Group Wiki Pages=<br />
<br />
Group 1 - [[Mobile Robot Control 2021 Group 1 | visit wiki ]] - '''Tutor''': Manuel Muñoz Sánchez<br />
<br />
Group 2 - [[Mobile Robot Control 2021 Group 2 | visit wiki ]] - '''Tutor''': Peter van Dooren<br />
<br />
Group 3 - [[Mobile Robot Control 2021 Group 3 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<br />
Group 4 - [[Mobile Robot Control 2021 Group 4 | visit wiki ]] - '''Tutor''': Hao Liang Chen<br />
<br />
Group 5 - [[Mobile Robot Control 2021 Group 5 | visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
Group 6 - [[Mobile Robot Control 2021 Group 6 | visit wiki ]] - '''Tutor''': Manuel Muñoz Sánchez <br />
<br />
Group 7 - [[Mobile Robot Control 2021 Group 7 | visit wiki ]] - '''Tutor''': Peter van Dooren<br />
<br />
Group 8 - [[Mobile Robot Control 2021 Group 8 | visit wiki ]] - '''Tutor''': César López<br />
<br />
<!---<br />
=Pico test schedule=<br />
- Testing takes place on the RoboCup field in Gemini-North.<br />
<br />
- Be sure you have your software on git before coming to the test session so that you only have to git clone/git pull to get your code on the robot!<br />
<br />
- Please charge the robot whenever possible so there is no down time due to empty batteries.<br />
<br />
To submit for a timeslot you have to be logged in. Through the 'edit'-button for Pico test schedule, you can select a timeslot by typing 'Group <groupnumber>' behind the desired timeslot.<br />
- Submissions are last checked the day before at 22:00.<br />
<br />
==Week 19==<br />
'''For week 19 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
'''Remark:''' Group 7 was allowed an extra time slot on Friday as they were not able to use their time slot on Thursday due to technical issues with pico.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 || 8<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || 7<br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 8-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 8-5-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 8-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 8-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 8-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 8-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 9-5-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 9-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 9-5-2019 || 11:45 - 12:40 || 9<br />
|-<br />
| 9-5-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 9-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 9-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 9-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 12:00 - 12:55 || 7<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 20==<br />
'''For week 20 each group can choose 1 time slot on Monday/Tuesday and 1 time slot on Thursday/Friday'''. Choose wisely.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 13-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 13-5-2019 || 11:45 - 12:40 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 14-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 14-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 14-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 14-5-2019 || 14:30 - 15:25 || 2<br />
|-<br />
| 14-5-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 14-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 16-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 16-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 16-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 16-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 16-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 16-5-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 16-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 16-5-2019 || 16:30 - 17:25 || 4<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 17-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 17-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 21==<br />
'''For week 21 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 21-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 21-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 21-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 21-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 22-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 22-5-2019 || 10:45 - 11:40 || 5<br />
|-<br />
| 22-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 22-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 22-5-2019 || 14:30 - 15:25 || 8<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 23-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 23-5-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 23-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 23-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 23-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 23-5-2019 || 14:30 - 15:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 24-5-2019 || 08:45 - 09:40 || <br />
|-<br />
| 24-5-2019 || 09:45 - 10:40 || 1<br />
|-<br />
| 24-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 24-5-2019 || 11:45 - 12:40 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 22 + 23==<br />
Since week 22 is shorter due to ascension day, it will not be possible for every group to test twice that week. Therefore extra slots are provided in week 23. '''Each team may choose 4 timeslots over these two weeks. Teams are allowed maximum 2 timeslots in week 22. To prevent planning issues, teams are advised to test at least for 1 timeslot in week 22.'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 27-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 27-5-2019 || 14:30 - 15:25 || 5<br />
|-<br />
| 27-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 27-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 28-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 28-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 28-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 28-5-2019 || 16:30 - 17:25 || 7<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 29-5-2019 || 08:45 - 09:40 ||<br />
|-<br />
| 29-5-2019 || 09:45 - 10:40 || 4<br />
|-<br />
| 29-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 29-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 29-5-2019 || 13:30 - 14:25 || 9<br />
|-<br />
| 29-5-2019 || 14:30 - 15:25 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 3-6-2019 || 13:30 - 14:25 || 4<br />
|-<br />
| 3-6-2019 || 14:30 - 15:25 || 1<br />
|-<br />
| 3-6-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 3-6-2019 || 16:30 - 17:25 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 4-6-2019 || 13:30 - 14:25 || 7<br />
|- <br />
| 4-6-2019 || 14:30 - 15:25 || <br />
|-<br />
| 4-6-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 4-6-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 5-6-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 5-6-2019 || 09:45 - 10:40 || <br />
|-<br />
| 5-6-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 5-6-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 5-6-2019 || 13:30 - 14:25 || 8 <br />
|-<br />
| 5-6-2019 || 14:30 - 15:25 || 3<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 6-6-2019 || 08:45 - 09:40 ||<br />
|-<br />
| 6-6-2019 || 09:45 - 10:40 ||<br />
|-<br />
| 6-6-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 6-6-2019 || 11:45 - 12:40 || 2<br />
|-<br />
| 6-6-2019 || 13:30 - 14:25 || 3<br />
|-<br />
| 6-6-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 6-6-2019 || 15:30 - 16:25 || 8<br />
|-<br />
| 6-6-2019 || 16:30 - 17:25 || 9<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-6-2019 || 08:45 - 09:40 || 2<br />
|-<br />
| 7-6-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 7-6-2019 || 10:45 - 11:40 || 1<br />
|-<br />
| 7-6-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 24==<br />
This is it! The week of the final challenge. '''Each team may choose 1 timeslot on Tuesday'''. Choose wisely and prepare this test well, as it is your last chance to test your code before the moment of truth.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 24 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 11-6-2019 || 08:45 - 09:40 || 4<br />
|-<br />
| 11-6-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 11-6-2019 || 10:45 - 11:40 || 8<br />
|-<br />
| 11-6-2019 || 11:45 - 12:40 || 5<br />
|-<br />
| 11-6-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 11-6-2019 || 14:30 - 15:25 || 7<br />
|-<br />
| 11-6-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 11-6-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
--><br />
<br />
=Contact Details=<br />
{{:Embedded_Motion_Control_2018/Contact_Details}}</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Mobile_Robot_Control_2021&diff=113949Mobile Robot Control 20212021-04-12T07:02:06Z<p>S131974: /* Group Wiki Pages */</p>
<hr />
<div><div align="center"><br />
<font size="4">'PICO in the Hospital'</font><br />
</div><br />
[[File:Gostai-Jazz-500x500.jpg|center|thumb|350px]]<br />
<br />
----<br />
<br />
= Introduction =<br />
This course is about software design and how to apply this in the context of autonomous robots. The accompanying assignment is about applying this knowledge to a real-life robotics task.<br />
<br />
= Course Schedule and Lecture Slides =<br />
<br />
<br />
'''[This schedule may be changed during the following weeks!]'''<br />
Online sessions such as live lectures will typically take place on the wednesdays between 15:30-17:15. Except for the week of may the 5th as it is liberation day; the Q&A session of lecture 2 will thus take place on the 7th of may between 10:45-12:30. The course schedule is as follows:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 5em;"<br />
|-<br />
| April 21<br />
| width="325" | Introduction by ''René van de Molengraft'', [[Tech United]] , ''VanderLande'' and ''Lely''<br />
| width="325" | [[Tooling, Infrastructure and Assignment]] by ''Bob Hendrikx'' <br />
|-<br />
| April 28<br />
| colspan="2" | Q&A session about Tutorial lectures 1. Tutorial lectures 1 can be found online when the course starts.<br />
|-<br />
| May 7<br />
| colspan="2" | Q&A session about Tutorial lectures 2. Tutorial lectures 2 can be found online when the course starts.<br />
|-<br />
| May 12<br />
| colspan="2" | '''Escape Room Competition'''<br />
|-<br />
| May 19<br />
| colspan="2" | No Lecture<br />
|-<br />
| May 26<br />
| colspan="2" | [[Coordination: mechanisms and architectural patterns]] by ''Herman Bruyninckx''<br />
|-<br />
| June 2<br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| June 9<br />
| colspan="2" | '''Final Competition''' <br />
|-<br />
| June 16<br />
| colspan="2" | No Lecture<br />
|-<br />
| <span style="color:red">June 23</span><br />
| colspan="2" | <span style="color:red">'''Deadline: Wiki Pages''' </span><br />
|-<br />
|}<br />
<br />
<!-- {| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 5em;"<br />
|-<br />
| April 21<br />
| width="325" | Introduction by ''René van de Molengraft'', [[Media:MRC2020-TechUnitedEindhoven.pdf | ''Tech United'']] , ''VanderLande'' and ''Lely''<br />
| width="325" | [[Media:MRC_tooling_infrastructure_2020.pdf | Tooling, Infrastructure and Assignment by ''Bob Hendrikx'' ]]<br />
|-<br />
| April 28<br />
| colspan="2" | Tutorial Lecture #1 - [[Media:MRC2020-TutorialLecture1_1_1_2.pdf | ''Part 1-2'']] - [[Media:MRC2020-TutorialLecture1_3.pdf | ''Part 3'']]<br />
|-<br />
| May 7<br />
| colspan="2" | Tutorial Lecture #2 - [[Media:EMC2020_localization-handout.pdf | ''Part 1'']] - [[Media:MRC2020-TutorialLecture2_Object_Detection.pdf | ''Part 2'']] - [[Media:2020-05-06_Mobile_Robot_Control_-_Motion_Planning.pdf | ''Part 3'']]<br />
|-<br />
| May 14<br />
| colspan="2" | '''Escape Room Competition'''<br />
|-<br />
| May 21<br />
| colspan="2" | No Lecture<br />
|-<br />
| May 28<br />
| colspan="2" | [[Media:MRC2020-LectureHermanBruyninckx.pdf | Coordination: mechanisms and architectural patterns]] by ''Herman Bruyninckx''<br />
|-<br />
| June 5<br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| June 12<br />
| colspan="2" | '''Final Competition''' <br />
|-<br />
| June 17<br />
| colspan="2" | No Lecture<br />
|-<br />
| <span style="color:red">June 24</span><br />
| colspan="2" | <span style="color:red">'''Deadline: Wiki Pages''' </span><br />
|-<br />
|} --><br />
<br />
<!-- ==Presentation Schedule==<br />
<br />
As you have seen in the course schedule, the presentations of the final software design will take place on June 3rd. As we did last years, each presentation will take no more than 6 minutes, followed by a 4 minute discussion. Given this years circumstances, we have decided to do these presentations for each group separately. However, your entire group is required to be available for the discussion session. Therefore, we plan these presentations during the regular lecture hours of the course.<br />
For the presentations of your final software design, please take the following into account:<br />
* Pick a time slot in the table below. First come, first served.<br />
* Send an invitation to all your group members, as well as René van de Molengraft, Jordy Senden, Bob Hendrikx and Wouter Houtman. These mail addresses can be found at the bottom of this page. Make sure, your invitation is accompanied with a meeting room of Microsoft Teams.<br />
* As long as your presentation can be shared via the Teams meeting, you are free to chose the medium you like.<br />
* In order to not waste time, make sure all team members are present, and both microphones and cameras are tested BEFORE the start of the presentation. Make sure your microphone is muted when you are not speaking.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 3-6-2020 || 15:30 - 15:40 ||group 3<br />
|-<br />
| || 15:45 - 15:55 ||group 1<br />
|-<br />
| || 16:00 - 16:10 ||group 7<br />
|-<br />
| || 16:15 - 16:25 ||group 6<br />
|-<br />
| || 16:30 - 16:40 ||group 2<br />
|-<br />
| || 16:45 - 16:55 ||group 8<br />
|-<br />
| || 17:00 - 17:10 ||group 4<br />
|-<br />
| || 17:15 - 17:25 ||group 10<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
--><br />
<br />
= Getting Started =<br />
<br />
To get started, please do the tutorials on the [[MRC/Tutorials| Tutorial Page]]. <!--Please note:<br />
<br />
* '''Do all tutorials, and all steps. Missing one step may cause a different behavior or incorrect working system later'''. If something is not working as expected, make sure you correctly did all previous steps.<br />
* Of course, things may still go wrong. If so, do not hesitate to contact us.<br />
<br />
* See [[Embedded_Motion_Control/Using_Pico | Using Pico]] for a quick overview of how to use Pico.<br />
<br />
= FAQ =<br />
[[Embedded_Motion_Control_2018/FAQ | Here]] you can find a collection of Frequently Asked Questions. Please check this page before contacting the student assistants or the tutors! If you find any issues or questions you had to deal with, please add them as well so your colleagues don't run into the same problems.<br />
<br />
<br />
= Design Document = <br />
<br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with: <br />
* Requirements,<br />
* Functions,<br />
* Components,<br />
* Specifications<br />
* Interfaces.<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 4th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2019}}<br />
<br />
<br />
= Map For The Final Challenge =<br />
* The simulation environment for the Hospital Challenge, with static and dynamics objects, [[Media:MRC2020_Hospital.zip | can be found here]].<br />
* The JSON file for the map for the final challenge can be found here:[[Media:Mrc2020_finalmap_corrected.zip | FINALMAP.zip]] (version where gridmap cabinets are corrected)<br />
* You are free to annotate / change this map to suit your software design <br />
* The start area is shown in the image below<br />
* A simulator gridmap of the environment is also provided<br />
* Clutter will be added (both static and moving) on the day of the challenge, adhering to the rules specified under "Hospital Competition"<br />
* Run `mrc-update` to get a sliding visualization and a safety stopping radius making the moving objects stop<br />
<br />
<br />
<gallery widths="500px" heights="500px" style="text-align:left"><br />
File:Finalmap_json_2020.png| Final map as provided<br />
File:Finalmap2020.png| Start area (1m x 1m)<br />
</gallery><br />
--><br />
=Group Wiki Pages=<br />
<br />
Group 1 - [[Mobile Robot Control 2021 Group 1 | visit wiki ]] - '''Tutor''': Manuel Muñoz Sánchez<br />
<br />
Group 2 - [[Mobile Robot Control 2021 Group 2 | visit wiki ]] - '''Tutor''': Peter van Dooren<br />
<br />
Group 3 - [[Mobile Robot Control 2021 Group 3 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<br />
Group 4 - [[Mobile Robot Control 2021 Group 4 | visit wiki ]] - '''Tutor''': Hao Liang Chen<br />
<br />
Group 5 - [[Mobile Robot Control 2021 Group 5 | visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
Group 6 - [[Mobile Robot Control 2021 Group 6 | visit wiki ]] - '''Tutor''': Manuel Muñoz Sánchez <br />
<br />
Group 7 - [[Mobile Robot Control 2021 Group 7 | visit wiki ]] - '''Tutor''': Peter van Dooren<br />
<br />
Group 8 - [[Mobile Robot Control 2021 Group 8 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<!---<br />
=Pico test schedule=<br />
- Testing takes place on the RoboCup field in Gemini-North.<br />
<br />
- Be sure you have your software on git before coming to the test session so that you only have to git clone/git pull to get your code on the robot!<br />
<br />
- Please charge the robot whenever possible so there is no down time due to empty batteries.<br />
<br />
To submit for a timeslot you have to be logged in. Through the 'edit'-button for Pico test schedule, you can select a timeslot by typing 'Group <groupnumber>' behind the desired timeslot.<br />
- Submissions are last checked the day before at 22:00.<br />
<br />
==Week 19==<br />
'''For week 19 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
'''Remark:''' Group 7 was allowed an extra time slot on Friday as they were not able to use their time slot on Thursday due to technical issues with pico.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 || 8<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || 7<br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 8-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 8-5-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 8-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 8-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 8-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 8-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 9-5-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 9-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 9-5-2019 || 11:45 - 12:40 || 9<br />
|-<br />
| 9-5-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 9-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 9-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 9-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 12:00 - 12:55 || 7<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 20==<br />
'''For week 20 each group can choose 1 time slot on Monday/Tuesday and 1 time slot on Thursday/Friday'''. Choose wisely.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 13-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 13-5-2019 || 11:45 - 12:40 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 14-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 14-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 14-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 14-5-2019 || 14:30 - 15:25 || 2<br />
|-<br />
| 14-5-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 14-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 16-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 16-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 16-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 16-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 16-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 16-5-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 16-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 16-5-2019 || 16:30 - 17:25 || 4<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 17-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 17-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 21==<br />
'''For week 21 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 21-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 21-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 21-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 21-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 22-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 22-5-2019 || 10:45 - 11:40 || 5<br />
|-<br />
| 22-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 22-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 22-5-2019 || 14:30 - 15:25 || 8<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 23-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 23-5-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 23-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 23-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 23-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 23-5-2019 || 14:30 - 15:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 24-5-2019 || 08:45 - 09:40 || <br />
|-<br />
| 24-5-2019 || 09:45 - 10:40 || 1<br />
|-<br />
| 24-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 24-5-2019 || 11:45 - 12:40 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 22 + 23==<br />
Since week 22 is shorter due to ascension day, it will not be possible for every group to test twice that week. Therefore extra slots are provided in week 23. '''Each team may choose 4 timeslots over these two weeks. Teams are allowed maximum 2 timeslots in week 22. To prevent planning issues, teams are advised to test at least for 1 timeslot in week 22.'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 27-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 27-5-2019 || 14:30 - 15:25 || 5<br />
|-<br />
| 27-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 27-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 28-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 28-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 28-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 28-5-2019 || 16:30 - 17:25 || 7<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 29-5-2019 || 08:45 - 09:40 ||<br />
|-<br />
| 29-5-2019 || 09:45 - 10:40 || 4<br />
|-<br />
| 29-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 29-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 29-5-2019 || 13:30 - 14:25 || 9<br />
|-<br />
| 29-5-2019 || 14:30 - 15:25 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 3-6-2019 || 13:30 - 14:25 || 4<br />
|-<br />
| 3-6-2019 || 14:30 - 15:25 || 1<br />
|-<br />
| 3-6-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 3-6-2019 || 16:30 - 17:25 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 4-6-2019 || 13:30 - 14:25 || 7<br />
|- <br />
| 4-6-2019 || 14:30 - 15:25 || <br />
|-<br />
| 4-6-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 4-6-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 5-6-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 5-6-2019 || 09:45 - 10:40 || <br />
|-<br />
| 5-6-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 5-6-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 5-6-2019 || 13:30 - 14:25 || 8 <br />
|-<br />
| 5-6-2019 || 14:30 - 15:25 || 3<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 6-6-2019 || 08:45 - 09:40 ||<br />
|-<br />
| 6-6-2019 || 09:45 - 10:40 ||<br />
|-<br />
| 6-6-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 6-6-2019 || 11:45 - 12:40 || 2<br />
|-<br />
| 6-6-2019 || 13:30 - 14:25 || 3<br />
|-<br />
| 6-6-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 6-6-2019 || 15:30 - 16:25 || 8<br />
|-<br />
| 6-6-2019 || 16:30 - 17:25 || 9<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-6-2019 || 08:45 - 09:40 || 2<br />
|-<br />
| 7-6-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 7-6-2019 || 10:45 - 11:40 || 1<br />
|-<br />
| 7-6-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 24==<br />
This is it! The week of the final challenge. '''Each team may choose 1 timeslot on Tuesday'''. Choose wisely and prepare this test well, as it is your last chance to test your code before the moment of truth.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 24 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 11-6-2019 || 08:45 - 09:40 || 4<br />
|-<br />
| 11-6-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 11-6-2019 || 10:45 - 11:40 || 8<br />
|-<br />
| 11-6-2019 || 11:45 - 12:40 || 5<br />
|-<br />
| 11-6-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 11-6-2019 || 14:30 - 15:25 || 7<br />
|-<br />
| 11-6-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 11-6-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
--><br />
<br />
=Contact Details=<br />
{{:Embedded_Motion_Control_2018/Contact_Details}}</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Mobile_Robot_Control_2021&diff=113948Mobile Robot Control 20212021-04-12T07:01:55Z<p>S131974: /* Group Wiki Pages */</p>
<hr />
<div><div align="center"><br />
<font size="4">'PICO in the Hospital'</font><br />
</div><br />
[[File:Gostai-Jazz-500x500.jpg|center|thumb|350px]]<br />
<br />
----<br />
<br />
= Introduction =<br />
This course is about software design and how to apply this in the context of autonomous robots. The accompanying assignment is about applying this knowledge to a real-life robotics task.<br />
<br />
= Course Schedule and Lecture Slides =<br />
<br />
<br />
'''[This schedule may be changed during the following weeks!]'''<br />
Online sessions such as live lectures will typically take place on the wednesdays between 15:30-17:15. Except for the week of may the 5th as it is liberation day; the Q&A session of lecture 2 will thus take place on the 7th of may between 10:45-12:30. The course schedule is as follows:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 5em;"<br />
|-<br />
| April 21<br />
| width="325" | Introduction by ''René van de Molengraft'', [[Tech United]] , ''VanderLande'' and ''Lely''<br />
| width="325" | [[Tooling, Infrastructure and Assignment]] by ''Bob Hendrikx'' <br />
|-<br />
| April 28<br />
| colspan="2" | Q&A session about Tutorial lectures 1. Tutorial lectures 1 can be found online when the course starts.<br />
|-<br />
| May 7<br />
| colspan="2" | Q&A session about Tutorial lectures 2. Tutorial lectures 2 can be found online when the course starts.<br />
|-<br />
| May 12<br />
| colspan="2" | '''Escape Room Competition'''<br />
|-<br />
| May 19<br />
| colspan="2" | No Lecture<br />
|-<br />
| May 26<br />
| colspan="2" | [[Coordination: mechanisms and architectural patterns]] by ''Herman Bruyninckx''<br />
|-<br />
| June 2<br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| June 9<br />
| colspan="2" | '''Final Competition''' <br />
|-<br />
| June 16<br />
| colspan="2" | No Lecture<br />
|-<br />
| <span style="color:red">June 23</span><br />
| colspan="2" | <span style="color:red">'''Deadline: Wiki Pages''' </span><br />
|-<br />
|}<br />
<br />
<!-- {| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 5em;"<br />
|-<br />
| April 21<br />
| width="325" | Introduction by ''René van de Molengraft'', [[Media:MRC2020-TechUnitedEindhoven.pdf | ''Tech United'']] , ''VanderLande'' and ''Lely''<br />
| width="325" | [[Media:MRC_tooling_infrastructure_2020.pdf | Tooling, Infrastructure and Assignment by ''Bob Hendrikx'' ]]<br />
|-<br />
| April 28<br />
| colspan="2" | Tutorial Lecture #1 - [[Media:MRC2020-TutorialLecture1_1_1_2.pdf | ''Part 1-2'']] - [[Media:MRC2020-TutorialLecture1_3.pdf | ''Part 3'']]<br />
|-<br />
| May 7<br />
| colspan="2" | Tutorial Lecture #2 - [[Media:EMC2020_localization-handout.pdf | ''Part 1'']] - [[Media:MRC2020-TutorialLecture2_Object_Detection.pdf | ''Part 2'']] - [[Media:2020-05-06_Mobile_Robot_Control_-_Motion_Planning.pdf | ''Part 3'']]<br />
|-<br />
| May 14<br />
| colspan="2" | '''Escape Room Competition'''<br />
|-<br />
| May 21<br />
| colspan="2" | No Lecture<br />
|-<br />
| May 28<br />
| colspan="2" | [[Media:MRC2020-LectureHermanBruyninckx.pdf | Coordination: mechanisms and architectural patterns]] by ''Herman Bruyninckx''<br />
|-<br />
| June 5<br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| June 12<br />
| colspan="2" | '''Final Competition''' <br />
|-<br />
| June 17<br />
| colspan="2" | No Lecture<br />
|-<br />
| <span style="color:red">June 24</span><br />
| colspan="2" | <span style="color:red">'''Deadline: Wiki Pages''' </span><br />
|-<br />
|} --><br />
<br />
<!-- ==Presentation Schedule==<br />
<br />
As you have seen in the course schedule, the presentations of the final software design will take place on June 3rd. As we did last years, each presentation will take no more than 6 minutes, followed by a 4 minute discussion. Given this years circumstances, we have decided to do these presentations for each group separately. However, your entire group is required to be available for the discussion session. Therefore, we plan these presentations during the regular lecture hours of the course.<br />
For the presentations of your final software design, please take the following into account:<br />
* Pick a time slot in the table below. First come, first served.<br />
* Send an invitation to all your group members, as well as René van de Molengraft, Jordy Senden, Bob Hendrikx and Wouter Houtman. These mail addresses can be found at the bottom of this page. Make sure, your invitation is accompanied with a meeting room of Microsoft Teams.<br />
* As long as your presentation can be shared via the Teams meeting, you are free to chose the medium you like.<br />
* In order to not waste time, make sure all team members are present, and both microphones and cameras are tested BEFORE the start of the presentation. Make sure your microphone is muted when you are not speaking.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 3-6-2020 || 15:30 - 15:40 ||group 3<br />
|-<br />
| || 15:45 - 15:55 ||group 1<br />
|-<br />
| || 16:00 - 16:10 ||group 7<br />
|-<br />
| || 16:15 - 16:25 ||group 6<br />
|-<br />
| || 16:30 - 16:40 ||group 2<br />
|-<br />
| || 16:45 - 16:55 ||group 8<br />
|-<br />
| || 17:00 - 17:10 ||group 4<br />
|-<br />
| || 17:15 - 17:25 ||group 10<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
--><br />
<br />
= Getting Started =<br />
<br />
To get started, please do the tutorials on the [[MRC/Tutorials| Tutorial Page]]. <!--Please note:<br />
<br />
* '''Do all tutorials, and all steps. Missing one step may cause a different behavior or incorrect working system later'''. If something is not working as expected, make sure you correctly did all previous steps.<br />
* Of course, things may still go wrong. If so, do not hesitate to contact us.<br />
<br />
* See [[Embedded_Motion_Control/Using_Pico | Using Pico]] for a quick overview of how to use Pico.<br />
<br />
= FAQ =<br />
[[Embedded_Motion_Control_2018/FAQ | Here]] you can find a collection of Frequently Asked Questions. Please check this page before contacting the student assistants or the tutors! If you find any issues or questions you had to deal with, please add them as well so your colleagues don't run into the same problems.<br />
<br />
<br />
= Design Document = <br />
<br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with: <br />
* Requirements,<br />
* Functions,<br />
* Components,<br />
* Specifications<br />
* Interfaces.<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 4th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2019}}<br />
<br />
<br />
= Map For The Final Challenge =<br />
* The simulation environment for the Hospital Challenge, with static and dynamics objects, [[Media:MRC2020_Hospital.zip | can be found here]].<br />
* The JSON file for the map for the final challenge can be found here:[[Media:Mrc2020_finalmap_corrected.zip | FINALMAP.zip]] (version where gridmap cabinets are corrected)<br />
* You are free to annotate / change this map to suit your software design <br />
* The start area is shown in the image below<br />
* A simulator gridmap of the environment is also provided<br />
* Clutter will be added (both static and moving) on the day of the challenge, adhering to the rules specified under "Hospital Competition"<br />
* Run `mrc-update` to get a sliding visualization and a safety stopping radius making the moving objects stop<br />
<br />
<br />
<gallery widths="500px" heights="500px" style="text-align:left"><br />
File:Finalmap_json_2020.png| Final map as provided<br />
File:Finalmap2020.png| Start area (1m x 1m)<br />
</gallery><br />
--><br />
=Group Wiki Pages=<br />
<br />
Group 1 - [[Mobile Robot Control 2021 Group 1 | visit wiki ]] - '''Tutor''': Manuel Muñoz Sánchez<br />
<br />
Group 2 - [[Mobile Robot Control 2021 Group 2 | visit wiki ]] - '''Tutor''': Peter van Dooren<br />
<br />
Group 3 - [[Mobile Robot Control 2021 Group 3 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<br />
Group 4 - [[Mobile Robot Control 2021 Group 4 | visit wiki ]] - '''Tutor''': Hao Liang Chen<br />
<br />
Group 5 - [[Mobile Robot Control 2021 Group 5 | visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
Group 6 - [[Mobile Robot Control 2021 Group 6 | visit wiki ]] - '''Tutor''': Manuel Muñoz Sánchez <br />
<br />
Group 7 - [[Mobile Robot Control 2021 Group 7 | visit wiki ]] - '''Tutor''': Peter Dooren<br />
<br />
Group 8 - [[Mobile Robot Control 2021 Group 8 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<!---<br />
=Pico test schedule=<br />
- Testing takes place on the RoboCup field in Gemini-North.<br />
<br />
- Be sure you have your software on git before coming to the test session so that you only have to git clone/git pull to get your code on the robot!<br />
<br />
- Please charge the robot whenever possible so there is no down time due to empty batteries.<br />
<br />
To submit for a timeslot you have to be logged in. Through the 'edit'-button for Pico test schedule, you can select a timeslot by typing 'Group <groupnumber>' behind the desired timeslot.<br />
- Submissions are last checked the day before at 22:00.<br />
<br />
==Week 19==<br />
'''For week 19 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
'''Remark:''' Group 7 was allowed an extra time slot on Friday as they were not able to use their time slot on Thursday due to technical issues with pico.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 || 8<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || 7<br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 8-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 8-5-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 8-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 8-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 8-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 8-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 9-5-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 9-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 9-5-2019 || 11:45 - 12:40 || 9<br />
|-<br />
| 9-5-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 9-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 9-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 9-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 12:00 - 12:55 || 7<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 20==<br />
'''For week 20 each group can choose 1 time slot on Monday/Tuesday and 1 time slot on Thursday/Friday'''. Choose wisely.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 13-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 13-5-2019 || 11:45 - 12:40 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 14-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 14-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 14-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 14-5-2019 || 14:30 - 15:25 || 2<br />
|-<br />
| 14-5-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 14-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 16-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 16-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 16-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 16-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 16-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 16-5-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 16-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 16-5-2019 || 16:30 - 17:25 || 4<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 17-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 17-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 21==<br />
'''For week 21 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 21-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 21-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 21-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 21-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 22-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 22-5-2019 || 10:45 - 11:40 || 5<br />
|-<br />
| 22-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 22-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 22-5-2019 || 14:30 - 15:25 || 8<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 23-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 23-5-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 23-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 23-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 23-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 23-5-2019 || 14:30 - 15:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 24-5-2019 || 08:45 - 09:40 || <br />
|-<br />
| 24-5-2019 || 09:45 - 10:40 || 1<br />
|-<br />
| 24-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 24-5-2019 || 11:45 - 12:40 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 22 + 23==<br />
Since week 22 is shorter due to ascension day, it will not be possible for every group to test twice that week. Therefore extra slots are provided in week 23. '''Each team may choose 4 timeslots over these two weeks. Teams are allowed maximum 2 timeslots in week 22. To prevent planning issues, teams are advised to test at least for 1 timeslot in week 22.'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 27-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 27-5-2019 || 14:30 - 15:25 || 5<br />
|-<br />
| 27-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 27-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 28-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 28-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 28-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 28-5-2019 || 16:30 - 17:25 || 7<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 29-5-2019 || 08:45 - 09:40 ||<br />
|-<br />
| 29-5-2019 || 09:45 - 10:40 || 4<br />
|-<br />
| 29-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 29-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 29-5-2019 || 13:30 - 14:25 || 9<br />
|-<br />
| 29-5-2019 || 14:30 - 15:25 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 3-6-2019 || 13:30 - 14:25 || 4<br />
|-<br />
| 3-6-2019 || 14:30 - 15:25 || 1<br />
|-<br />
| 3-6-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 3-6-2019 || 16:30 - 17:25 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 4-6-2019 || 13:30 - 14:25 || 7<br />
|- <br />
| 4-6-2019 || 14:30 - 15:25 || <br />
|-<br />
| 4-6-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 4-6-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 5-6-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 5-6-2019 || 09:45 - 10:40 || <br />
|-<br />
| 5-6-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 5-6-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 5-6-2019 || 13:30 - 14:25 || 8 <br />
|-<br />
| 5-6-2019 || 14:30 - 15:25 || 3<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 6-6-2019 || 08:45 - 09:40 ||<br />
|-<br />
| 6-6-2019 || 09:45 - 10:40 ||<br />
|-<br />
| 6-6-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 6-6-2019 || 11:45 - 12:40 || 2<br />
|-<br />
| 6-6-2019 || 13:30 - 14:25 || 3<br />
|-<br />
| 6-6-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 6-6-2019 || 15:30 - 16:25 || 8<br />
|-<br />
| 6-6-2019 || 16:30 - 17:25 || 9<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-6-2019 || 08:45 - 09:40 || 2<br />
|-<br />
| 7-6-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 7-6-2019 || 10:45 - 11:40 || 1<br />
|-<br />
| 7-6-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 24==<br />
This is it! The week of the final challenge. '''Each team may choose 1 timeslot on Tuesday'''. Choose wisely and prepare this test well, as it is your last chance to test your code before the moment of truth.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 24 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 11-6-2019 || 08:45 - 09:40 || 4<br />
|-<br />
| 11-6-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 11-6-2019 || 10:45 - 11:40 || 8<br />
|-<br />
| 11-6-2019 || 11:45 - 12:40 || 5<br />
|-<br />
| 11-6-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 11-6-2019 || 14:30 - 15:25 || 7<br />
|-<br />
| 11-6-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 11-6-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
--><br />
<br />
=Contact Details=<br />
{{:Embedded_Motion_Control_2018/Contact_Details}}</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=MRC/FullExample&diff=107517MRC/FullExample2021-02-25T12:42:27Z<p>S131974: /* Worldmodel */</p>
<hr />
<div>== Full Example ==<br />
Here you will find a full example, from a description of the robot behavior, to a Task-Skill-Motion framework to executable code. Note that this example is far from perfect, it is there just to show you the links between various concepts and some hints you could use to decompose your software.<br />
<br />
== Behavior ==<br />
We would like to create a behavior for Pico, in which:<br />
* Pico is driving forward, unless a wall is detected.<br />
* If a wall is detected, PICO drives backwards for several metres, <br />
* then turns approx. 90 degrees,<br />
* resumes driving forward.<br />
<br />
== Task-Skill-Motion ==<br />
[[File:TSM_FullExample.png|right|thumb|500px|Task-Skill-Motion Framework for Full Example]]<br />
First, we can describe this behavior in a Task-Skill-Motion Framework, which is shown in the figure, here on the right. This example has no GUI, it does have a user interface, through starting the executable. PICO will then start driving forward, which is selected in the Skill Context. Through monitoring the '''Detect Wall'''-skill the Task Monitor might change the skill to '''Turn''', this is controlled by the task control feedback. As this robot does not store any information about the Environment, the environment context is not present. The Skills control the robot through the Robot Operating System.<br />
<br />
== Software Executable ==<br />
The software is decomposed into four parts: ''main'', ''Detection'', ''DriveControl'' and ''WorldModel''. The part ''main'' is an implementation of the Task Content in the Task-Skill-Motion-framework. The '''Skills''' are separated into two parts: those used for detection ('''Detect Wall''') and those for driving ('''Drive Forward''', '''Drive Backward''', '''stop'''). <br />
<br />
To make the decoupling between ''Detection'', ''DriveControl'' and ''Worldmodel'' explicitly in the implementation, these are implemented in separate classes. <br />
<br />
=== Worldmodel ===<br />
The worldmodel contains all the information the robot has of its information, in this case only the minimum distance from the robot to the wall has to be saved. The Worldmodel-class is therefore a very simple one, its structure is defined in the header file ''worldmodel.h''<br />
<pre><br />
#include "config.h"<br />
<br />
#ifndef worldModel_H<br />
#define worldModel_H<br />
<br />
#include <emc/io.h><br />
#include <emc/data.h><br />
<br />
class WorldModel<br />
{<br />
private: <br />
double minDistance_;<br />
<br />
public:<br />
WorldModel(){<br />
minDistance_ = MAX_RANGE_LRF;<br />
}<br />
<br />
double* getMinimumDistance();<br />
void setMinimumDistance(emc::LaserData* laser); // Method to determine the minimum distance to a wall<br />
};<br />
<br />
#endif //worldModel_H <br />
<br />
</pre><br />
The methods '''getWorldmodel''' and '''setWorldmodel''' are described in the source file ''worldmodel.cpp''<br />
<pre><br />
#include "worldModel.h"<br />
<br />
double* WorldModel::getMinimumDistance()<br />
{<br />
return &minDistance_;<br />
}<br />
<br />
void WorldModel::setMinimumDistance(emc::LaserData* laser)<br />
{<br />
double aux = laser->ranges[0];<br />
for(int i = 1; i < laser->ranges.size(); ++i) {<br />
if(laser->ranges[i] < aux) {<br />
aux = laser->ranges[i]; <br />
}<br />
}<br />
minDistance_ = aux;<br />
}<br />
<br />
</pre><br />
<br />
=== Detection ===<br />
The header file of the Detection-class, ''detection.h'', is shown below. The Detection-class contains a pointer to the io-layer inOut, which contains the latest laser data, laser. The methods contained are getSensorData and wallDetected, which together describe the '''Detect Wall'''-skill. <br />
<pre><br />
#ifndef detection_H<br />
#define detection_H<br />
<br />
#include <emc/io.h><br />
#include <emc/data.h><br />
<br />
class Detection{<br />
private:<br />
emc::IO *inOut;<br />
<br />
public:<br />
Detection(emc::IO *io){<br />
inOut = io;<br />
laser = emc::LaserData();<br />
<br />
return;<br />
}<br />
<br />
emc::LaserData laser;<br />
bool getSensorData(); // Method to obtain the sensordata<br />
bool wallDetected(double minDistance);// Method to check if any wall is in the neighbourhood of the robot<br />
};<br />
<br />
#endif //detection_H<br />
<br />
</pre><br />
<br />
Beneath you will find the ''detection.cpp''-file. First, this file includes the structure of the class, described in the header file. In this file, the two methods '''getSensorData''' and '''wallDetected''' are described. <br />
<br />
<pre><br />
#include "detection.h"<br />
#include "config.h"<br />
<br />
bool Detection::getSensorData() {<br />
if(inOut->readLaserData(laser)) {<br />
return true;<br />
} else {<br />
return false;<br />
}<br />
}<br />
<br />
bool Detection::wallDetected(double minDistance) {<br />
if(minDistance < MIN_DIST_TO_WALL) {<br />
return true;<br />
} else {<br />
return false;<br />
}<br />
}<br />
</pre><br />
<br />
=== Drive Control ===<br />
Similar to the Detection-class, a DriveControl-class is created within the ''driveControl.h''-file , but now instead of laser data the odomotry data are obtained. Within this class, several '''drive'''-skills are mentioned.<br />
<br />
<pre><br />
#ifndef driveControl_H<br />
#define driveControl_H<br />
<br />
#include <emc/io.h><br />
#include <emc/odom.h><br />
<br />
class DriveControl<br />
{<br />
private:<br />
emc::IO *inOut;<br />
emc::OdometryData odom; // [x,y,a]<br />
<br />
public:<br />
DriveControl(emc::IO *io){<br />
inOut = io;<br />
odom = emc::OdometryData();<br />
<br />
return;<br />
}<br />
<br />
void driveForward(double Xspeed); // Method to go forward with the robot<br />
double driveBackward(double Xspeed); // Method to go backward with the robot<br />
double rotate(double Aspeed); // Method to rotate with the robot<br />
void stop(); // Method to stop moving with the robot<br />
};<br />
<br />
#endif //driveControl_H<br />
<br />
</pre><br />
<br />
Now, the ''driveControl.cpp''-file describes these methods:<br />
<pre><br />
#include "driveControl.h"<br />
#include "config.h"<br />
<br />
void DriveControl::driveForward(double Xspeed) {<br />
inOut->readOdometryData(odom);<br />
inOut->sendBaseReference(Xspeed, 0.0, 0.0);<br />
}<br />
<br />
double DriveControl::driveBackward(double Xspeed) {<br />
emc::OdometryData odomUpdate;<br />
inOut->readOdometryData(odomUpdate);<br />
<br />
inOut->sendBaseReference(-Xspeed, 0.0, 0.0);<br />
<br />
double distBackward = odomUpdate.x - odom.x;<br />
odom = odomUpdate;<br />
<br />
return distBackward;<br />
}<br />
<br />
double DriveControl::rotate(double Aspeed) {<br />
emc::OdometryData odomUpdate;<br />
inOut->readOdometryData(odomUpdate);<br />
<br />
inOut->sendBaseReference(0.0, 0.0, Aspeed);<br />
<br />
double rotationRelative = odomUpdate.a - odom.a;<br />
odom = odomUpdate;<br />
<br />
return rotationRelative;<br />
}<br />
<br />
void DriveControl::stop() {<br />
driveForward(0.0);<br />
}<br />
</pre><br />
<br />
=== Configuration files ===<br />
To obtain a good overview of all the definitions, a configuration-file, ''config.h'', is created. Copy the following details in it:<br />
<pre><br />
#define EXECUTION_RATE 20 // [Hz]<br />
#define FORWARD_SPEED 0.5 // [m/s]<br />
#define ROTATE_SPEED -1.0 // [rad/s]<br />
#define DIST_BACKWARDS 0.1 // [m]<br />
<br />
#define MIN_DIST_TO_WALL 0.4 // [m]<br />
#define MAX_RANGE_LRF 30.0 //[m]<br />
</pre><br />
<br />
= Main Execution =<br />
<br />
Finally, the ''main.cpp''-file is configured as follows:<br />
<br />
<pre><br />
#include <emc/io.h><br />
#include <emc/rate.h><br />
#include <emc/odom.h><br />
#include <cmath><br />
<br />
#include "driveControl.h"<br />
#include "detection.h"<br />
#include "worldModel.h"<br />
<br />
#include "config.h"<br />
<br />
typedef enum {<br />
drive_forward = 1,<br />
drive_backward,<br />
rotate,<br />
} state_t;<br />
<br />
int main(int argc, char *argv[])<br />
{<br />
// Initialization of Robot<br />
emc::Rate r(EXECUTION_RATE);<br />
emc::IO io;<br />
emc::OdometryData odom;<br />
<br />
// Initialize the Classes<br />
DriveControl pico_drive(&io);<br />
Detection detection(&io);<br />
WorldModel worldModel;<br />
<br />
// Initialize the State of the State Machine<br />
state_t state = drive_forward;<br />
double rotatedAngle = 0.0;<br />
double distanceBackwards = 0.0;<br />
<br />
/* Main Execution Loop, this loop keeps running until io.ok returns false,<br />
* hence on a robot error. */<br />
while(io.ok()) {<br />
// Get the Sensor data from the LRF<br />
if(detection.getSensorData()) {<br />
// Feed the WorldModel<br />
worldModel.setMinimumDistance(&(detection.laser));<br />
<br />
// State Machine<br />
switch(state) {<br />
// case drive_forward: the robot drives forward until a wall is detected.<br />
case drive_forward:<br />
if(detection.wallDetected(*(worldModel.getMinimumDistance()))) {<br />
// If a wall is detected:<br />
// stop before we hit the wall <br />
pico_drive.stop();<br />
// reset rotatedAngle to 0 <br />
rotatedAngle = 0.0;<br />
// reset distanceBackwards to 0 <br />
distanceBackwards = 0.0;<br />
// switch state to move backwards<br />
state = drive_backward;<br />
} else {<br />
pico_drive.driveForward(FORWARD_SPEED);<br />
}<br />
break;<br />
// case drive_backward: the robot drives backward<br />
case drive_backward:<br />
// start driving backwards, add distance driven to counter distanceBackwards<br />
distanceBackwards += pico_drive.driveBackward(FORWARD_SPEED);<br />
// if we have driven backwards far enough,<br />
if(fabs(distanceBackwards) >= DIST_BACKWARDS) {<br />
// we start rotating.<br />
state = rotate;<br />
}<br />
break;<br />
case rotate:<br />
// start rotating, add angular displacement to counter rotatedAngle<br />
rotatedAngle += pico_drive.rotate(ROTATE_SPEED); <br />
// if we have rotated enough,<br />
if(fabs(rotatedAngle) >= 0.5*M_PI) {<br />
// start driving again<br />
state = drive_forward;<br />
}<br />
break;<br />
<br />
default:<br />
pico_drive.stop();<br />
break;<br />
}<br />
} else {<br />
pico_drive.stop();<br />
}<br />
// Use this to ensure an execution rate of 20 Hertz.<br />
r.sleep();<br />
}<br />
<br />
<br />
return 0;<br />
}<br />
</pre><br />
<br />
What is Pico doing here? Well, Pico starts using its '''driving-forward''' skill! In the meantime, the robot continuously monitors its distance to the wall using its '''detection''' skill. When a wall is detected, Pico can not drive forward anymore and needs to '''turn'''. Therefore, the state switches and an other set of skills is called. Now, compile the files yourself, see whats happens and relate all the steps to the Taks-Skill-Motion Framework. Do you start to see the elegance of structuring your code within the framework and using classes? Now it is your turn!</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=MRC/FullExample&diff=107511MRC/FullExample2021-02-25T12:16:11Z<p>S131974: /* Software Executable */</p>
<hr />
<div>== Full Example ==<br />
Here you will find a full example, from a description of the robot behavior, to a Task-Skill-Motion framework to executable code. Note that this example is far from perfect, it is there just to show you the links between various concepts and some hints you could use to decompose your software.<br />
<br />
== Behavior ==<br />
We would like to create a behavior for Pico, in which:<br />
* Pico is driving forward, unless a wall is detected.<br />
* If a wall is detected, PICO drives backwards for several metres, <br />
* then turns approx. 90 degrees,<br />
* resumes driving forward.<br />
<br />
== Task-Skill-Motion ==<br />
[[File:TSM_FullExample.png|right|thumb|500px|Task-Skill-Motion Framework for Full Example]]<br />
First, we can describe this behavior in a Task-Skill-Motion Framework, which is shown in the figure, here on the right. This example has no GUI, it does have a user interface, through starting the executable. PICO will then start driving forward, which is selected in the Skill Context. Through monitoring the '''Detect Wall'''-skill the Task Monitor might change the skill to '''Turn''', this is controlled by the task control feedback. As this robot does not store any information about the Environment, the environment context is not present. The Skills control the robot through the Robot Operating System.<br />
<br />
== Software Executable ==<br />
The software is decomposed into four parts: ''main'', ''Detection'', ''DriveControl'' and ''WorldModel''. The part ''main'' is an implementation of the Task Content in the Task-Skill-Motion-framework. The '''Skills''' are separated into two parts: those used for detection ('''Detect Wall''') and those for driving ('''Drive Forward''', '''Drive Backward''', '''stop'''). <br />
<br />
To make the decoupling between ''Detection'', ''DriveControl'' and ''Worldmodel'' explicitly in the implementation, these are implemented in separate classes. <br />
<br />
=== Worldmodel ===<br />
The worldmodel contains all the information the robot has of its information, in this case only the minimum distance from the robot to the wall has to be saved. The Worldmodel-class is therefore a very simple one, its structure is defined in the header file ''worldmodel.h''<br />
<pre><br />
#include "config.h"<br />
<br />
#ifndef worldModel_H<br />
#define worldModel_H<br />
<br />
class WorldModel<br />
{<br />
private: <br />
double minDistance_;<br />
<br />
public:<br />
WorldModel(){<br />
minDistance_ = MAX_RANGE_LRF;<br />
}<br />
<br />
double* getMinimumDistance();<br />
void setMinimumDistance(emc::LaserData* laser); // Method to determine the minimum distance to a wall<br />
};<br />
<br />
#endif //worldModel_H <br />
<br />
</pre><br />
The methods '''getWorldmodel''' and '''setWorldmodel''' are described in the source file ''worldmodel.cpp''<br />
<pre><br />
#include "worldModel.h"<br />
<br />
double* WorldModel::getMinimumDistance()<br />
{<br />
return &minDistance_;<br />
}<br />
<br />
void WorldModel::setMinimumDistance(emc::LaserData* laser)<br />
{<br />
double aux = laser->ranges[0];<br />
for(int i = 1; i < laser->ranges.size(); ++i) {<br />
if(laser->ranges[i] < aux) {<br />
aux = laser->ranges[i]; <br />
}<br />
}<br />
minDistance_ = aux;<br />
}<br />
<br />
</pre><br />
<br />
=== Detection ===<br />
The header file of the Detection-class, ''detection.h'', is shown below. The Detection-class contains a pointer to the io-layer inOut, which contains the latest laser data, laser. The methods contained are getSensorData and wallDetected, which together describe the '''Detect Wall'''-skill. <br />
<pre><br />
#ifndef detection_H<br />
#define detection_H<br />
<br />
#include <emc/io.h><br />
#include <emc/data.h><br />
<br />
class Detection{<br />
private:<br />
emc::IO *inOut;<br />
<br />
public:<br />
Detection(emc::IO *io){<br />
inOut = io;<br />
laser = emc::LaserData();<br />
<br />
return;<br />
}<br />
<br />
emc::LaserData laser;<br />
bool getSensorData(); // Method to obtain the sensordata<br />
bool wallDetected(double minDistance);// Method to check if any wall is in the neighbourhood of the robot<br />
};<br />
<br />
#endif //detection_H<br />
<br />
</pre><br />
<br />
Beneath you will find the ''detection.cpp''-file. First, this file includes the structure of the class, described in the header file. In this file, the two methods '''getSensorData''' and '''wallDetected''' are described. <br />
<br />
<pre><br />
#include "detection.h"<br />
#include "config.h"<br />
<br />
bool Detection::getSensorData() {<br />
if(inOut->readLaserData(laser)) {<br />
return true;<br />
} else {<br />
return false;<br />
}<br />
}<br />
<br />
bool Detection::wallDetected(double minDistance) {<br />
if(minDistance < MIN_DIST_TO_WALL) {<br />
return true;<br />
} else {<br />
return false;<br />
}<br />
}<br />
</pre><br />
<br />
=== Drive Control ===<br />
Similar to the Detection-class, a DriveControl-class is created within the ''driveControl.h''-file , but now instead of laser data the odomotry data are obtained. Within this class, several '''drive'''-skills are mentioned.<br />
<br />
<pre><br />
#ifndef driveControl_H<br />
#define driveControl_H<br />
<br />
#include <emc/io.h><br />
#include <emc/odom.h><br />
<br />
class DriveControl<br />
{<br />
private:<br />
emc::IO *inOut;<br />
emc::OdometryData odom; // [x,y,a]<br />
<br />
public:<br />
DriveControl(emc::IO *io){<br />
inOut = io;<br />
odom = emc::OdometryData();<br />
<br />
return;<br />
}<br />
<br />
void driveForward(double Xspeed); // Method to go forward with the robot<br />
double driveBackward(double Xspeed); // Method to go backward with the robot<br />
double rotate(double Aspeed); // Method to rotate with the robot<br />
void stop(); // Method to stop moving with the robot<br />
};<br />
<br />
#endif //driveControl_H<br />
<br />
</pre><br />
<br />
Now, the ''driveControl.cpp''-file describes these methods:<br />
<pre><br />
#include "driveControl.h"<br />
#include "config.h"<br />
<br />
void DriveControl::driveForward(double Xspeed) {<br />
inOut->readOdometryData(odom);<br />
inOut->sendBaseReference(Xspeed, 0.0, 0.0);<br />
}<br />
<br />
double DriveControl::driveBackward(double Xspeed) {<br />
emc::OdometryData odomUpdate;<br />
inOut->readOdometryData(odomUpdate);<br />
<br />
inOut->sendBaseReference(-Xspeed, 0.0, 0.0);<br />
<br />
double distBackward = odomUpdate.x - odom.x;<br />
odom = odomUpdate;<br />
<br />
return distBackward;<br />
}<br />
<br />
double DriveControl::rotate(double Aspeed) {<br />
emc::OdometryData odomUpdate;<br />
inOut->readOdometryData(odomUpdate);<br />
<br />
inOut->sendBaseReference(0.0, 0.0, Aspeed);<br />
<br />
double rotationRelative = odomUpdate.a - odom.a;<br />
odom = odomUpdate;<br />
<br />
return rotationRelative;<br />
}<br />
<br />
void DriveControl::stop() {<br />
driveForward(0.0);<br />
}<br />
</pre><br />
<br />
=== Configuration files ===<br />
To obtain a good overview of all the definitions, a configuration-file, ''config.h'', is created. Copy the following details in it:<br />
<pre><br />
#define EXECUTION_RATE 20 // [Hz]<br />
#define FORWARD_SPEED 0.5 // [m/s]<br />
#define ROTATE_SPEED -1.0 // [rad/s]<br />
#define DIST_BACKWARDS 0.1 // [m]<br />
<br />
#define MIN_DIST_TO_WALL 0.4 // [m]<br />
#define MAX_RANGE_LRF 30.0 //[m]<br />
</pre><br />
<br />
= Main Execution =<br />
<br />
Finally, the ''main.cpp''-file is configured as follows:<br />
<br />
<pre><br />
#include <emc/io.h><br />
#include <emc/rate.h><br />
#include <emc/odom.h><br />
#include <cmath><br />
<br />
#include "driveControl.h"<br />
#include "detection.h"<br />
#include "worldModel.h"<br />
<br />
#include "config.h"<br />
<br />
typedef enum {<br />
drive_forward = 1,<br />
drive_backward,<br />
rotate,<br />
} state_t;<br />
<br />
int main(int argc, char *argv[])<br />
{<br />
// Initialization of Robot<br />
emc::Rate r(EXECUTION_RATE);<br />
emc::IO io;<br />
emc::OdometryData odom;<br />
<br />
// Initialize the Classes<br />
DriveControl pico_drive(&io);<br />
Detection detection(&io);<br />
WorldModel worldModel;<br />
<br />
// Initialize the State of the State Machine<br />
state_t state = drive_forward;<br />
double rotatedAngle = 0.0;<br />
double distanceBackwards = 0.0;<br />
<br />
/* Main Execution Loop, this loop keeps running until io.ok returns false,<br />
* hence on a robot error. */<br />
while(io.ok()) {<br />
// Get the Sensor data from the LRF<br />
if(detection.getSensorData()) {<br />
// Feed the WorldModel<br />
worldModel.setMinimumDistance(&(detection.laser));<br />
<br />
// State Machine<br />
switch(state) {<br />
// case drive_forward: the robot drives forward until a wall is detected.<br />
case drive_forward:<br />
if(detection.wallDetected(*(worldModel.getMinimumDistance()))) {<br />
// If a wall is detected:<br />
// stop before we hit the wall <br />
pico_drive.stop();<br />
// reset rotatedAngle to 0 <br />
rotatedAngle = 0.0;<br />
// reset distanceBackwards to 0 <br />
distanceBackwards = 0.0;<br />
// switch state to move backwards<br />
state = drive_backward;<br />
} else {<br />
pico_drive.driveForward(FORWARD_SPEED);<br />
}<br />
break;<br />
// case drive_backward: the robot drives backward<br />
case drive_backward:<br />
// start driving backwards, add distance driven to counter distanceBackwards<br />
distanceBackwards += pico_drive.driveBackward(FORWARD_SPEED);<br />
// if we have driven backwards far enough,<br />
if(fabs(distanceBackwards) >= DIST_BACKWARDS) {<br />
// we start rotating.<br />
state = rotate;<br />
}<br />
break;<br />
case rotate:<br />
// start rotating, add angular displacement to counter rotatedAngle<br />
rotatedAngle += pico_drive.rotate(ROTATE_SPEED); <br />
// if we have rotated enough,<br />
if(fabs(rotatedAngle) >= 0.5*M_PI) {<br />
// start driving again<br />
state = drive_forward;<br />
}<br />
break;<br />
<br />
default:<br />
pico_drive.stop();<br />
break;<br />
}<br />
} else {<br />
pico_drive.stop();<br />
}<br />
// Use this to ensure an execution rate of 20 Hertz.<br />
r.sleep();<br />
}<br />
<br />
<br />
return 0;<br />
}<br />
</pre><br />
<br />
What is Pico doing here? Well, Pico starts using its '''driving-forward''' skill! In the meantime, the robot continuously monitors its distance to the wall using its '''detection''' skill. When a wall is detected, Pico can not drive forward anymore and needs to '''turn'''. Therefore, the state switches and an other set of skills is called. Now, compile the files yourself, see whats happens and relate all the steps to the Taks-Skill-Motion Framework. Do you start to see the elegance of structuring your code within the framework and using classes? Now it is your turn!</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=MRC/Tutorials/Obtaining_laser,_odometry,_and_control_effort_data&diff=107510MRC/Tutorials/Obtaining laser, odometry, and control effort data2021-02-25T12:01:18Z<p>S131974: </p>
<hr />
<div>= Introduction =<br />
<br />
This page provides a short description of the laser data, odometry data, and control effort data that can be obtained throught the ''IO'' object introduced earlier.<br />
<br />
= Laser Data =<br />
<br />
To obtain the laser data, do the following:<br />
<br />
<pre><br />
emc::LaserData scan;<br />
if (io.readLaserData(scan))<br />
{<br />
// ... We got the laser data, now do something useful with it!<br />
}<br />
</pre><br />
<br />
The ''LaserData'' struct is defined as follows:<br />
<br />
<pre><br />
struct LaserData<br />
{<br />
double range_min;<br />
double range_max;<br />
<br />
double angle_min;<br />
double angle_max;<br />
double angle_increment;<br />
<br />
std::vector<float> ranges;<br />
<br />
double timestamp;<br />
};<br />
</pre><br />
<br />
The ''range_min'' and ''range_max'' values define what the smallest and largest measurable distances are. If a distance reading is below ''range_min'' or above ''range_max'', that reading is invalid. The values ''angle_min'' and ''angle_max'' determine the angle of the first and last beam in the measurement. The value ''angle_increment'' is the angle difference between two beams. Note that it is actually superfluous, as it can be derived from ''angle_min'', ''angle_max'' and the number of beams.<br />
<br />
The actual sensor readings are stored in ''ranges''. It is an ''std::vector'', a vector of values which, in this case, stores ''floats''. Each vector element corresponds to one measured distance in ''meters'' at a particular angle. That angle can be calculated from ''angle_min'', ''angle_increment'' and the index of the element in the vector.<br />
<br />
Finally, the ''timestamp'' specifies at which point in time the data was measured. The timestamp is in [http://en.wikipedia.org/wiki/Unix_time Unix time], ''i.e.'', the number of seconds since 1 January 1970. Note that the absolute value is not necessarily important, but that the timestamp ''can'' be handy to keep track of laser data over time, or to synchronize it with other input data (''e.g.'', the odometry data).<br />
<br />
= Odometry Data =<br />
<br />
The PICO robot has a holonomic wheel base which consists of three so-called omni-wheels. The specific configuration of the wheels allows the robot to move both forwards and sideways, and enables it to rotate around its axis. Each wheel has an encoder which keeps track of the rotations of that wheel. By using all three encoders and knowing the wheel configuration, the displacement and rotation of the robot can be calculated. In other words: we can calculate how far the robot drove and how far it rotated since it's initial position. This translation and rotation based on the wheel encoders is called ''odometry''. However, note that this information is highly sensitive to noise: small errors caused by measurement errors and wheel slip are accumalate over time. Therefore, relying on odometry data alone over longer periods of time is not recommended!<br />
<br />
To obtain the odometry information, do the following:<br />
<br />
<pre><br />
emc::OdometryData odom;<br />
if (io.readOdometryData(odom))<br />
{<br />
// ... We got the odom data, now do something useful with it!<br />
}<br />
</pre><br />
<br />
The ''OdometryData'' struct is defined as follows:<br />
<br />
<pre><br />
struct OdometryData<br />
{<br />
double x;<br />
double y;<br />
double a;<br />
double timestamp;<br />
};<br />
</pre><br />
<br />
Here ''x'', ''y'' and ''a'' define the displacement and rotation of the robot since its start, ''according to the wheel rotations''. The translation ''(x, y)'' is in meters. The rotation, ''a'' is in radians between -pi and pi. Like the laser data, the odometry data also contains a timestamp which is in seconds (Unix time).<br />
<br />
= Control Effort =<br />
<br />
'''remark: The control effort data will not give any output in the simulator and will only give outputs when testing on the real pico.'''<br><br />
To obtain the control effort information, do the following:<br />
<br />
<pre><br />
emc::ControlEffort ce;<br />
if (io.readControlEffort(ce))<br />
{<br />
// ... We got the control effort data, now do something useful with it!<br />
}<br />
</pre><br />
<br />
The ''ControlEffort'' struct is defined as follows:<br />
<br />
<pre><br />
struct ControlEffort<br />
{<br />
double x;<br />
double y;<br />
double th;<br />
double timestamp;<br />
};<br />
</pre><br />
<br />
Here, the 'x','y', and 'th' correspond to, respectively, the control effort in the x, y, and theta direction. Similar to all the data structures above, the timestamp is defined in Unix time.<br />
<br />
= Lazy Boolean Evaluation =<br />
The functions shown above are boolean function, i.e., they return True or False to indicate whether a new measurement of the sensor is available. If you want something to happen when either laser or odometer data is found you may be tempted to use something like:<br />
<br />
<pre><br />
emc::LaserData scan;<br />
emc::OdometryData odom;<br />
if (io.readLaserData(scan) || io.readOdometryData(odom))<br />
{<br />
// ... We got sensor data, now do something useful with it!<br />
}<br />
</pre><br />
<br />
However c++ uses lazy boolean evaluation. Meaning it won't evaluate the second argument in an OR statement if the first is already True. Similarly it won't evaluate the second argument in an AND statement if the first is False. In this example the laser data will be read but the odom struct remains empty!</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=MRC/Tutorials/Installing_Ubuntu&diff=107445MRC/Tutorials/Installing Ubuntu2021-02-24T15:50:46Z<p>S131974: /* Installing Ubuntu */</p>
<hr />
<div>= Installing Ubuntu =<br />
<br />
Download Ubuntu 16.04:<br />
* [http://releases.ubuntu.com/16.04/ubuntu-16.04.6-desktop-i386.iso 32-bit]<br />
* [http://releases.ubuntu.com/16.04/ubuntu-16.04.6-desktop-amd64.iso 64-bit]<br />
<br />
Then, assuming you are currently running Windows, go to [http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-windows this page] and follow the instructions to create a bootable USB stick. Reboot your computer with the newly created USB stick, and install Ubuntu. If you want to keep using Windows next to Ubuntu the most easy way is to have a dual-boot system, i.e., during startup you can choose to boot either Ubuntu or Windows. [https://itsfoss.com/install-ubuntu-1404-dual-boot-mode-windows-8-81-uefi/ this tutorial] will show you how to create a dual-boot. Of course you can also bring your notebook to the ICT servicedesk and ask them to install Ubuntu (but mention that you need version '''16.04''').<br />
<br />
=== Troubleshoot ===<br />
<br />
'''Nothing happens when I reboot with the USB drive'''<br />
<br />
When rebooting your computer with the USB stick it may be the case that booting from your hard drive or SSD is preferred over booting from the USB drive, and the Ubuntu installation doesn't start. In that case, try rebooting again, and now try to enter the ''BIOS'' or watch out for a ''Boot order'' menu. Often, you have to press keys during start-up such as F12 or DEL. Once you found the boot order menu, make sure the USB drive has priority over your normal drive, and restart.<br />
<br />
'''I cannot shrink my Windows-partition'''<br />
<br />
In the case you manually create partitions during the process of installing Ubuntu 16.04.6, you might face an unshrinkable Windows partition. This usually happens when some unimportant files exist at the end of the Windows partition, use [https://medium.com/@terajournal/increasing-size-of-available-shrink-space-for-hard-drive-partition-in-windows-8fffa50535d3 this manual] to change settings. After shrinking, the settings can be set to their original values. In most of the cases this will remove the files at the end of the partition. In the case that you are still facing an unshrinkable Windows partition have a look at [https://www.tenforums.com/tutorials/96356-read-shrink-volume-log-event-viewer-windows-10-a.html the defrag-events], but be careful not to remove any vital files when "just removing files".<br />
<br />
= The Ubuntu Terminal =<br />
<br />
Most of your interaction with Ubuntu will be done through the terminal, the number-one way of interacting with Ubuntu using your keyboard. A terminal can be started by pressing ''ctrl-alt-t''. <!-- It might be a good idea to drag the terminal icon in the menu to the Ubuntu panel, as you will be using it a lot. --><br />
<br />
Although the terminal commands may seem somewhat puzzling at first, you'll soon find out that the terminal is a nifty tool and allows for faster and more powerful access to all of Ubuntu's possibilities than the graphical interface and mouse. If you don't know your way around the terminal, have a look at [https://help.ubuntu.com/community/UsingTheTerminal this page].<br />
<br />
<br />
Ubuntu is already pretty great out-of-the-box, but some [[Embedded Motion Control/Tutorials/Customizing Ubuntu | customizations will make your Ubuntu experience even better]].</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Robotics_Lab_Map&diff=106933Robotics Lab Map2021-02-02T07:59:32Z<p>S131974: /* Employees */</p>
<hr />
<div>[[File:Floorplan_robotics_lab_new.png]]<br />
<br />
== Tech United FlexDesks ==<br />
For the Bachelor End Project-students we have reserved four desks for the MSL-team (''Tech United MSL FlexDesks'') and four desks for the @Home-team (''Tech United @Home FlexDesks''). As these are flexdesks you ''do not'' own a desk, just find a Flexdesk when you enter. Because of this, these desks have to be empty and clean when you are done working!<br />
<br />
'''Tech United MSL FlexDesks:''' ''35-38''<br />
<br />
'''Tech United @Home FlexDesks:''' ''11-14''<br />
<br />
== Employees ==<br />
<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:JesseScholtes.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:Picture_Jari_van_Steen.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MaartenJongeneel.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Jesse Scholtes'''<br />
| style="text-align:center;" | '''Jari van Steen'''<br />
| style="text-align:center;" | '''Maarten Jongeneel'''<br />
| style="text-align:center;" | '''Peter van Dooren'''<br />
| style="text-align:center;" | '''Manuel Muñoz Sánchez'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | j dot scholtes (at) tue dot nl<br />
| style="text-align:center;" | j dot j dot v dot steen (at) tue dot nl<br />
| style="text-align:center;" | m.j.jongeneel@tue.nl<br />
| style="text-align:center;" | p dot v dot dooren (at) tue dot nl<br />
| style="text-align:center;" | m dot munoz dot sanchez (at) tue dot nl<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Project Management'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Various'''<br />
| style="text-align:center;" | '''I.AM.'''<br />
| style="text-align:center;" | '''I.AM.'''<br />
| style="text-align:center;" | '''FlexCRAFT'''<br />
| style="text-align:center;" | '''SAFE-UP'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''1'''<br />
| style="text-align:center;" | '''2'''<br />
| style="text-align:center;" | '''3'''<br />
| style="text-align:center;" | '''4'''<br />
| style="text-align:center;" | '''5'''<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MDolatabadi.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:CLopez.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WHoutman.JPG|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:RobbertvdKruk.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Jos Elfring'''<br />
| style="text-align:center;" | '''Marzieh Dolatabadi'''<br />
| style="text-align:center;" | '''Cesar A. Lopez M.'''<br />
| style="text-align:center;" | '''Wouter Houtman'''<br />
| style="text-align:center;" | '''Robbert van der Kruk'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | <br />
| style="text-align:center;" | c dot a dot lopez dot martinez dot (at) tue dot nl<br />
| style="text-align:center;" | W dot Houtman (at) tue dot nl <br />
| style="text-align:center;" | r.j.v.d.kruk@tue<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Part-Time Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''Postdoctoral Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''Academic Researcher'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''TNO'''<br />
| style="text-align:center;" | '''autopilot'''<br />
| style="text-align:center;" | '''RoPod'''<br />
| style="text-align:center;" | '''RoPod'''<br />
| style="text-align:center;" | '''Flexcraft'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''6'''<br />
| style="text-align:center;" | '''7'''<br />
| style="text-align:center;" | '''8'''<br />
| style="text-align:center;" | '''9'''<br />
| style="text-align:center;" | '''10'''<br />
|}<br />
</center><br />
<br />
== Students ==<br />
<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Kevin Jebbink'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | ''''''<br />
| style="text-align:center;" | '''Tushar Sharma'''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | k.s.jebbink@student.tue.nl<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | t.sharma@student.tue.nl<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | ''''''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''EUTAFT: Autonomous Football Table'''<br />
| style="text-align:center;" | ''''''<br />
| style="text-align:center;" | ''''''<br />
| style="text-align:center;" | '''FlexCRAFT Project: Contactless stem detection for a tomato plant '''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''11'''<br />
| style="text-align:center;" | '''12'''<br />
| style="text-align:center;" | '''13'''<br />
| style="text-align:center;" | '''14'''<br />
| style="text-align:center;" | '''15'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:Arend_Jan_van_Noorden.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''William Schattevoet'''<br />
| style="text-align:center;" | '''Stan den Hartog'''<br />
| style="text-align:center;" | '''Arend-Jan van Noorden'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | w.s.a.l.schattevoet@student.tue.nl<br />
| style="text-align:center;" | c.m.d.hartog@student.tue.nl<br />
| style="text-align:center;" | a.c.h.v.noorden@student.tue.nl<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Assisted Guitarpicking'''<br />
| style="text-align:center;" | '''semantic MHT of a tomato plant'''<br />
| style="text-align:center;" | '''Flexcraft, Packaging robotics, handling of viscous fluid product in a bag'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''_'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''16'''<br />
| style="text-align:center;" | '''17'''<br />
| style="text-align:center;" | '''18'''<br />
| style="text-align:center;" | '''19'''<br />
| style="text-align:center;" | '''20'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:Bart_Reijnen.PNG|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Not existing'''<br />
| style="text-align:center;" | '''Elise Verhees'''<br />
| style="text-align:center;" | '''Bart Reijnen'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Winston Mendonca'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | e.d.t.verhees@student.tue.nl<br />
| style="text-align:center;" | b.p.j.reijnen@student.tue.nl<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | w.mendonca@student.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''FlexCRAFT Project:'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''FlexCRAFT Project: Motion Control for Robotic Arm'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''21'''<br />
| style="text-align:center;" | '''22'''<br />
| style="text-align:center;" | '''23'''<br />
| style="text-align:center;" | '''24'''<br />
| style="text-align:center;" | '''25'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:Richard_van_de_Ketterij.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MatthijsvdBurgh.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Richard van de Ketterij'''<br />
| style="text-align:center;" | '''Marc Meijer'''<br />
| style="text-align:center;" | '''Jet van den Broek'''<br />
| style="text-align:center;" | '''Matthijs van der Burgh'''<br />
| style="text-align:center;" | '''Kevin Hollands'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | r.l.v.d.ketterij@student.tue.nl<br />
| style="text-align:center;" | m.f.meijer@student.tue.nl<br />
| style="text-align:center;" | j.e.v.d.broek@student.tue.nl<br />
| style="text-align:center;" | m dot f dot m dot b dot v dot d dot burgh (at) student dot tue dot nl<br />
| style="text-align:center;" | k.h.m.hollands@student.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Haptic force feedback'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Internship'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Dynamic environment reconstruction for Cobot Control'''<br />
| style="text-align:center;" | '''Data science in precision farming '''<br />
| style="text-align:center;" | '''RoPod: Semantic localisation'''<br />
| style="text-align:center;" | '''FlexCRAFT: Control of packaging robots'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''26'''<br />
| style="text-align:center;" | '''27'''<br />
| style="text-align:center;" | '''28'''<br />
| style="text-align:center;" | '''29'''<br />
| style="text-align:center;" | '''30'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Bas Herremans'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Laura de Jong'''<br />
| style="text-align:center;" | '''Aron Tiemessen'''<br />
| style="text-align:center;" | '''Marleen Verhagen'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | b.r.herremans@student.tue.nl<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | l.s.d.jong@student.tue.nl<br />
| style="text-align:center;" | a.j.c.tiemessen@student.tue.nl<br />
| style="text-align:center;" | m.j.w.verhagen@studen.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis '''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Flex CRAFT - tomato harvesting robot'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Hypothesis generation for MHT''' <br />
| style="text-align:center;" | '''Safe Trajectory Generation and Tracking for Autonomous Racing'''<br />
| style="text-align:center;" | '''Camera network localization'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''31'''<br />
| style="text-align:center;" | '''32'''<br />
| style="text-align:center;" | '''33'''<br />
| style="text-align:center;" | '''34'''<br />
| style="text-align:center;" | '''35'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 45%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Bas Straatman'''<br />
| style="text-align:center;" | '''Lars Nijland'''<br />
| style="text-align:center;" | ''''''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | s.r.t.straatman@student.tue.nl<br />
| style="text-align:center;" | l.d.nijland@student.tue.nl<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | ''''''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Augmented Reality for Knee Implant Placement Surgery'''<br />
| style="text-align:center;" | '''Common Simulator Football Robots'''<br />
| style="text-align:center;" | ''''''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''36'''<br />
| style="text-align:center;" | '''37'''<br />
| style="text-align:center;" | '''38'''<br />
|}<br />
</center><br />
<br />
== Tech United MSL BEP Projects ==<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center;" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Ahmad Sahhary'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | a.sahhary@student.tue.nl<br />
<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''-'''<br />
<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''Tech United MSL FlexDesk'''<br />
<br />
|-<br />
! scope="row"| Supervisor<br />
| style="text-align:center;" | Omur Arslan<br />
<br />
|-<br />
|}<br />
</center><br />
<br />
== Tech United @Home BEP Projects ==<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''Tech United @Home FlexDesk'''<br />
|-<br />
! scope="row"| Supervisor<br />
| style="text-align:center;" | -<br />
|-<br />
|}<br />
</center><br />
<br />
== Robotics Research Lab - Wall of Fame ==<br />
In this Wall of Fame all the students that have achieved their Master's Thesis within the Robotics Research Lab will be remembered. <br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:roos.png|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WHoutman.JPG|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Rozemarijn Weijers'''<br />
| style="text-align:center;" | '''Wouter Houtman'''<br />
| style="text-align:center;" | '''Freek Ramp'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''EureyeCase: retinal structure recognition in images reconstructed from OCT A-scans'''<br />
| style="text-align:center;" | '''EureyeCase: Viscoelastic Modeling of Porcine Eyes for Membrane Peeling Purposes'''<br />
| style="text-align:center;" | ''' '''<br />
|-<br />
! scope="row"| Report<br />
| style="text-align:center;" | [[File:Report_Rozemarijn.pdf]]<br />
| style="text-align:center;" | [[File:Report_Wouter.pdf]] <br />
| style="text-align:center;" | [[File:Report_Freek.pdf]] <br />
|-<br />
! scope="row"| Presentation<br />
| style="text-align:center;" | [[File:Presentation_Rozemarijn.pdf]] <br />
| style="text-align:center;" | [[File:Presentation_Wouter.pdf]] <br />
| style="text-align:center;" | [[File:Presentation_Freek.pdf]] <br />
|-<br />
|}<br />
</center></div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Robotics_Lab_Map&diff=106777Robotics Lab Map2021-01-04T08:42:08Z<p>S131974: /* Students */</p>
<hr />
<div>[[File:Floorplan_robotics_lab_new.png]]<br />
<br />
== Tech United FlexDesks ==<br />
For the Bachelor End Project-students we have reserved four desks for the MSL-team (''Tech United MSL FlexDesks'') and four desks for the @Home-team (''Tech United @Home FlexDesks''). As these are flexdesks you ''do not'' own a desk, just find a Flexdesk when you enter. Because of this, these desks have to be empty and clean when you are done working!<br />
<br />
'''Tech United MSL FlexDesks:''' ''35-38''<br />
<br />
'''Tech United @Home FlexDesks:''' ''11-14''<br />
<br />
== Employees ==<br />
<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:JesseScholtes.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:Picture_Jari_van_Steen.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MaartenJongeneel.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WouterKuijpersWiki.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Jesse Scholtes'''<br />
| style="text-align:center;" | '''Jari van Steen'''<br />
| style="text-align:center;" | '''Maarten Jongeneel'''<br />
| style="text-align:center;" | '''Wouter Kuijpers'''<br />
| style="text-align:center;" | '''Manuel Muñoz Sánchez'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | j dot scholtes (at) tue dot nl<br />
| style="text-align:center;" | j dot j dot v dot steen (at) tue dot nl<br />
| style="text-align:center;" | m.j.jongeneel@tue.nl<br />
| style="text-align:center;" | W dot J dot P dot Kuijpers (at) tue dot nl<br />
| style="text-align:center;" | m dot munoz dot sanchez (at) tue dot nl<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Project Management'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Various'''<br />
| style="text-align:center;" | '''I.AM.'''<br />
| style="text-align:center;" | '''I.AM.'''<br />
| style="text-align:center;" | '''LED it Be 50%'''<br />
| style="text-align:center;" | '''SAFE-UP'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''1'''<br />
| style="text-align:center;" | '''2'''<br />
| style="text-align:center;" | '''3'''<br />
| style="text-align:center;" | '''4'''<br />
| style="text-align:center;" | '''5'''<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MDolatabadi.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:CLopez.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WHoutman.JPG|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:RobbertvdKruk.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Jos Elfring'''<br />
| style="text-align:center;" | '''Marzieh Dolatabadi'''<br />
| style="text-align:center;" | '''Cesar A. Lopez M.'''<br />
| style="text-align:center;" | '''Wouter Houtman'''<br />
| style="text-align:center;" | '''Robbert van der Kruk'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | <br />
| style="text-align:center;" | c dot a dot lopez dot martinez dot (at) tue dot nl<br />
| style="text-align:center;" | W dot Houtman (at) tue dot nl <br />
| style="text-align:center;" | r.j.v.d.kruk@tue<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Part-Time Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''Postdoctoral Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''Academic Researcher'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''TNO'''<br />
| style="text-align:center;" | '''autopilot'''<br />
| style="text-align:center;" | '''RoPod'''<br />
| style="text-align:center;" | '''RoPod'''<br />
| style="text-align:center;" | '''Flexcraft'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''6'''<br />
| style="text-align:center;" | '''7'''<br />
| style="text-align:center;" | '''8'''<br />
| style="text-align:center;" | '''9'''<br />
| style="text-align:center;" | '''10'''<br />
|}<br />
</center><br />
<br />
== Students ==<br />
<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Kevin Jebbink'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | ''''''<br />
| style="text-align:center;" | '''Tushar Sharma'''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | k.s.jebbink@student.tue.nl<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | t.sharma@student.tue.nl<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | ''''''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''EUTAFT: Autonomous Football Table'''<br />
| style="text-align:center;" | ''''''<br />
| style="text-align:center;" | ''''''<br />
| style="text-align:center;" | '''FlexCRAFT Project: Contactless stem detection for a tomato plant '''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''11'''<br />
| style="text-align:center;" | '''12'''<br />
| style="text-align:center;" | '''13'''<br />
| style="text-align:center;" | '''14'''<br />
| style="text-align:center;" | '''15'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:Arend_Jan_van_Noorden.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''William Schattevoet'''<br />
| style="text-align:center;" | '''Stan den Hartog'''<br />
| style="text-align:center;" | '''Arend-Jan van Noorden'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | w.s.a.l.schattevoet@student.tue.nl<br />
| style="text-align:center;" | c.m.d.hartog@student.tue.nl<br />
| style="text-align:center;" | a.c.h.v.noorden@student.tue.nl<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Assisted Guitarpicking'''<br />
| style="text-align:center;" | '''semantic MHT of a tomato plant'''<br />
| style="text-align:center;" | '''Flexcraft, Packaging robotics, handling of viscous fluid product in a bag'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''_'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''16'''<br />
| style="text-align:center;" | '''17'''<br />
| style="text-align:center;" | '''18'''<br />
| style="text-align:center;" | '''19'''<br />
| style="text-align:center;" | '''20'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Not existing'''<br />
| style="text-align:center;" | '''Elise Verhees'''<br />
| style="text-align:center;" | '''Bart Reijnen'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Winston Mendonca'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | e.d.t.verhees@student.tue.nl<br />
| style="text-align:center;" | b.p.j.reijnen@student.tue.nl<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | w.mendonca@student.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''FlexCRAFT Project: Motion Control for Robotic Arm'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''21'''<br />
| style="text-align:center;" | '''22'''<br />
| style="text-align:center;" | '''23'''<br />
| style="text-align:center;" | '''24'''<br />
| style="text-align:center;" | '''25'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:Richard_van_de_Ketterij.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MatthijsvdBurgh.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Richard van de Ketterij'''<br />
| style="text-align:center;" | '''Marc Meijer'''<br />
| style="text-align:center;" | '''Jet van den Broek'''<br />
| style="text-align:center;" | '''Matthijs van der Burgh'''<br />
| style="text-align:center;" | ''''''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | r.l.v.d.ketterij@student.tue.nl<br />
| style="text-align:center;" | m.f.meijer@student.tue.nl<br />
| style="text-align:center;" | j.e.v.d.broek@student.tue.nl<br />
| style="text-align:center;" | m dot f dot m dot b dot v dot d dot burgh (at) student dot tue dot nl<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Haptic force feedback'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | ''''''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Dynamic environment reconstruction for Cobot Control'''<br />
| style="text-align:center;" | '''Data science in precision farming '''<br />
| style="text-align:center;" | '''RoPod: Semantic localisation'''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''26'''<br />
| style="text-align:center;" | '''27'''<br />
| style="text-align:center;" | '''28'''<br />
| style="text-align:center;" | '''29'''<br />
| style="text-align:center;" | '''30'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Bas Herremans'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Laura de Jong'''<br />
| style="text-align:center;" | '''Aron Tiemessen'''<br />
| style="text-align:center;" | '''Marleen Verhagen'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | b.r.herremans@student.tue.nl<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | l.s.d.jong@student.tue.nl<br />
| style="text-align:center;" | a.j.c.tiemessen@student.tue.nl<br />
| style="text-align:center;" | m.j.w.verhagen@studen.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis '''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Flex CRAFT - tomato harvesting robot'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Hypothesis generation for MHT''' <br />
| style="text-align:center;" | '''Safe Trajectory Generation and Tracking for Autonomous Racing'''<br />
| style="text-align:center;" | '''Camera network localization'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''31'''<br />
| style="text-align:center;" | '''32'''<br />
| style="text-align:center;" | '''33'''<br />
| style="text-align:center;" | '''34'''<br />
| style="text-align:center;" | '''35'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 45%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Bas Straatman'''<br />
| style="text-align:center;" | '''Lars Nijland'''<br />
| style="text-align:center;" | ''''''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | s.r.t.straatman@student.tue.nl<br />
| style="text-align:center;" | l.d.nijland@student.tue.nl<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | ''''''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Augmented Reality for Knee Implant Placement Surgery'''<br />
| style="text-align:center;" | '''Common Simulator Football Robots'''<br />
| style="text-align:center;" | ''''''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''36'''<br />
| style="text-align:center;" | '''37'''<br />
| style="text-align:center;" | '''38'''<br />
|}<br />
</center><br />
<br />
== Tech United MSL BEP Projects ==<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center;" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Ahmad Sahhary'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | a.sahhary@student.tue.nl<br />
<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''-'''<br />
<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''Tech United MSL FlexDesk'''<br />
<br />
|-<br />
! scope="row"| Supervisor<br />
| style="text-align:center;" | Omur Arslan<br />
<br />
|-<br />
|}<br />
</center><br />
<br />
== Tech United @Home BEP Projects ==<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''Tech United @Home FlexDesk'''<br />
|-<br />
! scope="row"| Supervisor<br />
| style="text-align:center;" | -<br />
|-<br />
|}<br />
</center><br />
<br />
== Robotics Research Lab - Wall of Fame ==<br />
In this Wall of Fame all the students that have achieved their Master's Thesis within the Robotics Research Lab will be remembered. <br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:roos.png|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WHoutman.JPG|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Rozemarijn Weijers'''<br />
| style="text-align:center;" | '''Wouter Houtman'''<br />
| style="text-align:center;" | '''Freek Ramp'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''EureyeCase: retinal structure recognition in images reconstructed from OCT A-scans'''<br />
| style="text-align:center;" | '''EureyeCase: Viscoelastic Modeling of Porcine Eyes for Membrane Peeling Purposes'''<br />
| style="text-align:center;" | ''' '''<br />
|-<br />
! scope="row"| Report<br />
| style="text-align:center;" | [[File:Report_Rozemarijn.pdf]]<br />
| style="text-align:center;" | [[File:Report_Wouter.pdf]] <br />
| style="text-align:center;" | [[File:Report_Freek.pdf]] <br />
|-<br />
! scope="row"| Presentation<br />
| style="text-align:center;" | [[File:Presentation_Rozemarijn.pdf]] <br />
| style="text-align:center;" | [[File:Presentation_Wouter.pdf]] <br />
| style="text-align:center;" | [[File:Presentation_Freek.pdf]] <br />
|-<br />
|}<br />
</center></div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Robotics_Lab_Map&diff=106776Robotics Lab Map2021-01-04T08:40:26Z<p>S131974: /* Students */</p>
<hr />
<div>[[File:Floorplan_robotics_lab_new.png]]<br />
<br />
== Tech United FlexDesks ==<br />
For the Bachelor End Project-students we have reserved four desks for the MSL-team (''Tech United MSL FlexDesks'') and four desks for the @Home-team (''Tech United @Home FlexDesks''). As these are flexdesks you ''do not'' own a desk, just find a Flexdesk when you enter. Because of this, these desks have to be empty and clean when you are done working!<br />
<br />
'''Tech United MSL FlexDesks:''' ''35-38''<br />
<br />
'''Tech United @Home FlexDesks:''' ''11-14''<br />
<br />
== Employees ==<br />
<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:JesseScholtes.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:Picture_Jari_van_Steen.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MaartenJongeneel.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WouterKuijpersWiki.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Jesse Scholtes'''<br />
| style="text-align:center;" | '''Jari van Steen'''<br />
| style="text-align:center;" | '''Maarten Jongeneel'''<br />
| style="text-align:center;" | '''Wouter Kuijpers'''<br />
| style="text-align:center;" | '''Manuel Muñoz Sánchez'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | j dot scholtes (at) tue dot nl<br />
| style="text-align:center;" | j dot j dot v dot steen (at) tue dot nl<br />
| style="text-align:center;" | m.j.jongeneel@tue.nl<br />
| style="text-align:center;" | W dot J dot P dot Kuijpers (at) tue dot nl<br />
| style="text-align:center;" | m dot munoz dot sanchez (at) tue dot nl<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Project Management'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Various'''<br />
| style="text-align:center;" | '''I.AM.'''<br />
| style="text-align:center;" | '''I.AM.'''<br />
| style="text-align:center;" | '''LED it Be 50%'''<br />
| style="text-align:center;" | '''SAFE-UP'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''1'''<br />
| style="text-align:center;" | '''2'''<br />
| style="text-align:center;" | '''3'''<br />
| style="text-align:center;" | '''4'''<br />
| style="text-align:center;" | '''5'''<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MDolatabadi.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:CLopez.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WHoutman.JPG|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:RobbertvdKruk.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Jos Elfring'''<br />
| style="text-align:center;" | '''Marzieh Dolatabadi'''<br />
| style="text-align:center;" | '''Cesar A. Lopez M.'''<br />
| style="text-align:center;" | '''Wouter Houtman'''<br />
| style="text-align:center;" | '''Robbert van der Kruk'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | <br />
| style="text-align:center;" | c dot a dot lopez dot martinez dot (at) tue dot nl<br />
| style="text-align:center;" | W dot Houtman (at) tue dot nl <br />
| style="text-align:center;" | r.j.v.d.kruk@tue<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Part-Time Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''Postdoctoral Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''Academic Researcher'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''TNO'''<br />
| style="text-align:center;" | '''autopilot'''<br />
| style="text-align:center;" | '''RoPod'''<br />
| style="text-align:center;" | '''RoPod'''<br />
| style="text-align:center;" | '''Flexcraft'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''6'''<br />
| style="text-align:center;" | '''7'''<br />
| style="text-align:center;" | '''8'''<br />
| style="text-align:center;" | '''9'''<br />
| style="text-align:center;" | '''10'''<br />
|}<br />
</center><br />
<br />
== Students ==<br />
<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Kevin Jebbink'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | ''''''<br />
| style="text-align:center;" | '''Tushar Sharma'''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | k.s.jebbink@student.tue.nl<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | t.sharma@student.tue.nl<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | ''''''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''EUTAFT: Autonomous Football Table'''<br />
| style="text-align:center;" | ''''''<br />
| style="text-align:center;" | ''''''<br />
| style="text-align:center;" | '''FlexCRAFT Project: Contactless stem detection for a tomato plant '''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''11'''<br />
| style="text-align:center;" | '''12'''<br />
| style="text-align:center;" | '''13'''<br />
| style="text-align:center;" | '''14'''<br />
| style="text-align:center;" | '''15'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:Arend_Jan_van_Noorden.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''William Schattevoet'''<br />
| style="text-align:center;" | '''Stan den Hartog'''<br />
| style="text-align:center;" | '''Arend-Jan van Noorden'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | w.s.a.l.schattevoet@student.tue.nl<br />
| style="text-align:center;" | c.m.d.hartog@student.tue.nl<br />
| style="text-align:center;" | a.c.h.v.noorden@student.tue.nl<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Assisted Guitarpicking'''<br />
| style="text-align:center;" | '''semantic MHT of a tomato plant'''<br />
| style="text-align:center;" | '''Flexcraft, Packaging robotics, handling of viscous fluid product in a bag'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''_'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''16'''<br />
| style="text-align:center;" | '''17'''<br />
| style="text-align:center;" | '''18'''<br />
| style="text-align:center;" | '''19'''<br />
| style="text-align:center;" | '''20'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Not existing'''<br />
| style="text-align:center;" | '''Elise Verhees'''<br />
| style="text-align:center;" | '''Bart Reijnen'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Winston Mendonca'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | e.d.t.verhees@student.tue.nl<br />
| style="text-align:center;" | b.p.j.reijnen@student.tue.nl<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | w.mendonca@student.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''FlexCRAFT Project: Motion Control for Robotic Arm'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''21'''<br />
| style="text-align:center;" | '''22'''<br />
| style="text-align:center;" | '''23'''<br />
| style="text-align:center;" | '''24'''<br />
| style="text-align:center;" | '''25'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:Richard_van_de_Ketterij.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MatthijsvdBurgh.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Richard van de Ketterij'''<br />
| style="text-align:center;" | '''Marc Meijer'''<br />
| style="text-align:center;" | '''Jet van den Broek'''<br />
| style="text-align:center;" | '''Matthijs van der Burgh'''<br />
| style="text-align:center;" | ''''''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | r.l.v.d.ketterij@student.tue.nl<br />
| style="text-align:center;" | m.f.meijer@student.tue.nl<br />
| style="text-align:center;" | j.e.v.d.broek@student.tue.nl<br />
| style="text-align:center;" | m dot f dot m dot b dot v dot d dot burgh (at) student dot tue dot nl<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Haptic force feedback'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | ''''''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Dynamic environment reconstruction for Cobot Control'''<br />
| style="text-align:center;" | '''Data science in precision farming '''<br />
| style="text-align:center;" | '''RoPod: Semantic localisation'''<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''26'''<br />
| style="text-align:center;" | '''27'''<br />
| style="text-align:center;" | '''28'''<br />
| style="text-align:center;" | '''29'''<br />
| style="text-align:center;" | '''30'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Bas Herremans'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Laura de Jong'''<br />
| style="text-align:center;" | '''Aron Tiemessen'''<br />
| style="text-align:center;" | '''Marleen Verhagen'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | b.r.herremans@student.tue.nl<br />
| style="text-align:center;" | -<br />
| style="text-align:center;" | l.s.d.jong@student.tue.nl<br />
| style="text-align:center;" | a.j.c.tiemessen@student.tue.nl<br />
| style="text-align:center;" | m.j.w.verhagen@studen.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis '''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Flex CRAFT - tomato harvesting robot'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Hypothesis generation for MHT''' <br />
| style="text-align:center;" | '''Safe Trajectory Generation and Tracking for Autonomous Racing'''<br />
| style="text-align:center;" | '''Camera network localization'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''31'''<br />
| style="text-align:center;" | '''32'''<br />
| style="text-align:center;" | '''33'''<br />
| style="text-align:center;" | '''34'''<br />
| style="text-align:center;" | '''35'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 45%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Bas Straatman'''<br />
| style="text-align:center;" | '''Lars Nijland'''<br />
| style="text-align:center;" | ''''''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | s.r.t.straatman@student.tue.nl<br />
| style="text-align:center;" | l.d.nijland@student.tue.nl<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | ''''''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Augmented Reality for Knee Implant Placement Surgery'''<br />
| style="text-align:center;" | '''Common Simulator Football Robots'''<br />
| style="text-align:center;" | ''''''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''36'''<br />
| style="text-align:center;" | '''37'''<br />
| style="text-align:center;" | '''38'''<br />
|}<br />
</center><br />
<br />
== Tech United MSL BEP Projects ==<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center;" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Ahmad Sahhary'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | a.sahhary@student.tue.nl<br />
<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''-'''<br />
<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''Tech United MSL FlexDesk'''<br />
<br />
|-<br />
! scope="row"| Supervisor<br />
| style="text-align:center;" | Omur Arslan<br />
<br />
|-<br />
|}<br />
</center><br />
<br />
== Tech United @Home BEP Projects ==<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''Tech United @Home FlexDesk'''<br />
|-<br />
! scope="row"| Supervisor<br />
| style="text-align:center;" | -<br />
|-<br />
|}<br />
</center><br />
<br />
== Robotics Research Lab - Wall of Fame ==<br />
In this Wall of Fame all the students that have achieved their Master's Thesis within the Robotics Research Lab will be remembered. <br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:roos.png|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WHoutman.JPG|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Rozemarijn Weijers'''<br />
| style="text-align:center;" | '''Wouter Houtman'''<br />
| style="text-align:center;" | '''Freek Ramp'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''EureyeCase: retinal structure recognition in images reconstructed from OCT A-scans'''<br />
| style="text-align:center;" | '''EureyeCase: Viscoelastic Modeling of Porcine Eyes for Membrane Peeling Purposes'''<br />
| style="text-align:center;" | ''' '''<br />
|-<br />
! scope="row"| Report<br />
| style="text-align:center;" | [[File:Report_Rozemarijn.pdf]]<br />
| style="text-align:center;" | [[File:Report_Wouter.pdf]] <br />
| style="text-align:center;" | [[File:Report_Freek.pdf]] <br />
|-<br />
! scope="row"| Presentation<br />
| style="text-align:center;" | [[File:Presentation_Rozemarijn.pdf]] <br />
| style="text-align:center;" | [[File:Presentation_Wouter.pdf]] <br />
| style="text-align:center;" | [[File:Presentation_Freek.pdf]] <br />
|-<br />
|}<br />
</center></div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Robotics_Lab_Map&diff=103980Robotics Lab Map2020-07-14T09:35:48Z<p>S131974: /* Students */</p>
<hr />
<div>[[File:Floorplan_robotics_lab_new.png]]<br />
<br />
== Tech United FlexDesks ==<br />
For the Bachelor End Project-students we have reserved four desks for the MSL-team (''Tech United MSL FlexDesks'') and four desks for the @Home-team (''Tech United @Home FlexDesks''). As these are flexdesks you ''do not'' own a desk, just find a Flexdesk when you enter. Because of this, these desks have to be empty and clean when you are done working!<br />
<br />
'''Tech United MSL FlexDesks:''' ''35-38''<br />
<br />
'''Tech United @Home FlexDesks:''' ''11-14''<br />
<br />
== Employees ==<br />
<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:JesseScholtes.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:YanickDouven.png|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WouterKuijpersWiki.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Jesse Scholtes'''<br />
| style="text-align:center;" | '''Roy Cobbenhagen'''<br />
| style="text-align:center;" | '''Yanick Douven'''<br />
| style="text-align:center;" | '''Wouter Kuijpers'''<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | j dot scholtes (at) tue dot nl<br />
| style="text-align:center;" | a dot t dot j dot r dot cobbenhagen (at) tue dot nl<br />
| style="text-align:center;" | y dot g dot m dot douven (at) tue dot nl<br />
| style="text-align:center;" | W dot J dot P dot Kuijpers (at) tue dot nl<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Project Management'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Various'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''EurEyeCase'''<br />
| style="text-align:center;" | '''LED it Be 50%'''<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''1'''<br />
| style="text-align:center;" | '''2'''<br />
| style="text-align:center;" | '''3'''<br />
| style="text-align:center;" | '''4'''<br />
| style="text-align:center;" | '''5'''<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MDolatabadi.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WHoutman.JPG|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:CLopez.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Jos Elfring'''<br />
| style="text-align:center;" | '''Marzieh Dolatabadi'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''Wouter Houtman'''<br />
| style="text-align:center;" | '''Cesar A. Lopez M.'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | <br />
| style="text-align:center;" | <br />
| style="text-align:center;" | W dot Houtman (at) tue dot nl <br />
| style="text-align:center;" | c dot a dot lopez dot martinez dot (at) tue dot nl<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Part-Time Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''Postdoctoral Researcher'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''TNO'''<br />
| style="text-align:center;" | '''autopilot'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''RoPod'''<br />
| style="text-align:center;" | '''RoPod'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''6'''<br />
| style="text-align:center;" | '''7'''<br />
| style="text-align:center;" | '''8'''<br />
| style="text-align:center;" | '''9'''<br />
| style="text-align:center;" | '''10'''<br />
|}<br />
</center><br />
<br />
== Students ==<br />
<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | Kevin Jebbink<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | Martijn Schipper<br />
| style="text-align:center;" | Tushar Sharma<br />
| style="text-align:center;" | '''Remco van Doorn'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | k.s.jebbink@student.tue.nl<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | m.a.schipper@student.tue.nl<br />
| style="text-align:center;" | t.sharma@student.tue.nl<br />
| style="text-align:center;" | r.r.g.c.v.doorn@student.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Bachelor End Project'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''EUTAFT: Autonomous Football Table'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Sonar Analysis for Mobile Robots'''<br />
| style="text-align:center;" | '''FlexCRAFT Project: Contactless stem detection for a tomato plant '''<br />
| style="text-align:center;" | '''Robotics in construction'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''11'''<br />
| style="text-align:center;" | '''12'''<br />
| style="text-align:center;" | '''13'''<br />
| style="text-align:center;" | '''14'''<br />
| style="text-align:center;" | '''15'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''William Schattevoet'''<br />
| style="text-align:center;" | '''Stan den Hartog'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Lars Janssen'''<br />
| style="text-align:center;" | '''Daniël Bos'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | '''w.s.a.l.schattevoet@student.tue.nl''' <br />
| style="text-align:center;" | c.m.d.hartog@student.tue.nl<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | l.g.l.janssen@student.tue.nl<br />
| style="text-align:center;" | d.j.m.bos@student.tue.nl<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Internship'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Assisted Guitarpicking'''<br />
| style="text-align:center;" | '''semantic MHT of a tomato plant'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Something with robotics'''<br />
| style="text-align:center;" | '''Automatic flower counting using Multiple Hypothesis Tracking'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''16'''<br />
| style="text-align:center;" | '''17'''<br />
| style="text-align:center;" | '''18'''<br />
| style="text-align:center;" | '''19'''<br />
| style="text-align:center;" | '''20'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Ruben Beumer'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Sander Arts'''<br />
| style="text-align:center;" | '''Peter van Dooren'''<br />
| style="text-align:center;" | '''Winston Mendonca'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | '''r.m.beumer@student.tue.nl'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''a.j.m.arts@student.tue.nl'''<br />
| style="text-align:center;" | '''p.v.dooren@student.tue.nl'''<br />
| style="text-align:center;" | '''w.mendonca@student.tue.nl'''<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''ROPOD'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Surgical Tool Localization in Augmented Reality Knee Surgery'''<br />
| style="text-align:center;" | '''Action planning for a service robot'''<br />
| style="text-align:center;" | '''FlexCRAFT Project: Motion Control for Robotic Arm'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''21'''<br />
| style="text-align:center;" | '''22'''<br />
| style="text-align:center;" | '''23'''<br />
| style="text-align:center;" | '''24'''<br />
| style="text-align:center;" | '''25'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MatthijsvdBurgh.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Marc Meijer'''<br />
| style="text-align:center;" | '''Jet van den Broek'''<br />
| style="text-align:center;" | '''Matthijs van der Burgh'''<br />
| style="text-align:center;" | '''Robbert Louwers'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''m.f.meijer@student.tue.nl'''<br />
| style="text-align:center;" | '''j.e.v.d.broek@student.tue.nl'''<br />
| style="text-align:center;" | m dot f dot m dot b dot v dot d dot burgh (at) student dot tue dot nl<br />
| style="text-align:center;" | r dot louwers (at) student dot tue dot nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Dynamic environment reconstruction for Cobot Control'''<br />
| style="text-align:center;" | '''Data science in precision farming '''<br />
| style="text-align:center;" | '''RoPod: Semantic localisation'''<br />
| style="text-align:center;" | '''RoPod'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''26'''<br />
| style="text-align:center;" | '''27'''<br />
| style="text-align:center;" | '''28'''<br />
| style="text-align:center;" | '''29'''<br />
| style="text-align:center;" | '''30'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Bas Blom'''<br />
| style="text-align:center;" | '''Rick de Wildt'''<br />
| style="text-align:center;" | '''Laura de Jong'''<br />
| style="text-align:center;" | '''Gosse Bijlenga'''<br />
| style="text-align:center;" | '''Luuk Poort'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | b.j.blom@student.tue.nl<br />
| style="text-align:center;" | r.h.g.w.d.wildt@student.tue.nl<br />
| style="text-align:center;" | l.s.d.jong@student.tue.nl<br />
| style="text-align:center;" | g.bijlenga@student.tue.nl<br />
| style="text-align:center;" | l.poort@student.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Internship'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Predictive Cobot Control for obstacle avoidance'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Hypothesis generation for MHT''' <br />
| style="text-align:center;" | '''Semantic World Modeling'''<br />
| style="text-align:center;" | '''Tossbot'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''31'''<br />
| style="text-align:center;" | '''32'''<br />
| style="text-align:center;" | '''33'''<br />
| style="text-align:center;" | '''34'''<br />
| style="text-align:center;" | '''35'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 45%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Bas Straatman'''<br />
| style="text-align:center;" | '''Lex van Dommelen'''<br />
| style="text-align:center;" | ''' Cedric van Ruler'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | s.r.t.straatman@student.tue.nl<br />
| style="text-align:center;" | a.j.v.dommelen@student.tue.nl<br />
| style="text-align:center;" | 363430@student.fontys.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''MSc Thesis'''<br />
| style="text-align:center;" | '''MSc Thesis'''<br />
| style="text-align:center;" | '''Afstudeerstage'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Augmented Reality for Knee Implant Placement Surgery'''<br />
| style="text-align:center;" | '''RoPod'''<br />
| style="text-align:center;" | '''Project MO'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''36'''<br />
| style="text-align:center;" | '''37'''<br />
| style="text-align:center;" | '''38'''<br />
|}<br />
</center><br />
<br />
== Tech United MSL BEP Projects ==<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center;" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | -<br />
<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Bachelor End Project'''<br />
<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''Tech United MSL FlexDesk'''<br />
<br />
|-<br />
! scope="row"| Supervisor<br />
| style="text-align:center;" | -<br />
<br />
|-<br />
|}<br />
</center><br />
<br />
== Tech United @Home BEP Projects ==<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''Tech United @Home FlexDesk'''<br />
|-<br />
! scope="row"| Supervisor<br />
| style="text-align:center;" | -<br />
|-<br />
|}<br />
</center><br />
<br />
== Robotics Research Lab - Wall of Fame ==<br />
In this Wall of Fame all the students that have achieved their Master's Thesis within the Robotics Research Lab will be remembered. <br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:roos.png|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WHoutman.JPG|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Rozemarijn Weijers'''<br />
| style="text-align:center;" | '''Wouter Houtman'''<br />
| style="text-align:center;" | '''Freek Ramp'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''EureyeCase: retinal structure recognition in images reconstructed from OCT A-scans'''<br />
| style="text-align:center;" | '''EureyeCase: Viscoelastic Modeling of Porcine Eyes for Membrane Peeling Purposes'''<br />
| style="text-align:center;" | ''' '''<br />
|-<br />
! scope="row"| Report<br />
| style="text-align:center;" | [[File:Report_Rozemarijn.pdf]]<br />
| style="text-align:center;" | [[File:Report_Wouter.pdf]] <br />
| style="text-align:center;" | [[File:Report_Freek.pdf]] <br />
|-<br />
! scope="row"| Presentation<br />
| style="text-align:center;" | [[File:Presentation_Rozemarijn.pdf]] <br />
| style="text-align:center;" | [[File:Presentation_Wouter.pdf]] <br />
| style="text-align:center;" | [[File:Presentation_Freek.pdf]] <br />
|-<br />
|}<br />
</center></div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Robotics_Lab_Map&diff=103979Robotics Lab Map2020-07-14T09:33:54Z<p>S131974: /* Students */</p>
<hr />
<div>[[File:Floorplan_robotics_lab_new.png]]<br />
<br />
== Tech United FlexDesks ==<br />
For the Bachelor End Project-students we have reserved four desks for the MSL-team (''Tech United MSL FlexDesks'') and four desks for the @Home-team (''Tech United @Home FlexDesks''). As these are flexdesks you ''do not'' own a desk, just find a Flexdesk when you enter. Because of this, these desks have to be empty and clean when you are done working!<br />
<br />
'''Tech United MSL FlexDesks:''' ''35-38''<br />
<br />
'''Tech United @Home FlexDesks:''' ''11-14''<br />
<br />
== Employees ==<br />
<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:JesseScholtes.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:YanickDouven.png|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WouterKuijpersWiki.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Jesse Scholtes'''<br />
| style="text-align:center;" | '''Roy Cobbenhagen'''<br />
| style="text-align:center;" | '''Yanick Douven'''<br />
| style="text-align:center;" | '''Wouter Kuijpers'''<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | j dot scholtes (at) tue dot nl<br />
| style="text-align:center;" | a dot t dot j dot r dot cobbenhagen (at) tue dot nl<br />
| style="text-align:center;" | y dot g dot m dot douven (at) tue dot nl<br />
| style="text-align:center;" | W dot J dot P dot Kuijpers (at) tue dot nl<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Project Management'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Various'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''EurEyeCase'''<br />
| style="text-align:center;" | '''LED it Be 50%'''<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''1'''<br />
| style="text-align:center;" | '''2'''<br />
| style="text-align:center;" | '''3'''<br />
| style="text-align:center;" | '''4'''<br />
| style="text-align:center;" | '''5'''<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MDolatabadi.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WHoutman.JPG|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:CLopez.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Jos Elfring'''<br />
| style="text-align:center;" | '''Marzieh Dolatabadi'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''Wouter Houtman'''<br />
| style="text-align:center;" | '''Cesar A. Lopez M.'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | <br />
| style="text-align:center;" | <br />
| style="text-align:center;" | W dot Houtman (at) tue dot nl <br />
| style="text-align:center;" | c dot a dot lopez dot martinez dot (at) tue dot nl<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Part-Time Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''Postdoctoral Researcher'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''TNO'''<br />
| style="text-align:center;" | '''autopilot'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''RoPod'''<br />
| style="text-align:center;" | '''RoPod'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''6'''<br />
| style="text-align:center;" | '''7'''<br />
| style="text-align:center;" | '''8'''<br />
| style="text-align:center;" | '''9'''<br />
| style="text-align:center;" | '''10'''<br />
|}<br />
</center><br />
<br />
== Students ==<br />
<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | Kevin Jebbink<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | Martijn Schipper<br />
| style="text-align:center;" | Tushar Sharma<br />
| style="text-align:center;" | '''Remco van Doorn'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | k.s.jebbink@student.tue.nl<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | m.a.schipper@student.tue.nl<br />
| style="text-align:center;" | t.sharma@student.tue.nl<br />
| style="text-align:center;" | r.r.g.c.v.doorn@student.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Bachelor End Project'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''EUTAFT: Autonomous Football Table'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Sonar Analysis for Mobile Robots'''<br />
| style="text-align:center;" | '''FlexCRAFT Project: Contactless stem detection for a tomato plant '''<br />
| style="text-align:center;" | '''Robotics in construction'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''11'''<br />
| style="text-align:center;" | '''12'''<br />
| style="text-align:center;" | '''13'''<br />
| style="text-align:center;" | '''14'''<br />
| style="text-align:center;" | '''15'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''William Schattevoet'''<br />
| style="text-align:center;" | '''Stan den Hartog'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Lars Janssen'''<br />
| style="text-align:center;" | '''Daniël Bos'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | '''w.s.a.l.schattevoet@student.tue.nl''' <br />
| style="text-align:center;" | c.m.d.hartog@student.tue.nl<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | l.g.l.janssen@student.tue.nl<br />
| style="text-align:center;" | d.j.m.bos@student.tue.nl<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Internship'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Assisted Guitarpicking'''<br />
| style="text-align:center;" | '''semantic MHT of a tomato plant'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Something with robotics'''<br />
| style="text-align:center;" | '''Automatic flower counting using Multiple Hypothesis Tracking'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''16'''<br />
| style="text-align:center;" | '''17'''<br />
| style="text-align:center;" | '''18'''<br />
| style="text-align:center;" | '''19'''<br />
| style="text-align:center;" | '''20'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Ruben Beumer'''<br />
| style="text-align:center;" | '''Milan Haverlag'''<br />
| style="text-align:center;" | '''Sander Arts'''<br />
| style="text-align:center;" | '''Peter van Dooren'''<br />
| style="text-align:center;" | '''Winston Mendonca'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | '''r.m.beumer@student.tue.nl'''<br />
| style="text-align:center;" | '''m.a.haverlag@student.tue.nl'''<br />
| style="text-align:center;" | '''a.j.m.arts@student.tue.nl'''<br />
| style="text-align:center;" | '''p.v.dooren@student.tue.nl'''<br />
| style="text-align:center;" | '''w.mendonca@student.tue.nl'''<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''ROPOD'''<br />
| style="text-align:center;" | '''FAST project'''<br />
| style="text-align:center;" | '''Surgical Tool Localization in Augmented Reality Knee Surgery'''<br />
| style="text-align:center;" | '''Action planning for a service robot'''<br />
| style="text-align:center;" | '''FlexCRAFT Project: Motion Control for Robotic Arm'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''21'''<br />
| style="text-align:center;" | '''22'''<br />
| style="text-align:center;" | '''23'''<br />
| style="text-align:center;" | '''24'''<br />
| style="text-align:center;" | '''25'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MatthijsvdBurgh.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Josja Geijsberts'''<br />
| style="text-align:center;" | '''Marc Meijer'''<br />
| style="text-align:center;" | '''Jet van den Broek'''<br />
| style="text-align:center;" | '''Matthijs van der Burgh'''<br />
| style="text-align:center;" | '''Robbert Louwers'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | j dot geijsberts (at) student dot tue dot nl<br />
| style="text-align:center;" | '''m.f.meijer@student.tue.nl'''<br />
| style="text-align:center;" | '''j.e.v.d.broek@student.tue.nl'''<br />
| style="text-align:center;" | m dot f dot m dot b dot v dot d dot burgh (at) student dot tue dot nl<br />
| style="text-align:center;" | r dot louwers (at) student dot tue dot nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | Autonomous Generic Door Opening<br />
| style="text-align:center;" | '''Dynamic environment reconstruction for Cobot Control'''<br />
| style="text-align:center;" | '''Data science in precision farming '''<br />
| style="text-align:center;" | '''RoPod: Semantic localisation'''<br />
| style="text-align:center;" | '''RoPod'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''26'''<br />
| style="text-align:center;" | '''27'''<br />
| style="text-align:center;" | '''28'''<br />
| style="text-align:center;" | '''29'''<br />
| style="text-align:center;" | '''30'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Bas Blom'''<br />
| style="text-align:center;" | '''Rick de Wildt'''<br />
| style="text-align:center;" | '''Laura de Jong'''<br />
| style="text-align:center;" | '''Gosse Bijlenga'''<br />
| style="text-align:center;" | '''Luuk Poort'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | b.j.blom@student.tue.nl<br />
| style="text-align:center;" | r.h.g.w.d.wildt@student.tue.nl<br />
| style="text-align:center;" | l.s.d.jong@student.tue.nl<br />
| style="text-align:center;" | g.bijlenga@student.tue.nl<br />
| style="text-align:center;" | l.poort@student.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Internship'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Predictive Cobot Control for obstacle avoidance'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Hypothesis generation for MHT''' <br />
| style="text-align:center;" | '''Semantic World Modeling'''<br />
| style="text-align:center;" | '''Tossbot'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''31'''<br />
| style="text-align:center;" | '''32'''<br />
| style="text-align:center;" | '''33'''<br />
| style="text-align:center;" | '''34'''<br />
| style="text-align:center;" | '''35'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 45%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Bas Straatman'''<br />
| style="text-align:center;" | '''Lex van Dommelen'''<br />
| style="text-align:center;" | ''' Cedric van Ruler'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | s.r.t.straatman@student.tue.nl<br />
| style="text-align:center;" | a.j.v.dommelen@student.tue.nl<br />
| style="text-align:center;" | 363430@student.fontys.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''MSc Thesis'''<br />
| style="text-align:center;" | '''MSc Thesis'''<br />
| style="text-align:center;" | '''Afstudeerstage'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Augmented Reality for Knee Implant Placement Surgery'''<br />
| style="text-align:center;" | '''RoPod'''<br />
| style="text-align:center;" | '''Project MO'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''36'''<br />
| style="text-align:center;" | '''37'''<br />
| style="text-align:center;" | '''38'''<br />
|}<br />
</center><br />
<br />
== Tech United MSL BEP Projects ==<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center;" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | -<br />
<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Bachelor End Project'''<br />
<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''Tech United MSL FlexDesk'''<br />
<br />
|-<br />
! scope="row"| Supervisor<br />
| style="text-align:center;" | -<br />
<br />
|-<br />
|}<br />
</center><br />
<br />
== Tech United @Home BEP Projects ==<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''Tech United @Home FlexDesk'''<br />
|-<br />
! scope="row"| Supervisor<br />
| style="text-align:center;" | -<br />
|-<br />
|}<br />
</center><br />
<br />
== Robotics Research Lab - Wall of Fame ==<br />
In this Wall of Fame all the students that have achieved their Master's Thesis within the Robotics Research Lab will be remembered. <br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:roos.png|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WHoutman.JPG|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Rozemarijn Weijers'''<br />
| style="text-align:center;" | '''Wouter Houtman'''<br />
| style="text-align:center;" | '''Freek Ramp'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''EureyeCase: retinal structure recognition in images reconstructed from OCT A-scans'''<br />
| style="text-align:center;" | '''EureyeCase: Viscoelastic Modeling of Porcine Eyes for Membrane Peeling Purposes'''<br />
| style="text-align:center;" | ''' '''<br />
|-<br />
! scope="row"| Report<br />
| style="text-align:center;" | [[File:Report_Rozemarijn.pdf]]<br />
| style="text-align:center;" | [[File:Report_Wouter.pdf]] <br />
| style="text-align:center;" | [[File:Report_Freek.pdf]] <br />
|-<br />
! scope="row"| Presentation<br />
| style="text-align:center;" | [[File:Presentation_Rozemarijn.pdf]] <br />
| style="text-align:center;" | [[File:Presentation_Wouter.pdf]] <br />
| style="text-align:center;" | [[File:Presentation_Freek.pdf]] <br />
|-<br />
|}<br />
</center></div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Robotics_Lab_Map&diff=81534Robotics Lab Map2020-01-14T08:06:14Z<p>S131974: /* Students */</p>
<hr />
<div>[[File:Floorplan_robotics_lab_new.png]]<br />
<br />
== Tech United FlexDesks ==<br />
For the Bachelor End Project-students we have reserved four desks for the MSL-team (''Tech United MSL FlexDesks'') and four desks for the @Home-team (''Tech United @Home FlexDesks''). As these are flexdesks you ''do not'' own a desk, just find a Flexdesk when you enter. Because of this, these desks have to be empty and clean when you are done working!<br />
<br />
'''Tech United MSL FlexDesks:''' ''35-38''<br />
<br />
'''Tech United @Home FlexDesks:''' ''11-14''<br />
<br />
== Employees ==<br />
<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:JesseScholtes.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:YanickDouven.png|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WouterKuijpersWiki.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Jesse Scholtes'''<br />
| style="text-align:center;" | '''Roy Cobbenhagen'''<br />
| style="text-align:center;" | '''Yanick Douven'''<br />
| style="text-align:center;" | '''Wouter Kuijpers'''<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | j dot scholtes (at) tue dot nl<br />
| style="text-align:center;" | a dot t dot j dot r dot cobbenhagen (at) tue dot nl<br />
| style="text-align:center;" | y dot g dot m dot douven (at) tue dot nl<br />
| style="text-align:center;" | W dot J dot P dot Kuijpers (at) tue dot nl<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Project Management'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Various'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''EurEyeCase'''<br />
| style="text-align:center;" | '''LED it Be 50%'''<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''1'''<br />
| style="text-align:center;" | '''2'''<br />
| style="text-align:center;" | '''3'''<br />
| style="text-align:center;" | '''4'''<br />
| style="text-align:center;" | '''5'''<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MDolatabadi.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WHoutman.JPG|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:CLopez.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Jos Elfring'''<br />
| style="text-align:center;" | '''Marzieh Dolatabadi'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''Wouter Houtman'''<br />
| style="text-align:center;" | '''Cesar A. Lopez M.'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | <br />
| style="text-align:center;" | <br />
| style="text-align:center;" | W dot Houtman (at) tue dot nl <br />
| style="text-align:center;" | c dot a dot lopez dot martinez dot (at) tue dot nl<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Part-Time Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''Postdoctoral Researcher'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''TNO'''<br />
| style="text-align:center;" | '''autopilot'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''RoPod'''<br />
| style="text-align:center;" | '''RoPod'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''6'''<br />
| style="text-align:center;" | '''7'''<br />
| style="text-align:center;" | '''8'''<br />
| style="text-align:center;" | '''9'''<br />
| style="text-align:center;" | '''10'''<br />
|}<br />
</center><br />
<br />
== Students ==<br />
<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | <br />
| style="text-align:center;" | Martijn Schipper<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''Remco van Doorn'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | <br />
| style="text-align:center;" |<br />
| style="text-align:center;" | m.a.schipper@student.tue.nl<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | r.r.g.c.v.doorn@student.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Tech United Flex Desk'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Bachelor End Project'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Tech United @Home'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Sonar Analysis for Mobile Robots'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''Robotics in construction'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''11'''<br />
| style="text-align:center;" | '''12'''<br />
| style="text-align:center;" | '''13'''<br />
| style="text-align:center;" | '''14'''<br />
| style="text-align:center;" | '''15'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''William Schattevoet'''<br />
| style="text-align:center;" | '''Stan den Hartog'''<br />
| style="text-align:center;" | '''Maarten Jongeneel'''<br />
| style="text-align:center;" | '''Lars Janssen'''<br />
| style="text-align:center;" | '''Daniël Bos'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | '''w.s.a.l.schattevoet@student.tue.nl''' <br />
| style="text-align:center;" | c.m.d.hartog@student.tue.nl<br />
| style="text-align:center;" | m.j.jongeneel@student.tue.nl<br />
| style="text-align:center;" | l.g.l.janssen@student.tue.nl<br />
| style="text-align:center;" | d.j.m.bos@student.tue.nl<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Internship'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Assisted Guitarpicking'''<br />
| style="text-align:center;" | '''semantic MHT of a tomato plant'''<br />
| style="text-align:center;" | '''Object tracking'''<br />
| style="text-align:center;" | '''Something with robotics'''<br />
| style="text-align:center;" | '''Automatic flower counting using Multiple Hypothesis Tracking'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''16'''<br />
| style="text-align:center;" | '''17'''<br />
| style="text-align:center;" | '''18'''<br />
| style="text-align:center;" | '''19'''<br />
| style="text-align:center;" | '''20'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''Milan Haverlag'''<br />
| style="text-align:center;" | '''Sander Arts'''<br />
| style="text-align:center;" | '''Peter van Dooren'''<br />
| style="text-align:center;" | '''Sjoerd Tunissen'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''m.a.haverlag@student.tue.nl'''<br />
| style="text-align:center;" | '''a.j.m.arts@student.tue.nl'''<br />
| style="text-align:center;" | '''p.v.dooren@student.tue.nl'''<br />
| style="text-align:center;" | '''s.a.m.tunissen@student.tue.nl'''<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''FAST project'''<br />
| style="text-align:center;" | '''Surgical Tool Localization in Augmented Reality Knee Surgery'''<br />
| style="text-align:center;" | '''Action planning for a service robot'''<br />
| style="text-align:center;" | '''Heartbeat and breathing detection in in-eye OCT distance measurements'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''21'''<br />
| style="text-align:center;" | '''22'''<br />
| style="text-align:center;" | '''23'''<br />
| style="text-align:center;" | '''24'''<br />
| style="text-align:center;" | '''25'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MatthijsvdBurgh.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Josja Geijsberts'''<br />
| style="text-align:center;" | '''Marc Meijer'''<br />
| style="text-align:center;" | '''Jet van den Broek'''<br />
| style="text-align:center;" | '''Matthijs van der Burgh'''<br />
| style="text-align:center;" | '''Robbert Louwers'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | j dot geijsberts (at) student dot tue dot nl<br />
| style="text-align:center;" | '''m.f.meijer@student.tue.nl'''<br />
| style="text-align:center;" | '''j.e.v.d.broek@student.tue.nl'''<br />
| style="text-align:center;" | m dot f dot m dot b dot v dot d dot burgh (at) student dot tue dot nl<br />
| style="text-align:center;" | r dot louwers (at) student dot tue dot nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | Autonomous Generic Door Opening<br />
| style="text-align:center;" | '''Dynamic environment reconstruction for Cobot Control'''<br />
| style="text-align:center;" | '''Data science in precision farming '''<br />
| style="text-align:center;" | '''RoPod: Semantic localisation'''<br />
| style="text-align:center;" | '''RoPod'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''26'''<br />
| style="text-align:center;" | '''27'''<br />
| style="text-align:center;" | '''28'''<br />
| style="text-align:center;" | '''29'''<br />
| style="text-align:center;" | '''30'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Bas Blom'''<br />
| style="text-align:center;" | '''Rick de Wildt'''<br />
| style="text-align:center;" | '''Laura de Jong'''<br />
| style="text-align:center;" | '''Gosse Bijlenga'''<br />
| style="text-align:center;" | '''Luuk Poort'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | b.j.blom@student.tue.nl<br />
| style="text-align:center;" | r.h.g.w.d.wildt@student.tue.nl<br />
| style="text-align:center;" | l.s.d.jong@student.tue.nl<br />
| style="text-align:center;" | g.bijlenga@student.tue.nl<br />
| style="text-align:center;" | l.poort@student.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Internship'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Predictive Cobot Control for obstacle avoidance'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Hypothesis generation for MHT''' <br />
| style="text-align:center;" | '''Semantic World Modeling'''<br />
| style="text-align:center;" | '''Tossbot'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''31'''<br />
| style="text-align:center;" | '''32'''<br />
| style="text-align:center;" | '''33'''<br />
| style="text-align:center;" | '''34'''<br />
| style="text-align:center;" | '''35'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 45%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Bas Straatman'''<br />
| style="text-align:center;" | '''Lex van Dommelen'''<br />
| style="text-align:center;" | '''Joeri Roelofs'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | s.r.t.straatman@student.tue.nl<br />
| style="text-align:center;" | a.j.v.dommelen@student.tue.nl<br />
| style="text-align:center;" | j.roelofs@student.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''MSc Thesis'''<br />
| style="text-align:center;" | '''MSc Thesis'''<br />
| style="text-align:center;" | '''MSc Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Augmented Reality for Knee Implant Placement Surgery'''<br />
| style="text-align:center;" | '''RoPod'''<br />
| style="text-align:center;" | '''Farm Simulator'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''36'''<br />
| style="text-align:center;" | '''37'''<br />
| style="text-align:center;" | '''38'''<br />
|}<br />
</center><br />
<br />
== Tech United MSL BEP Projects ==<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center;" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | -<br />
<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Bachelor End Project'''<br />
<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''Tech United MSL FlexDesk'''<br />
<br />
|-<br />
! scope="row"| Supervisor<br />
| style="text-align:center;" | -<br />
<br />
|-<br />
|}<br />
</center><br />
<br />
== Tech United @Home BEP Projects ==<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''Tech United @Home FlexDesk'''<br />
|-<br />
! scope="row"| Supervisor<br />
| style="text-align:center;" | -<br />
|-<br />
|}<br />
</center><br />
<br />
== Robotics Research Lab - Wall of Fame ==<br />
In this Wall of Fame all the students that have achieved their Master's Thesis within the Robotics Research Lab will be remembered. <br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:roos.png|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WHoutman.JPG|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Rozemarijn Weijers'''<br />
| style="text-align:center;" | '''Wouter Houtman'''<br />
| style="text-align:center;" | '''Freek Ramp'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''EureyeCase: retinal structure recognition in images reconstructed from OCT A-scans'''<br />
| style="text-align:center;" | '''EureyeCase: Viscoelastic Modeling of Porcine Eyes for Membrane Peeling Purposes'''<br />
| style="text-align:center;" | ''' '''<br />
|-<br />
! scope="row"| Report<br />
| style="text-align:center;" | [[File:Report_Rozemarijn.pdf]]<br />
| style="text-align:center;" | [[File:Report_Wouter.pdf]] <br />
| style="text-align:center;" | [[File:Report_Freek.pdf]] <br />
|-<br />
! scope="row"| Presentation<br />
| style="text-align:center;" | [[File:Presentation_Rozemarijn.pdf]] <br />
| style="text-align:center;" | [[File:Presentation_Wouter.pdf]] <br />
| style="text-align:center;" | [[File:Presentation_Freek.pdf]] <br />
|-<br />
|}<br />
</center></div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Robotics_Lab_Map&diff=81533Robotics Lab Map2020-01-14T08:02:52Z<p>S131974: /* Students */</p>
<hr />
<div>[[File:Floorplan_robotics_lab_new.png]]<br />
<br />
== Tech United FlexDesks ==<br />
For the Bachelor End Project-students we have reserved four desks for the MSL-team (''Tech United MSL FlexDesks'') and four desks for the @Home-team (''Tech United @Home FlexDesks''). As these are flexdesks you ''do not'' own a desk, just find a Flexdesk when you enter. Because of this, these desks have to be empty and clean when you are done working!<br />
<br />
'''Tech United MSL FlexDesks:''' ''35-38''<br />
<br />
'''Tech United @Home FlexDesks:''' ''11-14''<br />
<br />
== Employees ==<br />
<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:JesseScholtes.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:YanickDouven.png|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WouterKuijpersWiki.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Jesse Scholtes'''<br />
| style="text-align:center;" | '''Roy Cobbenhagen'''<br />
| style="text-align:center;" | '''Yanick Douven'''<br />
| style="text-align:center;" | '''Wouter Kuijpers'''<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | j dot scholtes (at) tue dot nl<br />
| style="text-align:center;" | a dot t dot j dot r dot cobbenhagen (at) tue dot nl<br />
| style="text-align:center;" | y dot g dot m dot douven (at) tue dot nl<br />
| style="text-align:center;" | W dot J dot P dot Kuijpers (at) tue dot nl<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Project Management'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Various'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''EurEyeCase'''<br />
| style="text-align:center;" | '''LED it Be 50%'''<br />
| style="text-align:center;" | <br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''1'''<br />
| style="text-align:center;" | '''2'''<br />
| style="text-align:center;" | '''3'''<br />
| style="text-align:center;" | '''4'''<br />
| style="text-align:center;" | '''5'''<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MDolatabadi.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WHoutman.JPG|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:CLopez.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Jos Elfring'''<br />
| style="text-align:center;" | '''Marzieh Dolatabadi'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''Wouter Houtman'''<br />
| style="text-align:center;" | '''Cesar A. Lopez M.'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | <br />
| style="text-align:center;" | <br />
| style="text-align:center;" | W dot Houtman (at) tue dot nl <br />
| style="text-align:center;" | c dot a dot lopez dot martinez dot (at) tue dot nl<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Part-Time Researcher'''<br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''PhD Researcher'''<br />
| style="text-align:center;" | '''Postdoctoral Researcher'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''TNO'''<br />
| style="text-align:center;" | '''autopilot'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''RoPod'''<br />
| style="text-align:center;" | '''RoPod'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''6'''<br />
| style="text-align:center;" | '''7'''<br />
| style="text-align:center;" | '''8'''<br />
| style="text-align:center;" | '''9'''<br />
| style="text-align:center;" | '''10'''<br />
|}<br />
</center><br />
<br />
== Students ==<br />
<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | <br />
| style="text-align:center;" | Martijn Schipper<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''Remco van Doorn'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | <br />
| style="text-align:center;" |<br />
| style="text-align:center;" | m.a.schipper@student.tue.nl<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | r.r.g.c.v.doorn@student.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Tech United Flex Desk'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Bachelor End Project'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Tech United @Home'''<br />
| style="text-align:center;" |<br />
| style="text-align:center;" | '''Sonar Analysis for Mobile Robots'''<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''Robotics in construction'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''11'''<br />
| style="text-align:center;" | '''12'''<br />
| style="text-align:center;" | '''13'''<br />
| style="text-align:center;" | '''14'''<br />
| style="text-align:center;" | '''15'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''William Schattevoet'''<br />
| style="text-align:center;" | '''Stan den Hartog'''<br />
| style="text-align:center;" | '''Maarten Jongeneel'''<br />
| style="text-align:center;" | '''Lars Janssen'''<br />
| style="text-align:center;" | '''Daniël Bos'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | '''w.s.a.l.schattevoet@student.tue.nl''' <br />
| style="text-align:center;" | c.m.d.hartog@student.tue.nl<br />
| style="text-align:center;" | m.j.jongeneel@student.tue.nl<br />
| style="text-align:center;" | l.g.l.janssen@student.tue.nl<br />
| style="text-align:center;" | d.j.m.bos@student.tue.nl<br />
|-<br />
! scope="row"| Function<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Internship'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Assisted Guitarpicking'''<br />
| style="text-align:center;" | '''semantic MHT of a tomato plant'''<br />
| style="text-align:center;" | '''Object tracking'''<br />
| style="text-align:center;" | '''Something with robotics'''<br />
| style="text-align:center;" | '''Automatic flower counting using Multiple Hypothesis Tracking'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''16'''<br />
| style="text-align:center;" | '''17'''<br />
| style="text-align:center;" | '''18'''<br />
| style="text-align:center;" | '''19'''<br />
| style="text-align:center;" | '''20'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''Milan Haverlag'''<br />
| style="text-align:center;" | '''Sander Arts'''<br />
| style="text-align:center;" | '''Peter van Dooren'''<br />
| style="text-align:center;" | '''Sjoerd Tunissen'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''m.a.haverlag@student.tue.nl'''<br />
| style="text-align:center;" | '''a.j.m.arts@student.tue.nl'''<br />
| style="text-align:center;" | '''p.v.dooren@student.tue.nl'''<br />
| style="text-align:center;" | '''s.a.m.tunissen@student.tue.nl'''<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | <br />
| style="text-align:center;" | '''FAST project'''<br />
| style="text-align:center;" | '''Surgical Tool Localization in Augmented Reality Knee Surgery'''<br />
| style="text-align:center;" | '''Action planning for a service robot'''<br />
| style="text-align:center;" | '''Heartbeat and breathing detection in in-eye OCT distance measurements'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''21'''<br />
| style="text-align:center;" | '''22'''<br />
| style="text-align:center;" | '''23'''<br />
| style="text-align:center;" | '''24'''<br />
| style="text-align:center;" | '''25'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:MatthijsvdBurgh.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Josja Geijsberts'''<br />
| style="text-align:center;" | '''Marc Meijer'''<br />
| style="text-align:center;" | '''Jet van den Broek'''<br />
| style="text-align:center;" | '''Matthijs van der Burgh'''<br />
| style="text-align:center;" | '''Robbert Louwers'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | j dot geijsberts (at) student dot tue dot nl<br />
| style="text-align:center;" | '''m.f.meijer@student.tue.nl'''<br />
| style="text-align:center;" | '''j.e.v.d.broek@student.tue.nl'''<br />
| style="text-align:center;" | m dot f dot m dot b dot v dot d dot burgh (at) student dot tue dot nl<br />
| style="text-align:center;" | r dot louwers (at) student dot tue dot nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | Autonomous Generic Door Opening<br />
| style="text-align:center;" | '''Dynamic environment reconstruction for Cobot Control'''<br />
| style="text-align:center;" | '''Data science in precision farming '''<br />
| style="text-align:center;" | '''RoPod: Semantic localisation'''<br />
| style="text-align:center;" | '''RoPod'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''26'''<br />
| style="text-align:center;" | '''27'''<br />
| style="text-align:center;" | '''28'''<br />
| style="text-align:center;" | '''29'''<br />
| style="text-align:center;" | '''30'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 75%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Bas Blom'''<br />
| style="text-align:center;" | '''Rick de Wildt'''<br />
| style="text-align:center;" | '''Laura de Jong'''<br />
| style="text-align:center;" | '''Gosse Bijlenga'''<br />
| style="text-align:center;" | '''Luuk Poort'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | b.j.blom@student.tue.nl<br />
| style="text-align:center;" | r.h.g.w.d.wildt@student.tue.nl<br />
| style="text-align:center;" | l.s.d.jong@student.tue.nl<br />
| style="text-align:center;" | g.bijlenga@student.tue.nl<br />
| style="text-align:center;" | l.poort@student.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
| style="text-align:center;" | '''Internship'''<br />
| style="text-align:center;" | '''Master's Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Predictive Cobot Control for obstacle avoidance'''<br />
| style="text-align:center;" | '''-'''<br />
| style="text-align:center;" | '''Hypothesis generation for MHT''' <br />
| style="text-align:center;" | '''Semantic World Modeling'''<br />
| style="text-align:center;" | '''Tossbot'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''31'''<br />
| style="text-align:center;" | '''32'''<br />
| style="text-align:center;" | '''33'''<br />
| style="text-align:center;" | '''34'''<br />
| style="text-align:center;" | '''35'''<br />
|}<br />
</center><br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 45%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Bas Straatman'''<br />
| style="text-align:center;" | '''Lex van Dommelen'''<br />
| style="text-align:center;" | '''Joeri Roelofs'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | s.r.t.straatman@student.tue.nl<br />
| style="text-align:center;" | a.j.v.dommelen@student.tue.nl<br />
| style="text-align:center;" | j.roelofs@student.tue.nl<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''MSc Thesis'''<br />
| style="text-align:center;" | '''MSc Thesis'''<br />
| style="text-align:center;" | '''MSc Thesis'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''Augmented Reality for Knee Implant Placement Surgery'''<br />
| style="text-align:center;" | '''RoPod'''<br />
| style="text-align:center;" | '''Farm Simulator'''<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''36'''<br />
| style="text-align:center;" | '''37'''<br />
| style="text-align:center;" | '''38'''<br />
|}<br />
</center><br />
<br />
== Tech United MSL BEP Projects ==<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center;" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | -<br />
<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''Bachelor End Project'''<br />
<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''Tech United MSL FlexDesk'''<br />
<br />
|-<br />
! scope="row"| Supervisor<br />
| style="text-align:center;" | -<br />
<br />
|-<br />
|}<br />
</center><br />
<br />
== Tech United @Home BEP Projects ==<br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:emptyAMIGO.jpg|250x250px|]]<br />
<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| E-mail<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Project Level<br />
| style="text-align:center;" | '''-'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | -<br />
|-<br />
! scope="row"| Desk<br />
| style="text-align:center;" | '''Tech United @Home FlexDesk'''<br />
|-<br />
! scope="row"| Supervisor<br />
| style="text-align:center;" | -<br />
|-<br />
|}<br />
</center><br />
<br />
== Robotics Research Lab - Wall of Fame ==<br />
In this Wall of Fame all the students that have achieved their Master's Thesis within the Robotics Research Lab will be remembered. <br />
<center><br />
{| border="1" cellpadding="4" cellspacing="0" style="margin: 1em 1em 1em 0; width: 20%; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse"<br />
|-<br />
! <br />
| style="text-align:center; width: 15%" | [[File:roos.png|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:WHoutman.JPG|250x250px|]]<br />
| style="text-align:center; width: 15%" | [[File:emptyTURTLE.jpg|250x250px|]]<br />
|-<br />
! scope="row"| Name<br />
| style="text-align:center;" | '''Rozemarijn Weijers'''<br />
| style="text-align:center;" | '''Wouter Houtman'''<br />
| style="text-align:center;" | '''Freek Ramp'''<br />
|-<br />
! scope="row"| Project<br />
| style="text-align:center;" | '''EureyeCase: retinal structure recognition in images reconstructed from OCT A-scans'''<br />
| style="text-align:center;" | '''EureyeCase: Viscoelastic Modeling of Porcine Eyes for Membrane Peeling Purposes'''<br />
| style="text-align:center;" | ''' '''<br />
|-<br />
! scope="row"| Report<br />
| style="text-align:center;" | [[File:Report_Rozemarijn.pdf]]<br />
| style="text-align:center;" | [[File:Report_Wouter.pdf]] <br />
| style="text-align:center;" | [[File:Report_Freek.pdf]] <br />
|-<br />
! scope="row"| Presentation<br />
| style="text-align:center;" | [[File:Presentation_Rozemarijn.pdf]] <br />
| style="text-align:center;" | [[File:Presentation_Wouter.pdf]] <br />
| style="text-align:center;" | [[File:Presentation_Freek.pdf]] <br />
|-<br />
|}<br />
</center></div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2019&diff=76717Embedded Motion Control 20192019-06-05T09:49:22Z<p>S131974: /* Week 22 + 23 */</p>
<hr />
<div><div align="center"><br />
<font size="4">'PICO in the Hospital'</font><br />
</div><br />
[[File:Gostai-Jazz-500x500.jpg|center|thumb|350px]]<br />
<br />
----<br />
<br />
= Introduction =<br />
This course is about software design and how to apply this in the context of autonomous robots. The accompanying assignment is about applying this knowledge to a real-life robotics task.<br />
<br />
= Course Schedule and Lecture Slides =<br />
Lectures will be given on Wednesdays from 15.30h-17.30h in Traverse van Trierzaal, except the Lecture on Wednesday may 22nd, which will be given in GEM-Z 0.05. <span style="color:red">The special lectures at May 10th and June 7th will take place at GEM-Z 0.05!</span> The preliminary course schedule is as follows:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 5em;"<br />
|-<br />
| April 24<br />
| width="325" | Introduction by ''René van de Molengraft''<br />
| width="325" | [[Media:EMC_tooling_infrastructure_2019.pdf | Tooling and Infrastructure by ''Bob Hendrikx'' ]]<br />
|-<br />
| May 1<br />
| width="325" | [[Media:20190501-EMC-DoDont.pdf | Do’s and Don’ts in the design of a robotic software architecture" ]]by ''Herman Bruyninckx''<br />
| width="325" | <br />
|-<br />
| May 8<br />
| colspan="2" | First presentation of the design by ''the groups''. 6-minute presentation, about the group's initial design. Afterwards 4 minutes for questions.<br />
|-<br />
| <span style="color:red">May 10</span><br />
| width="325" | [https://en.wikipedia.org/wiki/Scrum_(software_development) SCRUM] & Gitlab by ''Puck Mulders'' and ''Bob Hendrikx'' [[Media:Gitlab_emc_2019.pdf |Gitlab]] [[Media:Agile_emc_2019.pdf |Agile]]<br />
| width="325" | <br />
|-<br />
| May 15<br />
| width="325" | '''Escape Room Competition'''<br />
| width="325" | Reflection Session<br />
|-<br />
| May 22<br />
| colspan="2" | <br />
* Worldmodeling for Experts by ''Wouter Houtman'' <br />
* Worldmodeling for Real Experts by ''Marzieh Dolatabadi''<br />
* Worldmodeling in practice by ''Hao Liang Chen''<br />
|-<br />
| June 5<br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| <span style="color:red">June 7</span><br />
| colspan="2" | Company Presentations<br />
|-<br />
| June 12<br />
| colspan="2" | '''Final Competition''' <br />
|-<br />
|}<br />
<br />
= Getting Started =<br />
<br />
To get started, please do the tutorials on the [[Embedded Motion Control/Tutorials | Tutorial Page]]. <!--Please note:<br />
<br />
* '''Do all tutorials, and all steps. Missing one step may cause a different behavior or incorrect working system later'''. If something is not working as expected, make sure you correctly did all previous steps.<br />
* Of course, things may still go wrong. If so, do not hesitate to contact us.<br />
<br />
* See [[Embedded_Motion_Control/Using_Pico | Using Pico]] for a quick overview of how to use Pico.<br />
--><br />
<br />
= FAQ =<br />
[[Embedded_Motion_Control_2018/FAQ | Here]] you can find a collection of Frequently Asked Questions. Please check this page before contacting the student assistants or the tutors! If you find any issues or questions you had to deal with, please add them as well so your colleagues don't run into the same problems.<br />
<br />
<br />
= Design Document = <br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with: <br />
* Requirements,<br />
* Functions,<br />
* Components,<br />
* Specifications<br />
* Interfaces.<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 6th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2019}}<br />
<br />
<br />
= Map For The Final Challenge =<br />
{{:Embedded_Motion_Control_map_2019}}<br />
<br />
<br />
=Group Wiki Pages=<br />
<br />
Group 1 - [[Embedded Motion Control 2019 Group 1 | visit wiki ]] - '''Tutor''': Wouter Kuijpers<br />
<br />
Group 2 - [[Embedded Motion Control 2019 Group 2 | visit wiki ]] - '''Tutor''': Wouter Houtman (Jordy senden in first week)<br />
<br />
Group 3 - [[Embedded Motion Control 2019 Group 3 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<br />
Group 4 - [[Embedded Motion Control 2019 Group 4 | visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
Group 5 - [[Embedded Motion Control 2019 Group 5 | visit wiki ]] - '''Tutor''': Hao Liang Chen<br />
<br />
<del>Group 6 - [[Embedded Motion Control 2019 Group 6 | visit wiki ]] - '''Tutor''': Marzieh Dolatabadi</del><br />
<br />
Group 7 - [[Embedded Motion Control 2019 Group 7 | visit wiki ]] - '''Tutor''': Yanick Douven<br />
<br />
Group 8 - [[Embedded Motion Control 2019 Group 8| visit wiki ]] - '''Tutor''': Rene & Herman<br />
<br />
Group 9 - [[Embedded Motion Control 2019 Group 9| visit wiki ]] - '''Tutor''': Marzieh Dolatabadi<br />
<br />
=Pico test schedule=<br />
- Testing takes place on the RoboCup field in Gemini-North.<br />
<br />
- Be sure you have your software on git before coming to the test session so that you only have to git clone/git pull to get your code on the robot!<br />
<br />
- Please charge the robot whenever possible so there is no down time due to empty batteries.<br />
<br />
To submit for a timeslot you have to be logged in. Through the 'edit'-button for Pico test schedule, you can select a timeslot by typing 'Group <groupnumber>' behind the desired timeslot.<br />
- Submissions are last checked the day before at 22:00.<br />
<br />
==Week 19==<br />
'''For week 19 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
'''Remark:''' Group 7 was allowed an extra time slot on Friday as they were not able to use their time slot on Thursday due to technical issues with pico.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 || 8<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || 7<br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 8-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 8-5-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 8-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 8-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 8-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 8-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 9-5-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 9-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 9-5-2019 || 11:45 - 12:40 || 9<br />
|-<br />
| 9-5-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 9-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 9-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 9-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 12:00 - 12:55 || 7<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 20==<br />
'''For week 20 each group can choose 1 time slot on Monday/Tuesday and 1 time slot on Thursday/Friday'''. Choose wisely.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 13-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 13-5-2019 || 11:45 - 12:40 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 14-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 14-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 14-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 14-5-2019 || 14:30 - 15:25 || 2<br />
|-<br />
| 14-5-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 14-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 16-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 16-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 16-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 16-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 16-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 16-5-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 16-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 16-5-2019 || 16:30 - 17:25 || 4<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 17-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 17-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 21==<br />
'''For week 21 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 21-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 21-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 21-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 21-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 22-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 22-5-2019 || 10:45 - 11:40 || 5<br />
|-<br />
| 22-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 22-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 22-5-2019 || 14:30 - 15:25 || 8<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 23-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 23-5-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 23-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 23-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 23-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 23-5-2019 || 14:30 - 15:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 24-5-2019 || 08:45 - 09:40 || <br />
|-<br />
| 24-5-2019 || 09:45 - 10:40 || 1<br />
|-<br />
| 24-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 24-5-2019 || 11:45 - 12:40 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 22 + 23==<br />
Since week 22 is shorter due to ascension day, it will not be possible for every group to test twice that week. Therefore extra slots are provided in week 23. '''Each team may choose 4 timeslots over these two weeks. Teams are allowed maximum 2 timeslots in week 22. To prevent planning issues, teams are advised to test at least for 1 timeslot in week 22.'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 27-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 27-5-2019 || 14:30 - 15:25 || 5<br />
|-<br />
| 27-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 27-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 28-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 28-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 28-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 28-5-2019 || 16:30 - 17:25 || 7<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 29-5-2019 || 08:45 - 09:40 ||<br />
|-<br />
| 29-5-2019 || 09:45 - 10:40 || 4<br />
|-<br />
| 29-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 29-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 29-5-2019 || 13:30 - 14:25 || 9<br />
|-<br />
| 29-5-2019 || 14:30 - 15:25 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 3-6-2019 || 13:30 - 14:25 || 4<br />
|-<br />
| 3-6-2019 || 14:30 - 15:25 || 1<br />
|-<br />
| 3-6-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 3-6-2019 || 16:30 - 17:25 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 4-6-2019 || 13:30 - 14:25 || 7<br />
|- <br />
| 4-6-2019 || 14:30 - 15:25 || <br />
|-<br />
| 4-6-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 4-6-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 5-6-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 5-6-2019 || 09:45 - 10:40 || <br />
|-<br />
| 5-6-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 5-6-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 5-6-2019 || 13:30 - 14:25 || 8 <br />
|-<br />
| 5-6-2019 || 14:30 - 15:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 6-6-2019 || 08:45 - 09:40 ||<br />
|-<br />
| 6-6-2019 || 09:45 - 10:40 ||<br />
|-<br />
| 6-6-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 6-6-2019 || 11:45 - 12:40 || 2<br />
|-<br />
| 6-6-2019 || 13:30 - 14:25 || 3<br />
|-<br />
| 6-6-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 6-6-2019 || 15:30 - 16:25 || 8<br />
|-<br />
| 6-6-2019 || 16:30 - 17:25 || 9<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-6-2019 || 08:45 - 09:40 || 2<br />
|-<br />
| 7-6-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 7-6-2019 || 10:45 - 11:40 || 1<br />
|-<br />
| 7-6-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 24==<br />
This is it! The week of the final challenge. '''Each team may choose 1 timeslot on Tuesday'''. Choose wisely and prepare this test well, as it is your last chance to test your code before the moment of truth.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 24 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 11-6-2019 || 08:45 - 09:40 || <br />
|-<br />
| 11-6-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 11-6-2019 || 10:45 - 11:40 || 8<br />
|-<br />
| 11-6-2019 || 11:45 - 12:40 || 5<br />
|-<br />
| 11-6-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 11-6-2019 || 14:30 - 15:25 || 1<br />
|-<br />
| 11-6-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 11-6-2019 || 16:30 - 17:25 || 7<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
=Contact Details=<br />
{{:Embedded_Motion_Control_2018/Contact_Details}}</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2019&diff=76712Embedded Motion Control 20192019-06-05T08:47:08Z<p>S131974: /* Week 22 + 23 */</p>
<hr />
<div><div align="center"><br />
<font size="4">'PICO in the Hospital'</font><br />
</div><br />
[[File:Gostai-Jazz-500x500.jpg|center|thumb|350px]]<br />
<br />
----<br />
<br />
= Introduction =<br />
This course is about software design and how to apply this in the context of autonomous robots. The accompanying assignment is about applying this knowledge to a real-life robotics task.<br />
<br />
= Course Schedule and Lecture Slides =<br />
Lectures will be given on Wednesdays from 15.30h-17.30h in Traverse van Trierzaal, except the Lecture on Wednesday may 22nd, which will be given in GEM-Z 0.05. <span style="color:red">The special lectures at May 10th and June 7th will take place at GEM-Z 0.05!</span> The preliminary course schedule is as follows:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 5em;"<br />
|-<br />
| April 24<br />
| width="325" | Introduction by ''René van de Molengraft''<br />
| width="325" | [[Media:EMC_tooling_infrastructure_2019.pdf | Tooling and Infrastructure by ''Bob Hendrikx'' ]]<br />
|-<br />
| May 1<br />
| width="325" | [[Media:20190501-EMC-DoDont.pdf | Do’s and Don’ts in the design of a robotic software architecture" ]]by ''Herman Bruyninckx''<br />
| width="325" | <br />
|-<br />
| May 8<br />
| colspan="2" | First presentation of the design by ''the groups''. 6-minute presentation, about the group's initial design. Afterwards 4 minutes for questions.<br />
|-<br />
| <span style="color:red">May 10</span><br />
| width="325" | [https://en.wikipedia.org/wiki/Scrum_(software_development) SCRUM] & Gitlab by ''Puck Mulders'' and ''Bob Hendrikx'' [[Media:Gitlab_emc_2019.pdf |Gitlab]] [[Media:Agile_emc_2019.pdf |Agile]]<br />
| width="325" | <br />
|-<br />
| May 15<br />
| width="325" | '''Escape Room Competition'''<br />
| width="325" | Reflection Session<br />
|-<br />
| May 22<br />
| colspan="2" | <br />
* Worldmodeling for Experts by ''Wouter Houtman'' <br />
* Worldmodeling for Real Experts by ''Marzieh Dolatabadi''<br />
* Worldmodeling in practice by ''Hao Liang Chen''<br />
|-<br />
| June 5<br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| <span style="color:red">June 7</span><br />
| colspan="2" | Company Presentations<br />
|-<br />
| June 12<br />
| colspan="2" | '''Final Competition''' <br />
|-<br />
|}<br />
<br />
= Getting Started =<br />
<br />
To get started, please do the tutorials on the [[Embedded Motion Control/Tutorials | Tutorial Page]]. <!--Please note:<br />
<br />
* '''Do all tutorials, and all steps. Missing one step may cause a different behavior or incorrect working system later'''. If something is not working as expected, make sure you correctly did all previous steps.<br />
* Of course, things may still go wrong. If so, do not hesitate to contact us.<br />
<br />
* See [[Embedded_Motion_Control/Using_Pico | Using Pico]] for a quick overview of how to use Pico.<br />
--><br />
<br />
= FAQ =<br />
[[Embedded_Motion_Control_2018/FAQ | Here]] you can find a collection of Frequently Asked Questions. Please check this page before contacting the student assistants or the tutors! If you find any issues or questions you had to deal with, please add them as well so your colleagues don't run into the same problems.<br />
<br />
<br />
= Design Document = <br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with: <br />
* Requirements,<br />
* Functions,<br />
* Components,<br />
* Specifications<br />
* Interfaces.<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 6th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2019}}<br />
<br />
<br />
= Map For The Final Challenge =<br />
{{:Embedded_Motion_Control_map_2019}}<br />
<br />
<br />
=Group Wiki Pages=<br />
<br />
Group 1 - [[Embedded Motion Control 2019 Group 1 | visit wiki ]] - '''Tutor''': Wouter Kuijpers<br />
<br />
Group 2 - [[Embedded Motion Control 2019 Group 2 | visit wiki ]] - '''Tutor''': Wouter Houtman (Jordy senden in first week)<br />
<br />
Group 3 - [[Embedded Motion Control 2019 Group 3 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<br />
Group 4 - [[Embedded Motion Control 2019 Group 4 | visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
Group 5 - [[Embedded Motion Control 2019 Group 5 | visit wiki ]] - '''Tutor''': Hao Liang Chen<br />
<br />
<del>Group 6 - [[Embedded Motion Control 2019 Group 6 | visit wiki ]] - '''Tutor''': Marzieh Dolatabadi</del><br />
<br />
Group 7 - [[Embedded Motion Control 2019 Group 7 | visit wiki ]] - '''Tutor''': Yanick Douven<br />
<br />
Group 8 - [[Embedded Motion Control 2019 Group 8| visit wiki ]] - '''Tutor''': Rene & Herman<br />
<br />
Group 9 - [[Embedded Motion Control 2019 Group 9| visit wiki ]] - '''Tutor''': Marzieh Dolatabadi<br />
<br />
=Pico test schedule=<br />
- Testing takes place on the RoboCup field in Gemini-North.<br />
<br />
- Be sure you have your software on git before coming to the test session so that you only have to git clone/git pull to get your code on the robot!<br />
<br />
- Please charge the robot whenever possible so there is no down time due to empty batteries.<br />
<br />
To submit for a timeslot you have to be logged in. Through the 'edit'-button for Pico test schedule, you can select a timeslot by typing 'Group <groupnumber>' behind the desired timeslot.<br />
- Submissions are last checked the day before at 22:00.<br />
<br />
==Week 19==<br />
'''For week 19 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
'''Remark:''' Group 7 was allowed an extra time slot on Friday as they were not able to use their time slot on Thursday due to technical issues with pico.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 || 8<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || 7<br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 8-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 8-5-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 8-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 8-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 8-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 8-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 9-5-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 9-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 9-5-2019 || 11:45 - 12:40 || 9<br />
|-<br />
| 9-5-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 9-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 9-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 9-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 12:00 - 12:55 || 7<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 20==<br />
'''For week 20 each group can choose 1 time slot on Monday/Tuesday and 1 time slot on Thursday/Friday'''. Choose wisely.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 13-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 13-5-2019 || 11:45 - 12:40 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 14-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 14-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 14-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 14-5-2019 || 14:30 - 15:25 || 2<br />
|-<br />
| 14-5-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 14-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 16-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 16-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 16-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 16-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 16-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 16-5-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 16-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 16-5-2019 || 16:30 - 17:25 || 4<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 17-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 17-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 21==<br />
'''For week 21 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 21-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 21-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 21-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 21-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 22-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 22-5-2019 || 10:45 - 11:40 || 5<br />
|-<br />
| 22-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 22-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 22-5-2019 || 14:30 - 15:25 || 8<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 23-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 23-5-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 23-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 23-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 23-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 23-5-2019 || 14:30 - 15:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 24-5-2019 || 08:45 - 09:40 || <br />
|-<br />
| 24-5-2019 || 09:45 - 10:40 || 1<br />
|-<br />
| 24-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 24-5-2019 || 11:45 - 12:40 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 22 + 23==<br />
Since week 22 is shorter due to ascension day, it will not be possible for every group to test twice that week. Therefore extra slots are provided in week 23. '''Each team may choose 4 timeslots over these two weeks. Teams are allowed maximum 2 timeslots in week 22. To prevent planning issues, teams are advised to test at least for 1 timeslot in week 22.'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 27-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 27-5-2019 || 14:30 - 15:25 || 5<br />
|-<br />
| 27-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 27-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 28-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 28-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 28-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 28-5-2019 || 16:30 - 17:25 || 7<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 29-5-2019 || 08:45 - 09:40 ||<br />
|-<br />
| 29-5-2019 || 09:45 - 10:40 || 4<br />
|-<br />
| 29-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 29-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 29-5-2019 || 13:30 - 14:25 || 9<br />
|-<br />
| 29-5-2019 || 14:30 - 15:25 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 3-6-2019 || 13:30 - 14:25 || 4<br />
|-<br />
| 3-6-2019 || 14:30 - 15:25 || 1<br />
|-<br />
| 3-6-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 3-6-2019 || 16:30 - 17:25 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 4-6-2019 || 13:30 - 14:25 || 7<br />
|- <br />
| 4-6-2019 || 14:30 - 15:25 || <br />
|-<br />
| 4-6-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 4-6-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 5-6-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 5-6-2019 || 09:45 - 10:40 || <br />
|-<br />
| 5-6-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 5-6-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 5-6-2019 || 13:30 - 14:25 || 8 <br />
|-<br />
| 5-6-2019 || 14:30 - 15:25 || 3<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 6-6-2019 || 08:45 - 09:40 ||<br />
|-<br />
| 6-6-2019 || 09:45 - 10:40 ||<br />
|-<br />
| 6-6-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 6-6-2019 || 11:45 - 12:40 || 2<br />
|-<br />
| 6-6-2019 || 13:30 - 14:25 || 3<br />
|-<br />
| 6-6-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 6-6-2019 || 15:30 - 16:25 || 8<br />
|-<br />
| 6-6-2019 || 16:30 - 17:25 || 9<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-6-2019 || 08:45 - 09:40 || 2<br />
|-<br />
| 7-6-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 7-6-2019 || 10:45 - 11:40 || 1<br />
|-<br />
| 7-6-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 24==<br />
This is it! The week of the final challenge. '''Each team may choose 1 timeslot on Tuesday'''. Choose wisely and prepare this test well, as it is your last chance to test your code before the moment of truth.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 24 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 11-6-2019 || 08:45 - 09:40 || <br />
|-<br />
| 11-6-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 11-6-2019 || 10:45 - 11:40 || 8<br />
|-<br />
| 11-6-2019 || 11:45 - 12:40 || 5<br />
|-<br />
| 11-6-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 11-6-2019 || 14:30 - 15:25 || 1<br />
|-<br />
| 11-6-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 11-6-2019 || 16:30 - 17:25 || 7<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
=Contact Details=<br />
{{:Embedded_Motion_Control_2018/Contact_Details}}</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2019&diff=76672Embedded Motion Control 20192019-06-04T12:09:14Z<p>S131974: </p>
<hr />
<div><div align="center"><br />
<font size="4">'PICO in the Hospital'</font><br />
</div><br />
[[File:Gostai-Jazz-500x500.jpg|center|thumb|350px]]<br />
<br />
----<br />
<br />
= Introduction =<br />
This course is about software design and how to apply this in the context of autonomous robots. The accompanying assignment is about applying this knowledge to a real-life robotics task.<br />
<br />
= Course Schedule and Lecture Slides =<br />
Lectures will be given on Wednesdays from 15.30h-17.30h in Traverse van Trierzaal, except the Lecture on Wednesday may 22nd, which will be given in GEM-Z 0.05. <span style="color:red">The special lectures at May 10th and June 7th will take place at GEM-Z 0.05!</span> The preliminary course schedule is as follows:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 5em;"<br />
|-<br />
| April 24<br />
| width="325" | Introduction by ''René van de Molengraft''<br />
| width="325" | [[Media:EMC_tooling_infrastructure_2019.pdf | Tooling and Infrastructure by ''Bob Hendrikx'' ]]<br />
|-<br />
| May 1<br />
| width="325" | [[Media:20190501-EMC-DoDont.pdf | Do’s and Don’ts in the design of a robotic software architecture" ]]by ''Herman Bruyninckx''<br />
| width="325" | <br />
|-<br />
| May 8<br />
| colspan="2" | First presentation of the design by ''the groups''. 6-minute presentation, about the group's initial design. Afterwards 4 minutes for questions.<br />
|-<br />
| <span style="color:red">May 10</span><br />
| width="325" | [https://en.wikipedia.org/wiki/Scrum_(software_development) SCRUM] & Gitlab by ''Puck Mulders'' and ''Bob Hendrikx'' [[Media:Gitlab_emc_2019.pdf |Gitlab]] [[Media:Agile_emc_2019.pdf |Agile]]<br />
| width="325" | <br />
|-<br />
| May 15<br />
| width="325" | '''Escape Room Competition'''<br />
| width="325" | Reflection Session<br />
|-<br />
| May 22<br />
| colspan="2" | <br />
* Worldmodeling for Experts by ''Wouter Houtman'' <br />
* Worldmodeling for Real Experts by ''Marzieh Dolatabadi''<br />
* Worldmodeling in practice by ''Hao Liang Chen''<br />
|-<br />
| June 5<br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| <span style="color:red">June 7</span><br />
| colspan="2" | Company Presentations<br />
|-<br />
| June 12<br />
| colspan="2" | '''Final Competition''' <br />
|-<br />
|}<br />
<br />
= Getting Started =<br />
<br />
To get started, please do the tutorials on the [[Embedded Motion Control/Tutorials | Tutorial Page]]. <!--Please note:<br />
<br />
* '''Do all tutorials, and all steps. Missing one step may cause a different behavior or incorrect working system later'''. If something is not working as expected, make sure you correctly did all previous steps.<br />
* Of course, things may still go wrong. If so, do not hesitate to contact us.<br />
<br />
* See [[Embedded_Motion_Control/Using_Pico | Using Pico]] for a quick overview of how to use Pico.<br />
--><br />
<br />
= FAQ =<br />
[[Embedded_Motion_Control_2018/FAQ | Here]] you can find a collection of Frequently Asked Questions. Please check this page before contacting the student assistants or the tutors! If you find any issues or questions you had to deal with, please add them as well so your colleagues don't run into the same problems.<br />
<br />
<br />
= Design Document = <br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with: <br />
* Requirements,<br />
* Functions,<br />
* Components,<br />
* Specifications<br />
* Interfaces.<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 6th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2019}}<br />
<br />
<br />
=Group Wiki Pages=<br />
<br />
Group 1 - [[Embedded Motion Control 2019 Group 1 | visit wiki ]] - '''Tutor''': Wouter Kuijpers<br />
<br />
Group 2 - [[Embedded Motion Control 2019 Group 2 | visit wiki ]] - '''Tutor''': Wouter Houtman (Jordy senden in first week)<br />
<br />
Group 3 - [[Embedded Motion Control 2019 Group 3 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<br />
Group 4 - [[Embedded Motion Control 2019 Group 4 | visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
Group 5 - [[Embedded Motion Control 2019 Group 5 | visit wiki ]] - '''Tutor''': Hao Liang Chen<br />
<br />
<del>Group 6 - [[Embedded Motion Control 2019 Group 6 | visit wiki ]] - '''Tutor''': Marzieh Dolatabadi</del><br />
<br />
Group 7 - [[Embedded Motion Control 2019 Group 7 | visit wiki ]] - '''Tutor''': Yanick Douven<br />
<br />
Group 8 - [[Embedded Motion Control 2019 Group 8| visit wiki ]] - '''Tutor''': Rene & Herman<br />
<br />
Group 9 - [[Embedded Motion Control 2019 Group 9| visit wiki ]] - '''Tutor''': Marzieh Dolatabadi<br />
<br />
=Pico test schedule=<br />
- Testing takes place on the RoboCup field in Gemini-North.<br />
<br />
- Be sure you have your software on git before coming to the test session so that you only have to git clone/git pull to get your code on the robot!<br />
<br />
- Please charge the robot whenever possible so there is no down time due to empty batteries.<br />
<br />
To submit for a timeslot you have to be logged in. Through the 'edit'-button for Pico test schedule, you can select a timeslot by typing 'Group <groupnumber>' behind the desired timeslot.<br />
- Submissions are last checked the day before at 22:00.<br />
<br />
==Week 19==<br />
'''For week 19 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
'''Remark:''' Group 7 was allowed an extra time slot on Friday as they were not able to use their time slot on Thursday due to technical issues with pico.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 || 8<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || 7<br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 8-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 8-5-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 8-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 8-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 8-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 8-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 9-5-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 9-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 9-5-2019 || 11:45 - 12:40 || 9<br />
|-<br />
| 9-5-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 9-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 9-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 9-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 12:00 - 12:55 || 7<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 20==<br />
'''For week 20 each group can choose 1 time slot on Monday/Tuesday and 1 time slot on Thursday/Friday'''. Choose wisely.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 13-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 13-5-2019 || 11:45 - 12:40 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 14-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 14-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 14-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 14-5-2019 || 14:30 - 15:25 || 2<br />
|-<br />
| 14-5-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 14-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 16-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 16-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 16-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 16-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 16-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 16-5-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 16-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 16-5-2019 || 16:30 - 17:25 || 4<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 17-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 17-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 21==<br />
'''For week 21 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 21-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 21-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 21-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 21-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 22-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 22-5-2019 || 10:45 - 11:40 || 5<br />
|-<br />
| 22-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 22-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 22-5-2019 || 14:30 - 15:25 || 8<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 23-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 23-5-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 23-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 23-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 23-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 23-5-2019 || 14:30 - 15:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 24-5-2019 || 08:45 - 09:40 || <br />
|-<br />
| 24-5-2019 || 09:45 - 10:40 || 1<br />
|-<br />
| 24-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 24-5-2019 || 11:45 - 12:40 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 22 + 23==<br />
Since week 22 is shorter due to ascension day, it will not be possible for every group to test twice that week. Therefore extra slots are provided in week 23. '''Each team may choose 4 timeslots over these two weeks. Teams are allowed maximum 2 timeslots in week 22. To prevent planning issues, teams are advised to test at least for 1 timeslot in week 22.'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 27-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 27-5-2019 || 14:30 - 15:25 || 5<br />
|-<br />
| 27-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 27-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 28-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 28-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 28-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 28-5-2019 || 16:30 - 17:25 || 7<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 29-5-2019 || 08:45 - 09:40 ||<br />
|-<br />
| 29-5-2019 || 09:45 - 10:40 || 4<br />
|-<br />
| 29-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 29-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 29-5-2019 || 13:30 - 14:25 || 9<br />
|-<br />
| 29-5-2019 || 14:30 - 15:25 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 3-6-2019 || 13:30 - 14:25 || 4<br />
|-<br />
| 3-6-2019 || 14:30 - 15:25 || 1<br />
|-<br />
| 3-6-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 3-6-2019 || 16:30 - 17:25 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 4-6-2019 || 13:30 - 14:25 || 7<br />
|- <br />
| 4-6-2019 || 14:30 - 15:25 || 8<br />
|-<br />
| 4-6-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 4-6-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 5-6-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 5-6-2019 || 09:45 - 10:40 || 1<br />
|-<br />
| 5-6-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 5-6-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 5-6-2019 || 13:30 - 14:25 || 8 <br />
|-<br />
| 5-6-2019 || 14:30 - 15:25 || 3<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 6-6-2019 || 08:45 - 09:40 ||<br />
|-<br />
| 6-6-2019 || 09:45 - 10:40 ||<br />
|-<br />
| 6-6-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 6-6-2019 || 11:45 - 12:40 || 2<br />
|-<br />
| 6-6-2019 || 13:30 - 14:25 || 3<br />
|-<br />
| 6-6-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 6-6-2019 || 15:30 - 16:25 || 8<br />
|-<br />
| 6-6-2019 || 16:30 - 17:25 || 9<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-6-2019 || 08:45 - 09:40 || 2<br />
|-<br />
| 7-6-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 7-6-2019 || 10:45 - 11:40 || 1<br />
|-<br />
| 7-6-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 24==<br />
This is it! The week of the final challenge. '''Each team may choose 1 timeslot on Tuesday'''. Choose wisely and prepare this test well, as it is your last chance to test your code before the moment of truth.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 24 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 11-6-2019 || 8:45 - 9:40 || <br />
|-<br />
| 11-6-2019 || 9:45 - 10:40 || <br />
|-<br />
| 11-6-2019 || 10:45 - 11:40 || <br />
|-<br />
| 11-6-2019 || 11:45 - 12:40 || <br />
|-<br />
| 11-6-2019 || 13:30 - 14:25 || <br />
|-<br />
| 11-6-2019 || 14:30 - 15:25 || <br />
|-<br />
| 11-6-2019 || 15:30 - 16:25 || <br />
|-<br />
| 11-6-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
=Contact Details=<br />
{{:Embedded_Motion_Control_2018/Contact_Details}}</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2019&diff=75783Embedded Motion Control 20192019-05-22T08:17:50Z<p>S131974: /* Course Schedule and Lecture Slides */</p>
<hr />
<div><div align="center"><br />
<font size="4">'PICO in the Hospital'</font><br />
</div><br />
[[File:Gostai-Jazz-500x500.jpg|center|thumb|350px]]<br />
<br />
----<br />
<br />
= Introduction =<br />
This course is about software design and how to apply this in the context of autonomous robots. The accompanying assignment is about applying this knowledge to a real-life robotics task.<br />
<br />
= Course Schedule and Lecture Slides =<br />
Lectures will be given on Wednesdays from 15.30h-17.30h in Traverse van Trierzaal, except the Lecture on Wednesday may 22nd, which will be given in GEM-Z 0.05. <span style="color:red">The special lectures at May 10th and June 7th will take place at GEM-Z 0.05!</span> The preliminary course schedule is as follows:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 5em;"<br />
|-<br />
| April 24<br />
| width="325" | Introduction by ''René van de Molengraft''<br />
| width="325" | [[Media:EMC_tooling_infrastructure_2019.pdf | Tooling and Infrastructure by ''Bob Hendrikx'' ]]<br />
|-<br />
| May 1<br />
| width="325" | [[Media:20190501-EMC-DoDont.pdf | Do’s and Don’ts in the design of a robotic software architecture" ]]by ''Herman Bruyninckx''<br />
| width="325" | <br />
|-<br />
| May 8<br />
| colspan="2" | First presentation of the design by ''the groups''. 6-minute presentation, about the group's initial design. Afterwards 4 minutes for questions.<br />
|-<br />
| <span style="color:red">May 10</span><br />
| width="325" | [https://en.wikipedia.org/wiki/Scrum_(software_development) SCRUM] & Gitlab by ''Puck Mulders'' and ''Bob Hendrikx'' [[Media:Gitlab_emc_2019.pdf |Gitlab]] [[Media:Agile_emc_2019.pdf |Agile]]<br />
| width="325" | <br />
|-<br />
| May 15<br />
| width="325" | '''Escape Room Competition'''<br />
| width="325" | Reflection Session<br />
|-<br />
| May 22<br />
| colspan="2" | <br />
* Worldmodeling for Experts by ''Wouter Houtman'' <br />
* Worldmodeling for Real Experts by ''Marzieh Dolatabadi''<br />
* Worldmodeling in practice by ''Hao Liang Chen''<br />
|-<br />
| June 5<br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| <span style="color:red">June 7</span><br />
| colspan="2" | Company Presentations<br />
|-<br />
| June 12<br />
| colspan="2" | '''Final Competition''' <br />
|-<br />
|}<br />
<br />
= Getting Started =<br />
<br />
To get started, please do the tutorials on the [[Embedded Motion Control/Tutorials | Tutorial Page]]. <!--Please note:<br />
<br />
* '''Do all tutorials, and all steps. Missing one step may cause a different behavior or incorrect working system later'''. If something is not working as expected, make sure you correctly did all previous steps.<br />
* Of course, things may still go wrong. If so, do not hesitate to contact us.<br />
<br />
* See [[Embedded_Motion_Control/Using_Pico | Using Pico]] for a quick overview of how to use Pico.<br />
--><br />
<br />
= FAQ =<br />
[[Embedded_Motion_Control_2018/FAQ | Here]] you can find a collection of Frequently Asked Questions. Please check this page before contacting the student assistants or the tutors! If you find any issues or questions you had to deal with, please add them as well so your colleagues don't run into the same problems.<br />
<br />
<br />
= Design Document = <br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with: <br />
* Requirements,<br />
* Functions,<br />
* Components,<br />
* Specifications<br />
* Interfaces.<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 6th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2019}}<br />
<br />
<br />
=Group Wiki Pages=<br />
<br />
Group 1 - [[Embedded Motion Control 2019 Group 1 | visit wiki ]] - '''Tutor''': Wouter Kuijpers<br />
<br />
Group 2 - [[Embedded Motion Control 2019 Group 2 | visit wiki ]] - '''Tutor''': Wouter Houtman (Jordy senden in first week)<br />
<br />
Group 3 - [[Embedded Motion Control 2019 Group 3 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<br />
Group 4 - [[Embedded Motion Control 2019 Group 4 | visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
Group 5 - [[Embedded Motion Control 2019 Group 5 | visit wiki ]] - '''Tutor''': Hao Liang Chen<br />
<br />
<del>Group 6 - [[Embedded Motion Control 2019 Group 6 | visit wiki ]] - '''Tutor''': Marzieh Dolatabadi</del><br />
<br />
Group 7 - [[Embedded Motion Control 2019 Group 7 | visit wiki ]] - '''Tutor''': Yanick Douven<br />
<br />
Group 8 - [[Embedded Motion Control 2019 Group 8| visit wiki ]] - '''Tutor''': Rene & Herman<br />
<br />
Group 9 - [[Embedded Motion Control 2019 Group 9| visit wiki ]] - '''Tutor''': Marzieh Dolatabadi<br />
<br />
=Pico test schedule=<br />
- Testing takes place on the RoboCup field in Gemini-North.<br />
<br />
- Be sure you have your software on git before coming to the test session so that you only have to git clone/git pull to get your code on the robot!<br />
<br />
- Please charge the robot whenever possible so there is no down time due to empty batteries.<br />
<br />
To submit for a timeslot you have to be logged in. Through the 'edit'-button for Pico test schedule, you can select a timeslot by typing 'Group <groupnumber>' behind the desired timeslot.<br />
- Submissions are last checked the day before at 22:00.<br />
<br />
==Week 19==<br />
'''For week 19 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
'''Remark:''' Group 7 was allowed an extra time slot on Friday as they were not able to use their time slot on Thursday due to technical issues with pico.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 || 8<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || 7<br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 8-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 8-5-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 8-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 8-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 8-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 8-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 9-5-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 9-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 9-5-2019 || 11:45 - 12:40 || 9<br />
|-<br />
| 9-5-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 9-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 9-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 9-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 12:00 - 12:55 || 7<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 20==<br />
'''For week 20 each group can choose 1 time slot on Monday/Tuesday and 1 time slot on Thursday/Friday'''. Choose wisely.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 13-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 13-5-2019 || 11:45 - 12:40 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 14-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 14-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 14-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 14-5-2019 || 14:30 - 15:25 || 2<br />
|-<br />
| 14-5-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 14-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 16-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 16-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 16-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 16-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 16-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 16-5-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 16-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 16-5-2019 || 16:30 - 17:25 || 4<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 17-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 17-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 21==<br />
'''For week 21 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 21-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 21-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 21-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 21-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 22-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 22-5-2019 || 10:45 - 11:40 || 5<br />
|-<br />
| 22-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 22-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 22-5-2019 || 14:30 - 15:25 || 8<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 23-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 23-5-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 23-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 23-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 23-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 23-5-2019 || 14:30 - 15:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 24-5-2019 || 08:45 - 09:40 || 1<br />
|-<br />
| 24-5-2019 || 09:45 - 10:40 || 9<br />
|-<br />
| 24-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 24-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 22 + 23==<br />
Since week 22 is shorter due to ascension day, it will not be possible for every group to test twice that week. Therefore extra slots are provided in week 23. '''Each team may choose 4 timeslots over these two weeks.'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 27-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 27-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 27-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 27-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 28-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 28-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 28-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 28-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 29-5-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 29-5-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 29-5-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 29-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 29-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 29-5-2019 || 14:30 - 15:25 ||<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 3-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 3-6-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 3-6-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 3-6-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 4-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 4-6-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 4-6-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 4-6-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 5-6-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 5-6-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 5-6-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 5-6-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 5-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 5-6-2019 || 14:30 - 15:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 6-6-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 6-6-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 6-6-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 6-6-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 6-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 6-6-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 6-6-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 6-6-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-6-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 7-6-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 7-6-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 7-6-2019 || 11:45 - 12:40 ||<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
=Contact Details=<br />
{{:Embedded_Motion_Control_2018/Contact_Details}}</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2019&diff=75780Embedded Motion Control 20192019-05-22T08:14:50Z<p>S131974: /* Course Schedule and Lecture Slides */</p>
<hr />
<div><div align="center"><br />
<font size="4">'PICO in the Hospital'</font><br />
</div><br />
[[File:Gostai-Jazz-500x500.jpg|center|thumb|350px]]<br />
<br />
----<br />
<br />
= Introduction =<br />
This course is about software design and how to apply this in the context of autonomous robots. The accompanying assignment is about applying this knowledge to a real-life robotics task.<br />
<br />
= Course Schedule and Lecture Slides =<br />
Lectures will be given on Wednesdays from 15.30h-17.30h in Traverse van Trierzaal, except the Lecture on Wednesday may 22nd, which will be given in GEM-Z 0.05.<br />
<span style="color:red">The special lectures at May 10th and June 7th will take place at GEM-Z 0.05!</span> The preliminary course schedule is as follows:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 5em;"<br />
|-<br />
| April 24<br />
| width="325" | Introduction by ''René van de Molengraft''<br />
| width="325" | [[Media:EMC_tooling_infrastructure_2019.pdf | Tooling and Infrastructure by ''Bob Hendrikx'' ]]<br />
|-<br />
| May 1<br />
| width="325" | [[Media:20190501-EMC-DoDont.pdf | Do’s and Don’ts in the design of a robotic software architecture" ]]by ''Herman Bruyninckx''<br />
| width="325" | <br />
|-<br />
| May 8<br />
| colspan="2" | First presentation of the design by ''the groups''. 6-minute presentation, about the group's initial design. Afterwards 4 minutes for questions.<br />
|-<br />
| <span style="color:red">May 10</span><br />
| width="325" | [https://en.wikipedia.org/wiki/Scrum_(software_development) SCRUM] & Gitlab by ''Puck Mulders'' and ''Bob Hendrikx'' [[Media:Gitlab_emc_2019.pdf |Gitlab]] [[Media:Agile_emc_2019.pdf |Agile]]<br />
| width="325" | <br />
|-<br />
| May 15<br />
| width="325" | '''Escape Room Competition'''<br />
| width="325" | Reflection Session<br />
|-<br />
| May 22<br />
| colspan="2" | <br />
* Worldmodeling for Experts by ''Wouter Houtman'' <br />
* Worldmodeling for Real Experts by ''Marzieh Dolatabadi''<br />
* Worldmodeling in practice by ''Hao Liang Chen''<br />
|-<br />
| June 5<br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| <span style="color:red">June 7</span><br />
| colspan="2" | Company Presentations<br />
|-<br />
| June 12<br />
| colspan="2" | '''Final Competition''' <br />
|-<br />
|}<br />
<br />
= Getting Started =<br />
<br />
To get started, please do the tutorials on the [[Embedded Motion Control/Tutorials | Tutorial Page]]. <!--Please note:<br />
<br />
* '''Do all tutorials, and all steps. Missing one step may cause a different behavior or incorrect working system later'''. If something is not working as expected, make sure you correctly did all previous steps.<br />
* Of course, things may still go wrong. If so, do not hesitate to contact us.<br />
<br />
* See [[Embedded_Motion_Control/Using_Pico | Using Pico]] for a quick overview of how to use Pico.<br />
--><br />
<br />
= FAQ =<br />
[[Embedded_Motion_Control_2018/FAQ | Here]] you can find a collection of Frequently Asked Questions. Please check this page before contacting the student assistants or the tutors! If you find any issues or questions you had to deal with, please add them as well so your colleagues don't run into the same problems.<br />
<br />
<br />
= Design Document = <br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with: <br />
* Requirements,<br />
* Functions,<br />
* Components,<br />
* Specifications<br />
* Interfaces.<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 6th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2019}}<br />
<br />
<br />
=Group Wiki Pages=<br />
<br />
Group 1 - [[Embedded Motion Control 2019 Group 1 | visit wiki ]] - '''Tutor''': Wouter Kuijpers<br />
<br />
Group 2 - [[Embedded Motion Control 2019 Group 2 | visit wiki ]] - '''Tutor''': Wouter Houtman (Jordy senden in first week)<br />
<br />
Group 3 - [[Embedded Motion Control 2019 Group 3 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<br />
Group 4 - [[Embedded Motion Control 2019 Group 4 | visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
Group 5 - [[Embedded Motion Control 2019 Group 5 | visit wiki ]] - '''Tutor''': Hao Liang Chen<br />
<br />
<del>Group 6 - [[Embedded Motion Control 2019 Group 6 | visit wiki ]] - '''Tutor''': Marzieh Dolatabadi</del><br />
<br />
Group 7 - [[Embedded Motion Control 2019 Group 7 | visit wiki ]] - '''Tutor''': Yanick Douven<br />
<br />
Group 8 - [[Embedded Motion Control 2019 Group 8| visit wiki ]] - '''Tutor''': Rene & Herman<br />
<br />
Group 9 - [[Embedded Motion Control 2019 Group 9| visit wiki ]] - '''Tutor''': Marzieh Dolatabadi<br />
<br />
=Pico test schedule=<br />
- Testing takes place on the RoboCup field in Gemini-North.<br />
<br />
- Be sure you have your software on git before coming to the test session so that you only have to git clone/git pull to get your code on the robot!<br />
<br />
- Please charge the robot whenever possible so there is no down time due to empty batteries.<br />
<br />
To submit for a timeslot you have to be logged in. Through the 'edit'-button for Pico test schedule, you can select a timeslot by typing 'Group <groupnumber>' behind the desired timeslot.<br />
- Submissions are last checked the day before at 22:00.<br />
<br />
==Week 19==<br />
'''For week 19 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
'''Remark:''' Group 7 was allowed an extra time slot on Friday as they were not able to use their time slot on Thursday due to technical issues with pico.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 || 8<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || 7<br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 8-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 8-5-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 8-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 8-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 8-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 8-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 9-5-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 9-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 9-5-2019 || 11:45 - 12:40 || 9<br />
|-<br />
| 9-5-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 9-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 9-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 9-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 12:00 - 12:55 || 7<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 20==<br />
'''For week 20 each group can choose 1 time slot on Monday/Tuesday and 1 time slot on Thursday/Friday'''. Choose wisely.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 13-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 13-5-2019 || 11:45 - 12:40 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 14-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 14-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 14-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 14-5-2019 || 14:30 - 15:25 || 2<br />
|-<br />
| 14-5-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 14-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 16-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 16-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 16-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 16-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 16-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 16-5-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 16-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 16-5-2019 || 16:30 - 17:25 || 4<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 17-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 17-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 21==<br />
'''For week 21 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 21-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 21-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 21-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 21-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 22-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 22-5-2019 || 10:45 - 11:40 || 5<br />
|-<br />
| 22-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 22-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 22-5-2019 || 14:30 - 15:25 || 8<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 23-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 23-5-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 23-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 23-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 23-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 23-5-2019 || 14:30 - 15:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 24-5-2019 || 08:45 - 09:40 || 1<br />
|-<br />
| 24-5-2019 || 09:45 - 10:40 || 9<br />
|-<br />
| 24-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 24-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 22 + 23==<br />
Since week 22 is shorter due to ascension day, it will not be possible for every group to test twice that week. Therefore extra slots are provided in week 23. '''Each team may choose 4 timeslots over these two weeks.'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 27-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 27-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 27-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 27-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 28-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 28-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 28-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 28-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 29-5-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 29-5-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 29-5-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 29-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 29-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 29-5-2019 || 14:30 - 15:25 ||<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 3-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 3-6-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 3-6-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 3-6-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 4-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 4-6-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 4-6-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 4-6-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 5-6-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 5-6-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 5-6-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 5-6-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 5-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 5-6-2019 || 14:30 - 15:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 6-6-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 6-6-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 6-6-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 6-6-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 6-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 6-6-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 6-6-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 6-6-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-6-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 7-6-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 7-6-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 7-6-2019 || 11:45 - 12:40 ||<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
=Contact Details=<br />
{{:Embedded_Motion_Control_2018/Contact_Details}}</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2019&diff=75734Embedded Motion Control 20192019-05-21T14:56:50Z<p>S131974: </p>
<hr />
<div><div align="center"><br />
<font size="4">'PICO in the Hospital'</font><br />
</div><br />
[[File:Gostai-Jazz-500x500.jpg|center|thumb|350px]]<br />
<br />
----<br />
<br />
= Introduction =<br />
This course is about software design and how to apply this in the context of autonomous robots. The accompanying assignment is about applying this knowledge to a real-life robotics task.<br />
<br />
= Course Schedule and Lecture Slides =<br />
Lectures will be given on Wednesdays from 15.30h-17.30h in Traverse van Trierzaal. <span style="color:red">The special lectures at May 10th and June 7th will take place at GEM-Z 0.05!</span> The preliminary course schedule is as follows:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 5em;"<br />
|-<br />
| April 24<br />
| width="325" | Introduction by ''René van de Molengraft''<br />
| width="325" | [[Media:EMC_tooling_infrastructure_2019.pdf | Tooling and Infrastructure by ''Bob Hendrikx'' ]]<br />
|-<br />
| May 1<br />
| width="325" | [[Media:20190501-EMC-DoDont.pdf | Do’s and Don’ts in the design of a robotic software architecture" ]]by ''Herman Bruyninckx''<br />
| width="325" | <br />
|-<br />
| May 8<br />
| colspan="2" | First presentation of the design by ''the groups''. 6-minute presentation, about the group's initial design. Afterwards 4 minutes for questions.<br />
|-<br />
| <span style="color:red">May 10</span><br />
| width="325" | [https://en.wikipedia.org/wiki/Scrum_(software_development) SCRUM] & Gitlab by ''Puck Mulders'' and ''Bob Hendrikx'' [[Media:Gitlab_emc_2019.pdf |Gitlab]] [[Media:Agile_emc_2019.pdf |Agile]]<br />
| width="325" | <br />
|-<br />
| May 15<br />
| width="325" | '''Escape Room Competition'''<br />
| width="325" | Reflection Session<br />
|-<br />
| May 22<br />
| colspan="2" | <br />
* Worldmodeling for Experts by ''Wouter Houtman'' <br />
* Worldmodeling for Real Experts by ''Marzieh Dolatabadi''<br />
* Worldmodeling in practice by ''Hao Liang Chen''<br />
|-<br />
| June 5<br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| <span style="color:red">June 7</span><br />
| colspan="2" | Company Presentations<br />
|-<br />
| June 12<br />
| colspan="2" | '''Final Competition''' <br />
|-<br />
|}<br />
<br />
= Getting Started =<br />
<br />
To get started, please do the tutorials on the [[Embedded Motion Control/Tutorials | Tutorial Page]]. <!--Please note:<br />
<br />
* '''Do all tutorials, and all steps. Missing one step may cause a different behavior or incorrect working system later'''. If something is not working as expected, make sure you correctly did all previous steps.<br />
* Of course, things may still go wrong. If so, do not hesitate to contact us.<br />
<br />
* See [[Embedded_Motion_Control/Using_Pico | Using Pico]] for a quick overview of how to use Pico.<br />
--><br />
<br />
= FAQ =<br />
[[Embedded_Motion_Control_2018/FAQ | Here]] you can find a collection of Frequently Asked Questions. Please check this page before contacting the student assistants or the tutors! If you find any issues or questions you had to deal with, please add them as well so your colleagues don't run into the same problems.<br />
<br />
<br />
= Design Document = <br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with: <br />
* Requirements,<br />
* Functions,<br />
* Components,<br />
* Specifications<br />
* Interfaces.<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 6th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2019}}<br />
<br />
<br />
=Group Wiki Pages=<br />
<br />
Group 1 - [[Embedded Motion Control 2019 Group 1 | visit wiki ]] - '''Tutor''': Wouter Kuijpers<br />
<br />
Group 2 - [[Embedded Motion Control 2019 Group 2 | visit wiki ]] - '''Tutor''': Wouter Houtman (Jordy senden in first week)<br />
<br />
Group 3 - [[Embedded Motion Control 2019 Group 3 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<br />
Group 4 - [[Embedded Motion Control 2019 Group 4 | visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
Group 5 - [[Embedded Motion Control 2019 Group 5 | visit wiki ]] - '''Tutor''': Hao Liang Chen<br />
<br />
<del>Group 6 - [[Embedded Motion Control 2019 Group 6 | visit wiki ]] - '''Tutor''': Marzieh Dolatabadi</del><br />
<br />
Group 7 - [[Embedded Motion Control 2019 Group 7 | visit wiki ]] - '''Tutor''': Yanick Douven<br />
<br />
Group 8 - [[Embedded Motion Control 2019 Group 8| visit wiki ]] - '''Tutor''': Rene & Herman<br />
<br />
Group 9 - [[Embedded Motion Control 2019 Group 9| visit wiki ]] - '''Tutor''': Marzieh Dolatabadi<br />
<br />
=Pico test schedule=<br />
- Testing takes place on the RoboCup field in Gemini-North.<br />
<br />
- Be sure you have your software on git before coming to the test session so that you only have to git clone/git pull to get your code on the robot!<br />
<br />
- Please charge the robot whenever possible so there is no down time due to empty batteries.<br />
<br />
To submit for a timeslot you have to be logged in. Through the 'edit'-button for Pico test schedule, you can select a timeslot by typing 'Group <groupnumber>' behind the desired timeslot.<br />
- Submissions are last checked the day before at 22:00.<br />
<br />
==Week 19==<br />
'''For week 19 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
'''Remark:''' Group 7 was allowed an extra time slot on Friday as they were not able to use their time slot on Thursday due to technical issues with pico.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 || 8<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || 7<br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 8-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 8-5-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 8-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 8-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 8-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 8-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 9-5-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 9-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 9-5-2019 || 11:45 - 12:40 || 9<br />
|-<br />
| 9-5-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 9-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 9-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 9-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 12:00 - 12:55 || 7<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 20==<br />
'''For week 20 each group can choose 1 time slot on Monday/Tuesday and 1 time slot on Thursday/Friday'''. Choose wisely.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 13-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 13-5-2019 || 11:45 - 12:40 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 14-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 14-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 14-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 14-5-2019 || 14:30 - 15:25 || 2<br />
|-<br />
| 14-5-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 14-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 16-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 16-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 16-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 16-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 16-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 16-5-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 16-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 16-5-2019 || 16:30 - 17:25 || 4<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 17-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 17-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 21==<br />
'''For week 21 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 21-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 21-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 21-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 21-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 22-5-2019 || 09:45 - 10:40 || 1<br />
|-<br />
| 22-5-2019 || 10:45 - 11:40 || 5<br />
|-<br />
| 22-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 22-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 22-5-2019 || 14:30 - 15:25 || 8<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 23-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 23-5-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 23-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 23-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 23-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 23-5-2019 || 14:30 - 15:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 24-5-2019 || 08:45 - 09:40 || 1<br />
|-<br />
| 24-5-2019 || 09:45 - 10:40 || 9<br />
|-<br />
| 24-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 24-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 22 + 23==<br />
Since week 22 is shorter due to ascension day, it will not be possible for every group to test twice that week. Therefore extra slots are provided in week 23. '''Each team may choose 4 timeslots over these two weeks.'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 27-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 27-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 27-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 27-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 28-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 28-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 28-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 28-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 29-5-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 29-5-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 29-5-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 29-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 29-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 29-5-2019 || 14:30 - 15:25 ||<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 3-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 3-6-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 3-6-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 3-6-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 4-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 4-6-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 4-6-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 4-6-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 5-6-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 5-6-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 5-6-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 5-6-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 5-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 5-6-2019 || 14:30 - 15:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 6-6-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 6-6-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 6-6-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 6-6-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 6-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 6-6-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 6-6-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 6-6-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-6-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 7-6-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 7-6-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 7-6-2019 || 11:45 - 12:40 ||<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
=Contact Details=<br />
{{:Embedded_Motion_Control_2018/Contact_Details}}</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2019&diff=75733Embedded Motion Control 20192019-05-21T14:55:19Z<p>S131974: /* Week 22 + 23 */</p>
<hr />
<div><div align="center"><br />
<font size="4">'PICO in the Hospital'</font><br />
</div><br />
[[File:Gostai-Jazz-500x500.jpg|center|thumb|350px]]<br />
<br />
----<br />
<br />
= Introduction =<br />
This course is about software design and how to apply this in the context of autonomous robots. The accompanying assignment is about applying this knowledge to a real-life robotics task.<br />
<br />
= Course Schedule and Lecture Slides =<br />
Lectures will be given on Wednesdays from 15.30h-17.30h in Traverse van Trierzaal. <span style="color:red">The special lectures at May 10th and June 7th will take place at GEM-Z 0.05!</span> The preliminary course schedule is as follows:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 5em;"<br />
|-<br />
| April 24<br />
| width="325" | Introduction by ''René van de Molengraft''<br />
| width="325" | [[Media:EMC_tooling_infrastructure_2019.pdf | Tooling and Infrastructure by ''Bob Hendrikx'' ]]<br />
|-<br />
| May 1<br />
| width="325" | [[Media:20190501-EMC-DoDont.pdf | Do’s and Don’ts in the design of a robotic software architecture" ]]by ''Herman Bruyninckx''<br />
| width="325" | <br />
|-<br />
| May 8<br />
| colspan="2" | First presentation of the design by ''the groups''. 6-minute presentation, about the group's initial design. Afterwards 4 minutes for questions.<br />
|-<br />
| <span style="color:red">May 10</span><br />
| width="325" | [https://en.wikipedia.org/wiki/Scrum_(software_development) SCRUM] & Gitlab by ''Puck Mulders'' and ''Bob Hendrikx'' [[Media:Gitlab_emc_2019.pdf |Gitlab]] [[Media:Agile_emc_2019.pdf |Agile]]<br />
| width="325" | <br />
|-<br />
| May 15<br />
| width="325" | '''Escape Room Competition'''<br />
| width="325" | Reflection Session<br />
|-<br />
| May 22<br />
| colspan="2" | <br />
* Worldmodeling for Experts by ''Wouter Houtman'' <br />
* Worldmodeling for Real Experts by ''Marzieh Dolatabadi''<br />
* Worldmodeling in practice by ''Hao Liang Chen''<br />
|-<br />
| June 5<br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| <span style="color:red">June 7</span><br />
| colspan="2" | Company Presentations<br />
|-<br />
| June 12<br />
| colspan="2" | '''Final Competition''' <br />
|-<br />
|}<br />
<br />
= Getting Started =<br />
<br />
To get started, please do the tutorials on the [[Embedded Motion Control/Tutorials | Tutorial Page]]. <!--Please note:<br />
<br />
* '''Do all tutorials, and all steps. Missing one step may cause a different behavior or incorrect working system later'''. If something is not working as expected, make sure you correctly did all previous steps.<br />
* Of course, things may still go wrong. If so, do not hesitate to contact us.<br />
<br />
* See [[Embedded_Motion_Control/Using_Pico | Using Pico]] for a quick overview of how to use Pico.<br />
--><br />
<br />
= FAQ =<br />
[[Embedded_Motion_Control_2018/FAQ | Here]] you can find a collection of Frequently Asked Questions. Please check this page before contacting the student assistants or the tutors! If you find any issues or questions you had to deal with, please add them as well so your colleagues don't run into the same problems.<br />
<br />
<br />
= Design Document = <br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with: <br />
* Requirements,<br />
* Functions,<br />
* Components,<br />
* Specifications<br />
* Interfaces.<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 6th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2019}}<br />
<br />
<br />
=Group Wiki Pages=<br />
<br />
Group 1 - [[Embedded Motion Control 2019 Group 1 | visit wiki ]] - '''Tutor''': Wouter Kuijpers<br />
<br />
Group 2 - [[Embedded Motion Control 2019 Group 2 | visit wiki ]] - '''Tutor''': Wouter Houtman (Jordy senden in first week)<br />
<br />
Group 3 - [[Embedded Motion Control 2019 Group 3 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<br />
Group 4 - [[Embedded Motion Control 2019 Group 4 | visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
Group 5 - [[Embedded Motion Control 2019 Group 5 | visit wiki ]] - '''Tutor''': Hao Liang Chen<br />
<br />
<del>Group 6 - [[Embedded Motion Control 2019 Group 6 | visit wiki ]] - '''Tutor''': Marzieh Dolatabadi</del><br />
<br />
Group 7 - [[Embedded Motion Control 2019 Group 7 | visit wiki ]] - '''Tutor''': Yanick Douven<br />
<br />
Group 8 - [[Embedded Motion Control 2019 Group 8| visit wiki ]] - '''Tutor''': Rene & Herman<br />
<br />
Group 9 - [[Embedded Motion Control 2019 Group 9| visit wiki ]] - '''Tutor''': Marzieh Dolatabadi<br />
<br />
=Pico test schedule=<br />
- Testing takes place on the RoboCup field in Gemini-North.<br />
<br />
- Be sure you have your software on git before coming to the test session so that you only have to git clone/git pull to get your code on the robot!<br />
<br />
- Please charge the robot whenever possible so there is no down time due to empty batteries.<br />
<br />
To submit for a timeslot you have to be logged in. Through the 'edit'-button for Pico test schedule, you can select a timeslot by typing 'Group <groupnumber>' behind the desired timeslot.<br />
- Submissions are last checked the day before at 22:00.<br />
<br />
==Week 19==<br />
'''For week 19 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
'''Remark:''' Group 7 was allowed an extra time slot on Friday as they were not able to use their time slot on Thursday due to technical issues with pico.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 || 8<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || 7<br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 8-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 8-5-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 8-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 8-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 8-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 8-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 9-5-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 9-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 9-5-2019 || 11:45 - 12:40 || 9<br />
|-<br />
| 9-5-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 9-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 9-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 9-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 12:00 - 12:55 || 7<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 20==<br />
'''For week 20 each group can choose 1 time slot on Monday/Tuesday and 1 time slot on Thursday/Friday'''. Choose wisely.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 13-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 13-5-2019 || 11:45 - 12:40 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 14-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 14-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 14-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 14-5-2019 || 14:30 - 15:25 || 2<br />
|-<br />
| 14-5-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 14-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 16-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 16-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 16-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 16-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 16-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 16-5-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 16-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 16-5-2019 || 16:30 - 17:25 || 4<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 17-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 17-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 21==<br />
'''For week 21 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 21-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 21-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 21-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 21-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 22-5-2019 || 09:45 - 10:40 || 1<br />
|-<br />
| 22-5-2019 || 10:45 - 11:40 || 5<br />
|-<br />
| 22-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 22-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 22-5-2019 || 14:30 - 15:25 || 8<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 23-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 23-5-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 23-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 23-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 23-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 23-5-2019 || 14:30 - 15:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 24-5-2019 || 08:45 - 09:40 || 1<br />
|-<br />
| 24-5-2019 || 09:45 - 10:40 || 9<br />
|-<br />
| 24-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 24-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 22 + 23==<br />
Since week 22 is shorter due to ascension day, it will not be possible for every group to test twice that week. Therefore extra slots are provided in week 23. '''Each team may choose 4 timeslots over these two weeks.'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 27-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 27-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 27-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 27-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 28-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 28-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 28-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 28-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 29-5-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 29-5-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 29-5-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 29-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 29-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 29-5-2019 || 14:30 - 15:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 3-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 3-6-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 3-6-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 3-6-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 4-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 4-6-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 4-6-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 4-6-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 5-6-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 5-6-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 5-6-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 5-6-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 5-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 5-6-2019 || 14:30 - 15:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 6-6-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 6-6-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 6-6-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 6-6-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 6-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 6-6-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 6-6-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 6-6-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-6-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 7-6-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 7-6-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 7-6-2019 || 11:45 - 12:40 ||<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
=Contact Details=<br />
{{:Embedded_Motion_Control_2018/Contact_Details}}</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2019&diff=75732Embedded Motion Control 20192019-05-21T14:53:56Z<p>S131974: </p>
<hr />
<div><div align="center"><br />
<font size="4">'PICO in the Hospital'</font><br />
</div><br />
[[File:Gostai-Jazz-500x500.jpg|center|thumb|350px]]<br />
<br />
----<br />
<br />
= Introduction =<br />
This course is about software design and how to apply this in the context of autonomous robots. The accompanying assignment is about applying this knowledge to a real-life robotics task.<br />
<br />
= Course Schedule and Lecture Slides =<br />
Lectures will be given on Wednesdays from 15.30h-17.30h in Traverse van Trierzaal. <span style="color:red">The special lectures at May 10th and June 7th will take place at GEM-Z 0.05!</span> The preliminary course schedule is as follows:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 5em;"<br />
|-<br />
| April 24<br />
| width="325" | Introduction by ''René van de Molengraft''<br />
| width="325" | [[Media:EMC_tooling_infrastructure_2019.pdf | Tooling and Infrastructure by ''Bob Hendrikx'' ]]<br />
|-<br />
| May 1<br />
| width="325" | [[Media:20190501-EMC-DoDont.pdf | Do’s and Don’ts in the design of a robotic software architecture" ]]by ''Herman Bruyninckx''<br />
| width="325" | <br />
|-<br />
| May 8<br />
| colspan="2" | First presentation of the design by ''the groups''. 6-minute presentation, about the group's initial design. Afterwards 4 minutes for questions.<br />
|-<br />
| <span style="color:red">May 10</span><br />
| width="325" | [https://en.wikipedia.org/wiki/Scrum_(software_development) SCRUM] & Gitlab by ''Puck Mulders'' and ''Bob Hendrikx'' [[Media:Gitlab_emc_2019.pdf |Gitlab]] [[Media:Agile_emc_2019.pdf |Agile]]<br />
| width="325" | <br />
|-<br />
| May 15<br />
| width="325" | '''Escape Room Competition'''<br />
| width="325" | Reflection Session<br />
|-<br />
| May 22<br />
| colspan="2" | <br />
* Worldmodeling for Experts by ''Wouter Houtman'' <br />
* Worldmodeling for Real Experts by ''Marzieh Dolatabadi''<br />
* Worldmodeling in practice by ''Hao Liang Chen''<br />
|-<br />
| June 5<br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| <span style="color:red">June 7</span><br />
| colspan="2" | Company Presentations<br />
|-<br />
| June 12<br />
| colspan="2" | '''Final Competition''' <br />
|-<br />
|}<br />
<br />
= Getting Started =<br />
<br />
To get started, please do the tutorials on the [[Embedded Motion Control/Tutorials | Tutorial Page]]. <!--Please note:<br />
<br />
* '''Do all tutorials, and all steps. Missing one step may cause a different behavior or incorrect working system later'''. If something is not working as expected, make sure you correctly did all previous steps.<br />
* Of course, things may still go wrong. If so, do not hesitate to contact us.<br />
<br />
* See [[Embedded_Motion_Control/Using_Pico | Using Pico]] for a quick overview of how to use Pico.<br />
--><br />
<br />
= FAQ =<br />
[[Embedded_Motion_Control_2018/FAQ | Here]] you can find a collection of Frequently Asked Questions. Please check this page before contacting the student assistants or the tutors! If you find any issues or questions you had to deal with, please add them as well so your colleagues don't run into the same problems.<br />
<br />
<br />
= Design Document = <br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with: <br />
* Requirements,<br />
* Functions,<br />
* Components,<br />
* Specifications<br />
* Interfaces.<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 6th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2019}}<br />
<br />
<br />
=Group Wiki Pages=<br />
<br />
Group 1 - [[Embedded Motion Control 2019 Group 1 | visit wiki ]] - '''Tutor''': Wouter Kuijpers<br />
<br />
Group 2 - [[Embedded Motion Control 2019 Group 2 | visit wiki ]] - '''Tutor''': Wouter Houtman (Jordy senden in first week)<br />
<br />
Group 3 - [[Embedded Motion Control 2019 Group 3 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<br />
Group 4 - [[Embedded Motion Control 2019 Group 4 | visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
Group 5 - [[Embedded Motion Control 2019 Group 5 | visit wiki ]] - '''Tutor''': Hao Liang Chen<br />
<br />
<del>Group 6 - [[Embedded Motion Control 2019 Group 6 | visit wiki ]] - '''Tutor''': Marzieh Dolatabadi</del><br />
<br />
Group 7 - [[Embedded Motion Control 2019 Group 7 | visit wiki ]] - '''Tutor''': Yanick Douven<br />
<br />
Group 8 - [[Embedded Motion Control 2019 Group 8| visit wiki ]] - '''Tutor''': Rene & Herman<br />
<br />
Group 9 - [[Embedded Motion Control 2019 Group 9| visit wiki ]] - '''Tutor''': Marzieh Dolatabadi<br />
<br />
=Pico test schedule=<br />
- Testing takes place on the RoboCup field in Gemini-North.<br />
<br />
- Be sure you have your software on git before coming to the test session so that you only have to git clone/git pull to get your code on the robot!<br />
<br />
- Please charge the robot whenever possible so there is no down time due to empty batteries.<br />
<br />
To submit for a timeslot you have to be logged in. Through the 'edit'-button for Pico test schedule, you can select a timeslot by typing 'Group <groupnumber>' behind the desired timeslot.<br />
- Submissions are last checked the day before at 22:00.<br />
<br />
==Week 19==<br />
'''For week 19 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
'''Remark:''' Group 7 was allowed an extra time slot on Friday as they were not able to use their time slot on Thursday due to technical issues with pico.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 || 8<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || 7<br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 8-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 8-5-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 8-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 8-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 8-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 8-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 9-5-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 9-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 9-5-2019 || 11:45 - 12:40 || 9<br />
|-<br />
| 9-5-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 9-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 9-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 9-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 12:00 - 12:55 || 7<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 20==<br />
'''For week 20 each group can choose 1 time slot on Monday/Tuesday and 1 time slot on Thursday/Friday'''. Choose wisely.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 13-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 13-5-2019 || 11:45 - 12:40 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 14-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 14-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 14-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 14-5-2019 || 14:30 - 15:25 || 2<br />
|-<br />
| 14-5-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 14-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 16-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 16-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 16-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 16-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 16-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 16-5-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 16-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 16-5-2019 || 16:30 - 17:25 || 4<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 17-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 17-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 21==<br />
'''For week 21 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 21-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 21-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 21-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 21-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 22-5-2019 || 09:45 - 10:40 || 1<br />
|-<br />
| 22-5-2019 || 10:45 - 11:40 || 5<br />
|-<br />
| 22-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 22-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 22-5-2019 || 14:30 - 15:25 || 8<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 23-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 23-5-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 23-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 23-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 23-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 23-5-2019 || 14:30 - 15:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 24-5-2019 || 08:45 - 09:40 || 1<br />
|-<br />
| 24-5-2019 || 09:45 - 10:40 || 9<br />
|-<br />
| 24-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 24-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 22 + 23==<br />
'''Since week 22 is shorter due to ascension day, it will not be possible for every group to test twice that week. Therefore extra slots are provided in week 23. Each team may choose 4 timeslots over these two weeks.'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 27-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 27-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 27-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 27-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 28-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 28-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 28-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 28-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 22 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 29-5-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 29-5-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 29-5-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 29-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 29-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 29-5-2019 || 14:30 - 15:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 3-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 3-6-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 3-6-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 3-6-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 4-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 4-6-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 4-6-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 4-6-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 5-6-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 5-6-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 5-6-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 5-6-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 5-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 5-6-2019 || 14:30 - 15:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 6-6-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 6-6-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 6-6-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 6-6-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 6-6-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 6-6-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 6-6-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 6-6-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 23 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-6-2019 || 8:45 - 9:40 ||<br />
|-<br />
| 7-6-2019 || 9:45 - 10:40 ||<br />
|-<br />
| 7-6-2019 || 10:45 - 11:40 ||<br />
|-<br />
| 7-6-2019 || 11:45 - 12:40 ||<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
<br />
=Contact Details=<br />
{{:Embedded_Motion_Control_2018/Contact_Details}}</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2019&diff=75480Embedded Motion Control 20192019-05-19T10:26:12Z<p>S131974: /* Week 21 */</p>
<hr />
<div><div align="center"><br />
<font size="4">'PICO in the Hospital'</font><br />
</div><br />
[[File:Gostai-Jazz-500x500.jpg|center|thumb|350px]]<br />
<br />
----<br />
<br />
= Introduction =<br />
This course is about software design and how to apply this in the context of autonomous robots. The accompanying assignment is about applying this knowledge to a real-life robotics task.<br />
<br />
= Course Schedule and Lecture Slides =<br />
Lectures will be given on Wednesdays from 15.30h-17.30h in Traverse van Trierzaal. <span style="color:red">The special lectures at May 10th and June 7th will take place at GEM-Z 0.05!</span> The preliminary course schedule is as follows:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 5em;"<br />
|-<br />
| April 24<br />
| width="325" | Introduction by ''René van de Molengraft''<br />
| width="325" | [[Media:EMC_tooling_infrastructure_2019.pdf | Tooling and Infrastructure by ''Bob Hendrikx'' ]]<br />
|-<br />
| May 1<br />
| width="325" | [[Media:20190501-EMC-DoDont.pdf | Do’s and Don’ts in the design of a robotic software architecture" ]]by ''Herman Bruyninckx''<br />
| width="325" | <br />
|-<br />
| May 8<br />
| colspan="2" | First presentation of the design by ''the groups''. 6-minute presentation, about the group's initial design. Afterwards 4 minutes for questions.<br />
|-<br />
| <span style="color:red">May 10</span><br />
| width="325" | [https://en.wikipedia.org/wiki/Scrum_(software_development) SCRUM] & Gitlab by ''Puck Mulders'' and ''Bob Hendrikx'' [[Media:Gitlab_emc_2019.pdf |Gitlab]] [[Media:Agile_emc_2019.pdf |Agile]]<br />
| width="325" | <br />
|-<br />
| May 15<br />
| width="325" | '''Escape Room Competition'''<br />
| width="325" | Reflection Session<br />
|-<br />
| May 22<br />
| colspan="2" | <br />
* Worldmodeling for Experts by ''Wouter Houtman'' <br />
* Worldmodeling for Real Experts by ''Marzieh Dolatabadi''<br />
* Worldmodeling in practice by ''Hao Liang Chen''<br />
|-<br />
| June 5<br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| <span style="color:red">June 7</span><br />
| colspan="2" | Company Presentations<br />
|-<br />
| June 12<br />
| colspan="2" | '''Final Competition''' <br />
|-<br />
|}<br />
<br />
= Getting Started =<br />
<br />
To get started, please do the tutorials on the [[Embedded Motion Control/Tutorials | Tutorial Page]]. <!--Please note:<br />
<br />
* '''Do all tutorials, and all steps. Missing one step may cause a different behavior or incorrect working system later'''. If something is not working as expected, make sure you correctly did all previous steps.<br />
* Of course, things may still go wrong. If so, do not hesitate to contact us.<br />
<br />
* See [[Embedded_Motion_Control/Using_Pico | Using Pico]] for a quick overview of how to use Pico.<br />
--><br />
<br />
= FAQ =<br />
[[Embedded_Motion_Control_2018/FAQ | Here]] you can find a collection of Frequently Asked Questions. Please check this page before contacting the student assistants or the tutors! If you find any issues or questions you had to deal with, please add them as well so your colleagues don't run into the same problems.<br />
<br />
<br />
= Design Document = <br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with: <br />
* Requirements,<br />
* Functions,<br />
* Components,<br />
* Specifications<br />
* Interfaces.<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 6th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2019}}<br />
<br />
<br />
=Group Wiki Pages=<br />
<br />
Group 1 - [[Embedded Motion Control 2019 Group 1 | visit wiki ]] - '''Tutor''': Wouter Kuijpers<br />
<br />
Group 2 - [[Embedded Motion Control 2019 Group 2 | visit wiki ]] - '''Tutor''': Wouter Houtman (Jordy senden in first week)<br />
<br />
Group 3 - [[Embedded Motion Control 2019 Group 3 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<br />
Group 4 - [[Embedded Motion Control 2019 Group 4 | visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
Group 5 - [[Embedded Motion Control 2019 Group 5 | visit wiki ]] - '''Tutor''': Hao Liang Chen<br />
<br />
<del>Group 6 - [[Embedded Motion Control 2019 Group 6 | visit wiki ]] - '''Tutor''': Marzieh Dolatabadi</del><br />
<br />
Group 7 - [[Embedded Motion Control 2019 Group 7 | visit wiki ]] - '''Tutor''': Yanick Douven<br />
<br />
Group 8 - [[Embedded Motion Control 2019 Group 8| visit wiki ]] - '''Tutor''': Rene & Herman<br />
<br />
Group 9 - [[Embedded Motion Control 2019 Group 9| visit wiki ]] - '''Tutor''': Marzieh Dolatabadi<br />
<br />
=Pico test schedule=<br />
- Testing takes place on the RoboCup field in Gemini-North.<br />
<br />
- Be sure you have your software on git before coming to the test session so that you only have to git clone/git pull to get your code on the robot!<br />
<br />
- Please charge the robot whenever possible so there is no down time due to empty batteries.<br />
<br />
To submit for a timeslot you have to be logged in. Through the 'edit'-button for Pico test schedule, you can select a timeslot by typing 'Group <groupnumber>' behind the desired timeslot.<br />
- Submissions are last checked the day before at 22:00.<br />
<br />
==Week 19==<br />
'''For week 19 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
'''Remark:''' Group 7 was allowed an extra time slot on Friday as they were not able to use their time slot on Thursday due to technical issues with pico.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || 3<br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 || 8<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || 7<br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 8-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 8-5-2019 || 11:45 - 12:40 || 4<br />
|-<br />
| 8-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 8-5-2019 || 14:30 - 15:25 || 9<br />
|-<br />
| 8-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 8-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 08:45 - 09:40 || 5<br />
|-<br />
| 9-5-2019 || 09:45 - 10:40 || 5<br />
|-<br />
| 9-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 9-5-2019 || 11:45 - 12:40 || 9<br />
|-<br />
| 9-5-2019 || 13:30 - 14:25 || 2<br />
|-<br />
| 9-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 9-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 9-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 12:00 - 12:55 || 7<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 20==<br />
'''For week 20 each group can choose 1 time slot on Monday/Tuesday and 1 time slot on Thursday/Friday'''. Choose wisely.<br />
<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 13-5-2019 || 10:45 - 11:40 || 4<br />
|-<br />
| 13-5-2019 || 11:45 - 12:40 || 5<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 14-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 14-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 14-5-2019 || 13:30 - 14:25 || 8<br />
|-<br />
| 14-5-2019 || 14:30 - 15:25 || 2<br />
|-<br />
| 14-5-2019 || 15:30 - 16:25 || 9<br />
|-<br />
| 14-5-2019 || 16:30 - 17:25 || 1<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 16-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 16-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 16-5-2019 || 10:45 - 11:40 || 7<br />
|-<br />
| 16-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 16-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 16-5-2019 || 14:30 - 15:25 || 3<br />
|-<br />
| 16-5-2019 || 15:30 - 16:25 || 1<br />
|-<br />
| 16-5-2019 || 16:30 - 17:25 || 4<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 17-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 17-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 21==<br />
'''For week 21 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 21-5-2019 || 13:30 - 14:25 ||<br />
|-<br />
| 21-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 21-5-2019 || 15:30 - 16:25 ||<br />
|-<br />
| 21-5-2019 || 16:30 - 17:25 ||<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 22-5-2019 || 09:45 - 10:40 ||<br />
|-<br />
| 22-5-2019 || 10:45 - 11:40 || 5<br />
|-<br />
| 22-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 22-5-2019 || 13:30 - 14:25 || 7<br />
|-<br />
| 22-5-2019 || 14:30 - 15:25 || 8<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 23-5-2019 || 08:45 - 09:40 || 9<br />
|-<br />
| 23-5-2019 || 09:45 - 10:40 || 3<br />
|-<br />
| 23-5-2019 || 10:45 - 11:40 || 3<br />
|-<br />
| 23-5-2019 || 11:45 - 12:40 || 7<br />
|-<br />
| 23-5-2019 || 13:30 - 14:25 || 5<br />
|-<br />
| 23-5-2019 || 14:30 - 15:25 || 2<br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 21 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 24-5-2019 || 08:45 - 09:40 ||<br />
|-<br />
| 24-5-2019 || 09:45 - 10:40 || 9<br />
|-<br />
| 24-5-2019 || 10:45 - 11:40 || 2<br />
|-<br />
| 24-5-2019 || 11:45 - 12:40 || 8<br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
=Contact Details=<br />
{{:Embedded_Motion_Control_2018/Contact_Details}}</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=MRC/Using_Pico&diff=75177MRC/Using Pico2019-05-14T14:38:30Z<p>S131974: /* Running your software */</p>
<hr />
<div>== Starting Pico ==<br />
To start Pico please follow the following steps:<br />
# Power on the robot<br />
#* For Pico, the on-off switch is on the bottom, next to the emergency button. This also starts the on-board computer<br />
<!--<br />
#* For Taco, the on-off switch is on the outer edge of the base. Also start the laptop, if it is not already on (you don't need to log in).<br />
--><br />
# Now plug the provided ethernet cable into the laptop you want to use (one of your group members' laptops).<br />
# '''From here on, you should work on your laptop.''' Open a terminal and type <pre>sshpico</pre> The password is '''emc'''.<br />
<!-- where <robot name> is either pico or taco, depending on which robot you want to use. Using this command, you login on the robot's computer; the password is again '''emc'''. --><br />
# Now that you are in, you can start all the necessary nodes on the robot. These controllers and drivers let your software communicate with the hardware. On the robot (so in the terminal you opened in the previous step) enter <br />
#* For Pico: <pre>pstart</pre><br />
<!--<br />
#* For Taco: <pre>tstart</pre><br />
--><br />
# '''N.B. leave this terminal open! '''<br />
<br />
== Running your software ==<br />
Pico is now up and running. To run your own software follow these steps:<br />
# Open a '''new''' terminal and login to your robot again: <pre>sshpico</pre> with password '''emc'''.<br />
# Go to your group's folder: <pre>cd ~/emc/emc<group number></pre><br />
# The rest works the same as on your own PC. <br />
#* The first time, you will have to clone your git project on the robot's computer: <pre>git clone https://gitlab.tue.nl/emc2019/group<group number>.git</pre> Of course with your own group number, project name etc. Just like you did on the PCs of the group members.<br />
#* Any next time you can just navigate to your project folder within your group's folder and <pre>git pull</pre><br />
#* Now that your own software is up to date, you can compile it and run it, again just like you would on your own laptop.<br />
<br />
== Develop while testing ==<br />
<br />
You should avoid having to do hard-core debugging and developing while testing, since you only have limited testing time. However, there may be times when you have to change some things in your code and retry. There are roughly two ways to do this:<br />
<br />
# Edit the files on your pc:<br />
## Simply use Qt Creator or any other editor to change the files<br />
## Push your changes to the git server<br />
## Pull the changes on the robot, recompile, and try<br />
# Edit the files on the robot:<br />
## Use programs such as 'nano' or 'vim' to edit the files<br />
## recompile and test<br />
## Commit and push your changes once you're happy<br />
##* Be sure to set your name and email address before committing!<pre>git config user.email "bla@student.tue.nl"</pre><pre>git config user.name "Your name"</pre>'''Note: don't use the '--global' option as other people are also using the robot. Not having the '--global' option will limit the config change to the current repository.'''<br />
<br />
== Visualization ==<br />
When you want to visualize the robot while testing, you can do the following<br />
# Open a new terminal and type <pre>pico-core</pre> This makes sure that any software you run in this terminal listens to the ros-master on your robot.<br />
# So if you now run our visualization software by entering <pre>emc-viz</pre> it will subscribe to the topics published on the robot.<br />
<br />
== Recording data ==<br />
A simulator simulates a perfect world, so if your software works in the simulator, it is not (at all) guaranteed to work in the real world. But because you only have limited testing time on the robots, it would be nice if you could somehow simulate being in the real world. Luckily, the developers of ROS also ran into this, so they created rosbag. Using rosbag you can record data published by the robot and play it later when you want to test an awesome new feature of your software using real sensor data, or if you just want to inspect the quality of the sensor data, etc.<br />
# The first step is again to open a terminal and log in to the robot <pre>sshpico</pre><br />
# Find the topics you would like to record (usually those will be the ones containing data from the LRF and the odometry: /pico/laser and /pico/odom) by using <pre>rostopic list</pre><br />
# You can now use the rosbag tool to record the topics you like: <pre>rosbag record topic_1 topic_2</pre>Topic_1 and topic_2 should of course be changed to the correct topic names, but you can also add more topics to this command. While recording, you should leave this terminal open, and if you think you have enough data, you can stop recording by pressing ctrl+C. If you would like to record all topics (not recommended, as this means recording '''a lot''' of unnecessary data), you could use the option -a instead of typing in all of the topic names.<br />
# The bag file you just recorded is now in the current directory, so if you enter <pre>ls</pre> you can see it among the other files in the current directory. This should be the home directory (if you did not cd to somewhere else). You can now copy this file over the network to your own laptop by opening a '''new terminal''' (or just log out of the robot by pressing ctrl+D), navigating to the directory where you want to place your new bag file, and entering<pre>scp emc@192.168.44.253:~/<filename> <filename></pre> What this command does is the following: it securely copies (scp) from the emc account at the robot's computer the file given by the path after the colon and it places it in your current directory with the second file name. If you gathered multiple bag files on the robot's PC, you can easily copy all of them in one go by doing <pre>scp emc@192.168.44.253:~/*.bag .</pre> This will copy all files wit the .bag extention from the home folder of Pico to your current directory.<br />
# After you have copied your bag files to your own PC, clean up the robot's PC by removing your bag file(s): <pre>rm <filename></pre> This '''permanently''' removes the file from the robot's file system, so if you want to keep it, make sure you only do this after copying it to your own PC!<br />
<br />
== Playing back bag files ==<br />
Now you can play this bag file as often as you like and have your software analyse the sensor data. To do that, take the following steps:<br />
# First start a roscore, like you always do<br />
# Now, because you want your node(s) to use the time that was recorded in the bag file instead of the current system time, you will have to tell it to do that. You can do that by setting the ROS parameter use_sim_time to ''true'': <pre>rosparam set use_sim_time true</pre><br />
# If all is well, you should now be able to play the bag file by entering <pre>rosbag play --clock <filename></pre><br />
For more advanced use and other information on the command line use of rosbag, go to the official [http://wiki.ros.org/rosbag/Commandline documentation of the tool].</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=MRC/Using_Pico&diff=75176MRC/Using Pico2019-05-14T14:38:02Z<p>S131974: /* Starting Pico */</p>
<hr />
<div>== Starting Pico ==<br />
To start Pico please follow the following steps:<br />
# Power on the robot<br />
#* For Pico, the on-off switch is on the bottom, next to the emergency button. This also starts the on-board computer<br />
<!--<br />
#* For Taco, the on-off switch is on the outer edge of the base. Also start the laptop, if it is not already on (you don't need to log in).<br />
--><br />
# Now plug the provided ethernet cable into the laptop you want to use (one of your group members' laptops).<br />
# '''From here on, you should work on your laptop.''' Open a terminal and type <pre>sshpico</pre> The password is '''emc'''.<br />
<!-- where <robot name> is either pico or taco, depending on which robot you want to use. Using this command, you login on the robot's computer; the password is again '''emc'''. --><br />
# Now that you are in, you can start all the necessary nodes on the robot. These controllers and drivers let your software communicate with the hardware. On the robot (so in the terminal you opened in the previous step) enter <br />
#* For Pico: <pre>pstart</pre><br />
<!--<br />
#* For Taco: <pre>tstart</pre><br />
--><br />
# '''N.B. leave this terminal open! '''<br />
<br />
== Running your software ==<br />
Pico is now up and running. To run your own software follow these steps:<br />
# Open a '''new''' terminal and login to your robot again: <pre>sshpico</pre> with password '''emc'''.<br />
# Go to your group's folder: <pre>cd ~/emc/emc<group number></pre><br />
# The rest works the same as on your own PC. <br />
#* The first time, you will have to clone your git project on the robot's computer: <pre>git clone https://gitlab.tue.nl/emc2018/group<group number>.git</pre> Of course with your own group number, project name etc. Just like you did on the PCs of the group members.<br />
#* Any next time you can just navigate to your project folder within your group's folder and <pre>git pull</pre><br />
#* Now that your own software is up to date, you can compile it and run it, again just like you would on your own laptop.<br />
<br />
== Develop while testing ==<br />
<br />
You should avoid having to do hard-core debugging and developing while testing, since you only have limited testing time. However, there may be times when you have to change some things in your code and retry. There are roughly two ways to do this:<br />
<br />
# Edit the files on your pc:<br />
## Simply use Qt Creator or any other editor to change the files<br />
## Push your changes to the git server<br />
## Pull the changes on the robot, recompile, and try<br />
# Edit the files on the robot:<br />
## Use programs such as 'nano' or 'vim' to edit the files<br />
## recompile and test<br />
## Commit and push your changes once you're happy<br />
##* Be sure to set your name and email address before committing!<pre>git config user.email "bla@student.tue.nl"</pre><pre>git config user.name "Your name"</pre>'''Note: don't use the '--global' option as other people are also using the robot. Not having the '--global' option will limit the config change to the current repository.'''<br />
<br />
== Visualization ==<br />
When you want to visualize the robot while testing, you can do the following<br />
# Open a new terminal and type <pre>pico-core</pre> This makes sure that any software you run in this terminal listens to the ros-master on your robot.<br />
# So if you now run our visualization software by entering <pre>emc-viz</pre> it will subscribe to the topics published on the robot.<br />
<br />
== Recording data ==<br />
A simulator simulates a perfect world, so if your software works in the simulator, it is not (at all) guaranteed to work in the real world. But because you only have limited testing time on the robots, it would be nice if you could somehow simulate being in the real world. Luckily, the developers of ROS also ran into this, so they created rosbag. Using rosbag you can record data published by the robot and play it later when you want to test an awesome new feature of your software using real sensor data, or if you just want to inspect the quality of the sensor data, etc.<br />
# The first step is again to open a terminal and log in to the robot <pre>sshpico</pre><br />
# Find the topics you would like to record (usually those will be the ones containing data from the LRF and the odometry: /pico/laser and /pico/odom) by using <pre>rostopic list</pre><br />
# You can now use the rosbag tool to record the topics you like: <pre>rosbag record topic_1 topic_2</pre>Topic_1 and topic_2 should of course be changed to the correct topic names, but you can also add more topics to this command. While recording, you should leave this terminal open, and if you think you have enough data, you can stop recording by pressing ctrl+C. If you would like to record all topics (not recommended, as this means recording '''a lot''' of unnecessary data), you could use the option -a instead of typing in all of the topic names.<br />
# The bag file you just recorded is now in the current directory, so if you enter <pre>ls</pre> you can see it among the other files in the current directory. This should be the home directory (if you did not cd to somewhere else). You can now copy this file over the network to your own laptop by opening a '''new terminal''' (or just log out of the robot by pressing ctrl+D), navigating to the directory where you want to place your new bag file, and entering<pre>scp emc@192.168.44.253:~/<filename> <filename></pre> What this command does is the following: it securely copies (scp) from the emc account at the robot's computer the file given by the path after the colon and it places it in your current directory with the second file name. If you gathered multiple bag files on the robot's PC, you can easily copy all of them in one go by doing <pre>scp emc@192.168.44.253:~/*.bag .</pre> This will copy all files wit the .bag extention from the home folder of Pico to your current directory.<br />
# After you have copied your bag files to your own PC, clean up the robot's PC by removing your bag file(s): <pre>rm <filename></pre> This '''permanently''' removes the file from the robot's file system, so if you want to keep it, make sure you only do this after copying it to your own PC!<br />
<br />
== Playing back bag files ==<br />
Now you can play this bag file as often as you like and have your software analyse the sensor data. To do that, take the following steps:<br />
# First start a roscore, like you always do<br />
# Now, because you want your node(s) to use the time that was recorded in the bag file instead of the current system time, you will have to tell it to do that. You can do that by setting the ROS parameter use_sim_time to ''true'': <pre>rosparam set use_sim_time true</pre><br />
# If all is well, you should now be able to play the bag file by entering <pre>rosbag play --clock <filename></pre><br />
For more advanced use and other information on the command line use of rosbag, go to the official [http://wiki.ros.org/rosbag/Commandline documentation of the tool].</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=MRC/Using_Pico&diff=74740MRC/Using Pico2019-05-08T10:57:19Z<p>S131974: /* Starting Pico */</p>
<hr />
<div>== Starting Pico ==<br />
To start Pico please follow the following steps:<br />
# Power on the robot<br />
#* For Pico, the on-off switch is on the bottom, next to the emergency button. This also starts the on-board computer<br />
<!--<br />
#* For Taco, the on-off switch is on the outer edge of the base. Also start the laptop, if it is not already on (you don't need to log in).<br />
--><br />
# Now with the laptop you want to use (one of your group members' laptops) log in to the RoPod wifi network (The TA will enter the credentials for you).<br />
# '''From here on, you should work on your laptop.''' Open a terminal and type <pre>sshpico</pre> The password is '''emc'''.<br />
<!-- where <robot name> is either pico or taco, depending on which robot you want to use. Using this command, you login on the robot's computer; the password is again '''emc'''. --><br />
# Now that you are in, you can start all the necessary nodes on the robot. These controllers and drivers let your software communicate with the hardware. On the robot (so in the terminal you opened in the previous step) enter <br />
#* For Pico: <pre>pstart</pre><br />
<!--<br />
#* For Taco: <pre>tstart</pre><br />
--><br />
# '''N.B. leave this terminal open! '''<br />
<br />
== Running your software ==<br />
Pico is now up and running. To run your own software follow these steps:<br />
# Open a '''new''' terminal and login to your robot again: <pre>sshpico</pre> with password '''emc'''.<br />
# Go to your group's folder: <pre>cd ~/emc/emc<group number></pre><br />
# The rest works the same as on your own PC. <br />
#* The first time, you will have to clone your git project on the robot's computer: <pre>git clone https://gitlab.tue.nl/emc2018/group<group number>.git</pre> Of course with your own group number, project name etc. Just like you did on the PCs of the group members.<br />
#* Any next time you can just navigate to your project folder within your group's folder and <pre>git pull</pre><br />
#* Now that your own software is up to date, you can compile it and run it, again just like you would on your own laptop.<br />
<br />
== Develop while testing ==<br />
<br />
You should avoid having to do hard-core debugging and developing while testing, since you only have limited testing time. However, there may be times when you have to change some things in your code and retry. There are roughly two ways to do this:<br />
<br />
# Edit the files on your pc:<br />
## Simply use Qt Creator or any other editor to change the files<br />
## Push your changes to the git server<br />
## Pull the changes on the robot, recompile, and try<br />
# Edit the files on the robot:<br />
## Use programs such as 'nano' or 'vim' to edit the files<br />
## recompile and test<br />
## Commit and push your changes once you're happy<br />
##* Be sure to set your name and email address before committing!<pre>git config user.email "bla@student.tue.nl"</pre><pre>git config user.name "Your name"</pre>'''Note: don't use the '--global' option as other people are also using the robot. Not having the '--global' option will limit the config change to the current repository.'''<br />
<br />
== Visualization ==<br />
When you want to visualize the robot while testing, you can do the following<br />
# Open a new terminal and type <pre>pico-core</pre> This makes sure that any software you run in this terminal listens to the ros-master on your robot.<br />
# So if you now run our visualization software by entering <pre>emc-viz</pre> it will subscribe to the topics published on the robot.<br />
<br />
== Recording data ==<br />
A simulator simulates a perfect world, so if your software works in the simulator, it is not (at all) guaranteed to work in the real world. But because you only have limited testing time on the robots, it would be nice if you could somehow simulate being in the real world. Luckily, the developers of ROS also ran into this, so they created rosbag. Using rosbag you can record data published by the robot and play it later when you want to test an awesome new feature of your software using real sensor data, or if you just want to inspect the quality of the sensor data, etc.<br />
# The first step is again to open a terminal and log in to the robot <pre>sshpico</pre><br />
# Find the topics you would like to record (usually those will be the ones containing data from the LRF and the odometry: /pico/laser and /pico/odom) by using <pre>rostopic list</pre><br />
# You can now use the rosbag tool to record the topics you like: <pre>rosbag record topic_1 topic_2</pre>Topic_1 and topic_2 should of course be changed to the correct topic names, but you can also add more topics to this command. While recording, you should leave this terminal open, and if you think you have enough data, you can stop recording by pressing ctrl+C. If you would like to record all topics (not recommended, as this means recording '''a lot''' of unnecessary data), you could use the option -a instead of typing in all of the topic names.<br />
# The bag file you just recorded is now in the current directory, so if you enter <pre>ls</pre> you can see it among the other files in the current directory. This should be the home directory (if you did not cd to somewhere else). You can now copy this file over the network to your own laptop by opening a '''new terminal''' (or just log out of the robot by pressing ctrl+D), navigating to the directory where you want to place your new bag file, and entering<pre>scp emc@192.168.44.253:~/<filename> <filename></pre> What this command does is the following: it securely copies (scp) from the emc account at the robot's computer the file given by the path after the colon and it places it in your current directory with the second file name. If you gathered multiple bag files on the robot's PC, you can easily copy all of them in one go by doing <pre>scp emc@192.168.44.253:~/*.bag .</pre> This will copy all files wit the .bag extention from the home folder of Pico to your current directory.<br />
# After you have copied your bag files to your own PC, clean up the robot's PC by removing your bag file(s): <pre>rm <filename></pre> This '''permanently''' removes the file from the robot's file system, so if you want to keep it, make sure you only do this after copying it to your own PC!<br />
<br />
== Playing back bag files ==<br />
Now you can play this bag file as often as you like and have your software analyse the sensor data. To do that, take the following steps:<br />
# First start a roscore, like you always do<br />
# Now, because you want your node(s) to use the time that was recorded in the bag file instead of the current system time, you will have to tell it to do that. You can do that by setting the ROS parameter use_sim_time to ''true'': <pre>rosparam set use_sim_time true</pre><br />
# If all is well, you should now be able to play the bag file by entering <pre>rosbag play --clock <filename></pre><br />
For more advanced use and other information on the command line use of rosbag, go to the official [http://wiki.ros.org/rosbag/Commandline documentation of the tool].</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=MRC/Using_Pico&diff=74738MRC/Using Pico2019-05-08T10:56:42Z<p>S131974: /* Starting Pico */</p>
<hr />
<div>== Starting Pico ==<br />
To start Pico please follow the following steps:<br />
# Power on the robot<br />
#* For Pico, the on-off switch is on the bottom, next to the emergency button. This also starts the on-board computer<br />
<!--<br />
#* For Taco, the on-off switch is on the outer edge of the base. Also start the laptop, if it is not already on (you don't need to log in).<br />
--><br />
# Now with the laptop you want to use (one of your group members' laptops) log in to the RoPod wifi network (The TA will provide you with the credentials).<br />
# '''From here on, you should work on your laptop.''' Open a terminal and type <pre>sshpico</pre> The password is '''emc'''.<br />
<!-- where <robot name> is either pico or taco, depending on which robot you want to use. Using this command, you login on the robot's computer; the password is again '''emc'''. --><br />
# Now that you are in, you can start all the necessary nodes on the robot. These controllers and drivers let your software communicate with the hardware. On the robot (so in the terminal you opened in the previous step) enter <br />
#* For Pico: <pre>pstart</pre><br />
<!--<br />
#* For Taco: <pre>tstart</pre><br />
--><br />
# '''N.B. leave this terminal open! '''<br />
<br />
== Running your software ==<br />
Pico is now up and running. To run your own software follow these steps:<br />
# Open a '''new''' terminal and login to your robot again: <pre>sshpico</pre> with password '''emc'''.<br />
# Go to your group's folder: <pre>cd ~/emc/emc<group number></pre><br />
# The rest works the same as on your own PC. <br />
#* The first time, you will have to clone your git project on the robot's computer: <pre>git clone https://gitlab.tue.nl/emc2018/group<group number>.git</pre> Of course with your own group number, project name etc. Just like you did on the PCs of the group members.<br />
#* Any next time you can just navigate to your project folder within your group's folder and <pre>git pull</pre><br />
#* Now that your own software is up to date, you can compile it and run it, again just like you would on your own laptop.<br />
<br />
== Develop while testing ==<br />
<br />
You should avoid having to do hard-core debugging and developing while testing, since you only have limited testing time. However, there may be times when you have to change some things in your code and retry. There are roughly two ways to do this:<br />
<br />
# Edit the files on your pc:<br />
## Simply use Qt Creator or any other editor to change the files<br />
## Push your changes to the git server<br />
## Pull the changes on the robot, recompile, and try<br />
# Edit the files on the robot:<br />
## Use programs such as 'nano' or 'vim' to edit the files<br />
## recompile and test<br />
## Commit and push your changes once you're happy<br />
##* Be sure to set your name and email address before committing!<pre>git config user.email "bla@student.tue.nl"</pre><pre>git config user.name "Your name"</pre>'''Note: don't use the '--global' option as other people are also using the robot. Not having the '--global' option will limit the config change to the current repository.'''<br />
<br />
== Visualization ==<br />
When you want to visualize the robot while testing, you can do the following<br />
# Open a new terminal and type <pre>pico-core</pre> This makes sure that any software you run in this terminal listens to the ros-master on your robot.<br />
# So if you now run our visualization software by entering <pre>emc-viz</pre> it will subscribe to the topics published on the robot.<br />
<br />
== Recording data ==<br />
A simulator simulates a perfect world, so if your software works in the simulator, it is not (at all) guaranteed to work in the real world. But because you only have limited testing time on the robots, it would be nice if you could somehow simulate being in the real world. Luckily, the developers of ROS also ran into this, so they created rosbag. Using rosbag you can record data published by the robot and play it later when you want to test an awesome new feature of your software using real sensor data, or if you just want to inspect the quality of the sensor data, etc.<br />
# The first step is again to open a terminal and log in to the robot <pre>sshpico</pre><br />
# Find the topics you would like to record (usually those will be the ones containing data from the LRF and the odometry: /pico/laser and /pico/odom) by using <pre>rostopic list</pre><br />
# You can now use the rosbag tool to record the topics you like: <pre>rosbag record topic_1 topic_2</pre>Topic_1 and topic_2 should of course be changed to the correct topic names, but you can also add more topics to this command. While recording, you should leave this terminal open, and if you think you have enough data, you can stop recording by pressing ctrl+C. If you would like to record all topics (not recommended, as this means recording '''a lot''' of unnecessary data), you could use the option -a instead of typing in all of the topic names.<br />
# The bag file you just recorded is now in the current directory, so if you enter <pre>ls</pre> you can see it among the other files in the current directory. This should be the home directory (if you did not cd to somewhere else). You can now copy this file over the network to your own laptop by opening a '''new terminal''' (or just log out of the robot by pressing ctrl+D), navigating to the directory where you want to place your new bag file, and entering<pre>scp emc@192.168.44.253:~/<filename> <filename></pre> What this command does is the following: it securely copies (scp) from the emc account at the robot's computer the file given by the path after the colon and it places it in your current directory with the second file name. If you gathered multiple bag files on the robot's PC, you can easily copy all of them in one go by doing <pre>scp emc@192.168.44.253:~/*.bag .</pre> This will copy all files wit the .bag extention from the home folder of Pico to your current directory.<br />
# After you have copied your bag files to your own PC, clean up the robot's PC by removing your bag file(s): <pre>rm <filename></pre> This '''permanently''' removes the file from the robot's file system, so if you want to keep it, make sure you only do this after copying it to your own PC!<br />
<br />
== Playing back bag files ==<br />
Now you can play this bag file as often as you like and have your software analyse the sensor data. To do that, take the following steps:<br />
# First start a roscore, like you always do<br />
# Now, because you want your node(s) to use the time that was recorded in the bag file instead of the current system time, you will have to tell it to do that. You can do that by setting the ROS parameter use_sim_time to ''true'': <pre>rosparam set use_sim_time true</pre><br />
# If all is well, you should now be able to play the bag file by entering <pre>rosbag play --clock <filename></pre><br />
For more advanced use and other information on the command line use of rosbag, go to the official [http://wiki.ros.org/rosbag/Commandline documentation of the tool].</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2019&diff=73711Embedded Motion Control 20192019-04-24T10:37:47Z<p>S131974: </p>
<hr />
<div><div align="center"><br />
<font size="4">'PICO in the Hospital'</font><br />
</div><br />
[[File:Gostai-Jazz-500x500.jpg|center|thumb|350px]]<br />
<br />
----<br />
<br />
= Introduction =<br />
This course is about software design and how to apply this in the context of autonomous robots. The accompanying assignment is about applying this knowledge to a real-life robotics task.<br />
<br />
= Course Schedule and Lecture Slides =<br />
Lectures will be given on Wednesdays from 15.30h-17.30h in Traverse van Trierzaal. The preliminary course schedule is as follows:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 5em;"<br />
|-<br />
| April 24<br />
| width="325" | Introduction by ''René van de Molengraft''<br />
| width="325" | Tooling and Infrastructure by ''Bob Hendrikx''<br />
|-<br />
| May 1<br />
| width="325" | Best Practices in System Design for Robot Control by ''Herman Bruyninckx''<br />
| width="325" | Architecture by ''Herman Bruyninckx''<br />
|-<br />
| May 8<br />
| colspan="2" | First presentation of the design by ''the groups''. 6-minute presentation, about the group's initial design. Afterwards 4 minutes for questions.<br />
|-<br />
| May 15<br />
| width="325" | '''Escape Room Competition'''<br />
| width="325" | Reflection Session<br />
|-<br />
| May 22<br />
| colspan="2" | <br />
* Worldmodeling for Experts by ''Wouter Houtman'' <br />
* Worldmodeling for Real Experts by ''Marzieh Dolatabadi''<br />
* Worldmodeling in practice by ''Hao Liang Chen''<br />
|-<br />
| June 5<br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| June 12<br />
| colspan="2" | '''Final Competition''' <br />
|-<br />
|}<br />
<!--<br />
= Design Document = <br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with: <br />
* Requirements,<br />
* Functions,<br />
* Components,<br />
* Specifications<br />
* Interfaces.<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 11th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2018}}<br />
<br />
--><br />
<br />
= Getting Started =<br />
<br />
To get started, please do the tutorials on the [[Embedded Motion Control/Tutorials | Tutorial Page]]. <!--Please note:<br />
<br />
* '''Do all tutorials, and all steps. Missing one step may cause a different behavior or incorrect working system later'''. If something is not working as expected, make sure you correctly did all previous steps.<br />
* Of course, things may still go wrong. If so, do not hesitate to contact us.<br />
<br />
* See [[Embedded_Motion_Control/Using_Pico | Using Pico]] for a quick overview of how to use Pico.<br />
--><br />
<br />
= FAQ =<br />
[[Embedded_Motion_Control_2018/FAQ | Here]] you can find a collection of Frequently Asked Questions. Please check this page before contacting the student assistants or the tutors! If you find any issues or questions you had to deal with, please add them as well so your colleagues don't run into the same problems.<br />
<br />
=Group Wiki Pages=<br />
<br />
Group 1 - [[Embedded Motion Control 2019 Group 1 | visit wiki ]] - '''Tutor''': Wouter Kuijpers<br />
<br />
Group 2 - [[Embedded Motion Control 2019 Group 2 | visit wiki ]] - '''Tutor''': Wouter Houtman (Jordy senden in first week)<br />
<br />
Group 3 - [[Embedded Motion Control 2019 Group 3 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<br />
Group 4 - [[Embedded Motion Control 2019 Group 4 | visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
Group 5 - [[Embedded Motion Control 2019 Group 5 | visit wiki ]] - '''Tutor''': Hao Liang Chen<br />
<br />
Group 6 - [[Embedded Motion Control 2019 Group 6 | visit wiki ]] - '''Tutor''': Marzieh Dolatabadi<br />
<br />
Group 7 - [[Embedded Motion Control 2019 Group 7 | visit wiki ]] - '''Tutor''': Yanick Douven<br />
<br />
Group 8 - [[Embedded Motion Control 2019 Group 8| visit wiki ]] - '''Tutor''': Rene & Herman<br />
<br />
Group 9 - [[Embedded Motion Control 2019 Group 9| visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
<!--<br />
=Pico test schedule=<br />
- Be sure you have your software on git before coming to the test session so that you only have to git clone/git pull to get your code on the robot!<br />
<br />
- Please charge the robot whenever possible so there is no down time due to empty batteries.<br />
<br />
To submit for a timeslot you have to be logged in. Through the 'edit'-button for Pico test schedule, you can select a timeslot by typing 'Group <groupnumber>' behind the desired timeslot.<br />
- Submissions are last checked the day before at 22:00.<br />
<br />
==Week 19==<br />
'''For week 19 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 8-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 8-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 8-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 8-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 8-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 8-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 08:45 - 09:40 || <br />
|-<br />
| 9-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 9-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 9-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 9-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 9-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 9-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 9-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 20==<br />
'''For week 20 each group can choose 1 time slot on Monday/Tuesday and 1 time slot on Thursday/Friday'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 13-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 13-5-2019 || 11:45 - 12:40 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 14-5-2019 || 08:45 - 09:40 || <br />
|-<br />
| 14-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 14-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 14-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 14-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 14-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 14-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 14-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 16-5-2019 || 08:45 - 09:40 || <br />
|-<br />
| 16-5-2019 || 09:45 - 10:40 || <br />
|-<br />
| 16-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 16-5-2019 || 11:45 - 12:40 ||<br />
|-<br />
| 16-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 16-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 16-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 16-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 17-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 17-5-2019 || 11:45 - 12:40 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
--><br />
<br />
=Contact Details=<br />
{{:Embedded_Motion_Control_2018/Contact_Details}}</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2019&diff=73699Embedded Motion Control 20192019-04-18T15:04:09Z<p>S131974: </p>
<hr />
<div><div align="center"><br />
<font size="4">'PICO in the Hospital'</font><br />
</div><br />
[[File:Gostai-Jazz-500x500.jpg|center|thumb|350px]]<br />
<br />
----<br />
<br />
= Introduction =<br />
This course is about software design and how to apply this in the context of autonomous robots. The accompanying assignment is about applying this knowledge to a real-life robotics task.<br />
<!--<br />
= Course Schedule and Lecture Slides =<br />
<span style="color:#ff0000"> '''Important Note:''' </span> the deadline for the Wiki-pages has been postponed to June 20th, 23.59h, please consult the announcement on Canvas for more information. <br />
<br />
Lectures will be given on Wednesdays from 15.45h-17.45h from in Luna 1.050. The lecture of <span style="color:#ff0000"> '''May 4''' </span> will be given from 10.45h-12.45h in Auditorium 11. The preliminary course schedule is as follows:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 3em;"<br />
|-<br />
| April 25<br />
| colspan="2" | No lecture (see Canvas!) <br />
|-<br />
| May 2<br />
| width="325" | Introduction by ''René van de Molengraft'' <br />
| width="325" | [[Media:EMC2018_ToolingInfrastructure_Handout2.pdf | Tooling and Infrastructure by ''Wouter Kuijpers'' ]]<br />
|-<br />
| <span style="color:#ff0000"> '''May 4''' </span><br />
| width="325" | [[Media:201804-EMC-MotionStackArchitecture.pdf | Best Practices in System Design for Robot Control]] by ''Herman Bruyninckx''<br />
| width="325" | Architecture by ''Herman Bruyninckx''<br />
|-<br />
| May 9<br />
| colspan="2" | No lecture <br />
|-<br />
| May 16<br />
| colspan="2" | First presentation of the design by ''the groups''. 6-minute presentation, about the group's initial design. Afterwards 4 minutes for questions.<br />
|-<br />
| May 23<br />
| width="325" | '''Escape Room Competition'''<br />
| width="325" | Worldmodeling by ''Herman Bruyninckx''<br />
|-<br />
| May 30<br />
| colspan="2" | <br />
* Worldmodeling for Experts by ''Wouter Houtman'' <br />
* [[Media:EMC2018_WM_IoT.pdf | Worldmodeling for Real Experts by ''Marzieh Dolatabadi'' ]]<br />
* Worldmodeling in practice by ''Bob Hendrikx''<br />
|-<br />
| June 6 <br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| June 13<br />
| colspan="2" | '''Final Competition''' [[Media:Map_hospital.png | (Hospital map for simulator)]]<br />
|-<br />
| <span style="color:#ff0000"> '''June 20''' </span><br />
| colspan="2" | '''Deadline Wiki Pages'''<br />
|-<br />
|}<br />
<br />
= Design Document = <br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with: <br />
* Requirements,<br />
* Functions,<br />
* Components,<br />
* Specifications<br />
* Interfaces.<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 11th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2018}}<br />
<br />
--><br />
= Getting Started =<br />
<br />
To get started, please do the tutorials on the [[Embedded Motion Control/Tutorials | Tutorial Page]]. <!--Please note:<br />
<br />
* '''Do all tutorials, and all steps. Missing one step may cause a different behavior or incorrect working system later'''. If something is not working as expected, make sure you correctly did all previous steps.<br />
* Of course, things may still go wrong. If so, do not hesitate to contact us.<br />
<br />
* See [[Embedded_Motion_Control/Using_Pico | Using Pico]] for a quick overview of how to use Pico.<br />
--><br />
<br />
= FAQ =<br />
[[Embedded_Motion_Control_2018/FAQ | Here]] you can find a collection of Frequently Asked Questions. Please check this page before contacting the student assistants or the tutors! If you find any issues or questions you had to deal with, please add them as well so your colleagues don't run into the same problems.<br />
<br />
=Group Wiki Pages=<br />
<br />
Group 1 - [[Embedded Motion Control 2019 Group 1 | visit wiki ]] - '''Tutor''': Wouter Kuipers<br />
<br />
Group 2 - [[Embedded Motion Control 2019 Group 2 | visit wiki ]] - '''Tutor''': Wouter Houtman (Jordy senden in first week)<br />
<br />
Group 3 - [[Embedded Motion Control 2019 Group 3 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<br />
Group 4 - [[Embedded Motion Control 2019 Group 4 | visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
Group 5 - [[Embedded Motion Control 2019 Group 5 | visit wiki ]] - '''Tutor''': Hao Liang Chen<br />
<br />
Group 6 - [[Embedded Motion Control 2019 Group 6 | visit wiki ]] - '''Tutor''': Marzieh Dolatabadi<br />
<br />
Group 7 - [[Embedded Motion Control 2019 Group 7 | visit wiki ]] - '''Tutor''': Yanick Douven<br />
<br />
Group 8 - [[Embedded Motion Control 2019 Group 8| visit wiki ]] - '''Tutor''': Rene & Herman<br />
<br />
Group 9 - [[Embedded Motion Control 2019 Group 9| visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
<!--<br />
=Pico test schedule=<br />
- Be sure you have your software on git before coming to the test session so that you only have to git clone/git pull to get your code on the robot!<br />
<br />
- Please charge the robot whenever possible so there is no down time due to empty batteries.<br />
<br />
To submit for a timeslot you have to be logged in. Through the 'edit'-button for Pico test schedule, you can select a timeslot by typing 'Group <groupnumber>' behind the desired timeslot.<br />
- Submissions are last checked the day before at 22:00.<br />
<br />
==Week 19==<br />
'''For week 19 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 8-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 8-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 8-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 8-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 8-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 8-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 8:45 - 9:40 || <br />
|-<br />
| 9-5-2019 || 9:45 - 10:40 || <br />
|-<br />
| 9-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 9-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 9-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 9-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 9-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 9-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 20==<br />
'''For week 20 each group can choose 1 time slot on Monday/Tuesday and 1 time slot on Thursday/Friday'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 13-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 13-5-2019 || 11:45 - 12:40 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 14-5-2019 || 8:45 - 9:40 || <br />
|-<br />
| 14-5-2019 || 9:45 - 10:40 || <br />
|-<br />
| 14-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 14-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 14-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 14-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 14-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 14-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 16-5-2019 || 8:45 - 9:40 || <br />
|-<br />
| 16-5-2019 || 9:45 - 10:40 || <br />
|-<br />
| 16-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 16-5-2019 || 11:45 - 12:40 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 17-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 17-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 17-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 17-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 17-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 17-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
--><br />
<br />
=Contact Details=<br />
{{:Embedded_Motion_Control_2018/Contact_Details}}</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2019&diff=73698Embedded Motion Control 20192019-04-18T15:01:20Z<p>S131974: </p>
<hr />
<div><div align="center"><br />
<font size="4">'PICO in the Hospital'</font><br />
</div><br />
[[File:Gostai-Jazz-500x500.jpg|center|thumb|350px]]<br />
<br />
----<br />
<br />
= Introduction =<br />
This course is about software design and how to apply this in the context of autonomous robots. The accompanying assignment is about applying this knowledge to a real-life robotics task.<br />
<!--<br />
= Course Schedule and Lecture Slides =<br />
<span style="color:#ff0000"> '''Important Note:''' </span> the deadline for the Wiki-pages has been postponed to June 20th, 23.59h, please consult the announcement on Canvas for more information. <br />
<br />
Lectures will be given on Wednesdays from 15.45h-17.45h from in Luna 1.050. The lecture of <span style="color:#ff0000"> '''May 4''' </span> will be given from 10.45h-12.45h in Auditorium 11. The preliminary course schedule is as follows:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 3em;"<br />
|-<br />
| April 25<br />
| colspan="2" | No lecture (see Canvas!) <br />
|-<br />
| May 2<br />
| width="325" | Introduction by ''René van de Molengraft'' <br />
| width="325" | [[Media:EMC2018_ToolingInfrastructure_Handout2.pdf | Tooling and Infrastructure by ''Wouter Kuijpers'' ]]<br />
|-<br />
| <span style="color:#ff0000"> '''May 4''' </span><br />
| width="325" | [[Media:201804-EMC-MotionStackArchitecture.pdf | Best Practices in System Design for Robot Control]] by ''Herman Bruyninckx''<br />
| width="325" | Architecture by ''Herman Bruyninckx''<br />
|-<br />
| May 9<br />
| colspan="2" | No lecture <br />
|-<br />
| May 16<br />
| colspan="2" | First presentation of the design by ''the groups''. 6-minute presentation, about the group's initial design. Afterwards 4 minutes for questions.<br />
|-<br />
| May 23<br />
| width="325" | '''Escape Room Competition'''<br />
| width="325" | Worldmodeling by ''Herman Bruyninckx''<br />
|-<br />
| May 30<br />
| colspan="2" | <br />
* Worldmodeling for Experts by ''Wouter Houtman'' <br />
* [[Media:EMC2018_WM_IoT.pdf | Worldmodeling for Real Experts by ''Marzieh Dolatabadi'' ]]<br />
* Worldmodeling in practice by ''Bob Hendrikx''<br />
|-<br />
| June 6 <br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| June 13<br />
| colspan="2" | '''Final Competition''' [[Media:Map_hospital.png | (Hospital map for simulator)]]<br />
|-<br />
| <span style="color:#ff0000"> '''June 20''' </span><br />
| colspan="2" | '''Deadline Wiki Pages'''<br />
|-<br />
|}<br />
<br />
= Design Document = <br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with: <br />
* Requirements,<br />
* Functions,<br />
* Components,<br />
* Specifications<br />
* Interfaces.<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 11th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2018}}<br />
<br />
--><br />
= Getting Started =<br />
<br />
To get started, please do the tutorials on the [[Embedded Motion Control/Tutorials | Tutorial Page]]. <!--Please note:<br />
<br />
* '''Do all tutorials, and all steps. Missing one step may cause a different behavior or incorrect working system later'''. If something is not working as expected, make sure you correctly did all previous steps.<br />
* Of course, things may still go wrong. If so, do not hesitate to contact us.<br />
<br />
* See [[Embedded_Motion_Control/Using_Pico | Using Pico]] for a quick overview of how to use Pico.<br />
--><br />
<br />
= FAQ =<br />
[[Embedded_Motion_Control_2018/FAQ | Here]] you can find a collection of Frequently Asked Questions. Please check this page before contacting the student assistants or the tutors! If you find any issues or questions you had to deal with, please add them as well so your colleagues don't run into the same problems.<br />
<br />
=Group Wiki Pages=<br />
<br />
Group 1 - [[Embedded Motion Control 2019 Group 1 | visit wiki ]] - '''Tutor''': Wouter Kuipers<br />
<br />
Group 2 - [[Embedded Motion Control 2019 Group 2 | visit wiki ]] - '''Tutor''': Wouter Houtman (Jordy senden in first week)<br />
<br />
Group 3 - [[Embedded Motion Control 2019 Group 3 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<br />
Group 4 - [[Embedded Motion Control 2019 Group 4 | visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
Group 5 - [[Embedded Motion Control 2019 Group 5 | visit wiki ]] - '''Tutor''': Hao Liang Chen<br />
<br />
Group 6 - [[Embedded Motion Control 2019 Group 6 | visit wiki ]] - '''Tutor''': Marzieh Dolatabadi<br />
<br />
Group 7 - [[Embedded Motion Control 2019 Group 7 | visit wiki ]] - '''Tutor''': Yanick Douven<br />
<br />
Group 8 - [[Embedded Motion Control 2019 Group 8| visit wiki ]] - '''Tutor''': Rene & Herman<br />
<br />
Group 9 - [[Embedded Motion Control 2019 Group 9| visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
<br />
=Pico test schedule=<br />
- Be sure you have your software on git before coming to the test session so that you only have to git clone/git pull to get your code on the robot!<br />
<br />
- Please charge the robot whenever possible so there is no down time due to empty batteries.<br />
<br />
To submit for a timeslot you have to be logged in. Through the 'edit'-button for Pico test schedule, you can select a timeslot by typing 'Group <groupnumber>' behind the desired timeslot.<br />
- Submissions are last checked the day before at 22:00.<br />
<br />
==Week 19==<br />
'''For week 19 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 8-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 8-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 8-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 8-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 8-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 8-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 9-5-2019 || 8:45 - 9:40 || <br />
|-<br />
| 9-5-2019 || 9:45 - 10:40 || <br />
|-<br />
| 9-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 9-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 9-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 9-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 9-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 9-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
==Week 20==<br />
'''For week 20 each group can choose 1 time slot on Monday/Tuesday and 1 time slot on Thursday/Friday'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Monday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 13-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 13-5-2019 || 11:45 - 12:40 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 14-5-2019 || 8:45 - 9:40 || <br />
|-<br />
| 14-5-2019 || 9:45 - 10:40 || <br />
|-<br />
| 14-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 14-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 14-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 14-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 14-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 14-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 16-5-2019 || 8:45 - 9:40 || <br />
|-<br />
| 16-5-2019 || 9:45 - 10:40 || <br />
|-<br />
| 16-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 16-5-2019 || 11:45 - 12:40 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 20 Friday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 17-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 17-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 17-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 17-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 17-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 17-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
=Contact Details=<br />
{{:Embedded_Motion_Control_2018/Contact_Details}}</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2019&diff=73697Embedded Motion Control 20192019-04-18T14:50:32Z<p>S131974: </p>
<hr />
<div><div align="center"><br />
<font size="4">'PICO in the Hospital'</font><br />
</div><br />
[[File:Gostai-Jazz-500x500.jpg|center|thumb|350px]]<br />
<br />
----<br />
<br />
= Introduction =<br />
This course is about software design and how to apply this in the context of autonomous robots. The accompanying assignment is about applying this knowledge to a real-life robotics task.<br />
<!--<br />
= Course Schedule and Lecture Slides =<br />
<span style="color:#ff0000"> '''Important Note:''' </span> the deadline for the Wiki-pages has been postponed to June 20th, 23.59h, please consult the announcement on Canvas for more information. <br />
<br />
Lectures will be given on Wednesdays from 15.45h-17.45h from in Luna 1.050. The lecture of <span style="color:#ff0000"> '''May 4''' </span> will be given from 10.45h-12.45h in Auditorium 11. The preliminary course schedule is as follows:<br />
<br />
{| border="1" cellpadding="5" cellspacing="0" align="center" style="margin-left: 3em;"<br />
|-<br />
| April 25<br />
| colspan="2" | No lecture (see Canvas!) <br />
|-<br />
| May 2<br />
| width="325" | Introduction by ''René van de Molengraft'' <br />
| width="325" | [[Media:EMC2018_ToolingInfrastructure_Handout2.pdf | Tooling and Infrastructure by ''Wouter Kuijpers'' ]]<br />
|-<br />
| <span style="color:#ff0000"> '''May 4''' </span><br />
| width="325" | [[Media:201804-EMC-MotionStackArchitecture.pdf | Best Practices in System Design for Robot Control]] by ''Herman Bruyninckx''<br />
| width="325" | Architecture by ''Herman Bruyninckx''<br />
|-<br />
| May 9<br />
| colspan="2" | No lecture <br />
|-<br />
| May 16<br />
| colspan="2" | First presentation of the design by ''the groups''. 6-minute presentation, about the group's initial design. Afterwards 4 minutes for questions.<br />
|-<br />
| May 23<br />
| width="325" | '''Escape Room Competition'''<br />
| width="325" | Worldmodeling by ''Herman Bruyninckx''<br />
|-<br />
| May 30<br />
| colspan="2" | <br />
* Worldmodeling for Experts by ''Wouter Houtman'' <br />
* [[Media:EMC2018_WM_IoT.pdf | Worldmodeling for Real Experts by ''Marzieh Dolatabadi'' ]]<br />
* Worldmodeling in practice by ''Bob Hendrikx''<br />
|-<br />
| June 6 <br />
| colspan="2" | Presentation of final design by the ''groups''.<br />
|-<br />
| June 13<br />
| colspan="2" | '''Final Competition''' [[Media:Map_hospital.png | (Hospital map for simulator)]]<br />
|-<br />
| <span style="color:#ff0000"> '''June 20''' </span><br />
| colspan="2" | '''Deadline Wiki Pages'''<br />
|-<br />
|}<br />
<br />
= Design Document = <br />
Hand-in a 3-page A4-sized design document as pdf (<1Mb) that pictures/describes the initial design idea with: <br />
* Requirements,<br />
* Functions,<br />
* Components,<br />
* Specifications<br />
* Interfaces.<br />
You should upload this design document to your group's Wiki-page as this is a vital document in the design process. Make sure the document has been uploaded on May 11th, 17.00h. In case of questions about the document, consult your tutor.<br />
<br />
= Escape Room Competition =<br />
{{:Embedded_Motion_Control/Escape_Room_Competition_2018}}<br />
<br />
= Hospital Competition =<br />
{{:Embedded_Motion_Control/Hospital_Room_Competition_2018}}<br />
<br />
--><br />
= Getting Started =<br />
<br />
To get started, please do the tutorials on the [[Embedded Motion Control/Tutorials | Tutorial Page]]. <!--Please note:<br />
<br />
* '''Do all tutorials, and all steps. Missing one step may cause a different behavior or incorrect working system later'''. If something is not working as expected, make sure you correctly did all previous steps.<br />
* Of course, things may still go wrong. If so, do not hesitate to contact us.<br />
<br />
* See [[Embedded_Motion_Control/Using_Pico | Using Pico]] for a quick overview of how to use Pico.<br />
--><br />
<br />
= FAQ =<br />
[[Embedded_Motion_Control_2018/FAQ | Here]] you can find a collection of Frequently Asked Questions. Please check this page before contacting the student assistants or the tutors! If you find any issues or questions you had to deal with, please add them as well so your colleagues don't run into the same problems.<br />
<br />
=Group Wiki Pages=<br />
<br />
Group 1 - [[Embedded Motion Control 2019 Group 1 | visit wiki ]] - '''Tutor''': Wouter Kuipers<br />
<br />
Group 2 - [[Embedded Motion Control 2019 Group 2 | visit wiki ]] - '''Tutor''': Wouter Houtman (Jordy senden in first week)<br />
<br />
Group 3 - [[Embedded Motion Control 2019 Group 3 | visit wiki ]] - '''Tutor''': Jordy Senden<br />
<br />
Group 4 - [[Embedded Motion Control 2019 Group 4 | visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
Group 5 - [[Embedded Motion Control 2019 Group 5 | visit wiki ]] - '''Tutor''': Hao Liang Chen<br />
<br />
Group 6 - [[Embedded Motion Control 2019 Group 6 | visit wiki ]] - '''Tutor''': Marzieh Dolatabadi<br />
<br />
Group 7 - [[Embedded Motion Control 2019 Group 7 | visit wiki ]] - '''Tutor''': Yanick Douven<br />
<br />
Group 8 - [[Embedded Motion Control 2019 Group 8| visit wiki ]] - '''Tutor''': Rene & Herman<br />
<br />
Group 9 - [[Embedded Motion Control 2019 Group 9| visit wiki ]] - '''Tutor''': Bob Hendrikx<br />
<br />
<br />
=Pico test schedule=<br />
- Be sure you have your software on git before coming to the test session so that you only have to git clone/git pull to get your code on the robot!<br />
<br />
- Please charge the robot whenever possible so there is no down time due to empty batteries.<br />
<br />
To submit for a timeslot you have to be logged in. Through the 'edit'-button for Pico test schedule, you can select a timeslot by typing 'Group <groupnumber>' behind the desired timeslot.<br />
- Submissions are last checked the day before at 22:00.<br />
<br />
==Week 19==<br />
'''For week 19 each group can choose 2 time slots'''. Choose wisely.<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Tuesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Wednesday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
{| class="TablePager" style="width: 230px; min-width: 240px; margin-left: 2em; float:left; color: black;"<br />
|+ '''Week 19 Thursday'''<br />
|-<br />
! scope="col" | '''Date'''<br />
! scope="col" | '''Time'''<br />
! scope="col" | '''Group'''<br />
|-<br />
| 7-5-2019 || 8:45 - 9:40 || <br />
|-<br />
| 7-5-2019 || 9:45 - 10:40 || <br />
|-<br />
| 7-5-2019 || 10:45 - 11:40 || <br />
|-<br />
| 7-5-2019 || 11:45 - 12:40 || <br />
|-<br />
| 7-5-2019 || 13:30 - 14:25 || <br />
|-<br />
| 7-5-2019 || 14:30 - 15:25 ||<br />
|-<br />
| 7-5-2019 || 15:30 - 16:25 || <br />
|-<br />
| 7-5-2019 || 16:30 - 17:25 || <br />
|}<br />
<br />
<div style="clear:both"></div><br />
<br><br />
<br />
<br />
=Contact Details=<br />
{{:Embedded_Motion_Control_2018/Contact_Details}}</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2018_Group_3&diff=59956Embedded Motion Control 2018 Group 32018-06-19T12:17:41Z<p>S131974: /* Code */</p>
<hr />
<div>= Group Members =<br />
{| border="1" cellpadding="5" cellspacing="1" style="float:left;"<br />
! TU/e Number<br />
! Name<br />
! E-mail<br />
|- <br />
| 0848904<br />
| Luc (L.L.M.) van den Aker<br />
| <tt>l dot l dot m dot v dot d dot aker at student dot tue dot nl</tt><br />
|-<br />
| 0852908<br />
| Thomas (T.) Neilen<br />
| <tt>t dot neilen at student dot tue dot nl</tt><br />
|-<br />
| 0909434<br />
| Jeroen (J.W.) van de Valk<br />
| <tt>j dot w dot v dot d dot valk at student dot tue dot nl</tt><br />
|-<br />
| 0896947<br />
| Nourdin (N.) Kaai<br />
| <tt>n dot kaai at student dot tue dot nl</tt><br />
|-<br />
| 0883056<br />
| Peter (P.) van Dooren<br />
| <tt>p dot v dot dooren at student dot tue dot nl</tt><br />
|-<br />
| 0861750<br />
| Ties (T.J.) van Loon<br />
| <tt>t dot j dot v dot loon at student dot tue dot nl</tt><br />
|-<br />
|}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Wiki Info=<br />
'''NOTE: This is just for the menbers of Group 3 and will be deleted before the deadline!'''<br />
<br />
==Wiki Deadline==<br />
The Wiki, code and peer review deadline is: Wednesday, 20 June, 23:59h.<br />
<br />
==Wiki Content==<br />
Make sure the Wiki of your group contains:<br />
* An overview of the software architecture and approach used. How does it map to the paradigms explained in this course?<br />
* A description of the methods that make your solution work so well, preferably using nice explanatory images (explain what makes your solution unique; what are you most proud of?)<br />
* Which difficult problems were identified, and how were they solved?<br />
* An evaluation of the hospital challenge: What went well? What went wrong? Why? How could it be improved?<br />
* Videos / GIFs / animations / diagrams / pictures are very welcome! The simulator map for the Hospital Room challenge will be posted after the challenge (of course), so you can show that you are able to solve the challenge in simulation.<br />
<br />
==Publishing Code==<br />
A part of the grading criteria in this course is the quality of your code. We will not dive into your full code base. Instead, link to one or a few pieces of code or code files of which you are particularly proud, and which you think reflect the lessons taught: you can use the code snippet system as included in Gitlab. Do ensure we can access the code! Of course, feel free to also add some introductory/explanatory remarks on the Wiki, or as comments in the code. Make sure the links to your code snippets are clearly visible from your Wiki. For example, put them in a separate section called: ''Code''.<br />
<br />
=Initial Design=<br />
The initial design is explained in the following parts:<br />
* Requirements<br />
* Functions<br />
* Components<br />
* Specifications<br />
* Interfaces<br />
Note that the report of the initial design is shared in Documents.<br />
<br />
==Requirements==<br />
* PICO should make no collisions with any walls<br />
* PICO cannot stand still for 30 seconds or longer<br />
* For the escape room challenge, the robot should leave the room within 5 minutes<br />
* For the hospital challenge, within 5 minutes, mapping, reverse parking and obtaining the object should be done<br />
* Its surroundings should be made visible in a map<br />
* PICO should be able to reach every position in the room<br />
* PICO should be able to leave every room<br />
* PICO should make distinction between the hall and rooms<br />
* It should run autonomously, so in each challenge there should be no additional input<br />
* To start your software, only one executable has to be called<br />
* PICO should be able to recognize an object and stand still close to it<br />
<br />
==Functions==<br />
* PICO should be able to drive in any direction<br />
* PICO should be able to turn around<br />
* It should be able to detect walls<br />
* PICO has to know its own position within the mapped map<br />
* PICO is able to construct a map<br />
* It should be possible to create a trajectory to a room<br />
* PICO should be able to recognize an object<br />
<br />
==Components==<br />
* Sensors:<br />
** Laser Range Finder (LRF)<br />
** Wheel encoders (odometry)<br />
* Actuator:<br />
** Holonomic base (omni-wheels)<br />
* Computer:<br />
** Intel i7<br />
** Ubuntu 16.04<br />
<br />
==Specifications==<br />
* Translation maximum: 0.5 m/s<br />
* Rotation maximum: 1.2 rad/s<br />
* Range of Laser Range Finder is assumed to be bigger than maximum room dimension<br />
* The field of view of the Laser Range Finder is from -2 rad to 2 rad, divided in pieces of 0.004004<br />
* The Laser Range Finder can only measure at one height<br />
<br />
==Interfaces==<br />
The interfaces of the initial design are shown here:<br />
<br />
[[File:InterfaceGroup3.png]]<br />
<br />
As shown in the figure above, a world model is the link between all other parts. The tasks represent the highest level, meaning the most global work PICO has to do. The skills are needed to complete these tasks and some motions together form a skill. The perception contains the sensors, the continuous data. Below an overview of the different parts are given:<br />
<br />
''World model:''<br />
* Compose map<br />
* Object recognition<br />
<br />
''Tasks:''<br />
* Mapping of the environment <br />
* Backward parking at the specified location<br />
* Searching for the object<br />
<br />
''Skills:''<br />
* Planning a trajectory<br />
* Collision avoidance<br />
* Backward parking<br />
* Navigate<br />
* Positioning in front of an opening<br />
* Compose maps<br />
<br />
''Motion:''<br />
* Translation <br />
* Rotation<br />
<br />
''Perception:''<br />
* Odometry <br />
* Laser Range Finder<br />
* Control effort<br />
<br />
=Escape Room Challenge=<br />
Since our code to map a room was not finished completely, a new code for the escape room challenge was made. This code was kept simple and effective. PICO should drive to a wall, turn to the left when it detects a wall within 0.4 meters from itself, and follow the wall (without hitting it of course). Then it will scan for a hallway to exit the room. When he sees a way to exit the room, PICO will go through the opening in the wall. <br />
<br />
Our first attempt during the escape room challange was very successful! PICO drove out of the room, but we were convinced he could do it even faster. So we set the speed higher for the second try, and it was even faster. PICO drove out of the room within 29 seconds. This resulted in a second place and being one of the two teams that made it out of the room.<br />
<br />
Here a shot video is shown of PICO leaving a room. Note that this is not filmed during the 'official' escape room challenge. Due to our enthousiasm, we forgot to film, so we reconstructed the room during one of our test sessions.<br />
<br />
[[File:EscapeRoomChallenge.gif]]<br />
<br />
=Final Design=<br />
First off, the architecture is explained. This architecture is based on the theorem and takes the requirements of the hospital challenge into account. The architecture is explained in six steps:<br />
* World model<br />
* Detection<br />
* Localization<br />
* Trajectory planning<br />
* Motion control <br />
* Task manager<br />
The overall architecture is visualized here:<br />
<br />
[[File:ArchitectureCorrected.png|650px]]<br />
<br />
All six main components that are in this archtecture will be explained now.<br />
<br />
==World Model==<br />
To build a map of the hospital a twofold mapping procedure will be used. First PICO will map the room it is currently standing in. Secondly a graph connecting all mapped rooms with each other is stored. By using this two level mapping abstraction it is easier to locate PICO in a certain room. Also trajectory planning to a desired room can be more efficiently by using the graph. <br />
The data structures used to store the obtained data are the Rooms, Exits and a graph with all the Rooms.<br />
Once a room is mapped it is stored in a Room object. This object contains the width and height of the room, a global ID of the room and Exit objects. The Exit objects have a local ID, ie the ID of the exit has only meaning when the room it belongs to is also know. The exits also have a location in the coordinate frame of the room and a destination. <br />
The world model also holds the current position and the current position based on odometry.<br />
<br />
===Graph===<br />
Every room (square in figure) and door (circle in figure) will be numbered with an ID and then stored in the world model in the form of a graph. An visual representation of such graph can be seen below:<br />
<br />
[[File:Graph.png|200px]]<br />
<br />
Using the grapgh, it can be easily seen what trajectory PICO should take to find the object. As the hint states, the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, it can be quickly determined what sequence of room ID and door IDs is the longest. Knowing this makes finding the object easier, since PICO does not have to look in every room again, bit can immeadily go to the room with the longest sequence.<br />
<br />
==Line Extraction==<br />
The first step in mapping a room is to extract line segments from the obtained laser data. For this a pre-made laser line extraction package was used. This code was slightly modified to remove the ROS layer. the source code can be found on: https://github.com/kam3k/laser_line_extraction<br />
<br />
This package employs a split and merge algorithm [T. Pavlidis and S. L. Horowitz, "Segmentation of Plane Curves," in IEEE Transactions on Computers, vol. C-23, no. 8, pp. 860-870, Aug. 1974] The obtained laser data for the rooms was relatively clean, thus no filtering before the line extraction was applied. The parameters used in the algorithm needed some additional tuning to give the optimal result.<br />
In the figures below, the lines can be seen:<br />
<br />
[[File:Line_detection_Sim.png|300px]] [[File:Line_detection_Lines.png|300px]]<br />
<br />
==Fit Room==<br />
The mapping of a room is done using the lines found by the line extraction.<br />
<br />
===Saving Lines===<br />
To map a room PICO needs to look 360° around him, however the laser range finder only has a limited range. Therefore a PICO will scan lines, turn around 180° and scan another time. It will then combine these two sets to end up with a set of lines which describe the entire room around PICO.<br />
<br />
The first time this is done pico’s position will be saved. The lines are transformed using the orientation of pico. This way the resulting lines are aligned with the global axis system but the 0,0 position is at pico’s location. This new frame will be called the mappedFrame.<br />
<br />
after rotating 180 degrees. Pico will merge the detected lines. First the lines are transformed to the mapping frame. Then the lines are compared to the lines already saved. If the lines are collinear, (they have similar same radius and angle) the lines are checked for overlap. The start and end points of the new line are projected on the compared line. If either of the projected point lies on the old line with some margin of error. The line is merged. This is done by taking the furthest start and end point. <br />
<br />
In the figures below, the two sets of lines can be seen, followed by the merged set of lines: <br />
<br />
[[File:Transform_sim.png|300px]] [[File:Transform_lines.png|300px]] [[File:Merged_lines.png|300px]]<br />
<br />
===Determine dimensions===<br />
Once PICO has assembled a set of lines all around him, he can determine the properties of the room he is in. This is done in two steps: <br />
* The dimensions of the room are found.<br />
* All the exits of the room are found.<br />
<br />
A box is defined with a distances to the left, to the right, above and below pico. The width and height of the room are determined by fitting the largest possible box inside the lines in mergedLines. An initial guess for the distances is made using the minimum radii of all lines which have the right orientation. Each line in mergedLines can be determined to be either to the left, to the right, above and below pico.<br />
<br />
For example, consider the left wall of the room. In the figure below three lines have the correct orientation to belong to that wall. The initial estimate for the distance to the left of pico is chosen as the smallest radius among those three lines. The same is done for the other three walls.<br />
<br />
After the initial estimate it is possible that the box is still smaller than the room. This can be caused by lines outside the room which happen to have a smaller radius. To expand the size of the room an iterative procedure is used. One side at a time the function checks whether the room can be expanded in this direction. It again searches for a minimum radius among a selection of lines, however this time a criteria is added that the line must fall within the estimated box after expansion. This will filter out most lines outside of the room. The procedure continues until it has gone one cycle without updating the distances. Using the distances left, right, up and down the width and height of the room can be determined as well as the location of pico in this new room, expressed in the new room frame.<br />
<br />
[[File:testRoomMergedLines.png|200px]] <br />
[[File:testRoomFit1.png|200px]] <br />
[[File:testRoomFit2.png|200px]] <br />
[[File:testRoomFit3.png|200px]] <br />
<br />
There are edge cases where this procedure goes wrong however they are considered rare enough that they are not taken into account.<br />
<br />
[[File:EdgeCaseRoomFit.png|300px]]<br />
<br />
===Find exits===<br />
In order to find the exits a function is made which once again loops over the lines in mergedLines. It will determine whether a line belongs to the room as determined by the dimensions previously established. If the gap between two consecutive lines which belong to the room is the size of a door (between 0.4 and 1.7m). An exit is added there. After looping over all lines a final check is done to determine whether an exit exists between the first and last lines in mergedLines.<br />
<br />
[[File:testRoomExits.png|300px]] <br />
<br />
===Adding the room to the world model===<br />
After the room has been fitted it must be added to the map in the world model. There are several properties of the room which still need to be determined. <br />
The location of the room coordinate frame is calculated using the room coordinate frame of the previous room, the location of pico in the previous room frame (mappedFrame) and the location of pico in the new room.<br />
The exit pico went through in the previous room must be linked to an exit found in the new room. This is done by calculating the distance from the exits in the new room to the exit taken in the previous room. The exit with the smallest distance is linked to this new room. The destinations of the two exits are set and the exit in the new room is moved to the front of the vector with exits so that exits[0] always leads back to the hallway.<br />
Finally pico's location and current room are updated to be in the new room.<br />
<br />
==Localization==<br />
Once a room has been mapped. PICO will be able to compare the detected lines to the map it has made. Based on this, PICO's location can be determined. As the odometry data of PICO is unreliable, another solution had to be made to reliably navigate through the environment. A solution had to be made that navigates PICO based on the local coordinates of a room. To do this three different functionalities had to be implemented:<br />
* Make an initial guess of PICO’s position within a room.<br />
* Determine which lines are part of a specific room.<br />
* Determine PICO’s position based on LRF-data.<br />
[[File:Localisation_animation.gif]]<br />
===Initial guess===<br />
The localisation script constantly provides information on PICO’s position. When PICO is leaving a room through a door to another room, this position is used as an initial guess for PICO’s current coordinates. Using these coordinates the lines that PICO sees can be transformed to the coordinate frame of the new room.<br />
<br />
===Line filtering===<br />
The lines that PICO sees are converted to the coordinate system of the room. Based on the information previously gathered about a specific room it is determined which of the lines that PICO currently sees are actually part of the room itself. This is to prevent that for example lines from a hallway are used in the localisation. First it is checked if the end points of the lines directly coincide with the corners of the room. A vector is spanned between the coordinates of a corner and the end point under consideration. The norm of this vector should not exceed a certain parameter in order to be considered to be part of the room. Another possibility is that the end point of a line lies on the contour of a room. In order to determine if this is happening the closest distance of this end point to the line spanned by the two nearby corners should be determined. This can be done using simple vector calculus.<br />
<br />
The shortest distance between a line the origin is expressed in the following equation:<br />
<br />
<br />
<math>\left(\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}\right)\cdot\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}=0</math><br />
<br />
<br />
In this equation <math>p_{1}</math> and <math>p_{2}</math> are calculated by substracting the end point of the line under consideration from the corners of the room. <math>t</math> is calculated, and substituted in the following equation to obtain the vector spanned between the end point and the line:<br />
<br />
<br />
<math>\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}</math><br />
<br />
<br />
The length of this vector is also compared with the fixed parameter used to test the coincidence of the end points and the corners.<br />
<br />
===Localisation===<br />
Because the lines are created in a certain way, it can be derived to which of the four walls they belong. The start- and end points of lines are defined in a counter-clockwise manner around the coordinate system, and the angle of the lines is calculated with respect to the x-axis of a this coordinate system. The lines corresponding to the rightmost wall would thus have an angle corresponding to <math>0</math> radians, the upper walls <math>\frac{1}{2}\pi</math> radians, the leftmost walls <math>\pi</math> radians and the lower walls <math>\frac{3}{2}\pi</math> radians. When it is determined which lines belong to which walls, information about the distance from PICO to these walls is extracted from the untransformed lines. This information is used to calculate PICO’s x and y coordinates in a room, by comparing the data to the previously stored width and height of a room.<br />
<br />
===Angle Estimation===<br />
The odometry on PICO gives an estimate of the orientation of PICO. However due to the nature of odometry this estimate will drift over time. Therefore an absolute measurement of the angle is necessary to reset the odometry measurement. This is done using the lines extracted by PICO. These lines have a radius and an angle relative to PICO. Since the hospital is contructed of perpendicular lines PICO can determine it's angle relative to the walls. By using an initial guess, which will give the general direction PICO is oriented in, i.e. whether its angle is around <math>0</math>, <math>\dfrac{1}{2}\pi</math>, <math>\pi</math>, or <math>-\frac{1}{2}\pi</math>. Then the angle is corrected y using the following equation on the measurement:<br />
<br />
<math>estimate +mod_{0.5 * \pi}(measuredAngle)</math><br />
<br />
==Trajectory Planning==<br />
This part plans the trajectory PICO should take during the hospital challenge.<br />
<br />
===Approaching a Door===<br />
From the worldmodel PICO obtains his current position, and the position of the two corners of the door. A function is made which basically calculates a point right in the middle of the two corners, and puts a setpoint at a specified distance in front of the midpoint of the door and behind the midpoint of the door seen in the Figure below. Using the P-controller and the repulsion, this setpoint can be reached by PICO. PICO first changes the angle and drives forwards to the 'DES 1' setpoint, when this setpoint is reached the angle changes again and starts driving to the second 'DES 2' setpoint.<br />
<br />
[[File:Draw1x.png|300px]]<br />
<br />
==Motion Control==<br />
This part explains the methods used to perform the motion as dictated from the trajectory planning.<br />
<br />
===Repulsion===<br />
A function is implemented which keeps PICO from touching the walls. This is done using virtual repulsion forces. The repulsion force is calculated using the reciprocal of the laser scan data. The laser data is scanned over the entire range of the sensor, except for the first 10 points and the last 10 points because the returned laser data at these points was not trustworthy. For each sensor reading a repulsion force is calculated in the x and y direction. By adding up all the repulsion forces over the entire scan range a single force vector is obtained. By putting this 'force' combined with a gain directly into PICO's speed input, it will have the tendency to drive away from walls. A tuning parameter has been made in the form of a maximum distance of 0.35m in which PICO can approach a wall. All laser data points which are larger than this value are ignored. Since the laser data only covers 240° of view PICO always changes its angle to drive with its head forward to the destination coordinates. This way there is always available laser data to avoid obstacles.<br />
<br />
[[File:draw2x.jpg]]<br />
<br />
[[File:Draw3x.png|220px]]<br />
<br />
===P-controller===<br />
In order to have PICO move from point A to point B a simple P-controller has been implemented. For testing purposes the P-controller currently relies on odometry data. The 'error' is calculated by subtracting the current position from the target position. The error is multiplied with a proportional action. During testing these parameters will be tuned to ensure optimal behavior of PICO.<br />
<br />
===P-controller with Repulsion===<br />
The speed outputted by the P-controller and the speed generated by the repulsion function are simultaneously used in the PICO speed command. This means that, for example, when PICO is closing in on a corner, the speed (depending on the direction in which PICO is oriented) is temporarily reduced in the direction of the walls, ensuring that PICO gets enough clearance before returning on his path. A problem arises however when a setpoint is located directly behind a wall. In this case PICO cannot reach his goal, as the P-controller 'pulls' PICO towards the setpoint, while the repulsion 'pushes' PICO away from the walls. Therefore it is necessary to give PICO setpoints which he can roughly 'see'. The generation of these setpoints is handled in one of the previous sections. To make sure the maximum translation velocity in the x and y direction is not exceeded the norm of both speeds are calculated, when the velocity exceeds the maximum translation speed it is lowered.<br />
<br />
==Task Manager==<br />
The task manager states what task should take place at what moment. The task manager contains three tasks:<br />
* Exploration<br />
* Parking<br />
* Search and rescue<br />
The charts of these tasks are shown below. The left one shows exploration and parking, and the right one shows search and rescue:<br />
<br />
[[File:MappingX.png|350px]] [[File:SearchRescueX.png|400px]]<br />
<br />
<br />
These three tasks will be highlighted in more detail now.<br />
<br />
===Exploration===<br />
Starting the hospital challenge, exploration is the first task to complete. Starting in the corridor, the detection of this area will be done. This corridor is saved in a struct, which contains a vector of exits. These exits have a destination. In the beginning, each of these destinations have value -1. The exploration is programmed in such a way that always the exit with a destination of -1 will be taken, so always an unexplored room will be entered. After entering a new room, again detection will scan the area. The destination of the door through which PICO has entered the room, will change from -1 to a value belonging to the previous area (corridor in this case). Then, if a room is entered and more than one exit is detected, again the door with unknown destination will be chosen. In the end, all unknown exits are explored and PICO is back in the corridor. At this moment PICO should move to its starting position and parking phase will begin.<br />
<br />
===Parking===<br />
When the map building is complete, PICO has to park backwards to the wall behind the starting position. Parking is done upon touching the wall. After PICO parked, PICO should say: "I am parked!". <br />
<br />
This is done by letting PICO drive forward to the starting position and stopping in front of the wall. Then PICO will turn around such that he can drive backwards to the wall. Since PICO cannnot scan what is behind him, a diffrent method is used to see/feel the wall he should touch. This is done using the control effort. If the control effort becomes large enough, PICO will stop since this increase in control effort is caused by touching the wall. All in all, a short video will summarize the result far better, so let's watch the parking skills of PICO:<br />
<br />
[[File:BackwardParking.gif]]<br />
<br />
<br />
Note that this is a GIF, so you can't hear PICO say "I am parked!".<br />
After parking, the last phase of the challenge can begin. This phase will be explained in Search and Rescue.<br />
<br />
===Search and Rescue===<br />
At this moment, the hospital is explored and mapped. In the world model, a graph is saved. As discussed before, the hint states that the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, the position of the object should be known and PICO can drive towards it. Standing still in front of this object will be the end of the challenge. In case there are multiple rooms for which the most doors have to be passed through, PICO should just try one and in case the object is not found, the other possibility should be tried.<br />
For now, the code calculates the longest path and stores this value. Because of the graph, PICO always knows which exit to take. After taking all these exits, the room with the object is entered. As explained, there can be multiple options. However, this is not fixed yet and will be one of the recommendations. After entering the room with the object, the object search function will be called. In this function, the LRF data is used. For each laserpoint, the differences between its distance and the distance of laserpoints on the left and on the right are measured. If that difference is high enough, there has to be an object in the room. This function places a point in front of the object and PICO will drive towards that point with the normal motion functions and will speak 'I found the object'. This search and rescue is shown in the GIF below.<br />
<br />
=Hospital Challenge=<br />
On June 13th, the hospital challenge took place. It is expected to fail on localization. Besides that, most of the code works the way it should, independent of the way the hospital is build.<br />
<br />
==Evaluation==<br />
Since localization did not work yet, PICO was localized with the help of its odometry. As known, this odometry is not accurate. After a few meters, the errors are increasing and after a while the position where PICO thinks to be and its actual position differed lot. This was the reason the challenge was not successful. PICO started mapping the corridor. It located two exits and moved through one of these, as it is expected to do. Mapping the first room again worked as it should. Two exits were found and PICO knew it should take the door to an unknown place. Moving through that door worked just fine. Mapping that room worked, but then PICO should move to the door through where it entered. However, this door was not at the right position anymore. Or better, PICOs location was too different from where it thought it was. This meant there was a wall on a place of an exit, meaning PICO wanted to go through that wall. The force field made sure PICO did not bump into the wall, but the door was not found. This was the end of the challenge. Both trials did not succeed because of this reason. This was not the only disadvantage of our code. Mapping the corridor did not work perfectly, because of its dimensions. Since the width of the corridor was a lot smaller than its height, mapping the corridor was hard. There was not enough laserdata to have a good visualization of the end of the corridor. That is why only two exits were mapped instead of three. To correct this, PICO should move further into the corridor and map again.<br />
<br />
==Simulator==<br />
The main reason why the hospital challenge did not succeed was because of localization. This is not a problem in simulation. Localizing on odometry works just fine in simulation. Both the mapping and parking phase are shown in the YouTube video. As can be seen, mapping in the corridor starts in the middle of the corridor:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailHospital.png|300px|link=https://youtu.be/xx87YWtambs]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:HospitalSearch.gif]]<br />
<br />
==The Real Challenge==<br />
As seen above, PICO thinks the hospital challenge is not an actual challenge for him... To see what PICO can do, a real challenge was created. This is done with the following map, which is far more challenging due to its size, number of rooms, and especially more diversity of door sizes and positions.<br />
<br />
[[File:TheRealChallenge.png|350px]]<br />
<br />
Without wasting any more words, both the mapping and parking phase are shown in the YouTube video:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailReal.png|300px|link=https://youtu.be/pVJy6qWZcw8]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:RealSearch.gif]]<br />
<br />
=Documents=<br />
All the documents made, besides the Wiki page itself, are shared here.<br />
<br />
==Report of Initial Design==<br />
Due to a misunderstanding, the report was not uploaded as a PDF yet. However, the full report was uploaded on this Wiki page (see below) before May 11th (17.00h), and now it is also uploaded as a PDF file (<1Mb). Our apologies for any inconvenience. The PDF of the report of the initial design can be found here: [[File:InitialDesign_Group3_Report.pdf]]<br />
<br />
==Presentation of Initial Design==<br />
On May 16th, all groups presented their initial design. So we presented our initial design too and included two GIFs of our process so far. A PDF of the slides can be found here: [[File:InitialDesign_Group3_Presentation.pdf]]<br />
<br />
==Presentation of Final Design==<br />
On June 6th, the final presentation was presented to the other groups. This presentation of the final design mainly focussed on the architecture. A PDF of the slides can be found here: [[File:FinalDesign_Group3_Presentation.pdf]]<br />
<br />
=Code=<br />
Below several pieces of code can be found of which our group is particularly proud. These include the structures that form our map as well as the room fitting procedure. Our obstacle avoidance function is also included since this allows us to drive collision free even if the map is not 100% accurate.<br />
<br />
Structures used in the map<br />
[https://gitlab.tue.nl/EMC2018/group3/snippets/30 worldModel_structures]<br />
<br />
<br />
Room fit procedure<br />
[https://gitlab.tue.nl/EMC2018/group3/snippets/31 Room_fitting]<br />
<br />
<br />
Obstacle avoidance<br />
[https://gitlab.tue.nl/EMC2018/group3/snippets/32 Obstacle_avoidance]</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2018_Group_3&diff=59952Embedded Motion Control 2018 Group 32018-06-19T12:16:52Z<p>S131974: /* Code */</p>
<hr />
<div>= Group Members =<br />
{| border="1" cellpadding="5" cellspacing="1" style="float:left;"<br />
! TU/e Number<br />
! Name<br />
! E-mail<br />
|- <br />
| 0848904<br />
| Luc (L.L.M.) van den Aker<br />
| <tt>l dot l dot m dot v dot d dot aker at student dot tue dot nl</tt><br />
|-<br />
| 0852908<br />
| Thomas (T.) Neilen<br />
| <tt>t dot neilen at student dot tue dot nl</tt><br />
|-<br />
| 0909434<br />
| Jeroen (J.W.) van de Valk<br />
| <tt>j dot w dot v dot d dot valk at student dot tue dot nl</tt><br />
|-<br />
| 0896947<br />
| Nourdin (N.) Kaai<br />
| <tt>n dot kaai at student dot tue dot nl</tt><br />
|-<br />
| 0883056<br />
| Peter (P.) van Dooren<br />
| <tt>p dot v dot dooren at student dot tue dot nl</tt><br />
|-<br />
| 0861750<br />
| Ties (T.J.) van Loon<br />
| <tt>t dot j dot v dot loon at student dot tue dot nl</tt><br />
|-<br />
|}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Wiki Info=<br />
'''NOTE: This is just for the menbers of Group 3 and will be deleted before the deadline!'''<br />
<br />
==Wiki Deadline==<br />
The Wiki, code and peer review deadline is: Wednesday, 20 June, 23:59h.<br />
<br />
==Wiki Content==<br />
Make sure the Wiki of your group contains:<br />
* An overview of the software architecture and approach used. How does it map to the paradigms explained in this course?<br />
* A description of the methods that make your solution work so well, preferably using nice explanatory images (explain what makes your solution unique; what are you most proud of?)<br />
* Which difficult problems were identified, and how were they solved?<br />
* An evaluation of the hospital challenge: What went well? What went wrong? Why? How could it be improved?<br />
* Videos / GIFs / animations / diagrams / pictures are very welcome! The simulator map for the Hospital Room challenge will be posted after the challenge (of course), so you can show that you are able to solve the challenge in simulation.<br />
<br />
==Publishing Code==<br />
A part of the grading criteria in this course is the quality of your code. We will not dive into your full code base. Instead, link to one or a few pieces of code or code files of which you are particularly proud, and which you think reflect the lessons taught: you can use the code snippet system as included in Gitlab. Do ensure we can access the code! Of course, feel free to also add some introductory/explanatory remarks on the Wiki, or as comments in the code. Make sure the links to your code snippets are clearly visible from your Wiki. For example, put them in a separate section called: ''Code''.<br />
<br />
=Initial Design=<br />
The initial design is explained in the following parts:<br />
* Requirements<br />
* Functions<br />
* Components<br />
* Specifications<br />
* Interfaces<br />
Note that the report of the initial design is shared in Documents.<br />
<br />
==Requirements==<br />
* PICO should make no collisions with any walls<br />
* PICO cannot stand still for 30 seconds or longer<br />
* For the escape room challenge, the robot should leave the room within 5 minutes<br />
* For the hospital challenge, within 5 minutes, mapping, reverse parking and obtaining the object should be done<br />
* Its surroundings should be made visible in a map<br />
* PICO should be able to reach every position in the room<br />
* PICO should be able to leave every room<br />
* PICO should make distinction between the hall and rooms<br />
* It should run autonomously, so in each challenge there should be no additional input<br />
* To start your software, only one executable has to be called<br />
* PICO should be able to recognize an object and stand still close to it<br />
<br />
==Functions==<br />
* PICO should be able to drive in any direction<br />
* PICO should be able to turn around<br />
* It should be able to detect walls<br />
* PICO has to know its own position within the mapped map<br />
* PICO is able to construct a map<br />
* It should be possible to create a trajectory to a room<br />
* PICO should be able to recognize an object<br />
<br />
==Components==<br />
* Sensors:<br />
** Laser Range Finder (LRF)<br />
** Wheel encoders (odometry)<br />
* Actuator:<br />
** Holonomic base (omni-wheels)<br />
* Computer:<br />
** Intel i7<br />
** Ubuntu 16.04<br />
<br />
==Specifications==<br />
* Translation maximum: 0.5 m/s<br />
* Rotation maximum: 1.2 rad/s<br />
* Range of Laser Range Finder is assumed to be bigger than maximum room dimension<br />
* The field of view of the Laser Range Finder is from -2 rad to 2 rad, divided in pieces of 0.004004<br />
* The Laser Range Finder can only measure at one height<br />
<br />
==Interfaces==<br />
The interfaces of the initial design are shown here:<br />
<br />
[[File:InterfaceGroup3.png]]<br />
<br />
As shown in the figure above, a world model is the link between all other parts. The tasks represent the highest level, meaning the most global work PICO has to do. The skills are needed to complete these tasks and some motions together form a skill. The perception contains the sensors, the continuous data. Below an overview of the different parts are given:<br />
<br />
''World model:''<br />
* Compose map<br />
* Object recognition<br />
<br />
''Tasks:''<br />
* Mapping of the environment <br />
* Backward parking at the specified location<br />
* Searching for the object<br />
<br />
''Skills:''<br />
* Planning a trajectory<br />
* Collision avoidance<br />
* Backward parking<br />
* Navigate<br />
* Positioning in front of an opening<br />
* Compose maps<br />
<br />
''Motion:''<br />
* Translation <br />
* Rotation<br />
<br />
''Perception:''<br />
* Odometry <br />
* Laser Range Finder<br />
* Control effort<br />
<br />
=Escape Room Challenge=<br />
Since our code to map a room was not finished completely, a new code for the escape room challenge was made. This code was kept simple and effective. PICO should drive to a wall, turn to the left when it detects a wall within 0.4 meters from itself, and follow the wall (without hitting it of course). Then it will scan for a hallway to exit the room. When he sees a way to exit the room, PICO will go through the opening in the wall. <br />
<br />
Our first attempt during the escape room challange was very successful! PICO drove out of the room, but we were convinced he could do it even faster. So we set the speed higher for the second try, and it was even faster. PICO drove out of the room within 29 seconds. This resulted in a second place and being one of the two teams that made it out of the room.<br />
<br />
Here a shot video is shown of PICO leaving a room. Note that this is not filmed during the 'official' escape room challenge. Due to our enthousiasm, we forgot to film, so we reconstructed the room during one of our test sessions.<br />
<br />
[[File:EscapeRoomChallenge.gif]]<br />
<br />
=Final Design=<br />
First off, the architecture is explained. This architecture is based on the theorem and takes the requirements of the hospital challenge into account. The architecture is explained in six steps:<br />
* World model<br />
* Detection<br />
* Localization<br />
* Trajectory planning<br />
* Motion control <br />
* Task manager<br />
The overall architecture is visualized here:<br />
<br />
[[File:ArchitectureCorrected.png|650px]]<br />
<br />
All six main components that are in this archtecture will be explained now.<br />
<br />
==World Model==<br />
To build a map of the hospital a twofold mapping procedure will be used. First PICO will map the room it is currently standing in. Secondly a graph connecting all mapped rooms with each other is stored. By using this two level mapping abstraction it is easier to locate PICO in a certain room. Also trajectory planning to a desired room can be more efficiently by using the graph. <br />
The data structures used to store the obtained data are the Rooms, Exits and a graph with all the Rooms.<br />
Once a room is mapped it is stored in a Room object. This object contains the width and height of the room, a global ID of the room and Exit objects. The Exit objects have a local ID, ie the ID of the exit has only meaning when the room it belongs to is also know. The exits also have a location in the coordinate frame of the room and a destination. <br />
The world model also holds the current position and the current position based on odometry.<br />
<br />
===Graph===<br />
Every room (square in figure) and door (circle in figure) will be numbered with an ID and then stored in the world model in the form of a graph. An visual representation of such graph can be seen below:<br />
<br />
[[File:Graph.png|200px]]<br />
<br />
Using the grapgh, it can be easily seen what trajectory PICO should take to find the object. As the hint states, the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, it can be quickly determined what sequence of room ID and door IDs is the longest. Knowing this makes finding the object easier, since PICO does not have to look in every room again, bit can immeadily go to the room with the longest sequence.<br />
<br />
==Line Extraction==<br />
The first step in mapping a room is to extract line segments from the obtained laser data. For this a pre-made laser line extraction package was used. This code was slightly modified to remove the ROS layer. the source code can be found on: https://github.com/kam3k/laser_line_extraction<br />
<br />
This package employs a split and merge algorithm [T. Pavlidis and S. L. Horowitz, "Segmentation of Plane Curves," in IEEE Transactions on Computers, vol. C-23, no. 8, pp. 860-870, Aug. 1974] The obtained laser data for the rooms was relatively clean, thus no filtering before the line extraction was applied. The parameters used in the algorithm needed some additional tuning to give the optimal result.<br />
In the figures below, the lines can be seen:<br />
<br />
[[File:Line_detection_Sim.png|300px]] [[File:Line_detection_Lines.png|300px]]<br />
<br />
==Fit Room==<br />
The mapping of a room is done using the lines found by the line extraction.<br />
<br />
===Saving Lines===<br />
To map a room PICO needs to look 360° around him, however the laser range finder only has a limited range. Therefore a PICO will scan lines, turn around 180° and scan another time. It will then combine these two sets to end up with a set of lines which describe the entire room around PICO.<br />
<br />
The first time this is done pico’s position will be saved. The lines are transformed using the orientation of pico. This way the resulting lines are aligned with the global axis system but the 0,0 position is at pico’s location. This new frame will be called the mappedFrame.<br />
<br />
after rotating 180 degrees. Pico will merge the detected lines. First the lines are transformed to the mapping frame. Then the lines are compared to the lines already saved. If the lines are collinear, (they have similar same radius and angle) the lines are checked for overlap. The start and end points of the new line are projected on the compared line. If either of the projected point lies on the old line with some margin of error. The line is merged. This is done by taking the furthest start and end point. <br />
<br />
In the figures below, the two sets of lines can be seen, followed by the merged set of lines: <br />
<br />
[[File:Transform_sim.png|300px]] [[File:Transform_lines.png|300px]] [[File:Merged_lines.png|300px]]<br />
<br />
===Determine dimensions===<br />
Once PICO has assembled a set of lines all around him, he can determine the properties of the room he is in. This is done in two steps: <br />
* The dimensions of the room are found.<br />
* All the exits of the room are found.<br />
<br />
A box is defined with a distances to the left, to the right, above and below pico. The width and height of the room are determined by fitting the largest possible box inside the lines in mergedLines. An initial guess for the distances is made using the minimum radii of all lines which have the right orientation. Each line in mergedLines can be determined to be either to the left, to the right, above and below pico.<br />
<br />
For example, consider the left wall of the room. In the figure below three lines have the correct orientation to belong to that wall. The initial estimate for the distance to the left of pico is chosen as the smallest radius among those three lines. The same is done for the other three walls.<br />
<br />
After the initial estimate it is possible that the box is still smaller than the room. This can be caused by lines outside the room which happen to have a smaller radius. To expand the size of the room an iterative procedure is used. One side at a time the function checks whether the room can be expanded in this direction. It again searches for a minimum radius among a selection of lines, however this time a criteria is added that the line must fall within the estimated box after expansion. This will filter out most lines outside of the room. The procedure continues until it has gone one cycle without updating the distances. Using the distances left, right, up and down the width and height of the room can be determined as well as the location of pico in this new room, expressed in the new room frame.<br />
<br />
[[File:testRoomMergedLines.png|200px]] <br />
[[File:testRoomFit1.png|200px]] <br />
[[File:testRoomFit2.png|200px]] <br />
[[File:testRoomFit3.png|200px]] <br />
<br />
There are edge cases where this procedure goes wrong however they are considered rare enough that they are not taken into account.<br />
<br />
[[File:EdgeCaseRoomFit.png|300px]]<br />
<br />
===Find exits===<br />
In order to find the exits a function is made which once again loops over the lines in mergedLines. It will determine whether a line belongs to the room as determined by the dimensions previously established. If the gap between two consecutive lines which belong to the room is the size of a door (between 0.4 and 1.7m). An exit is added there. After looping over all lines a final check is done to determine whether an exit exists between the first and last lines in mergedLines.<br />
<br />
[[File:testRoomExits.png|300px]] <br />
<br />
===Adding the room to the world model===<br />
After the room has been fitted it must be added to the map in the world model. There are several properties of the room which still need to be determined. <br />
The location of the room coordinate frame is calculated using the room coordinate frame of the previous room, the location of pico in the previous room frame (mappedFrame) and the location of pico in the new room.<br />
The exit pico went through in the previous room must be linked to an exit found in the new room. This is done by calculating the distance from the exits in the new room to the exit taken in the previous room. The exit with the smallest distance is linked to this new room. The destinations of the two exits are set and the exit in the new room is moved to the front of the vector with exits so that exits[0] always leads back to the hallway.<br />
Finally pico's location and current room are updated to be in the new room.<br />
<br />
==Localization==<br />
Once a room has been mapped. PICO will be able to compare the detected lines to the map it has made. Based on this, PICO's location can be determined. As the odometry data of PICO is unreliable, another solution had to be made to reliably navigate through the environment. A solution had to be made that navigates PICO based on the local coordinates of a room. To do this three different functionalities had to be implemented:<br />
* Make an initial guess of PICO’s position within a room.<br />
* Determine which lines are part of a specific room.<br />
* Determine PICO’s position based on LRF-data.<br />
[[File:Localisation_animation.gif]]<br />
===Initial guess===<br />
The localisation script constantly provides information on PICO’s position. When PICO is leaving a room through a door to another room, this position is used as an initial guess for PICO’s current coordinates. Using these coordinates the lines that PICO sees can be transformed to the coordinate frame of the new room.<br />
<br />
===Line filtering===<br />
The lines that PICO sees are converted to the coordinate system of the room. Based on the information previously gathered about a specific room it is determined which of the lines that PICO currently sees are actually part of the room itself. This is to prevent that for example lines from a hallway are used in the localisation. First it is checked if the end points of the lines directly coincide with the corners of the room. A vector is spanned between the coordinates of a corner and the end point under consideration. The norm of this vector should not exceed a certain parameter in order to be considered to be part of the room. Another possibility is that the end point of a line lies on the contour of a room. In order to determine if this is happening the closest distance of this end point to the line spanned by the two nearby corners should be determined. This can be done using simple vector calculus.<br />
<br />
The shortest distance between a line the origin is expressed in the following equation:<br />
<br />
<br />
<math>\left(\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}\right)\cdot\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}=0</math><br />
<br />
<br />
In this equation <math>p_{1}</math> and <math>p_{2}</math> are calculated by substracting the end point of the line under consideration from the corners of the room. <math>t</math> is calculated, and substituted in the following equation to obtain the vector spanned between the end point and the line:<br />
<br />
<br />
<math>\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}</math><br />
<br />
<br />
The length of this vector is also compared with the fixed parameter used to test the coincidence of the end points and the corners.<br />
<br />
===Localisation===<br />
Because the lines are created in a certain way, it can be derived to which of the four walls they belong. The start- and end points of lines are defined in a counter-clockwise manner around the coordinate system, and the angle of the lines is calculated with respect to the x-axis of a this coordinate system. The lines corresponding to the rightmost wall would thus have an angle corresponding to <math>0</math> radians, the upper walls <math>\frac{1}{2}\pi</math> radians, the leftmost walls <math>\pi</math> radians and the lower walls <math>\frac{3}{2}\pi</math> radians. When it is determined which lines belong to which walls, information about the distance from PICO to these walls is extracted from the untransformed lines. This information is used to calculate PICO’s x and y coordinates in a room, by comparing the data to the previously stored width and height of a room.<br />
<br />
===Angle Estimation===<br />
The odometry on PICO gives an estimate of the orientation of PICO. However due to the nature of odometry this estimate will drift over time. Therefore an absolute measurement of the angle is necessary to reset the odometry measurement. This is done using the lines extracted by PICO. These lines have a radius and an angle relative to PICO. Since the hospital is contructed of perpendicular lines PICO can determine it's angle relative to the walls. By using an initial guess, which will give the general direction PICO is oriented in, i.e. whether its angle is around <math>0</math>, <math>\dfrac{1}{2}\pi</math>, <math>\pi</math>, or <math>-\frac{1}{2}\pi</math>. Then the angle is corrected y using the following equation on the measurement:<br />
<br />
<math>estimate +mod_{0.5 * \pi}(measuredAngle)</math><br />
<br />
==Trajectory Planning==<br />
This part plans the trajectory PICO should take during the hospital challenge.<br />
<br />
===Approaching a Door===<br />
From the worldmodel PICO obtains his current position, and the position of the two corners of the door. A function is made which basically calculates a point right in the middle of the two corners, and puts a setpoint at a specified distance in front of the midpoint of the door and behind the midpoint of the door seen in the Figure below. Using the P-controller and the repulsion, this setpoint can be reached by PICO. PICO first changes the angle and drives forwards to the 'DES 1' setpoint, when this setpoint is reached the angle changes again and starts driving to the second 'DES 2' setpoint.<br />
<br />
[[File:Draw1x.png|300px]]<br />
<br />
==Motion Control==<br />
This part explains the methods used to perform the motion as dictated from the trajectory planning.<br />
<br />
===Repulsion===<br />
A function is implemented which keeps PICO from touching the walls. This is done using virtual repulsion forces. The repulsion force is calculated using the reciprocal of the laser scan data. The laser data is scanned over the entire range of the sensor, except for the first 10 points and the last 10 points because the returned laser data at these points was not trustworthy. For each sensor reading a repulsion force is calculated in the x and y direction. By adding up all the repulsion forces over the entire scan range a single force vector is obtained. By putting this 'force' combined with a gain directly into PICO's speed input, it will have the tendency to drive away from walls. A tuning parameter has been made in the form of a maximum distance of 0.35m in which PICO can approach a wall. All laser data points which are larger than this value are ignored. Since the laser data only covers 240° of view PICO always changes its angle to drive with its head forward to the destination coordinates. This way there is always available laser data to avoid obstacles.<br />
<br />
[[File:draw2x.jpg]]<br />
<br />
[[File:Draw3x.png|220px]]<br />
<br />
===P-controller===<br />
In order to have PICO move from point A to point B a simple P-controller has been implemented. For testing purposes the P-controller currently relies on odometry data. The 'error' is calculated by subtracting the current position from the target position. The error is multiplied with a proportional action. During testing these parameters will be tuned to ensure optimal behavior of PICO.<br />
<br />
===P-controller with Repulsion===<br />
The speed outputted by the P-controller and the speed generated by the repulsion function are simultaneously used in the PICO speed command. This means that, for example, when PICO is closing in on a corner, the speed (depending on the direction in which PICO is oriented) is temporarily reduced in the direction of the walls, ensuring that PICO gets enough clearance before returning on his path. A problem arises however when a setpoint is located directly behind a wall. In this case PICO cannot reach his goal, as the P-controller 'pulls' PICO towards the setpoint, while the repulsion 'pushes' PICO away from the walls. Therefore it is necessary to give PICO setpoints which he can roughly 'see'. The generation of these setpoints is handled in one of the previous sections. To make sure the maximum translation velocity in the x and y direction is not exceeded the norm of both speeds are calculated, when the velocity exceeds the maximum translation speed it is lowered.<br />
<br />
==Task Manager==<br />
The task manager states what task should take place at what moment. The task manager contains three tasks:<br />
* Exploration<br />
* Parking<br />
* Search and rescue<br />
The charts of these tasks are shown below. The left one shows exploration and parking, and the right one shows search and rescue:<br />
<br />
[[File:MappingX.png|350px]] [[File:SearchRescueX.png|400px]]<br />
<br />
<br />
These three tasks will be highlighted in more detail now.<br />
<br />
===Exploration===<br />
Starting the hospital challenge, exploration is the first task to complete. Starting in the corridor, the detection of this area will be done. This corridor is saved in a struct, which contains a vector of exits. These exits have a destination. In the beginning, each of these destinations have value -1. The exploration is programmed in such a way that always the exit with a destination of -1 will be taken, so always an unexplored room will be entered. After entering a new room, again detection will scan the area. The destination of the door through which PICO has entered the room, will change from -1 to a value belonging to the previous area (corridor in this case). Then, if a room is entered and more than one exit is detected, again the door with unknown destination will be chosen. In the end, all unknown exits are explored and PICO is back in the corridor. At this moment PICO should move to its starting position and parking phase will begin.<br />
<br />
===Parking===<br />
When the map building is complete, PICO has to park backwards to the wall behind the starting position. Parking is done upon touching the wall. After PICO parked, PICO should say: "I am parked!". <br />
<br />
This is done by letting PICO drive forward to the starting position and stopping in front of the wall. Then PICO will turn around such that he can drive backwards to the wall. Since PICO cannnot scan what is behind him, a diffrent method is used to see/feel the wall he should touch. This is done using the control effort. If the control effort becomes large enough, PICO will stop since this increase in control effort is caused by touching the wall. All in all, a short video will summarize the result far better, so let's watch the parking skills of PICO:<br />
<br />
[[File:BackwardParking.gif]]<br />
<br />
<br />
Note that this is a GIF, so you can't hear PICO say "I am parked!".<br />
After parking, the last phase of the challenge can begin. This phase will be explained in Search and Rescue.<br />
<br />
===Search and Rescue===<br />
At this moment, the hospital is explored and mapped. In the world model, a graph is saved. As discussed before, the hint states that the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, the position of the object should be known and PICO can drive towards it. Standing still in front of this object will be the end of the challenge. In case there are multiple rooms for which the most doors have to be passed through, PICO should just try one and in case the object is not found, the other possibility should be tried.<br />
For now, the code calculates the longest path and stores this value. Because of the graph, PICO always knows which exit to take. After taking all these exits, the room with the object is entered. As explained, there can be multiple options. However, this is not fixed yet and will be one of the recommendations. After entering the room with the object, the object search function will be called. In this function, the LRF data is used. For each laserpoint, the differences between its distance and the distance of laserpoints on the left and on the right are measured. If that difference is high enough, there has to be an object in the room. This function places a point in front of the object and PICO will drive towards that point with the normal motion functions and will speak 'I found the object'. This search and rescue is shown in the GIF below.<br />
<br />
=Hospital Challenge=<br />
On June 13th, the hospital challenge took place. It is expected to fail on localization. Besides that, most of the code works the way it should, independent of the way the hospital is build.<br />
<br />
==Evaluation==<br />
Since localization did not work yet, PICO was localized with the help of its odometry. As known, this odometry is not accurate. After a few meters, the errors are increasing and after a while the position where PICO thinks to be and its actual position differed lot. This was the reason the challenge was not successful. PICO started mapping the corridor. It located two exits and moved through one of these, as it is expected to do. Mapping the first room again worked as it should. Two exits were found and PICO knew it should take the door to an unknown place. Moving through that door worked just fine. Mapping that room worked, but then PICO should move to the door through where it entered. However, this door was not at the right position anymore. Or better, PICOs location was too different from where it thought it was. This meant there was a wall on a place of an exit, meaning PICO wanted to go through that wall. The force field made sure PICO did not bump into the wall, but the door was not found. This was the end of the challenge. Both trials did not succeed because of this reason. This was not the only disadvantage of our code. Mapping the corridor did not work perfectly, because of its dimensions. Since the width of the corridor was a lot smaller than its height, mapping the corridor was hard. There was not enough laserdata to have a good visualization of the end of the corridor. That is why only two exits were mapped instead of three. To correct this, PICO should move further into the corridor and map again.<br />
<br />
==Simulator==<br />
The main reason why the hospital challenge did not succeed was because of localization. This is not a problem in simulation. Localizing on odometry works just fine in simulation. Both the mapping and parking phase are shown in the YouTube video. As can be seen, mapping in the corridor starts in the middle of the corridor:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailHospital.png|300px|link=https://youtu.be/xx87YWtambs]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:HospitalSearch.gif]]<br />
<br />
==The Real Challenge==<br />
As seen above, PICO thinks the hospital challenge is not an actual challenge for him... To see what PICO can do, a real challenge was created. This is done with the following map, which is far more challenging due to its size, number of rooms, and especially more diversity of door sizes and positions.<br />
<br />
[[File:TheRealChallenge.png|350px]]<br />
<br />
Without wasting any more words, both the mapping and parking phase are shown in the YouTube video:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailReal.png|300px|link=https://youtu.be/pVJy6qWZcw8]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:RealSearch.gif]]<br />
<br />
=Documents=<br />
All the documents made, besides the Wiki page itself, are shared here.<br />
<br />
==Report of Initial Design==<br />
Due to a misunderstanding, the report was not uploaded as a PDF yet. However, the full report was uploaded on this Wiki page (see below) before May 11th (17.00h), and now it is also uploaded as a PDF file (<1Mb). Our apologies for any inconvenience. The PDF of the report of the initial design can be found here: [[File:InitialDesign_Group3_Report.pdf]]<br />
<br />
==Presentation of Initial Design==<br />
On May 16th, all groups presented their initial design. So we presented our initial design too and included two GIFs of our process so far. A PDF of the slides can be found here: [[File:InitialDesign_Group3_Presentation.pdf]]<br />
<br />
==Presentation of Final Design==<br />
On June 6th, the final presentation was presented to the other groups. This presentation of the final design mainly focussed on the architecture. A PDF of the slides can be found here: [[File:FinalDesign_Group3_Presentation.pdf]]<br />
<br />
=Code=<br />
Below several pieces of code can be found of which our group is particularly proud. These include the structures that form our map as well as the room fitting procedure. Our obstacle avoidance function is also included since this allows us to drive collision free even if the map is not 100% accurate.<br />
<br />
Structures used in the map<br />
[https://gitlab.tue.nl/snippets/30 worldModel_structures]<br />
<br />
<br />
Room fit procedure<br />
[https://gitlab.tue.nl/snippets/31 Room_fitting]<br />
<br />
<br />
Obstacle avoidance<br />
[https://gitlab.tue.nl/snippets/32 Obstacle_avoidance]</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2018_Group_3&diff=59946Embedded Motion Control 2018 Group 32018-06-19T11:59:58Z<p>S131974: /* Code */</p>
<hr />
<div>= Group Members =<br />
{| border="1" cellpadding="5" cellspacing="1" style="float:left;"<br />
! TU/e Number<br />
! Name<br />
! E-mail<br />
|- <br />
| 0848904<br />
| Luc (L.L.M.) van den Aker<br />
| <tt>l dot l dot m dot v dot d dot aker at student dot tue dot nl</tt><br />
|-<br />
| 0852908<br />
| Thomas (T.) Neilen<br />
| <tt>t dot neilen at student dot tue dot nl</tt><br />
|-<br />
| 0909434<br />
| Jeroen (J.W.) van de Valk<br />
| <tt>j dot w dot v dot d dot valk at student dot tue dot nl</tt><br />
|-<br />
| 0896947<br />
| Nourdin (N.) Kaai<br />
| <tt>n dot kaai at student dot tue dot nl</tt><br />
|-<br />
| 0883056<br />
| Peter (P.) van Dooren<br />
| <tt>p dot v dot dooren at student dot tue dot nl</tt><br />
|-<br />
| 0861750<br />
| Ties (T.J.) van Loon<br />
| <tt>t dot j dot v dot loon at student dot tue dot nl</tt><br />
|-<br />
|}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Wiki Info=<br />
'''NOTE: This is just for the menbers of Group 3 and will be deleted before the deadline!'''<br />
<br />
==Wiki Deadline==<br />
The Wiki, code and peer review deadline is: Wednesday, 20 June, 23:59h.<br />
<br />
==Wiki Content==<br />
Make sure the Wiki of your group contains:<br />
* An overview of the software architecture and approach used. How does it map to the paradigms explained in this course?<br />
* A description of the methods that make your solution work so well, preferably using nice explanatory images (explain what makes your solution unique; what are you most proud of?)<br />
* Which difficult problems were identified, and how were they solved?<br />
* An evaluation of the hospital challenge: What went well? What went wrong? Why? How could it be improved?<br />
* Videos / GIFs / animations / diagrams / pictures are very welcome! The simulator map for the Hospital Room challenge will be posted after the challenge (of course), so you can show that you are able to solve the challenge in simulation.<br />
<br />
==Publishing Code==<br />
A part of the grading criteria in this course is the quality of your code. We will not dive into your full code base. Instead, link to one or a few pieces of code or code files of which you are particularly proud, and which you think reflect the lessons taught: you can use the code snippet system as included in Gitlab. Do ensure we can access the code! Of course, feel free to also add some introductory/explanatory remarks on the Wiki, or as comments in the code. Make sure the links to your code snippets are clearly visible from your Wiki. For example, put them in a separate section called: ''Code''.<br />
<br />
=Initial Design=<br />
The initial design is explained in the following parts:<br />
* Requirements<br />
* Functions<br />
* Components<br />
* Specifications<br />
* Interfaces<br />
Note that the report of the initial design is shared in Documents.<br />
<br />
==Requirements==<br />
* PICO should make no collisions with any walls<br />
* PICO cannot stand still for 30 seconds or longer<br />
* For the escape room challenge, the robot should leave the room within 5 minutes<br />
* For the hospital challenge, within 5 minutes, mapping, reverse parking and obtaining the object should be done<br />
* Its surroundings should be made visible in a map<br />
* PICO should be able to reach every position in the room<br />
* PICO should be able to leave every room<br />
* PICO should make distinction between the hall and rooms<br />
* It should run autonomously, so in each challenge there should be no additional input<br />
* To start your software, only one executable has to be called<br />
* PICO should be able to recognize an object and stand still close to it<br />
<br />
==Functions==<br />
* PICO should be able to drive in any direction<br />
* PICO should be able to turn around<br />
* It should be able to detect walls<br />
* PICO has to know its own position within the mapped map<br />
* PICO is able to construct a map<br />
* It should be possible to create a trajectory to a room<br />
* PICO should be able to recognize an object<br />
<br />
==Components==<br />
* Sensors:<br />
** Laser Range Finder (LRF)<br />
** Wheel encoders (odometry)<br />
* Actuator:<br />
** Holonomic base (omni-wheels)<br />
* Computer:<br />
** Intel i7<br />
** Ubuntu 16.04<br />
<br />
==Specifications==<br />
* Translation maximum: 0.5 m/s<br />
* Rotation maximum: 1.2 rad/s<br />
* Range of Laser Range Finder is assumed to be bigger than maximum room dimension<br />
* The field of view of the Laser Range Finder is from -2 rad to 2 rad, divided in pieces of 0.004004<br />
* The Laser Range Finder can only measure at one height<br />
<br />
==Interfaces==<br />
The interfaces of the initial design are shown here:<br />
<br />
[[File:InterfaceGroup3.png]]<br />
<br />
As shown in the figure above, a world model is the link between all other parts. The tasks represent the highest level, meaning the most global work PICO has to do. The skills are needed to complete these tasks and some motions together form a skill. The perception contains the sensors, the continuous data. Below an overview of the different parts are given:<br />
<br />
''World model:''<br />
* Compose map<br />
* Object recognition<br />
<br />
''Tasks:''<br />
* Mapping of the environment <br />
* Backward parking at the specified location<br />
* Searching for the object<br />
<br />
''Skills:''<br />
* Planning a trajectory<br />
* Collision avoidance<br />
* Backward parking<br />
* Navigate<br />
* Positioning in front of an opening<br />
* Compose maps<br />
<br />
''Motion:''<br />
* Translation <br />
* Rotation<br />
<br />
''Perception:''<br />
* Odometry <br />
* Laser Range Finder<br />
* Control effort<br />
<br />
=Escape Room Challenge=<br />
Since our code to map a room was not finished completely, a new code for the escape room challenge was made. This code was kept simple and effective. PICO should drive to a wall, turn to the left when it detects a wall within 0.4 meters from itself, and follow the wall (without hitting it of course). Then it will scan for a hallway to exit the room. When he sees a way to exit the room, PICO will go through the opening in the wall. <br />
<br />
Our first attempt during the escape room challange was very successful! PICO drove out of the room, but we were convinced he could do it even faster. So we set the speed higher for the second try, and it was even faster. PICO drove out of the room within 29 seconds. This resulted in a second place and being one of the two teams that made it out of the room.<br />
<br />
Here a shot video is shown of PICO leaving a room. Note that this is not filmed during the 'official' escape room challenge. Due to our enthousiasm, we forgot to film, so we reconstructed the room during one of our test sessions.<br />
<br />
[[File:EscapeRoomChallenge.gif]]<br />
<br />
=Final Design=<br />
First off, the architecture is explained. This architecture is based on the theorem and takes the requirements of the hospital challenge into account. The architecture is explained in six steps:<br />
* World model<br />
* Detection<br />
* Localization<br />
* Trajectory planning<br />
* Motion control <br />
* Task manager<br />
The overall architecture is visualized here:<br />
<br />
[[File:ArchitectureCorrected.png|650px]]<br />
<br />
All six main components that are in this archtecture will be explained now.<br />
<br />
==World Model==<br />
To build a map of the hospital a twofold mapping procedure will be used. First PICO will map the room it is currently standing in. Secondly a graph connecting all mapped rooms with each other is stored. By using this two level mapping abstraction it is easier to locate PICO in a certain room. Also trajectory planning to a desired room can be more efficiently by using the graph. <br />
The data structures used to store the obtained data are the Rooms, Exits and a graph with all the Rooms.<br />
Once a room is mapped it is stored in a Room object. This object contains the width and height of the room, a global ID of the room and Exit objects. The Exit objects have a local ID, ie the ID of the exit has only meaning when the room it belongs to is also know. The exits also have a location in the coordinate frame of the room and a destination. <br />
The world model also holds the current position and the current position based on odometry.<br />
<br />
===Graph===<br />
Every room (square in figure) and door (circle in figure) will be numbered with an ID and then stored in the world model in the form of a graph. An visual representation of such graph can be seen below:<br />
<br />
[[File:Graph.png|200px]]<br />
<br />
Using the grapgh, it can be easily seen what trajectory PICO should take to find the object. As the hint states, the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, it can be quickly determined what sequence of room ID and door IDs is the longest. Knowing this makes finding the object easier, since PICO does not have to look in every room again, bit can immeadily go to the room with the longest sequence.<br />
<br />
==Line Extraction==<br />
The first step in mapping a room is to extract line segments from the obtained laser data. For this a pre-made laser line extraction package was used. This code was slightly modified to remove the ROS layer. the source code can be found on: https://github.com/kam3k/laser_line_extraction<br />
<br />
This package employs a split and merge algorithm [T. Pavlidis and S. L. Horowitz, "Segmentation of Plane Curves," in IEEE Transactions on Computers, vol. C-23, no. 8, pp. 860-870, Aug. 1974] The obtained laser data for the rooms was relatively clean, thus no filtering before the line extraction was applied. The parameters used in the algorithm needed some additional tuning to give the optimal result.<br />
In the figures below, the lines can be seen:<br />
<br />
[[File:Line_detection_Sim.png|300px]] [[File:Line_detection_Lines.png|300px]]<br />
<br />
==Fit Room==<br />
The mapping of a room is done using the lines found by the line extraction.<br />
<br />
===Saving Lines===<br />
To map a room PICO needs to look 360° around him, however the laser range finder only has a limited range. Therefore a PICO will scan lines, turn around 180° and scan another time. It will then combine these two sets to end up with a set of lines which describe the entire room around PICO.<br />
<br />
The first time this is done pico’s position will be saved. The lines are transformed using the orientation of pico. This way the resulting lines are aligned with the global axis system but the 0,0 position is at pico’s location. This new frame will be called the mappedFrame.<br />
<br />
after rotating 180 degrees. Pico will merge the detected lines. First the lines are transformed to the mapping frame. Then the lines are compared to the lines already saved. If the lines are collinear, (they have similar same radius and angle) the lines are checked for overlap. The start and end points of the new line are projected on the compared line. If either of the projected point lies on the old line with some margin of error. The line is merged. This is done by taking the furthest start and end point. <br />
<br />
In the figures below, the two sets of lines can be seen, followed by the merged set of lines: <br />
<br />
[[File:Transform_sim.png|300px]] [[File:Transform_lines.png|300px]] [[File:Merged_lines.png|300px]]<br />
<br />
===Determine dimensions===<br />
Once PICO has assembled a set of lines all around him, he can determine the properties of the room he is in. This is done in two steps: <br />
* The dimensions of the room are found.<br />
* All the exits of the room are found.<br />
<br />
A box is defined with a distances to the left, to the right, above and below pico. The width and height of the room are determined by fitting the largest possible box inside the lines in mergedLines. An initial guess for the distances is made using the minimum radii of all lines which have the right orientation. Each line in mergedLines can be determined to be either to the left, to the right, above and below pico.<br />
<br />
For example, consider the left wall of the room. In the figure below three lines have the correct orientation to belong to that wall. The initial estimate for the distance to the left of pico is chosen as the smallest radius among those three lines. The same is done for the other three walls.<br />
<br />
After the initial estimate it is possible that the box is still smaller than the room. This can be caused by lines outside the room which happen to have a smaller radius. To expand the size of the room an iterative procedure is used. One side at a time the function checks whether the room can be expanded in this direction. It again searches for a minimum radius among a selection of lines, however this time a criteria is added that the line must fall within the estimated box after expansion. This will filter out most lines outside of the room. The procedure continues until it has gone one cycle without updating the distances. Using the distances left, right, up and down the width and height of the room can be determined as well as the location of pico in this new room, expressed in the new room frame.<br />
<br />
[[File:testRoomMergedLines.png|200px]] <br />
[[File:testRoomFit1.png|200px]] <br />
[[File:testRoomFit2.png|200px]] <br />
[[File:testRoomFit3.png|200px]] <br />
<br />
There are edge cases where this procedure goes wrong however they are considered rare enough that they are not taken into account.<br />
<br />
[[File:EdgeCaseRoomFit.png|300px]]<br />
<br />
===Find exits===<br />
In order to find the exits a function is made which once again loops over the lines in mergedLines. It will determine whether a line belongs to the room as determined by the dimensions previously established. If the gap between two consecutive lines which belong to the room is the size of a door (between 0.4 and 1.7m). An exit is added there. After looping over all lines a final check is done to determine whether an exit exists between the first and last lines in mergedLines.<br />
<br />
[[File:testRoomExits.png|300px]] <br />
<br />
===Adding the room to the world model===<br />
After the room has been fitted it must be added to the map in the world model. There are several properties of the room which still need to be determined. <br />
The location of the room coordinate frame is calculated using the room coordinate frame of the previous room, the location of pico in the previous room frame (mappedFrame) and the location of pico in the new room.<br />
The exit pico went through in the previous room must be linked to an exit found in the new room. This is done by calculating the distance from the exits in the new room to the exit taken in the previous room. The exit with the smallest distance is linked to this new room. The destinations of the two exits are set and the exit in the new room is moved to the front of the vector with exits so that exits[0] always leads back to the hallway.<br />
Finally pico's location and current room are updated to be in the new room.<br />
<br />
==Localization==<br />
Once a room has been mapped. PICO will be able to compare the detected lines to the map it has made. Based on this, PICO's location can be determined. As the odometry data of PICO is unreliable, another solution had to be made to reliably navigate through the environment. A solution had to be made that navigates PICO based on the local coordinates of a room. To do this three different functionalities had to be implemented:<br />
* Make an initial guess of PICO’s position within a room.<br />
* Determine which lines are part of a specific room.<br />
* Determine PICO’s position based on LRF-data.<br />
[[File:Localisation_animation.gif]]<br />
===Initial guess===<br />
The localisation script constantly provides information on PICO’s position. When PICO is leaving a room through a door to another room, this position is used as an initial guess for PICO’s current coordinates. Using these coordinates the lines that PICO sees can be transformed to the coordinate frame of the new room.<br />
<br />
===Line filtering===<br />
The lines that PICO sees are converted to the coordinate system of the room. Based on the information previously gathered about a specific room it is determined which of the lines that PICO currently sees are actually part of the room itself. This is to prevent that for example lines from a hallway are used in the localisation. First it is checked if the end points of the lines directly coincide with the corners of the room. A vector is spanned between the coordinates of a corner and the end point under consideration. The norm of this vector should not exceed a certain parameter in order to be considered to be part of the room. Another possibility is that the end point of a line lies on the contour of a room. In order to determine if this is happening the closest distance of this end point to the line spanned by the two nearby corners should be determined. This can be done using simple vector calculus.<br />
<br />
The shortest distance between a line the origin is expressed in the following equation:<br />
<br />
<br />
<math>\left(\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}\right)\cdot\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}=0</math><br />
<br />
<br />
In this equation <math>p_{1}</math> and <math>p_{2}</math> are calculated by substracting the end point of the line under consideration from the corners of the room. <math>t</math> is calculated, and substituted in the following equation to obtain the vector spanned between the end point and the line:<br />
<br />
<br />
<math>\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}</math><br />
<br />
<br />
The length of this vector is also compared with the fixed parameter used to test the coincidence of the end points and the corners.<br />
<br />
===Localisation===<br />
Because the lines are created in a certain way, it can be derived to which of the four walls they belong. The start- and end points of lines are defined in a counter-clockwise manner around the coordinate system, and the angle of the lines is calculated with respect to the x-axis of a this coordinate system. The lines corresponding to the rightmost wall would thus have an angle corresponding to <math>0</math> radians, the upper walls <math>\frac{1}{2}\pi</math> radians, the leftmost walls <math>\pi</math> radians and the lower walls <math>\frac{3}{2}\pi</math> radians. When it is determined which lines belong to which walls, information about the distance from PICO to these walls is extracted from the untransformed lines. This information is used to calculate PICO’s x and y coordinates in a room, by comparing the data to the previously stored width and height of a room.<br />
<br />
===Angle Estimation===<br />
The odometry on PICO gives an estimate of the orientation of PICO. However due to the nature of odometry this estimate will drift over time. Therefore an absolute measurement of the angle is necessary to reset the odometry measurement. This is done using the lines extracted by PICO. These lines have a radius and an angle relative to PICO. Since the hospital is contructed of perpendicular lines PICO can determine it's angle relative to the walls. By using an initial guess, which will give the general direction PICO is oriented in, i.e. whether its angle is around <math>0</math>, <math>\dfrac{1}{2}\pi</math>, <math>\pi</math>, or <math>-\frac{1}{2}\pi</math>. Then the angle is corrected y using the following equation on the measurement:<br />
<br />
<math>estimate +mod_{0.5 * \pi}(measuredAngle)</math><br />
<br />
==Trajectory Planning==<br />
This part plans the trajectory PICO should take during the hospital challenge.<br />
<br />
===Approaching a Door===<br />
From the worldmodel PICO obtains his current position, and the position of the two corners of the door. A function is made which basically calculates a point right in the middle of the two corners, and puts a setpoint at a specified distance in front of the midpoint of the door and behind the midpoint of the door seen in the Figure below. Using the P-controller and the repulsion, this setpoint can be reached by PICO. PICO first changes the angle and drives forwards to the 'DES 1' setpoint, when this setpoint is reached the angle changes again and starts driving to the second 'DES 2' setpoint.<br />
<br />
[[File:Draw1x.png|300px]]<br />
<br />
==Motion Control==<br />
This part explains the methods used to perform the motion as dictated from the trajectory planning.<br />
<br />
===Repulsion===<br />
A function is implemented which keeps PICO from touching the walls. This is done using virtual repulsion forces. The repulsion force is calculated using the reciprocal of the laser scan data. The laser data is scanned over the entire range of the sensor, except for the first 10 points and the last 10 points because the returned laser data at these points was not trustworthy. For each sensor reading a repulsion force is calculated in the x and y direction. By adding up all the repulsion forces over the entire scan range a single force vector is obtained. By putting this 'force' combined with a gain directly into PICO's speed input, it will have the tendency to drive away from walls. A tuning parameter has been made in the form of a maximum distance of 0.35m in which PICO can approach a wall. All laser data points which are larger than this value are ignored. Since the laser data only covers 240° of view PICO always changes its angle to drive with its head forward to the destination coordinates. This way there is always available laser data to avoid obstacles.<br />
<br />
[[File:draw2x.jpg]]<br />
<br />
[[File:Draw3x.png|220px]]<br />
<br />
===P-controller===<br />
In order to have PICO move from point A to point B a simple P-controller has been implemented. For testing purposes the P-controller currently relies on odometry data. The 'error' is calculated by subtracting the current position from the target position. The error is multiplied with a proportional action. During testing these parameters will be tuned to ensure optimal behavior of PICO.<br />
<br />
===P-controller with Repulsion===<br />
The speed outputted by the P-controller and the speed generated by the repulsion function are simultaneously used in the PICO speed command. This means that, for example, when PICO is closing in on a corner, the speed (depending on the direction in which PICO is oriented) is temporarily reduced in the direction of the walls, ensuring that PICO gets enough clearance before returning on his path. A problem arises however when a setpoint is located directly behind a wall. In this case PICO cannot reach his goal, as the P-controller 'pulls' PICO towards the setpoint, while the repulsion 'pushes' PICO away from the walls. Therefore it is necessary to give PICO setpoints which he can roughly 'see'. The generation of these setpoints is handled in one of the previous sections. To make sure the maximum translation velocity in the x and y direction is not exceeded the norm of both speeds are calculated, when the velocity exceeds the maximum translation speed it is lowered.<br />
<br />
==Task Manager==<br />
The task manager states what task should take place at what moment. The task manager contains three tasks:<br />
* Exploration<br />
* Parking<br />
* Search and rescue<br />
The charts of these tasks are shown below. The left one shows exploration and parking, and the right one shows search and rescue:<br />
<br />
[[File:MappingX.png|350px]] [[File:SearchRescueX.png|400px]]<br />
<br />
<br />
These three tasks will be highlighted in more detail now.<br />
<br />
===Exploration===<br />
Starting the hospital challenge, exploration is the first task to complete. Starting in the corridor, the detection of this area will be done. This corridor is saved in a struct, which contains a vector of exits. These exits have a destination. In the beginning, each of these destinations have value -1. The exploration is programmed in such a way that always the exit with a destination of -1 will be taken, so always an unexplored room will be entered. After entering a new room, again detection will scan the area. The destination of the door through which PICO has entered the room, will change from -1 to a value belonging to the previous area (corridor in this case). Then, if a room is entered and more than one exit is detected, again the door with unknown destination will be chosen. In the end, all unknown exits are explored and PICO is back in the corridor. At this moment PICO should move to its starting position and parking phase will begin.<br />
<br />
===Parking===<br />
When the map building is complete, PICO has to park backwards to the wall behind the starting position. Parking is done upon touching the wall. After PICO parked, PICO should say: "I am parked!". <br />
<br />
This is done by letting PICO drive forward to the starting position and stopping in front of the wall. Then PICO will turn around such that he can drive backwards to the wall. Since PICO cannnot scan what is behind him, a diffrent method is used to see/feel the wall he should touch. This is done using the control effort. If the control effort becomes large enough, PICO will stop since this increase in control effort is caused by touching the wall. All in all, a short video will summarize the result far better, so let's watch the parking skills of PICO:<br />
<br />
[[File:BackwardParking.gif]]<br />
<br />
<br />
Note that this is a GIF, so you can't hear PICO say "I am parked!".<br />
After parking, the last phase of the challenge can begin. This phase will be explained in Search and Rescue.<br />
<br />
===Search and Rescue===<br />
At this moment, the hospital is explored and mapped. In the world model, a graph is saved. As discussed before, the hint states that the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, the position of the object should be known and PICO can drive towards it. Standing still in front of this object will be the end of the challenge. In case there are multiple rooms for which the most doors have to be passed through, PICO should just try one and in case the object is not found, the other possibility should be tried.<br />
For now, the code calculates the longest path and stores this value. Because of the graph, PICO always knows which exit to take. After taking all these exits, the room with the object is entered. As explained, there can be multiple options. However, this is not fixed yet and will be one of the recommendations. After entering the room with the object, the object search function will be called. In this function, the LRF data is used. For each laserpoint, the differences between its distance and the distance of laserpoints on the left and on the right are measured. If that difference is high enough, there has to be an object in the room. This function places a point in front of the object and PICO will drive towards that point with the normal motion functions and will speak 'I found the object'. This search and rescue is shown in the GIF below.<br />
<br />
=Hospital Challenge=<br />
On June 13th, the hospital challenge took place. It is expected to fail on localization. Besides that, most of the code works the way it should, independent of the way the hospital is build.<br />
<br />
==Evaluation==<br />
Since localization did not work yet, PICO was localized with the help of its odometry. As known, this odometry is not accurate. After a few meters, the errors are increasing and after a while the position where PICO thinks to be and its actual position differed lot. This was the reason the challenge was not successful. PICO started mapping the corridor. It located two exits and moved through one of these, as it is expected to do. Mapping the first room again worked as it should. Two exits were found and PICO knew it should take the door to an unknown place. Moving through that door worked just fine. Mapping that room worked, but then PICO should move to the door through where it entered. However, this door was not at the right position anymore. Or better, PICOs location was too different from where it thought it was. This meant there was a wall on a place of an exit, meaning PICO wanted to go through that wall. The force field made sure PICO did not bump into the wall, but the door was not found. This was the end of the challenge. Both trials did not succeed because of this reason. This was not the only disadvantage of our code. Mapping the corridor did not work perfectly, because of its dimensions. Since the width of the corridor was a lot smaller than its height, mapping the corridor was hard. There was not enough laserdata to have a good visualization of the end of the corridor. That is why only two exits were mapped instead of three. To correct this, PICO should move further into the corridor and map again.<br />
<br />
==Simulator==<br />
The main reason why the hospital challenge did not succeed was because of localization. This is not a problem in simulation. Localizing on odometry works just fine in simulation. Both the mapping and parking phase are shown in the YouTube video. As can be seen, mapping in the corridor starts in the middle of the corridor:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailHospital.png|300px|link=https://youtu.be/xx87YWtambs]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:HospitalSearch.gif]]<br />
<br />
==The Real Challenge==<br />
As seen above, PICO thinks the hospital challenge is not an actual challenge for him... To see what PICO can do, a real challenge was created. This is done with the following map, which is far more challenging due to its size, number of rooms, and especially more diversity of door sizes and positions.<br />
<br />
[[File:TheRealChallenge.png|350px]]<br />
<br />
Without wasting any more words, both the mapping and parking phase are shown in the YouTube video:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailReal.png|300px|link=https://youtu.be/pVJy6qWZcw8]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:RealSearch.gif]]<br />
<br />
=Documents=<br />
All the documents made, besides the Wiki page itself, are shared here.<br />
<br />
==Report of Initial Design==<br />
Due to a misunderstanding, the report was not uploaded as a PDF yet. However, the full report was uploaded on this Wiki page (see below) before May 11th (17.00h), and now it is also uploaded as a PDF file (<1Mb). Our apologies for any inconvenience. The PDF of the report of the initial design can be found here: [[File:InitialDesign_Group3_Report.pdf]]<br />
<br />
==Presentation of Initial Design==<br />
On May 16th, all groups presented their initial design. So we presented our initial design too and included two GIFs of our process so far. A PDF of the slides can be found here: [[File:InitialDesign_Group3_Presentation.pdf]]<br />
<br />
==Presentation of Final Design==<br />
On June 6th, the final presentation was presented to the other groups. This presentation of the final design mainly focussed on the architecture. A PDF of the slides can be found here: [[File:FinalDesign_Group3_Presentation.pdf]]<br />
<br />
=Code=<br />
Below several pieces of code can be found of which our group is particularly proud. These include the structures that form our map as well as the room fitting procedure. Our obstacle avoidance function is also included since this allows us to drive collision free even if the map is not 100% accurate.<br />
<br />
Structures used in the map<br />
[https://gitlab.tue.nl/EMC2018/group3/snippets/30 worldModel_structures]<br />
<br />
<br />
Room fit procedure<br />
[https://gitlab.tue.nl/EMC2018/group3/snippets/31 Room_fitting]<br />
<br />
<br />
Obstacle avoidance<br />
[https://gitlab.tue.nl/EMC2018/group3/snippets/32 Obstacle_avoidance]</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2018_Group_3&diff=59565Embedded Motion Control 2018 Group 32018-06-17T10:08:48Z<p>S131974: /* Determine dimensions */</p>
<hr />
<div>= Group Members =<br />
{| border="1" cellpadding="5" cellspacing="1" style="float:left;"<br />
! TU/e Number<br />
! Name<br />
! E-mail<br />
|- <br />
| 0848904<br />
| Luc (L.L.M.) van den Aker<br />
| <tt>l dot l dot m dot v dot d dot aker at student dot tue dot nl</tt><br />
|-<br />
| 0852908<br />
| Thomas (T.) Neilen<br />
| <tt>t dot neilen at student dot tue dot nl</tt><br />
|-<br />
| 0909434<br />
| Jeroen (J.W.) van de Valk<br />
| <tt>j dot w dot v dot d dot valk at student dot tue dot nl</tt><br />
|-<br />
| 0896947<br />
| Nourdin (N.) Kaai<br />
| <tt>n dot kaai at student dot tue dot nl</tt><br />
|-<br />
| 0883056<br />
| Peter (P.) van Dooren<br />
| <tt>p dot v dot dooren at student dot tue dot nl</tt><br />
|-<br />
| 0861750<br />
| Ties (T.J.) van Loon<br />
| <tt>t dot j dot v dot loon at student dot tue dot nl</tt><br />
|-<br />
|}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Wiki Info=<br />
'''NOTE: This is just for the menbers of Group 3 and will be deleted before the deadline!'''<br />
<br />
==Wiki Deadline==<br />
The Wiki, code and peer review deadline is: Wednesday, 20 June, 23:59h.<br />
<br />
==Wiki Content==<br />
Make sure the Wiki of your group contains:<br />
* An overview of the software architecture and approach used. How does it map to the paradigms explained in this course?<br />
* A description of the methods that make your solution work so well, preferably using nice explanatory images (explain what makes your solution unique; what are you most proud of?)<br />
* Which difficult problems were identified, and how were they solved?<br />
* An evaluation of the hospital challenge: What went well? What went wrong? Why? How could it be improved?<br />
* Videos / GIFs / animations / diagrams / pictures are very welcome! The simulator map for the Hospital Room challenge will be posted after the challenge (of course), so you can show that you are able to solve the challenge in simulation.<br />
<br />
==Publishing Code==<br />
A part of the grading criteria in this course is the quality of your code. We will not dive into your full code base. Instead, link to one or a few pieces of code or code files of which you are particularly proud, and which you think reflect the lessons taught: you can use the code snippet system as included in Gitlab. Do ensure we can access the code! Of course, feel free to also add some introductory/explanatory remarks on the Wiki, or as comments in the code. Make sure the links to your code snippets are clearly visible from your Wiki. For example, put them in a separate section called: ''Code''.<br />
<br />
=Initial Design=<br />
The initial design is explained in the following parts:<br />
* Requirements<br />
* Functions<br />
* Components<br />
* Specifications<br />
* Interfaces<br />
Note that the report of the initial design is shared in Documents.<br />
<br />
==Requirements==<br />
* PICO should make no collisions with any walls<br />
* PICO cannot stand still for 30 seconds or longer<br />
* For the escape room challenge, the robot should leave the room within 5 minutes<br />
* For the hospital challenge, within 5 minutes, mapping, reverse parking and obtaining the object should be done<br />
* Its surroundings should be made visible in a map<br />
* PICO should be able to reach every position in the room<br />
* PICO should be able to leave every room<br />
* PICO should make distinction between the hall and rooms<br />
* It should run autonomously, so in each challenge there should be no additional input<br />
* To start your software, only one executable has to be called<br />
* PICO should be able to recognize an object and stand still close to it<br />
<br />
==Functions==<br />
* PICO should be able to drive in any direction<br />
* PICO should be able to turn around<br />
* It should be able to detect walls<br />
* PICO has to know its own position within the mapped map<br />
* PICO is able to construct a map<br />
* It should be possible to create a trajectory to a room<br />
* PICO should be able to recognize an object<br />
<br />
==Components==<br />
* Sensors:<br />
** Laser Range Finder (LRF)<br />
** Wheel encoders (odometry)<br />
* Actuator:<br />
** Holonomic base (omni-wheels)<br />
* Computer:<br />
** Intel i7<br />
** Ubuntu 16.04<br />
<br />
==Specifications==<br />
* Translation maximum: 0.5 m/s<br />
* Rotation maximum: 1.2 rad/s<br />
* Range of Laser Range Finder is assumed to be bigger than maximum room dimension<br />
* The field of view of the Laser Range Finder is from -2 rad to 2 rad, divided in pieces of 0.004004<br />
* The Laser Range Finder can only measure at one height<br />
<br />
==Interfaces==<br />
The interfaces of the initial design are shown here:<br />
<br />
[[File:InterfaceGroup3.png]]<br />
<br />
As shown in the figure above, a world model is the link between all other parts. The tasks represent the highest level, meaning the most global work PICO has to do. The skills are needed to complete these tasks and some motions together form a skill. The perception contains the sensors, the continuous data. Below an overview of the different parts are given:<br />
<br />
''World model:''<br />
* Compose map<br />
* Object recognition<br />
<br />
''Tasks:''<br />
* Mapping of the environment <br />
* Backward parking at the specified location<br />
* Searching for the object<br />
<br />
''Skills:''<br />
* Planning a trajectory<br />
* Collision avoidance<br />
* Backward parking<br />
* Navigate<br />
* Positioning in front of an opening<br />
* Compose maps<br />
<br />
''Motion:''<br />
* Translation <br />
* Rotation<br />
<br />
''Perception:''<br />
* Odometry <br />
* Laser Range Finder<br />
* Control effort<br />
<br />
=Escape Room Challenge=<br />
Since our code to map a room was not finished completely, a new code for the escape room challenge was made. This code was kept simple and effective. PICO should drive to a wall, turn to the left when it detects a wall within 0.4 meters from itself, and follow the wall (without hitting it of course). Then it will scan for a hallway to exit the room. When he sees a way to exit the room, PICO will go through the opening in the wall. <br />
<br />
Our first attempt during the escape room challange was very successful! PICO drove out of the room, but we were convinced he could do it even faster. So we set the speed higher for the second try, and it was even faster. PICO drove out of the room within 29 seconds. This resulted in a second place and being one of the two teams that made it out of the room.<br />
<br />
Here a shot video is shown of PICO leaving a room. Note that this is not filmed during the 'official' escape room challenge. Due to our enthousiasm, we forgot to film, so we reconstructed the room during one of our test sessions.<br />
<br />
[[File:EscapeRoomChallenge.gif]]<br />
<br />
=Final Design=<br />
First off, the architecture is explained. This architecture is based on the theorem and takes the requirements of the hospital challenge into account. The architecture is explained in six steps:<br />
* World model<br />
* Detection<br />
* Localization<br />
* Trajectory planning<br />
* Motion control <br />
* Task manager<br />
The overall architecture is visualized here:<br />
<br />
[[File:Architecture_Group3.png|650px]]<br />
<br />
All six main components that are in this archtecture will be explained now.<br />
<br />
==World Model==<br />
To build a map of the hospital a twofold mapping procedure will be used. First PICO will map the room it is currently standing in. Secondly a graph connecting all mapped rooms with each other is stored. By using this two level mapping abstraction it is easier to locate PICO in a certain room. Also trajectory planning to a desired room can be more efficiently by using the graph. <br />
The data structures used to store the obtained data are the Rooms, Exits and a graph with all the Rooms.<br />
Once a room is mapped it is stored in a Room object. This object contains the width and height of the room, a global ID of the room and Exit objects. The Exit objects have a local ID, ie the ID of the exit has only meaning when the room it belongs to is also know. The exits also have a location in the coordinate frame of the room and a destination. <br />
The world model also holds the current position and the current position based on odometry.<br />
<br />
===Graph===<br />
Every room (square in figure) and door (circle in figure) will be numbered with an ID and then stored in the world model in the form of a graph. An visual representation of such graph can be seen below:<br />
<br />
[[File:Graph.png|200px]]<br />
<br />
Using the grapgh, it can be easily seen what trajectory PICO should take to find the object. As the hint states, the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, it can be quickly determined what sequence of room ID and door IDs is the longest. Knowing this makes finding the object easier, since PICO does not have to look in every room again, bit can immeadily go to the room with the longest sequence.<br />
<br />
==Line Extraction==<br />
The first step in mapping a room is to extract line segments from the obtained laser data. For this a pre-made laser line extraction package was used. This code was slightly modified to remove the ROS layer. the source code can be found on: https://github.com/kam3k/laser_line_extraction<br />
<br />
This package employs a split and merge algorithm [T. Pavlidis and S. L. Horowitz, "Segmentation of Plane Curves," in IEEE Transactions on Computers, vol. C-23, no. 8, pp. 860-870, Aug. 1974] The obtained laser data for the rooms was relatively clean, thus no filtering before the line extraction was applied. The parameters used in the algorithm needed some additional tuning to give the optimal result.<br />
In the figures below, the lines can be seen:<br />
<br />
[[File:Line_detection_Sim.png|300px]] [[File:Line_detection_Lines.png|300px]]<br />
<br />
==Fit Room==<br />
The mapping of a room is done using the lines found by the line extraction.<br />
<br />
===Saving Lines===<br />
To map a room PICO needs to look 360° around him, however the laser range finder only has a limited range. Therefore a PICO will scan lines, turn around 180° and scan another time. It will then combine these two sets to end up with a set of lines which describe the entire room around PICO.<br />
<br />
The first time this is done pico’s position will be saved. The lines are transformed using the orientation of pico. This way the resulting lines are aligned with the global axis system but the 0,0 position is at pico’s location. This new frame will be called the mappedFrame.<br />
<br />
after rotating 180 degrees. Pico will merge the detected lines. First the lines are transformed to the mapping frame. Then the lines are compared to the lines already saved. If the lines are collinear, (they have similar same radius and angle) the lines are checked for overlap. The start and end points of the new line are projected on the compared line. If either of the projected point lies on the old line with some margin of error. The line is merged. This is done by taking the furthest start and end point. <br />
<br />
In the figures below, the two sets of lines can be seen, followed by the merged set of lines: <br />
<br />
[[File:Transform_sim.png|300px]] [[File:Transform_lines.png|300px]] [[File:Merged_lines.png|300px]]<br />
<br />
===Determine dimensions===<br />
Once PICO has assembled a set of lines all around him, he can determine the properties of the room he is in. This is done in two steps: <br />
* The dimensions of the room are found.<br />
* All the exits of the room are found.<br />
<br />
A box is defined with a distances to the left, to the right, above and below pico. The width and height of the room are determined by fitting the largest possible box inside the lines in mergedLines. An initial guess for the distances is made using the minimum radii of all lines which have the right orientation. Each line in mergedLines can be determined to be either to the left, to the right, above and below pico.<br />
<br />
For example, consider the left wall of the room. In the figure below three lines have the correct orientation to belong to that wall. The initial estimate for the distance to the left of pico is chosen as the smallest radius among those three lines. The same is done for the other three walls.<br />
<br />
After the initial estimate it is possible that the box is still smaller than the room. This can be caused by lines outside the room which happen to have a smaller radius. To expand the size of the room an iterative procedure is used. One side at a time the function checks whether the room can be expanded in this direction. It again searches for a minimum radius among a selection of lines, however this time a criteria is added that the line must fall within the estimated box after expansion. This will filter out most lines outside of the room. The procedure continues until it has gone one cycle without updating the distances. Using the distances left, right, up and down the width and height of the room can be determined as well as the location of pico in this new room, expressed in the new room frame.<br />
<br />
[[File:testRoomMergedLines.png|200px]] <br />
[[File:testRoomFit1.png|200px]] <br />
[[File:testRoomFit2.png|200px]] <br />
[[File:testRoomFit3.png|200px]] <br />
<br />
There are edge cases where this procedure goes wrong however they are considered rare enough that they are not taken into account.<br />
<br />
[[File:EdgeCaseRoomFit.png|300px]]<br />
<br />
===Find exits===<br />
In order to find the exits a function is made which once again loops over the lines in mergedLines. It will determine whether a line belongs to the room as determined by the dimensions previously established. If the gap between two consecutive lines which belong to the room is the size of a door (between 0.4 and 1.7m). An exit is added there. After looping over all lines a final check is done to determine whether an exit exists between the first and last lines in mergedLines.<br />
<br />
[[File:testRoomExits.png|300px]] <br />
<br />
===Adding the room to the world model===<br />
After the room has been fitted it must be added to the map in the world model. There are several properties of the room which still need to be determined. <br />
The location of the room coordinate frame is calculated using the room coordinate frame of the previous room, the location of pico in the previous room frame (mappedFrame) and the location of pico in the new room.<br />
The exit pico went through in the previous room must be linked to an exit found in the new room. This is done by calculating the distance from the exits in the new room to the exit taken in the previous room. The exit with the smallest distance is linked to this new room. The destinations of the two exits are set and the exit in the new room is moved to the front of the vector with exits so that exits[0] always leads back to the hallway.<br />
Finally pico's location and current room are updated to be in the new room.<br />
<br />
==Localization==<br />
Once a room has been mapped. PICO will be able to compare the detected lines to the map it has made. Based on this, PICO's location can be determined. As the odometry data of PICO is unreliable, another solution had to be made to reliably navigate through the environment. A solution had to be made that navigates PICO based on the local coordinates of a room. To do this three different functionalities had to be implemented:<br />
* Make an initial guess of PICO’s position within a room.<br />
* Determine which lines are part of a specific room.<br />
* Determine PICO’s position based on LRF-data.<br />
[[File:Localisation_animation.gif]]<br />
===Initial guess===<br />
The localisation script constantly provides information on PICO’s position. When PICO is leaving a room through a door to another room, this position is used as an initial guess for PICO’s current coordinates. Using these coordinates the lines that PICO sees can be transformed to the coordinate frame of the new room.<br />
<br />
===Line filtering===<br />
The lines that PICO sees are converted to the coordinate system of the room. Based on the information previously gathered about a specific room it is determined which of the lines that PICO currently sees are actually part of the room itself. This is to prevent that for example lines from a hallway are used in the localisation. First it is checked if the end points of the lines directly coincide with the corners of the room. A vector is spanned between the coordinates of a corner and the end point under consideration. The norm of this vector should not exceed a certain parameter in order to be considered to be part of the room. Another possibility is that the end point of a line lies on the contour of a room. In order to determine if this is happening the closest distance of this end point to the line spanned by the two nearby corners should be determined. This can be done using simple vector calculus.<br />
<br />
The shortest distance between a line the origin is expressed in the following equation:<br />
<br />
<br />
<math>\left(\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}\right)\cdot\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}=0</math><br />
<br />
<br />
In this equation <math>p_{1}</math> and <math>p_{2}</math> are calculated by substracting the end point of the line under consideration from the corners of the room. <math>t</math> is calculated, and substituted in the following equation to obtain the vector spanned between the end point and the line:<br />
<br />
<br />
<math>\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}</math><br />
<br />
<br />
The length of this vector is also compared with the fixed parameter used to test the coincidence of the end points and the corners.<br />
<br />
===Localisation===<br />
Because the lines are created in a certain way, it can be derived to which of the four walls they belong. The start- and end points of lines are defined in a counter-clockwise manner around the coordinate system, and the angle of the lines is calculated with respect to the x-axis of a this coordinate system. The lines corresponding to the rightmost wall would thus have an angle corresponding to <math>0</math> radians, the upper walls <math>\frac{1}{2}\pi</math> radians, the leftmost walls <math>\pi</math> radians and the lower walls <math>\frac{3}{2}\pi</math> radians. When it is determined which lines belong to which walls, information about the distance from PICO to these walls is extracted from the untransformed lines. This information is used to calculate PICO’s x and y coordinates in a room, by comparing the data to the previously stored width and height of a room.<br />
<br />
===Angle Estimation===<br />
The odometry on PICO gives an estimate of the orientation of PICO. However due to the nature of odometry this estimate will drift over time. Therefore an absolute measurement of the angle is necessary to reset the odometry measurement. This is done using the lines extracted by PICO. These lines have a radius and an angle relative to PICO. Since the hospital is contructed of perpendicular lines PICO can determine it's angle relative to the walls. By using an initial guess, which will give the general direction PICO is oriented in, i.e. whether its angle is around <math>0</math>, <math>\dfrac{1}{2}\pi</math>, <math>\pi</math>, or <math>-\frac{1}{2}\pi</math>. Then the angle is corrected y using the following equation on the measurement:<br />
<br />
<math>estimate +mod_{0.5 * \pi}(measuredAngle)</math><br />
<br />
==Trajectory Planning==<br />
This part plans the trajectory PICO should take during the hospital challenge.<br />
<br />
===Approaching a Door===<br />
From the worldmodel PICO obtains his current position, and the position of the two corners of the door. A function is made which basically calculates a point right in the middle of the two corners, and puts a setpoint at a specified distance in front of the midpoint of the door and behind the midpoint of the door seen in the Figure below. Using the P-controller and the repulsion, this setpoint can be reached by PICO. PICO first changes the angle and drives forwards to the 'DES 1' setpoint, when this setpoint is reached the angle changes again and starts driving to the second 'DES 2' setpoint.<br />
<br />
[[File:Draw1x.png|300px]]<br />
<br />
==Motion Control==<br />
This part explains the methods used to perform the motion as dictated from the trajectory planning.<br />
<br />
===Repulsion===<br />
A function is implemented which keeps PICO from touching the walls. This is done using virtual repulsion forces. The repulsion force is calculated using the reciprocal of the laser scan data. The laser data is scanned over the entire range of the sensor, except for the first 10 points and the last 10 points because the returned laser data at these points was not trustworthy. For each sensor reading a repulsion force is calculated in the x and y direction. By adding up all the repulsion forces over the entire scan range a single force vector is obtained. By putting this 'force' combined with a gain directly into PICO's speed input, it will have the tendency to drive away from walls. A tuning parameter has been made in the form of a maximum distance of 0.35m in which PICO can approach a wall. All laser data points which are larger than this value are ignored. Since the laser data only covers 240° of view PICO always changes its angle to drive with its head forward to the destination coordinates. This way there is always available laser data to avoid obstacles.<br />
<br />
[[File:draw2x.jpg]]<br />
<br />
[[File:Draw3x.png|220px]]<br />
<br />
===P-controller===<br />
In order to have PICO move from point A to point B a simple P-controller has been implemented. For testing purposes the P-controller currently relies on odometry data. The 'error' is calculated by subtracting the current position from the target position. The error is multiplied with a proportional action. During testing these parameters will be tuned to ensure optimal behavior of PICO.<br />
<br />
===P-controller with Repulsion===<br />
The speed outputted by the P-controller and the speed generated by the repulsion function are simultaneously used in the PICO speed command. This means that, for example, when PICO is closing in on a corner, the speed (depending on the direction in which PICO is oriented) is temporarily reduced in the direction of the walls, ensuring that PICO gets enough clearance before returning on his path. A problem arises however when a setpoint is located directly behind a wall. In this case PICO cannot reach his goal, as the P-controller 'pulls' PICO towards the setpoint, while the repulsion 'pushes' PICO away from the walls. Therefore it is necessary to give PICO setpoints which he can roughly 'see'. The generation of these setpoints is handled in one of the previous sections. To make sure the maximum translation velocity in the x and y direction is not exceeded the norm of both speeds are calculated, when the velocity exceeds the maximum translation speed it is lowered.<br />
<br />
==Task Manager==<br />
The task manager states what task should take place at what moment. The task manager contains three tasks:<br />
* Exploration<br />
* Parking<br />
* Search and rescue<br />
The charts of these tasks are shown below. The left one shows exploration and parking, and the right one shows search and rescue:<br />
<br />
[[File:MappingX.png|350px]] [[File:SearchRescueX.png|400px]]<br />
<br />
<br />
These three tasks will be highlighted in more detail now.<br />
<br />
===Exploration===<br />
Starting the hospital challenge, exploration is the first task to complete. Starting in the corridor, the detection of this area will be done. This corridor is saved in a struct, which contains a vector of exits. These exits have a destination. In the beginning, each of these destinations have value -1. The exploration is programmed in such a way that always the exit with a destination of -1 will be taken, so always an unexplored room will be entered. After entering a new room, again detection will scan the area. The destination of the door through which PICO has entered the room, will change from -1 to a value belonging to the previous area (corridor in this case). Then, if a room is entered and more than one exit is detected, again the door with unknown destination will be chosen. In the end, all unknown exits are explored and PICO is back in the corridor. At this moment PICO should move to its starting position and parking phase will begin.<br />
<br />
===Parking===<br />
When the map building is complete, PICO has to park backwards to the wall behind the starting position. Parking is done upon touching the wall. After PICO parked, PICO should say: "I am parked!". <br />
<br />
This is done by letting PICO drive forward to the starting position and stopping in front of the wall. Then PICO will turn around such that he can drive backwards to the wall. Since PICO cannnot scan what is behind him, a diffrent method is used to see/feel the wall he should touch. This is done using the control effort. If the control effort becomes large enough, PICO will stop since this increase in control effort is caused by touching the wall. All in all, a short video will summarize the result far better, so let's watch the parking skills of PICO:<br />
<br />
[[File:BackwardParking.gif]]<br />
<br />
<br />
Note that this is a GIF, so you can't hear PICO say "I am parked!".<br />
After parking, the last phase of the challenge can begin. This phase will be explained in Search and Rescue.<br />
<br />
===Search and Rescue===<br />
At this moment, the hospital is explored and mapped. In the world model, a graph is saved. As discussed before, the hint states that the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, the position of the object should be known and PICO can drive towards it. Standing still in front of this object will be the end of the challenge. In case there are multiple rooms for which the most doors have to be passed through, PICO should just try one and in case the object is not found, the other possibility should be tried.<br />
For now, the code calculates the longest path and stores this value. Because of the graph, PICO always knows which exit to take. After taking all these exits, the room with the object is entered. As explained, there can be multiple options. However, this is not fixed yet and will be one of the recommendations. After entering the room with the object, the object search function will be called. In this function, the LRF data is used. For each laserpoint, the differences between its distance and the distance of laserpoints on the left and on the right are measured. If that difference is high enough, there has to be an object in the room. This function places a point in front of the object and PICO will drive towards that point with the normal motion functions and will speak 'I found the object'. This search and rescue is shown in the GIF below.<br />
<br />
=Hospital Challenge=<br />
On June 13th, the hospital challenge took place. It is expected to fail on localization. Besides that, most of the code works the way it should, independent of the way the hospital is build.<br />
<br />
==Evaluation==<br />
Since localization did not work yet, PICO was localized with the help of its odometry. As known, this odometry is not accurate. After a few meters, the errors are increasing and after a while the position where PICO thinks to be and its actual position differed lot. This was the reason the challenge was not successful. PICO started mapping the corridor. It located two exits and moved through one of these, as it is expected to do. Mapping the first room again worked as it should. Two exits were found and PICO knew it should take the door to an unknown place. Moving through that door worked just fine. Mapping that room worked, but then PICO should move to the door through where it entered. However, this door was not at the right position anymore. Or better, PICOs location was too different from where it thought it was. This meant there was a wall on a place of an exit, meaning PICO wanted to go through that wall. The force field made sure PICO did not bump into the wall, but the door was not found. This was the end of the challenge. Both trials did not succeed because of this reason. This was not the only disadvantage of our code. Mapping the corridor did not work perfectly, because of its dimensions. Since the width of the corridor was a lot smaller than its height, mapping the corridor was hard. There was not enough laserdata to have a good visualization of the end of the corridor. That is why only two exits were mapped instead of three. To correct this, PICO should move further into the corridor and map again.<br />
<br />
==Simulator==<br />
The main reason why the hospital challenge did not succeed was because of localization. This is not a problem in simulation. Localizing on odometry works just fine in simulation. Both the mapping and parking phase are shown in the YouTube video. As can be seen, mapping in the corridor starts in the middle of the corridor:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailHospital.png|300px|link=https://youtu.be/xx87YWtambs]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:HospitalSearch.gif]]<br />
<br />
==The Real Challenge==<br />
As seen above, PICO thinks the hospital challenge is not an actual challenge for him... To see what PICO can do, a real challenge was created. This is done with the following map, which is far more challenging due to its size, number of rooms, and especially more diversity of door sizes and positions.<br />
<br />
[[File:TheRealChallenge.png|350px]]<br />
<br />
Without wasting any more words, both the mapping and parking phase are shown in the YouTube video:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailReal.png|300px|link=https://youtu.be/pVJy6qWZcw8]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:RealSearch.gif]]<br />
<br />
=Documents=<br />
All the documents made, besides the Wiki page itself, are shared here.<br />
<br />
==Report of Initial Design==<br />
Due to a misunderstanding, the report was not uploaded as a PDF yet. However, the full report was uploaded on this Wiki page (see below) before May 11th (17.00h), and now it is also uploaded as a PDF file (<1Mb). Our apologies for any inconvenience. The PDF of the report of the initial design can be found here: [[File:InitialDesign_Group3_Report.pdf]]<br />
<br />
==Presentation of Initial Design==<br />
On May 16th, all groups presented their initial design. So we presented our initial design too and included two GIFs of our process so far. A PDF of the slides can be found here: [[File:InitialDesign_Group3_Presentation.pdf]]<br />
<br />
==Presentation of Final Design==<br />
On June 6th, the final presentation was presented to the other groups. This presentation of the final design mainly focussed on the architecture. A PDF of the slides can be found here: [[File:FinalDesign_Group3_Presentation.pdf]]<br />
<br />
=Code=<br />
Still to come...</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2018_Group_3&diff=59564Embedded Motion Control 2018 Group 32018-06-17T10:08:09Z<p>S131974: /* Saving Lines */</p>
<hr />
<div>= Group Members =<br />
{| border="1" cellpadding="5" cellspacing="1" style="float:left;"<br />
! TU/e Number<br />
! Name<br />
! E-mail<br />
|- <br />
| 0848904<br />
| Luc (L.L.M.) van den Aker<br />
| <tt>l dot l dot m dot v dot d dot aker at student dot tue dot nl</tt><br />
|-<br />
| 0852908<br />
| Thomas (T.) Neilen<br />
| <tt>t dot neilen at student dot tue dot nl</tt><br />
|-<br />
| 0909434<br />
| Jeroen (J.W.) van de Valk<br />
| <tt>j dot w dot v dot d dot valk at student dot tue dot nl</tt><br />
|-<br />
| 0896947<br />
| Nourdin (N.) Kaai<br />
| <tt>n dot kaai at student dot tue dot nl</tt><br />
|-<br />
| 0883056<br />
| Peter (P.) van Dooren<br />
| <tt>p dot v dot dooren at student dot tue dot nl</tt><br />
|-<br />
| 0861750<br />
| Ties (T.J.) van Loon<br />
| <tt>t dot j dot v dot loon at student dot tue dot nl</tt><br />
|-<br />
|}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Wiki Info=<br />
'''NOTE: This is just for the menbers of Group 3 and will be deleted before the deadline!'''<br />
<br />
==Wiki Deadline==<br />
The Wiki, code and peer review deadline is: Wednesday, 20 June, 23:59h.<br />
<br />
==Wiki Content==<br />
Make sure the Wiki of your group contains:<br />
* An overview of the software architecture and approach used. How does it map to the paradigms explained in this course?<br />
* A description of the methods that make your solution work so well, preferably using nice explanatory images (explain what makes your solution unique; what are you most proud of?)<br />
* Which difficult problems were identified, and how were they solved?<br />
* An evaluation of the hospital challenge: What went well? What went wrong? Why? How could it be improved?<br />
* Videos / GIFs / animations / diagrams / pictures are very welcome! The simulator map for the Hospital Room challenge will be posted after the challenge (of course), so you can show that you are able to solve the challenge in simulation.<br />
<br />
==Publishing Code==<br />
A part of the grading criteria in this course is the quality of your code. We will not dive into your full code base. Instead, link to one or a few pieces of code or code files of which you are particularly proud, and which you think reflect the lessons taught: you can use the code snippet system as included in Gitlab. Do ensure we can access the code! Of course, feel free to also add some introductory/explanatory remarks on the Wiki, or as comments in the code. Make sure the links to your code snippets are clearly visible from your Wiki. For example, put them in a separate section called: ''Code''.<br />
<br />
=Initial Design=<br />
The initial design is explained in the following parts:<br />
* Requirements<br />
* Functions<br />
* Components<br />
* Specifications<br />
* Interfaces<br />
Note that the report of the initial design is shared in Documents.<br />
<br />
==Requirements==<br />
* PICO should make no collisions with any walls<br />
* PICO cannot stand still for 30 seconds or longer<br />
* For the escape room challenge, the robot should leave the room within 5 minutes<br />
* For the hospital challenge, within 5 minutes, mapping, reverse parking and obtaining the object should be done<br />
* Its surroundings should be made visible in a map<br />
* PICO should be able to reach every position in the room<br />
* PICO should be able to leave every room<br />
* PICO should make distinction between the hall and rooms<br />
* It should run autonomously, so in each challenge there should be no additional input<br />
* To start your software, only one executable has to be called<br />
* PICO should be able to recognize an object and stand still close to it<br />
<br />
==Functions==<br />
* PICO should be able to drive in any direction<br />
* PICO should be able to turn around<br />
* It should be able to detect walls<br />
* PICO has to know its own position within the mapped map<br />
* PICO is able to construct a map<br />
* It should be possible to create a trajectory to a room<br />
* PICO should be able to recognize an object<br />
<br />
==Components==<br />
* Sensors:<br />
** Laser Range Finder (LRF)<br />
** Wheel encoders (odometry)<br />
* Actuator:<br />
** Holonomic base (omni-wheels)<br />
* Computer:<br />
** Intel i7<br />
** Ubuntu 16.04<br />
<br />
==Specifications==<br />
* Translation maximum: 0.5 m/s<br />
* Rotation maximum: 1.2 rad/s<br />
* Range of Laser Range Finder is assumed to be bigger than maximum room dimension<br />
* The field of view of the Laser Range Finder is from -2 rad to 2 rad, divided in pieces of 0.004004<br />
* The Laser Range Finder can only measure at one height<br />
<br />
==Interfaces==<br />
The interfaces of the initial design are shown here:<br />
<br />
[[File:InterfaceGroup3.png]]<br />
<br />
As shown in the figure above, a world model is the link between all other parts. The tasks represent the highest level, meaning the most global work PICO has to do. The skills are needed to complete these tasks and some motions together form a skill. The perception contains the sensors, the continuous data. Below an overview of the different parts are given:<br />
<br />
''World model:''<br />
* Compose map<br />
* Object recognition<br />
<br />
''Tasks:''<br />
* Mapping of the environment <br />
* Backward parking at the specified location<br />
* Searching for the object<br />
<br />
''Skills:''<br />
* Planning a trajectory<br />
* Collision avoidance<br />
* Backward parking<br />
* Navigate<br />
* Positioning in front of an opening<br />
* Compose maps<br />
<br />
''Motion:''<br />
* Translation <br />
* Rotation<br />
<br />
''Perception:''<br />
* Odometry <br />
* Laser Range Finder<br />
* Control effort<br />
<br />
=Escape Room Challenge=<br />
Since our code to map a room was not finished completely, a new code for the escape room challenge was made. This code was kept simple and effective. PICO should drive to a wall, turn to the left when it detects a wall within 0.4 meters from itself, and follow the wall (without hitting it of course). Then it will scan for a hallway to exit the room. When he sees a way to exit the room, PICO will go through the opening in the wall. <br />
<br />
Our first attempt during the escape room challange was very successful! PICO drove out of the room, but we were convinced he could do it even faster. So we set the speed higher for the second try, and it was even faster. PICO drove out of the room within 29 seconds. This resulted in a second place and being one of the two teams that made it out of the room.<br />
<br />
Here a shot video is shown of PICO leaving a room. Note that this is not filmed during the 'official' escape room challenge. Due to our enthousiasm, we forgot to film, so we reconstructed the room during one of our test sessions.<br />
<br />
[[File:EscapeRoomChallenge.gif]]<br />
<br />
=Final Design=<br />
First off, the architecture is explained. This architecture is based on the theorem and takes the requirements of the hospital challenge into account. The architecture is explained in six steps:<br />
* World model<br />
* Detection<br />
* Localization<br />
* Trajectory planning<br />
* Motion control <br />
* Task manager<br />
The overall architecture is visualized here:<br />
<br />
[[File:Architecture_Group3.png|650px]]<br />
<br />
All six main components that are in this archtecture will be explained now.<br />
<br />
==World Model==<br />
To build a map of the hospital a twofold mapping procedure will be used. First PICO will map the room it is currently standing in. Secondly a graph connecting all mapped rooms with each other is stored. By using this two level mapping abstraction it is easier to locate PICO in a certain room. Also trajectory planning to a desired room can be more efficiently by using the graph. <br />
The data structures used to store the obtained data are the Rooms, Exits and a graph with all the Rooms.<br />
Once a room is mapped it is stored in a Room object. This object contains the width and height of the room, a global ID of the room and Exit objects. The Exit objects have a local ID, ie the ID of the exit has only meaning when the room it belongs to is also know. The exits also have a location in the coordinate frame of the room and a destination. <br />
The world model also holds the current position and the current position based on odometry.<br />
<br />
===Graph===<br />
Every room (square in figure) and door (circle in figure) will be numbered with an ID and then stored in the world model in the form of a graph. An visual representation of such graph can be seen below:<br />
<br />
[[File:Graph.png|200px]]<br />
<br />
Using the grapgh, it can be easily seen what trajectory PICO should take to find the object. As the hint states, the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, it can be quickly determined what sequence of room ID and door IDs is the longest. Knowing this makes finding the object easier, since PICO does not have to look in every room again, bit can immeadily go to the room with the longest sequence.<br />
<br />
==Line Extraction==<br />
The first step in mapping a room is to extract line segments from the obtained laser data. For this a pre-made laser line extraction package was used. This code was slightly modified to remove the ROS layer. the source code can be found on: https://github.com/kam3k/laser_line_extraction<br />
<br />
This package employs a split and merge algorithm [T. Pavlidis and S. L. Horowitz, "Segmentation of Plane Curves," in IEEE Transactions on Computers, vol. C-23, no. 8, pp. 860-870, Aug. 1974] The obtained laser data for the rooms was relatively clean, thus no filtering before the line extraction was applied. The parameters used in the algorithm needed some additional tuning to give the optimal result.<br />
In the figures below, the lines can be seen:<br />
<br />
[[File:Line_detection_Sim.png|300px]] [[File:Line_detection_Lines.png|300px]]<br />
<br />
==Fit Room==<br />
The mapping of a room is done using the lines found by the line extraction.<br />
<br />
===Saving Lines===<br />
To map a room PICO needs to look 360° around him, however the laser range finder only has a limited range. Therefore a PICO will scan lines, turn around 180° and scan another time. It will then combine these two sets to end up with a set of lines which describe the entire room around PICO.<br />
<br />
The first time this is done pico’s position will be saved. The lines are transformed using the orientation of pico. This way the resulting lines are aligned with the global axis system but the 0,0 position is at pico’s location. This new frame will be called the mappedFrame.<br />
<br />
after rotating 180 degrees. Pico will merge the detected lines. First the lines are transformed to the mapping frame. Then the lines are compared to the lines already saved. If the lines are collinear, (they have similar same radius and angle) the lines are checked for overlap. The start and end points of the new line are projected on the compared line. If either of the projected point lies on the old line with some margin of error. The line is merged. This is done by taking the furthest start and end point. <br />
<br />
In the figures below, the two sets of lines can be seen, followed by the merged set of lines: <br />
<br />
[[File:Transform_sim.png|300px]] [[File:Transform_lines.png|300px]] [[File:Merged_lines.png|300px]]<br />
<br />
===Determine dimensions===<br />
Once PICO has assembled a set of lines all around him, he can determine the properties of the room he is in. This is done in two steps: <br />
* The dimensions of the room are found.<br />
* All the exits of the room are found.<br />
<br />
A box is defined with a distances to the left, to the right, above and below pico. The width and height of the room are determined by fitting the largest possible box inside the lines in mergedLines. An initial guess for the distances is made using the minimum radii of all lines which have the right orientation. Each line in mergedLines can be determined to be either to the left, to the right, above and below pico.<br />
<br />
For example, consider the left wall of the room. In the figure below three lines have the correct orientation to belong to that wall. The initial estimate for the distance to the left of pico is chosen as the smallest radius among those three lines. The same is done for the other three walls.<br />
<br />
After the initial estimate it is possible that the box is still smaller than the room. This can be caused by lines outside the room which happen to have a smaller radius. To expand the size of the room an iterative procedure is used. One side at a time the function checks whether the room can be expanded in this direction. It again searches for a minimum radius among a selection of lines, however this time a criteria is added that the line must fall within the estimated box after expansion. This will filter out most lines outside of the room. The procedure continues until it has gone one cycle without updating the distances. Using the distances left, right, up and down the width and height of the room can be determined as well as the location of pico in this new room, expressed in the new room frame.<br />
<br />
[[File:testRoomMergedLines.png|300px]] <br />
[[File:testRoomFit1.png|300px]] <br />
[[File:testRoomFit2.png|300px]] <br />
[[File:testRoomFit3.png|300px]] <br />
<br />
There are edge cases where this procedure goes wrong however they are considered rare enough that they are not taken into account.<br />
<br />
[[File:EdgeCaseRoomFit.png|300px]] <br />
<br />
===Find exits===<br />
In order to find the exits a function is made which once again loops over the lines in mergedLines. It will determine whether a line belongs to the room as determined by the dimensions previously established. If the gap between two consecutive lines which belong to the room is the size of a door (between 0.4 and 1.7m). An exit is added there. After looping over all lines a final check is done to determine whether an exit exists between the first and last lines in mergedLines.<br />
<br />
[[File:testRoomExits.png|300px]] <br />
<br />
===Adding the room to the world model===<br />
After the room has been fitted it must be added to the map in the world model. There are several properties of the room which still need to be determined. <br />
The location of the room coordinate frame is calculated using the room coordinate frame of the previous room, the location of pico in the previous room frame (mappedFrame) and the location of pico in the new room.<br />
The exit pico went through in the previous room must be linked to an exit found in the new room. This is done by calculating the distance from the exits in the new room to the exit taken in the previous room. The exit with the smallest distance is linked to this new room. The destinations of the two exits are set and the exit in the new room is moved to the front of the vector with exits so that exits[0] always leads back to the hallway.<br />
Finally pico's location and current room are updated to be in the new room.<br />
<br />
==Localization==<br />
Once a room has been mapped. PICO will be able to compare the detected lines to the map it has made. Based on this, PICO's location can be determined. As the odometry data of PICO is unreliable, another solution had to be made to reliably navigate through the environment. A solution had to be made that navigates PICO based on the local coordinates of a room. To do this three different functionalities had to be implemented:<br />
* Make an initial guess of PICO’s position within a room.<br />
* Determine which lines are part of a specific room.<br />
* Determine PICO’s position based on LRF-data.<br />
[[File:Localisation_animation.gif]]<br />
===Initial guess===<br />
The localisation script constantly provides information on PICO’s position. When PICO is leaving a room through a door to another room, this position is used as an initial guess for PICO’s current coordinates. Using these coordinates the lines that PICO sees can be transformed to the coordinate frame of the new room.<br />
<br />
===Line filtering===<br />
The lines that PICO sees are converted to the coordinate system of the room. Based on the information previously gathered about a specific room it is determined which of the lines that PICO currently sees are actually part of the room itself. This is to prevent that for example lines from a hallway are used in the localisation. First it is checked if the end points of the lines directly coincide with the corners of the room. A vector is spanned between the coordinates of a corner and the end point under consideration. The norm of this vector should not exceed a certain parameter in order to be considered to be part of the room. Another possibility is that the end point of a line lies on the contour of a room. In order to determine if this is happening the closest distance of this end point to the line spanned by the two nearby corners should be determined. This can be done using simple vector calculus.<br />
<br />
The shortest distance between a line the origin is expressed in the following equation:<br />
<br />
<br />
<math>\left(\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}\right)\cdot\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}=0</math><br />
<br />
<br />
In this equation <math>p_{1}</math> and <math>p_{2}</math> are calculated by substracting the end point of the line under consideration from the corners of the room. <math>t</math> is calculated, and substituted in the following equation to obtain the vector spanned between the end point and the line:<br />
<br />
<br />
<math>\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}</math><br />
<br />
<br />
The length of this vector is also compared with the fixed parameter used to test the coincidence of the end points and the corners.<br />
<br />
===Localisation===<br />
Because the lines are created in a certain way, it can be derived to which of the four walls they belong. The start- and end points of lines are defined in a counter-clockwise manner around the coordinate system, and the angle of the lines is calculated with respect to the x-axis of a this coordinate system. The lines corresponding to the rightmost wall would thus have an angle corresponding to <math>0</math> radians, the upper walls <math>\frac{1}{2}\pi</math> radians, the leftmost walls <math>\pi</math> radians and the lower walls <math>\frac{3}{2}\pi</math> radians. When it is determined which lines belong to which walls, information about the distance from PICO to these walls is extracted from the untransformed lines. This information is used to calculate PICO’s x and y coordinates in a room, by comparing the data to the previously stored width and height of a room.<br />
<br />
===Angle Estimation===<br />
The odometry on PICO gives an estimate of the orientation of PICO. However due to the nature of odometry this estimate will drift over time. Therefore an absolute measurement of the angle is necessary to reset the odometry measurement. This is done using the lines extracted by PICO. These lines have a radius and an angle relative to PICO. Since the hospital is contructed of perpendicular lines PICO can determine it's angle relative to the walls. By using an initial guess, which will give the general direction PICO is oriented in, i.e. whether its angle is around <math>0</math>, <math>\dfrac{1}{2}\pi</math>, <math>\pi</math>, or <math>-\frac{1}{2}\pi</math>. Then the angle is corrected y using the following equation on the measurement:<br />
<br />
<math>estimate +mod_{0.5 * \pi}(measuredAngle)</math><br />
<br />
==Trajectory Planning==<br />
This part plans the trajectory PICO should take during the hospital challenge.<br />
<br />
===Approaching a Door===<br />
From the worldmodel PICO obtains his current position, and the position of the two corners of the door. A function is made which basically calculates a point right in the middle of the two corners, and puts a setpoint at a specified distance in front of the midpoint of the door and behind the midpoint of the door seen in the Figure below. Using the P-controller and the repulsion, this setpoint can be reached by PICO. PICO first changes the angle and drives forwards to the 'DES 1' setpoint, when this setpoint is reached the angle changes again and starts driving to the second 'DES 2' setpoint.<br />
<br />
[[File:Draw1x.png|300px]]<br />
<br />
==Motion Control==<br />
This part explains the methods used to perform the motion as dictated from the trajectory planning.<br />
<br />
===Repulsion===<br />
A function is implemented which keeps PICO from touching the walls. This is done using virtual repulsion forces. The repulsion force is calculated using the reciprocal of the laser scan data. The laser data is scanned over the entire range of the sensor, except for the first 10 points and the last 10 points because the returned laser data at these points was not trustworthy. For each sensor reading a repulsion force is calculated in the x and y direction. By adding up all the repulsion forces over the entire scan range a single force vector is obtained. By putting this 'force' combined with a gain directly into PICO's speed input, it will have the tendency to drive away from walls. A tuning parameter has been made in the form of a maximum distance of 0.35m in which PICO can approach a wall. All laser data points which are larger than this value are ignored. Since the laser data only covers 240° of view PICO always changes its angle to drive with its head forward to the destination coordinates. This way there is always available laser data to avoid obstacles.<br />
<br />
[[File:draw2x.jpg]]<br />
<br />
[[File:Draw3x.png|220px]]<br />
<br />
===P-controller===<br />
In order to have PICO move from point A to point B a simple P-controller has been implemented. For testing purposes the P-controller currently relies on odometry data. The 'error' is calculated by subtracting the current position from the target position. The error is multiplied with a proportional action. During testing these parameters will be tuned to ensure optimal behavior of PICO.<br />
<br />
===P-controller with Repulsion===<br />
The speed outputted by the P-controller and the speed generated by the repulsion function are simultaneously used in the PICO speed command. This means that, for example, when PICO is closing in on a corner, the speed (depending on the direction in which PICO is oriented) is temporarily reduced in the direction of the walls, ensuring that PICO gets enough clearance before returning on his path. A problem arises however when a setpoint is located directly behind a wall. In this case PICO cannot reach his goal, as the P-controller 'pulls' PICO towards the setpoint, while the repulsion 'pushes' PICO away from the walls. Therefore it is necessary to give PICO setpoints which he can roughly 'see'. The generation of these setpoints is handled in one of the previous sections. To make sure the maximum translation velocity in the x and y direction is not exceeded the norm of both speeds are calculated, when the velocity exceeds the maximum translation speed it is lowered.<br />
<br />
==Task Manager==<br />
The task manager states what task should take place at what moment. The task manager contains three tasks:<br />
* Exploration<br />
* Parking<br />
* Search and rescue<br />
The charts of these tasks are shown below. The left one shows exploration and parking, and the right one shows search and rescue:<br />
<br />
[[File:MappingX.png|350px]] [[File:SearchRescueX.png|400px]]<br />
<br />
<br />
These three tasks will be highlighted in more detail now.<br />
<br />
===Exploration===<br />
Starting the hospital challenge, exploration is the first task to complete. Starting in the corridor, the detection of this area will be done. This corridor is saved in a struct, which contains a vector of exits. These exits have a destination. In the beginning, each of these destinations have value -1. The exploration is programmed in such a way that always the exit with a destination of -1 will be taken, so always an unexplored room will be entered. After entering a new room, again detection will scan the area. The destination of the door through which PICO has entered the room, will change from -1 to a value belonging to the previous area (corridor in this case). Then, if a room is entered and more than one exit is detected, again the door with unknown destination will be chosen. In the end, all unknown exits are explored and PICO is back in the corridor. At this moment PICO should move to its starting position and parking phase will begin.<br />
<br />
===Parking===<br />
When the map building is complete, PICO has to park backwards to the wall behind the starting position. Parking is done upon touching the wall. After PICO parked, PICO should say: "I am parked!". <br />
<br />
This is done by letting PICO drive forward to the starting position and stopping in front of the wall. Then PICO will turn around such that he can drive backwards to the wall. Since PICO cannnot scan what is behind him, a diffrent method is used to see/feel the wall he should touch. This is done using the control effort. If the control effort becomes large enough, PICO will stop since this increase in control effort is caused by touching the wall. All in all, a short video will summarize the result far better, so let's watch the parking skills of PICO:<br />
<br />
[[File:BackwardParking.gif]]<br />
<br />
<br />
Note that this is a GIF, so you can't hear PICO say "I am parked!".<br />
After parking, the last phase of the challenge can begin. This phase will be explained in Search and Rescue.<br />
<br />
===Search and Rescue===<br />
At this moment, the hospital is explored and mapped. In the world model, a graph is saved. As discussed before, the hint states that the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, the position of the object should be known and PICO can drive towards it. Standing still in front of this object will be the end of the challenge. In case there are multiple rooms for which the most doors have to be passed through, PICO should just try one and in case the object is not found, the other possibility should be tried.<br />
For now, the code calculates the longest path and stores this value. Because of the graph, PICO always knows which exit to take. After taking all these exits, the room with the object is entered. As explained, there can be multiple options. However, this is not fixed yet and will be one of the recommendations. After entering the room with the object, the object search function will be called. In this function, the LRF data is used. For each laserpoint, the differences between its distance and the distance of laserpoints on the left and on the right are measured. If that difference is high enough, there has to be an object in the room. This function places a point in front of the object and PICO will drive towards that point with the normal motion functions and will speak 'I found the object'. This search and rescue is shown in the GIF below.<br />
<br />
=Hospital Challenge=<br />
On June 13th, the hospital challenge took place. It is expected to fail on localization. Besides that, most of the code works the way it should, independent of the way the hospital is build.<br />
<br />
==Evaluation==<br />
Since localization did not work yet, PICO was localized with the help of its odometry. As known, this odometry is not accurate. After a few meters, the errors are increasing and after a while the position where PICO thinks to be and its actual position differed lot. This was the reason the challenge was not successful. PICO started mapping the corridor. It located two exits and moved through one of these, as it is expected to do. Mapping the first room again worked as it should. Two exits were found and PICO knew it should take the door to an unknown place. Moving through that door worked just fine. Mapping that room worked, but then PICO should move to the door through where it entered. However, this door was not at the right position anymore. Or better, PICOs location was too different from where it thought it was. This meant there was a wall on a place of an exit, meaning PICO wanted to go through that wall. The force field made sure PICO did not bump into the wall, but the door was not found. This was the end of the challenge. Both trials did not succeed because of this reason. This was not the only disadvantage of our code. Mapping the corridor did not work perfectly, because of its dimensions. Since the width of the corridor was a lot smaller than its height, mapping the corridor was hard. There was not enough laserdata to have a good visualization of the end of the corridor. That is why only two exits were mapped instead of three. To correct this, PICO should move further into the corridor and map again.<br />
<br />
==Simulator==<br />
The main reason why the hospital challenge did not succeed was because of localization. This is not a problem in simulation. Localizing on odometry works just fine in simulation. Both the mapping and parking phase are shown in the YouTube video. As can be seen, mapping in the corridor starts in the middle of the corridor:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailHospital.png|300px|link=https://youtu.be/xx87YWtambs]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:HospitalSearch.gif]]<br />
<br />
==The Real Challenge==<br />
As seen above, PICO thinks the hospital challenge is not an actual challenge for him... To see what PICO can do, a real challenge was created. This is done with the following map, which is far more challenging due to its size, number of rooms, and especially more diversity of door sizes and positions.<br />
<br />
[[File:TheRealChallenge.png|350px]]<br />
<br />
Without wasting any more words, both the mapping and parking phase are shown in the YouTube video:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailReal.png|300px|link=https://youtu.be/pVJy6qWZcw8]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:RealSearch.gif]]<br />
<br />
=Documents=<br />
All the documents made, besides the Wiki page itself, are shared here.<br />
<br />
==Report of Initial Design==<br />
Due to a misunderstanding, the report was not uploaded as a PDF yet. However, the full report was uploaded on this Wiki page (see below) before May 11th (17.00h), and now it is also uploaded as a PDF file (<1Mb). Our apologies for any inconvenience. The PDF of the report of the initial design can be found here: [[File:InitialDesign_Group3_Report.pdf]]<br />
<br />
==Presentation of Initial Design==<br />
On May 16th, all groups presented their initial design. So we presented our initial design too and included two GIFs of our process so far. A PDF of the slides can be found here: [[File:InitialDesign_Group3_Presentation.pdf]]<br />
<br />
==Presentation of Final Design==<br />
On June 6th, the final presentation was presented to the other groups. This presentation of the final design mainly focussed on the architecture. A PDF of the slides can be found here: [[File:FinalDesign_Group3_Presentation.pdf]]<br />
<br />
=Code=<br />
Still to come...</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2018_Group_3&diff=59563Embedded Motion Control 2018 Group 32018-06-17T10:07:41Z<p>S131974: /* Fit Room */</p>
<hr />
<div>= Group Members =<br />
{| border="1" cellpadding="5" cellspacing="1" style="float:left;"<br />
! TU/e Number<br />
! Name<br />
! E-mail<br />
|- <br />
| 0848904<br />
| Luc (L.L.M.) van den Aker<br />
| <tt>l dot l dot m dot v dot d dot aker at student dot tue dot nl</tt><br />
|-<br />
| 0852908<br />
| Thomas (T.) Neilen<br />
| <tt>t dot neilen at student dot tue dot nl</tt><br />
|-<br />
| 0909434<br />
| Jeroen (J.W.) van de Valk<br />
| <tt>j dot w dot v dot d dot valk at student dot tue dot nl</tt><br />
|-<br />
| 0896947<br />
| Nourdin (N.) Kaai<br />
| <tt>n dot kaai at student dot tue dot nl</tt><br />
|-<br />
| 0883056<br />
| Peter (P.) van Dooren<br />
| <tt>p dot v dot dooren at student dot tue dot nl</tt><br />
|-<br />
| 0861750<br />
| Ties (T.J.) van Loon<br />
| <tt>t dot j dot v dot loon at student dot tue dot nl</tt><br />
|-<br />
|}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Wiki Info=<br />
'''NOTE: This is just for the menbers of Group 3 and will be deleted before the deadline!'''<br />
<br />
==Wiki Deadline==<br />
The Wiki, code and peer review deadline is: Wednesday, 20 June, 23:59h.<br />
<br />
==Wiki Content==<br />
Make sure the Wiki of your group contains:<br />
* An overview of the software architecture and approach used. How does it map to the paradigms explained in this course?<br />
* A description of the methods that make your solution work so well, preferably using nice explanatory images (explain what makes your solution unique; what are you most proud of?)<br />
* Which difficult problems were identified, and how were they solved?<br />
* An evaluation of the hospital challenge: What went well? What went wrong? Why? How could it be improved?<br />
* Videos / GIFs / animations / diagrams / pictures are very welcome! The simulator map for the Hospital Room challenge will be posted after the challenge (of course), so you can show that you are able to solve the challenge in simulation.<br />
<br />
==Publishing Code==<br />
A part of the grading criteria in this course is the quality of your code. We will not dive into your full code base. Instead, link to one or a few pieces of code or code files of which you are particularly proud, and which you think reflect the lessons taught: you can use the code snippet system as included in Gitlab. Do ensure we can access the code! Of course, feel free to also add some introductory/explanatory remarks on the Wiki, or as comments in the code. Make sure the links to your code snippets are clearly visible from your Wiki. For example, put them in a separate section called: ''Code''.<br />
<br />
=Initial Design=<br />
The initial design is explained in the following parts:<br />
* Requirements<br />
* Functions<br />
* Components<br />
* Specifications<br />
* Interfaces<br />
Note that the report of the initial design is shared in Documents.<br />
<br />
==Requirements==<br />
* PICO should make no collisions with any walls<br />
* PICO cannot stand still for 30 seconds or longer<br />
* For the escape room challenge, the robot should leave the room within 5 minutes<br />
* For the hospital challenge, within 5 minutes, mapping, reverse parking and obtaining the object should be done<br />
* Its surroundings should be made visible in a map<br />
* PICO should be able to reach every position in the room<br />
* PICO should be able to leave every room<br />
* PICO should make distinction between the hall and rooms<br />
* It should run autonomously, so in each challenge there should be no additional input<br />
* To start your software, only one executable has to be called<br />
* PICO should be able to recognize an object and stand still close to it<br />
<br />
==Functions==<br />
* PICO should be able to drive in any direction<br />
* PICO should be able to turn around<br />
* It should be able to detect walls<br />
* PICO has to know its own position within the mapped map<br />
* PICO is able to construct a map<br />
* It should be possible to create a trajectory to a room<br />
* PICO should be able to recognize an object<br />
<br />
==Components==<br />
* Sensors:<br />
** Laser Range Finder (LRF)<br />
** Wheel encoders (odometry)<br />
* Actuator:<br />
** Holonomic base (omni-wheels)<br />
* Computer:<br />
** Intel i7<br />
** Ubuntu 16.04<br />
<br />
==Specifications==<br />
* Translation maximum: 0.5 m/s<br />
* Rotation maximum: 1.2 rad/s<br />
* Range of Laser Range Finder is assumed to be bigger than maximum room dimension<br />
* The field of view of the Laser Range Finder is from -2 rad to 2 rad, divided in pieces of 0.004004<br />
* The Laser Range Finder can only measure at one height<br />
<br />
==Interfaces==<br />
The interfaces of the initial design are shown here:<br />
<br />
[[File:InterfaceGroup3.png]]<br />
<br />
As shown in the figure above, a world model is the link between all other parts. The tasks represent the highest level, meaning the most global work PICO has to do. The skills are needed to complete these tasks and some motions together form a skill. The perception contains the sensors, the continuous data. Below an overview of the different parts are given:<br />
<br />
''World model:''<br />
* Compose map<br />
* Object recognition<br />
<br />
''Tasks:''<br />
* Mapping of the environment <br />
* Backward parking at the specified location<br />
* Searching for the object<br />
<br />
''Skills:''<br />
* Planning a trajectory<br />
* Collision avoidance<br />
* Backward parking<br />
* Navigate<br />
* Positioning in front of an opening<br />
* Compose maps<br />
<br />
''Motion:''<br />
* Translation <br />
* Rotation<br />
<br />
''Perception:''<br />
* Odometry <br />
* Laser Range Finder<br />
* Control effort<br />
<br />
=Escape Room Challenge=<br />
Since our code to map a room was not finished completely, a new code for the escape room challenge was made. This code was kept simple and effective. PICO should drive to a wall, turn to the left when it detects a wall within 0.4 meters from itself, and follow the wall (without hitting it of course). Then it will scan for a hallway to exit the room. When he sees a way to exit the room, PICO will go through the opening in the wall. <br />
<br />
Our first attempt during the escape room challange was very successful! PICO drove out of the room, but we were convinced he could do it even faster. So we set the speed higher for the second try, and it was even faster. PICO drove out of the room within 29 seconds. This resulted in a second place and being one of the two teams that made it out of the room.<br />
<br />
Here a shot video is shown of PICO leaving a room. Note that this is not filmed during the 'official' escape room challenge. Due to our enthousiasm, we forgot to film, so we reconstructed the room during one of our test sessions.<br />
<br />
[[File:EscapeRoomChallenge.gif]]<br />
<br />
=Final Design=<br />
First off, the architecture is explained. This architecture is based on the theorem and takes the requirements of the hospital challenge into account. The architecture is explained in six steps:<br />
* World model<br />
* Detection<br />
* Localization<br />
* Trajectory planning<br />
* Motion control <br />
* Task manager<br />
The overall architecture is visualized here:<br />
<br />
[[File:Architecture_Group3.png|650px]]<br />
<br />
All six main components that are in this archtecture will be explained now.<br />
<br />
==World Model==<br />
To build a map of the hospital a twofold mapping procedure will be used. First PICO will map the room it is currently standing in. Secondly a graph connecting all mapped rooms with each other is stored. By using this two level mapping abstraction it is easier to locate PICO in a certain room. Also trajectory planning to a desired room can be more efficiently by using the graph. <br />
The data structures used to store the obtained data are the Rooms, Exits and a graph with all the Rooms.<br />
Once a room is mapped it is stored in a Room object. This object contains the width and height of the room, a global ID of the room and Exit objects. The Exit objects have a local ID, ie the ID of the exit has only meaning when the room it belongs to is also know. The exits also have a location in the coordinate frame of the room and a destination. <br />
The world model also holds the current position and the current position based on odometry.<br />
<br />
===Graph===<br />
Every room (square in figure) and door (circle in figure) will be numbered with an ID and then stored in the world model in the form of a graph. An visual representation of such graph can be seen below:<br />
<br />
[[File:Graph.png|200px]]<br />
<br />
Using the grapgh, it can be easily seen what trajectory PICO should take to find the object. As the hint states, the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, it can be quickly determined what sequence of room ID and door IDs is the longest. Knowing this makes finding the object easier, since PICO does not have to look in every room again, bit can immeadily go to the room with the longest sequence.<br />
<br />
==Line Extraction==<br />
The first step in mapping a room is to extract line segments from the obtained laser data. For this a pre-made laser line extraction package was used. This code was slightly modified to remove the ROS layer. the source code can be found on: https://github.com/kam3k/laser_line_extraction<br />
<br />
This package employs a split and merge algorithm [T. Pavlidis and S. L. Horowitz, "Segmentation of Plane Curves," in IEEE Transactions on Computers, vol. C-23, no. 8, pp. 860-870, Aug. 1974] The obtained laser data for the rooms was relatively clean, thus no filtering before the line extraction was applied. The parameters used in the algorithm needed some additional tuning to give the optimal result.<br />
In the figures below, the lines can be seen:<br />
<br />
[[File:Line_detection_Sim.png|300px]] [[File:Line_detection_Lines.png|300px]]<br />
<br />
==Fit Room==<br />
The mapping of a room is done using the lines found by the line extraction.<br />
<br />
===Saving Lines===<br />
To map a room PICO needs to look 360° around him, however the laser range finder only has a limited range. Therefore a PICO will scan lines, turn around 180° and scan another time. It will then combine these two sets to end up with a set of lines which describe the entire room around PICO.<br />
<br />
The first time this is done pico’s position will be saved. The lines are transformed using the orientation of pico. This way the resulting lines are aligned with the global axis system but the 0,0 position is at pico’s location. This new frame will be called the mappedFrame.<br />
<br />
after rotating 180 degrees. Pico will merge the detected lines. First the lines are transformed to the mapping frame. Then the lines are compared to the lines already saved. If the lines are collinear, (they have similar same radius and angle) the lines are checked for overlap. The start and end points of the new line are projected on the compared line. If either of the projected point lies on the old line with some margin of error. The line is merged. This is done by taking the furthest start and end point. <br />
<br />
In the figures below, the two sets of lines can be seen: <br />
<br />
[[File:Transform_sim.png|300px]] [[File:Transform_lines.png|300px]] [[File:Merged_lines.png|300px]]<br />
<br />
===Determine dimensions===<br />
Once PICO has assembled a set of lines all around him, he can determine the properties of the room he is in. This is done in two steps: <br />
* The dimensions of the room are found.<br />
* All the exits of the room are found.<br />
<br />
A box is defined with a distances to the left, to the right, above and below pico. The width and height of the room are determined by fitting the largest possible box inside the lines in mergedLines. An initial guess for the distances is made using the minimum radii of all lines which have the right orientation. Each line in mergedLines can be determined to be either to the left, to the right, above and below pico.<br />
<br />
For example, consider the left wall of the room. In the figure below three lines have the correct orientation to belong to that wall. The initial estimate for the distance to the left of pico is chosen as the smallest radius among those three lines. The same is done for the other three walls.<br />
<br />
After the initial estimate it is possible that the box is still smaller than the room. This can be caused by lines outside the room which happen to have a smaller radius. To expand the size of the room an iterative procedure is used. One side at a time the function checks whether the room can be expanded in this direction. It again searches for a minimum radius among a selection of lines, however this time a criteria is added that the line must fall within the estimated box after expansion. This will filter out most lines outside of the room. The procedure continues until it has gone one cycle without updating the distances. Using the distances left, right, up and down the width and height of the room can be determined as well as the location of pico in this new room, expressed in the new room frame.<br />
<br />
[[File:testRoomMergedLines.png|300px]] <br />
[[File:testRoomFit1.png|300px]] <br />
[[File:testRoomFit2.png|300px]] <br />
[[File:testRoomFit3.png|300px]] <br />
<br />
There are edge cases where this procedure goes wrong however they are considered rare enough that they are not taken into account.<br />
<br />
[[File:EdgeCaseRoomFit.png|300px]] <br />
<br />
===Find exits===<br />
In order to find the exits a function is made which once again loops over the lines in mergedLines. It will determine whether a line belongs to the room as determined by the dimensions previously established. If the gap between two consecutive lines which belong to the room is the size of a door (between 0.4 and 1.7m). An exit is added there. After looping over all lines a final check is done to determine whether an exit exists between the first and last lines in mergedLines.<br />
<br />
[[File:testRoomExits.png|300px]] <br />
<br />
===Adding the room to the world model===<br />
After the room has been fitted it must be added to the map in the world model. There are several properties of the room which still need to be determined. <br />
The location of the room coordinate frame is calculated using the room coordinate frame of the previous room, the location of pico in the previous room frame (mappedFrame) and the location of pico in the new room.<br />
The exit pico went through in the previous room must be linked to an exit found in the new room. This is done by calculating the distance from the exits in the new room to the exit taken in the previous room. The exit with the smallest distance is linked to this new room. The destinations of the two exits are set and the exit in the new room is moved to the front of the vector with exits so that exits[0] always leads back to the hallway.<br />
Finally pico's location and current room are updated to be in the new room.<br />
<br />
==Localization==<br />
Once a room has been mapped. PICO will be able to compare the detected lines to the map it has made. Based on this, PICO's location can be determined. As the odometry data of PICO is unreliable, another solution had to be made to reliably navigate through the environment. A solution had to be made that navigates PICO based on the local coordinates of a room. To do this three different functionalities had to be implemented:<br />
* Make an initial guess of PICO’s position within a room.<br />
* Determine which lines are part of a specific room.<br />
* Determine PICO’s position based on LRF-data.<br />
[[File:Localisation_animation.gif]]<br />
===Initial guess===<br />
The localisation script constantly provides information on PICO’s position. When PICO is leaving a room through a door to another room, this position is used as an initial guess for PICO’s current coordinates. Using these coordinates the lines that PICO sees can be transformed to the coordinate frame of the new room.<br />
<br />
===Line filtering===<br />
The lines that PICO sees are converted to the coordinate system of the room. Based on the information previously gathered about a specific room it is determined which of the lines that PICO currently sees are actually part of the room itself. This is to prevent that for example lines from a hallway are used in the localisation. First it is checked if the end points of the lines directly coincide with the corners of the room. A vector is spanned between the coordinates of a corner and the end point under consideration. The norm of this vector should not exceed a certain parameter in order to be considered to be part of the room. Another possibility is that the end point of a line lies on the contour of a room. In order to determine if this is happening the closest distance of this end point to the line spanned by the two nearby corners should be determined. This can be done using simple vector calculus.<br />
<br />
The shortest distance between a line the origin is expressed in the following equation:<br />
<br />
<br />
<math>\left(\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}\right)\cdot\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}=0</math><br />
<br />
<br />
In this equation <math>p_{1}</math> and <math>p_{2}</math> are calculated by substracting the end point of the line under consideration from the corners of the room. <math>t</math> is calculated, and substituted in the following equation to obtain the vector spanned between the end point and the line:<br />
<br />
<br />
<math>\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}</math><br />
<br />
<br />
The length of this vector is also compared with the fixed parameter used to test the coincidence of the end points and the corners.<br />
<br />
===Localisation===<br />
Because the lines are created in a certain way, it can be derived to which of the four walls they belong. The start- and end points of lines are defined in a counter-clockwise manner around the coordinate system, and the angle of the lines is calculated with respect to the x-axis of a this coordinate system. The lines corresponding to the rightmost wall would thus have an angle corresponding to <math>0</math> radians, the upper walls <math>\frac{1}{2}\pi</math> radians, the leftmost walls <math>\pi</math> radians and the lower walls <math>\frac{3}{2}\pi</math> radians. When it is determined which lines belong to which walls, information about the distance from PICO to these walls is extracted from the untransformed lines. This information is used to calculate PICO’s x and y coordinates in a room, by comparing the data to the previously stored width and height of a room.<br />
<br />
===Angle Estimation===<br />
The odometry on PICO gives an estimate of the orientation of PICO. However due to the nature of odometry this estimate will drift over time. Therefore an absolute measurement of the angle is necessary to reset the odometry measurement. This is done using the lines extracted by PICO. These lines have a radius and an angle relative to PICO. Since the hospital is contructed of perpendicular lines PICO can determine it's angle relative to the walls. By using an initial guess, which will give the general direction PICO is oriented in, i.e. whether its angle is around <math>0</math>, <math>\dfrac{1}{2}\pi</math>, <math>\pi</math>, or <math>-\frac{1}{2}\pi</math>. Then the angle is corrected y using the following equation on the measurement:<br />
<br />
<math>estimate +mod_{0.5 * \pi}(measuredAngle)</math><br />
<br />
==Trajectory Planning==<br />
This part plans the trajectory PICO should take during the hospital challenge.<br />
<br />
===Approaching a Door===<br />
From the worldmodel PICO obtains his current position, and the position of the two corners of the door. A function is made which basically calculates a point right in the middle of the two corners, and puts a setpoint at a specified distance in front of the midpoint of the door and behind the midpoint of the door seen in the Figure below. Using the P-controller and the repulsion, this setpoint can be reached by PICO. PICO first changes the angle and drives forwards to the 'DES 1' setpoint, when this setpoint is reached the angle changes again and starts driving to the second 'DES 2' setpoint.<br />
<br />
[[File:Draw1x.png|300px]]<br />
<br />
==Motion Control==<br />
This part explains the methods used to perform the motion as dictated from the trajectory planning.<br />
<br />
===Repulsion===<br />
A function is implemented which keeps PICO from touching the walls. This is done using virtual repulsion forces. The repulsion force is calculated using the reciprocal of the laser scan data. The laser data is scanned over the entire range of the sensor, except for the first 10 points and the last 10 points because the returned laser data at these points was not trustworthy. For each sensor reading a repulsion force is calculated in the x and y direction. By adding up all the repulsion forces over the entire scan range a single force vector is obtained. By putting this 'force' combined with a gain directly into PICO's speed input, it will have the tendency to drive away from walls. A tuning parameter has been made in the form of a maximum distance of 0.35m in which PICO can approach a wall. All laser data points which are larger than this value are ignored. Since the laser data only covers 240° of view PICO always changes its angle to drive with its head forward to the destination coordinates. This way there is always available laser data to avoid obstacles.<br />
<br />
[[File:draw2x.jpg]]<br />
<br />
[[File:Draw3x.png|220px]]<br />
<br />
===P-controller===<br />
In order to have PICO move from point A to point B a simple P-controller has been implemented. For testing purposes the P-controller currently relies on odometry data. The 'error' is calculated by subtracting the current position from the target position. The error is multiplied with a proportional action. During testing these parameters will be tuned to ensure optimal behavior of PICO.<br />
<br />
===P-controller with Repulsion===<br />
The speed outputted by the P-controller and the speed generated by the repulsion function are simultaneously used in the PICO speed command. This means that, for example, when PICO is closing in on a corner, the speed (depending on the direction in which PICO is oriented) is temporarily reduced in the direction of the walls, ensuring that PICO gets enough clearance before returning on his path. A problem arises however when a setpoint is located directly behind a wall. In this case PICO cannot reach his goal, as the P-controller 'pulls' PICO towards the setpoint, while the repulsion 'pushes' PICO away from the walls. Therefore it is necessary to give PICO setpoints which he can roughly 'see'. The generation of these setpoints is handled in one of the previous sections. To make sure the maximum translation velocity in the x and y direction is not exceeded the norm of both speeds are calculated, when the velocity exceeds the maximum translation speed it is lowered.<br />
<br />
==Task Manager==<br />
The task manager states what task should take place at what moment. The task manager contains three tasks:<br />
* Exploration<br />
* Parking<br />
* Search and rescue<br />
The charts of these tasks are shown below. The left one shows exploration and parking, and the right one shows search and rescue:<br />
<br />
[[File:MappingX.png|350px]] [[File:SearchRescueX.png|400px]]<br />
<br />
<br />
These three tasks will be highlighted in more detail now.<br />
<br />
===Exploration===<br />
Starting the hospital challenge, exploration is the first task to complete. Starting in the corridor, the detection of this area will be done. This corridor is saved in a struct, which contains a vector of exits. These exits have a destination. In the beginning, each of these destinations have value -1. The exploration is programmed in such a way that always the exit with a destination of -1 will be taken, so always an unexplored room will be entered. After entering a new room, again detection will scan the area. The destination of the door through which PICO has entered the room, will change from -1 to a value belonging to the previous area (corridor in this case). Then, if a room is entered and more than one exit is detected, again the door with unknown destination will be chosen. In the end, all unknown exits are explored and PICO is back in the corridor. At this moment PICO should move to its starting position and parking phase will begin.<br />
<br />
===Parking===<br />
When the map building is complete, PICO has to park backwards to the wall behind the starting position. Parking is done upon touching the wall. After PICO parked, PICO should say: "I am parked!". <br />
<br />
This is done by letting PICO drive forward to the starting position and stopping in front of the wall. Then PICO will turn around such that he can drive backwards to the wall. Since PICO cannnot scan what is behind him, a diffrent method is used to see/feel the wall he should touch. This is done using the control effort. If the control effort becomes large enough, PICO will stop since this increase in control effort is caused by touching the wall. All in all, a short video will summarize the result far better, so let's watch the parking skills of PICO:<br />
<br />
[[File:BackwardParking.gif]]<br />
<br />
<br />
Note that this is a GIF, so you can't hear PICO say "I am parked!".<br />
After parking, the last phase of the challenge can begin. This phase will be explained in Search and Rescue.<br />
<br />
===Search and Rescue===<br />
At this moment, the hospital is explored and mapped. In the world model, a graph is saved. As discussed before, the hint states that the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, the position of the object should be known and PICO can drive towards it. Standing still in front of this object will be the end of the challenge. In case there are multiple rooms for which the most doors have to be passed through, PICO should just try one and in case the object is not found, the other possibility should be tried.<br />
For now, the code calculates the longest path and stores this value. Because of the graph, PICO always knows which exit to take. After taking all these exits, the room with the object is entered. As explained, there can be multiple options. However, this is not fixed yet and will be one of the recommendations. After entering the room with the object, the object search function will be called. In this function, the LRF data is used. For each laserpoint, the differences between its distance and the distance of laserpoints on the left and on the right are measured. If that difference is high enough, there has to be an object in the room. This function places a point in front of the object and PICO will drive towards that point with the normal motion functions and will speak 'I found the object'. This search and rescue is shown in the GIF below.<br />
<br />
=Hospital Challenge=<br />
On June 13th, the hospital challenge took place. It is expected to fail on localization. Besides that, most of the code works the way it should, independent of the way the hospital is build.<br />
<br />
==Evaluation==<br />
Since localization did not work yet, PICO was localized with the help of its odometry. As known, this odometry is not accurate. After a few meters, the errors are increasing and after a while the position where PICO thinks to be and its actual position differed lot. This was the reason the challenge was not successful. PICO started mapping the corridor. It located two exits and moved through one of these, as it is expected to do. Mapping the first room again worked as it should. Two exits were found and PICO knew it should take the door to an unknown place. Moving through that door worked just fine. Mapping that room worked, but then PICO should move to the door through where it entered. However, this door was not at the right position anymore. Or better, PICOs location was too different from where it thought it was. This meant there was a wall on a place of an exit, meaning PICO wanted to go through that wall. The force field made sure PICO did not bump into the wall, but the door was not found. This was the end of the challenge. Both trials did not succeed because of this reason. This was not the only disadvantage of our code. Mapping the corridor did not work perfectly, because of its dimensions. Since the width of the corridor was a lot smaller than its height, mapping the corridor was hard. There was not enough laserdata to have a good visualization of the end of the corridor. That is why only two exits were mapped instead of three. To correct this, PICO should move further into the corridor and map again.<br />
<br />
==Simulator==<br />
The main reason why the hospital challenge did not succeed was because of localization. This is not a problem in simulation. Localizing on odometry works just fine in simulation. Both the mapping and parking phase are shown in the YouTube video. As can be seen, mapping in the corridor starts in the middle of the corridor:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailHospital.png|300px|link=https://youtu.be/xx87YWtambs]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:HospitalSearch.gif]]<br />
<br />
==The Real Challenge==<br />
As seen above, PICO thinks the hospital challenge is not an actual challenge for him... To see what PICO can do, a real challenge was created. This is done with the following map, which is far more challenging due to its size, number of rooms, and especially more diversity of door sizes and positions.<br />
<br />
[[File:TheRealChallenge.png|350px]]<br />
<br />
Without wasting any more words, both the mapping and parking phase are shown in the YouTube video:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailReal.png|300px|link=https://youtu.be/pVJy6qWZcw8]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:RealSearch.gif]]<br />
<br />
=Documents=<br />
All the documents made, besides the Wiki page itself, are shared here.<br />
<br />
==Report of Initial Design==<br />
Due to a misunderstanding, the report was not uploaded as a PDF yet. However, the full report was uploaded on this Wiki page (see below) before May 11th (17.00h), and now it is also uploaded as a PDF file (<1Mb). Our apologies for any inconvenience. The PDF of the report of the initial design can be found here: [[File:InitialDesign_Group3_Report.pdf]]<br />
<br />
==Presentation of Initial Design==<br />
On May 16th, all groups presented their initial design. So we presented our initial design too and included two GIFs of our process so far. A PDF of the slides can be found here: [[File:InitialDesign_Group3_Presentation.pdf]]<br />
<br />
==Presentation of Final Design==<br />
On June 6th, the final presentation was presented to the other groups. This presentation of the final design mainly focussed on the architecture. A PDF of the slides can be found here: [[File:FinalDesign_Group3_Presentation.pdf]]<br />
<br />
=Code=<br />
Still to come...</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=File:TestRoomMergedLines.png&diff=59562File:TestRoomMergedLines.png2018-06-17T10:03:01Z<p>S131974: </p>
<hr />
<div></div>S131974https://cstwiki.wtb.tue.nl/index.php?title=File:TestRoomFit3.png&diff=59561File:TestRoomFit3.png2018-06-17T10:02:55Z<p>S131974: </p>
<hr />
<div></div>S131974https://cstwiki.wtb.tue.nl/index.php?title=File:TestRoomFit2.png&diff=59559File:TestRoomFit2.png2018-06-17T10:02:50Z<p>S131974: </p>
<hr />
<div></div>S131974https://cstwiki.wtb.tue.nl/index.php?title=File:TestRoomFit1.png&diff=59558File:TestRoomFit1.png2018-06-17T10:02:44Z<p>S131974: </p>
<hr />
<div></div>S131974https://cstwiki.wtb.tue.nl/index.php?title=File:TestRoomExits.png&diff=59557File:TestRoomExits.png2018-06-17T10:02:39Z<p>S131974: </p>
<hr />
<div></div>S131974https://cstwiki.wtb.tue.nl/index.php?title=File:EdgeCaseRoomFit.png&diff=59555File:EdgeCaseRoomFit.png2018-06-17T10:02:33Z<p>S131974: </p>
<hr />
<div></div>S131974https://cstwiki.wtb.tue.nl/index.php?title=File:Merged_lines.png&diff=59554File:Merged lines.png2018-06-17T10:02:24Z<p>S131974: </p>
<hr />
<div></div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2018_Group_3&diff=59509Embedded Motion Control 2018 Group 32018-06-16T16:27:32Z<p>S131974: </p>
<hr />
<div>= Group Members =<br />
{| border="1" cellpadding="5" cellspacing="1" style="float:left;"<br />
! TU/e Number<br />
! Name<br />
! E-mail<br />
|- <br />
| 0848904<br />
| Luc (L.L.M.) van den Aker<br />
| <tt>l dot l dot m dot v dot d dot aker at student dot tue dot nl</tt><br />
|-<br />
| 0852908<br />
| Thomas (T.) Neilen<br />
| <tt>t dot neilen at student dot tue dot nl</tt><br />
|-<br />
| 0909434<br />
| Jeroen (J.W.) van de Valk<br />
| <tt>j dot w dot v dot d dot valk at student dot tue dot nl</tt><br />
|-<br />
| 0896947<br />
| Nourdin (N.) Kaai<br />
| <tt>n dot kaai at student dot tue dot nl</tt><br />
|-<br />
| 0883056<br />
| Peter (P.) van Dooren<br />
| <tt>p dot v dot dooren at student dot tue dot nl</tt><br />
|-<br />
| 0861750<br />
| Ties (T.J.) van Loon<br />
| <tt>t dot j dot v dot loon at student dot tue dot nl</tt><br />
|-<br />
|}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Wiki Info=<br />
'''NOTE: This is just for the menbers of Group 3 and will be deleted before the deadline!'''<br />
<br />
==Wiki Deadline==<br />
The Wiki, code and peer review deadline is: Wednesday, 20 June, 23:59h.<br />
<br />
==Wiki Content==<br />
Make sure the Wiki of your group contains:<br />
* An overview of the software architecture and approach used. How does it map to the paradigms explained in this course?<br />
* A description of the methods that make your solution work so well, preferably using nice explanatory images (explain what makes your solution unique; what are you most proud of?)<br />
* Which difficult problems were identified, and how were they solved?<br />
* An evaluation of the hospital challenge: What went well? What went wrong? Why? How could it be improved?<br />
* Videos / GIFs / animations / diagrams / pictures are very welcome! The simulator map for the Hospital Room challenge will be posted after the challenge (of course), so you can show that you are able to solve the challenge in simulation.<br />
<br />
==Publishing Code==<br />
A part of the grading criteria in this course is the quality of your code. We will not dive into your full code base. Instead, link to one or a few pieces of code or code files of which you are particularly proud, and which you think reflect the lessons taught: you can use the code snippet system as included in Gitlab. Do ensure we can access the code! Of course, feel free to also add some introductory/explanatory remarks on the Wiki, or as comments in the code. Make sure the links to your code snippets are clearly visible from your Wiki. For example, put them in a separate section called: ''Code''.<br />
<br />
=Initial Design=<br />
The initial design is explained in the following parts:<br />
* Requirements<br />
* Functions<br />
* Components<br />
* Specifications<br />
* Interfaces<br />
Note that the report of the initial design is shared in Documents.<br />
<br />
==Requirements==<br />
* PICO should make no collisions with any walls<br />
* PICO cannot stand still for 30 seconds or longer<br />
* For the escape room challenge, the robot should leave the room within 5 minutes<br />
* For the hospital challenge, within 5 minutes, mapping, reverse parking and obtaining the object should be done<br />
* Its surroundings should be made visible in a map<br />
* PICO should be able to reach every position in the room<br />
* PICO should be able to leave every room<br />
* PICO should make distinction between the hall and rooms<br />
* It should run autonomously, so in each challenge there should be no additional input<br />
* To start your software, only one executable has to be called<br />
* PICO should be able to recognize an object and stand still close to it<br />
<br />
==Functions==<br />
* PICO should be able to drive in any direction<br />
* PICO should be able to turn around<br />
* It should be able to detect walls<br />
* PICO has to know its own position within the mapped map<br />
* PICO is able to construct a map<br />
* It should be possible to create a trajectory to a room<br />
* PICO should be able to recognize an object<br />
<br />
==Components==<br />
* Sensors:<br />
** Laser Range Finder (LRF)<br />
** Wheel encoders (odometry)<br />
* Actuator:<br />
** Holonomic base (omni-wheels)<br />
* Computer:<br />
** Intel i7<br />
** Ubuntu 16.04<br />
<br />
==Specifications==<br />
* Translation maximum: 0.5 m/s<br />
* Rotation maximum: 1.2 rad/s<br />
* Range of Laser Range Finder is assumed to be bigger than maximum room dimension<br />
* The field of view of the Laser Range Finder is from -2 rad to 2 rad, divided in pieces of 0.004004<br />
* The Laser Range Finder can only measure at one height<br />
<br />
==Interfaces==<br />
The interfaces of the initial design are shown here:<br />
<br />
[[File:InterfaceGroup3.png]]<br />
<br />
As shown in the figure above, a world model is the link between all other parts. The tasks represent the highest level, meaning the most global work PICO has to do. The skills are needed to complete these tasks and some motions together form a skill. The perception contains the sensors, the continuous data. Below an overview of the different parts are given:<br />
<br />
''World model:''<br />
* Compose map<br />
* Object recognition<br />
<br />
''Tasks:''<br />
* Mapping of the environment <br />
* Backward parking at the specified location<br />
* Searching for the object<br />
<br />
''Skills:''<br />
* Planning a trajectory<br />
* Collision avoidance<br />
* Backward parking<br />
* Navigate<br />
* Positioning in front of an opening<br />
* Compose maps<br />
<br />
''Motion:''<br />
* Translation <br />
* Rotation<br />
<br />
''Perception:''<br />
* Odometry <br />
* Laser Range Finder<br />
* Control effort<br />
<br />
=Escape Room Challenge=<br />
Since our code to map a room was not finished completely, a new code for the escape room challenge was made. This code was kept simple and effective. PICO should drive to a wall, turn to the left when it detects a wall within 0.4 meters from itself, and follow the wall (without hitting it of course). Then it will scan for a hallway to exit the room. When he sees a way to exit the room, PICO will go through the opening in the wall. <br />
<br />
Our first attempt during the escape room challange was very successful! PICO drove out of the room, but we were convinced he could do it even faster. So we set the speed higher for the second try, and it was even faster. PICO drove out of the room within 29 seconds. This resulted in a second place and being one of the two teams that made it out of the room.<br />
<br />
Here a shot video is shown of PICO leaving a room. Note that this is not filmed during the 'official' escape room challenge. Due to our enthousiasm, we forgot to film, so we reconstructed the room during one of our test sessions.<br />
<br />
[[File:EscapeRoomChallenge.gif]]<br />
<br />
=Final Design=<br />
First off, the architecture is explained. This architecture is based on the theorem and takes the requirements of the hospital challenge into account. The architecture is explained in six steps:<br />
* World model<br />
* Detection<br />
* Localization<br />
* Trajectory planning<br />
* Motion control <br />
* Task manager<br />
The overall architecture is visualized here:<br />
<br />
[[File:Architecture_Group3.png|650px]]<br />
<br />
All six main components that are in this archtecture will be explained now.<br />
<br />
==World Model==<br />
To build a map of the hospital a twofold mapping procedure will be used. First PICO will map the room it is currently standing in. Secondly a graph connecting all mapped rooms with each other is stored. By using this two level mapping abstraction it is easier to locate PICO in a certain room. Also trajectory planning to a desired room can be more efficiently by using the graph. <br />
The data structures used to store the obtained data are the Rooms, Exits and a graph with all the Rooms.<br />
Once a room is mapped it is stored in a Room object. This object contains the width and height of the room, a global ID of the room and Exit objects. The Exit objects have a local ID, ie the ID of the exit has only meaning when the room it belongs to is also know. The exits also have a location in the coordinate frame of the room and a destination. <br />
The world model also holds the current position and the current position based on odometry.<br />
<br />
===Graph===<br />
Every room (square in figure) and door (circle in figure) will be numbered with an ID and then stored in the world model in the form of a graph. An visual representation of such graph can be seen below:<br />
<br />
[[File:Graph.png|200px]]<br />
<br />
Using the grapgh, it can be easily seen what trajectory PICO should take to find the object. As the hint states, the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, it can be quickly determined what sequence of room ID and door IDs is the longest. Knowing this makes finding the object easier, since PICO does not have to look in every room again, bit can immeadily go to the room with the longest sequence.<br />
<br />
==Line Extraction==<br />
The first step in mapping a room is to extract line segments from the obtained laser data. For this a pre-made laser line extraction package was used. This code was slightly modified to remove the ROS layer. the source code can be found on: https://github.com/kam3k/laser_line_extraction<br />
<br />
This package employs a split and merge algorithm [T. Pavlidis and S. L. Horowitz, "Segmentation of Plane Curves," in IEEE Transactions on Computers, vol. C-23, no. 8, pp. 860-870, Aug. 1974] The obtained laser data for the rooms was relatively clean, thus no filtering before the line extraction was applied. The parameters used in the algorithm needed some additional tuning to give the optimal result.<br />
In the figures below, the lines can be seen:<br />
<br />
[[File:Line_detection_Sim.png|300px]] [[File:Line_detection_Lines.png|300px]]<br />
<br />
==Fit Room==<br />
The mapping of a room is done using the lines found by the line extraction.<br />
<br />
===Saving Lines===<br />
To map a room PICO needs to look 360° around him, however the laser range finder only has a limited range. Therefore a PICO will scan lines, turn around 180° and scan another time. It will then combine these two sets to end up with a set of lines which describe the entire room around PICO.<br />
<br />
The first time this is done pico’s position will be saved. The lines are transformed using the orientation of pico. This way the resulting lines are aligned with the global axis system but the 0,0 position is at pico’s location. This new frame will be called the mappedFrame.<br />
<br />
after rotating 180 degrees. Pico will merge the detected lines. First the lines are transformed to the mapping frame. Then the lines are compared to the lines already saved. If the lines are collinear, (they have similar same radius and angle) the lines are checked for overlap. The start and end points of the new line are projected on the compared line. If either of the projected point lies on the old line with some margin of error. The line is merged. This is done by taking the furthest start and end point. <br />
<br />
In the figures below, the two sets of lines can be seen: <br />
<br />
[[File:Transform_sim.png|300px]] [[File:Transform_lines.png|300px]]<br />
<br />
===Determine dimensions===<br />
Once PICO has assembled a set of lines all around him, he can determine the properties of the room he is in. This is done in two steps: <br />
* The dimensions of the room are found.<br />
* All the exits of the room are found.<br />
<br />
A box is defined with a distances to the left, to the right, above and below pico. The width and height of the room are determined by fitting the largest possible box inside the lines in mergedLines. An initial guess for the distances is made using the minimum radii of all lines which have the right orientation. Each line in mergedLines can be determined to be either to the left, to the right, above and below pico.<br />
<br />
For example, consider the left wall of the room. In the figure below three lines have the correct orientation to belong to that wall. The initial estimate for the distance to the left of pico is chosen as the smallest radius among those three lines. The same is done for the other three walls.<br />
<br />
After the initial estimate it is possible that the box is still smaller than the room. This can be caused by lines outside the room which happen to have a smaller radius. To expand the size of the room an iterative procedure is used. One side at a time the function checks whether the room can be expanded in this direction. It again searches for a minimum radius among a selection of lines, however this time a criteria is added that the line must fall within the estimated box after expansion. This will filter out most lines outside of the room. The procedure continues until it has gone one cycle without updating the distances. There are edge cases where this procedure goes wrong however they are considered rare enough that they are not taken into account.<br />
Using the distances left, right, up and down the width and height of the room can be determined as well as the location of pico in this new room, expressed in the new room frame.<br />
<br />
Picture of expanding procedure <br />
picture of edge cases. <br />
<br />
===Find exits===<br />
In order to find the exits a function is made which once again loops over the lines in mergedLines. It will determine whether a line belongs to the room as determined by the dimensions previously established. If the gap between two consecutive lines which belong to the room is the size of a door (between 0.4 and 1.7m). An exit is added there. After looping over all lines a final check is done to determine whether an exit exists between the first and last lines in mergedLines.<br />
<br />
===Adding the room to the world model===<br />
After the room has been fitted it must be added to the map in the world model. There are several properties of the room which still need to be determined. <br />
The location of the room coordinate frame is calculated using the room coordinate frame of the previous room, the location of pico in the previous room frame (mappedFrame) and the location of pico in the new room.<br />
The exit pico went through in the previous room must be linked to an exit found in the new room. This is done by calculating the distance from the exits in the new room to the exit taken in the previous room. The exit with the smallest distance is linked to this new room. The destinations of the two exits are set and the exit in the new room is moved to the front of the vector with exits so that exits[0] always leads back to the hallway.<br />
Finally pico's location and current room are updated to be in the new room.<br />
<br />
==Localization==<br />
Once a room has been mapped. PICO will be able to compare the detected lines to the map it has made. Based on this, PICO's location can be determined. As the odometry data of PICO is unreliable, another solution had to be made to reliably navigate through the environment. A solution had to be made that navigates PICO based on the local coordinates of a room. To do this three different functionalities had to be implemented:<br />
* Make an initial guess of PICO’s position within a room.<br />
* Determine which lines are part of a specific room.<br />
* Determine PICO’s position based on LRF-data.<br />
[[File:Localisation_animation.gif]]<br />
===Initial guess===<br />
The localisation script constantly provides information on PICO’s position. When PICO is leaving a room through a door to another room, this position is used as an initial guess for PICO’s current coordinates. Using these coordinates the lines that PICO sees can be transformed to the coordinate frame of the new room.<br />
<br />
===Line filtering===<br />
The lines that PICO sees are converted to the coordinate system of the room. Based on the information previously gathered about a specific room it is determined which of the lines that PICO currently sees are actually part of the room itself. This is to prevent that for example lines from a hallway are used in the localisation. First it is checked if the end points of the lines directly coincide with the corners of the room. A vector is spanned between the coordinates of a corner and the end point under consideration. The norm of this vector should not exceed a certain parameter in order to be considered to be part of the room. Another possibility is that the end point of a line lies on the contour of a room. In order to determine if this is happening the closest distance of this end point to the line spanned by the two nearby corners should be determined. This can be done using simple vector calculus.<br />
<br />
The shortest distance between a line the origin is expressed in the following equation:<br />
<br />
<br />
<math>\left(\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}\right)\cdot\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}=0</math><br />
<br />
<br />
In this equation <math>p_{1}</math> and <math>p_{2}</math> are calculated by substracting the end point of the line under consideration from the corners of the room. <math>t</math> is calculated, and substituted in the following equation to obtain the vector spanned between the end point and the line:<br />
<br />
<br />
<math>\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}</math><br />
<br />
<br />
The length of this vector is also compared with the fixed parameter used to test the coincidence of the end points and the corners.<br />
<br />
===Localisation===<br />
Because the lines are created in a certain way, it can be derived to which of the four walls they belong. The start- and end points of lines are defined in a counter-clockwise manner around the coordinate system, and the angle of the lines is calculated with respect to the x-axis of a this coordinate system. The lines corresponding to the rightmost wall would thus have an angle corresponding to <math>0</math> radians, the upper walls <math>\frac{1}{2}\pi</math> radians, the leftmost walls <math>\pi</math> radians and the lower walls <math>\frac{3}{2}\pi</math> radians. When it is determined which lines belong to which walls, information about the distance from PICO to these walls is extracted from the untransformed lines. This information is used to calculate PICO’s x and y coordinates in a room, by comparing the data to the previously stored width and height of a room.<br />
<br />
===Angle Estimation===<br />
The odometry on PICO gives an estimate of the orientation of PICO. However due to the nature of odometry this estimate will drift over time. Therefore an absolute measurement of the angle is necessary to reset the odometry measurement. This is done using the lines extracted by PICO. These lines have a radius and an angle relative to PICO. Since the hospital is contructed of perpendicular lines PICO can determine it's angle relative to the walls. By using an initial guess, which will give the general direction PICO is oriented in, i.e. whether its angle is around <math>0</math>, <math>\dfrac{1}{2}\pi</math>, <math>\pi</math>, or <math>-\frac{1}{2}\pi</math>. Then the angle is corrected y using the following equation on the measurement:<br />
<br />
<math>estimate +mod_{0.5 * \pi}(measuredAngle)</math><br />
<br />
==Trajectory Planning==<br />
This part plans the trajectory PICO should take during the hospital challenge.<br />
<br />
===Approaching a Door===<br />
From the worldmodel PICO obtains his current position, and the position of the two corners of the door. A function is made which basically calculates a point right in the middle of the two corners, and puts a setpoint at a specified distance in front of the midpoint of the door and behind the midpoint of the door seen in the Figure below. Using the P-controller and the repulsion, this setpoint can be reached by PICO. PICO first changes the angle and drives forwards to the 'DES 1' setpoint, when this setpoint is reached the angle changes again and starts driving to the second 'DES 2' setpoint.<br />
<br />
[[File:Draw1x.png|300px]]<br />
<br />
==Motion Control==<br />
This part explains the methods used to perform the motion as dictated from the trajectory planning.<br />
<br />
===Repulsion===<br />
A function is implemented which keeps PICO from touching the walls. This is done using virtual repulsion forces. The repulsion force is calculated using the reciprocal of the laser scan data. The laser data is scanned over the entire range of the sensor, except for the first 10 points and the last 10 points because the returned laser data at these points was not trustworthy. For each sensor reading a repulsion force is calculated in the x and y direction. By adding up all the repulsion forces over the entire scan range a single force vector is obtained. By putting this 'force' combined with a gain directly into PICO's speed input, it will have the tendency to drive away from walls. A tuning parameter has been made in the form of a maximum distance of 0.35m in which PICO can approach a wall. All laser data points which are larger than this value are ignored. Since the laser data only covers 240° of view PICO always changes its angle to drive with its head forward to the destination coordinates. This way there is always available laser data to avoid obstacles.<br />
<br />
[[File:draw2x.jpg]]<br />
<br />
[[File:Draw3x.png|220px]]<br />
<br />
===P-controller===<br />
In order to have PICO move from point A to point B a simple P-controller has been implemented. For testing purposes the P-controller currently relies on odometry data. The 'error' is calculated by subtracting the current position from the target position. The error is multiplied with a proportional action. During testing these parameters will be tuned to ensure optimal behavior of PICO.<br />
<br />
===P-controller with Repulsion===<br />
The speed outputted by the P-controller and the speed generated by the repulsion function are simultaneously used in the PICO speed command. This means that, for example, when PICO is closing in on a corner, the speed (depending on the direction in which PICO is oriented) is temporarily reduced in the direction of the walls, ensuring that PICO gets enough clearance before returning on his path. A problem arises however when a setpoint is located directly behind a wall. In this case PICO cannot reach his goal, as the P-controller 'pulls' PICO towards the setpoint, while the repulsion 'pushes' PICO away from the walls. Therefore it is necessary to give PICO setpoints which he can roughly 'see'. The generation of these setpoints is handled in one of the previous sections. To make sure the maximum translation velocity in the x and y direction is not exceeded the norm of both speeds are calculated, when the velocity exceeds the maximum translation speed it is lowered.<br />
<br />
==Task Manager==<br />
The task manager states what task should take place at what moment. The task manager contains three tasks:<br />
* Exploration<br />
* Parking<br />
* Search and rescue<br />
The charts of these tasks are shown below. The left one shows exploration and parking, and the right one shows search and rescue:<br />
<br />
[[File:MappingX.png|350px]] [[File:SearchRescueX.png|400px]]<br />
<br />
<br />
These three tasks will be highlighted in more detail now.<br />
<br />
===Exploration===<br />
Starting the hospital challenge, exploration is the first task to complete. Starting in the corridor, the detection of this area will be done. This corridor is saved in a struct, which contains a vector of exits. These exits have a destination. In the beginning, each of these destinations have value -1. The exploration is programmed in such a way that always the exit with a destination of -1 will be taken, so always an unexplored room will be entered. After entering a new room, again detection will scan the area. The destination of the door through which PICO has entered the room, will change from -1 to a value belonging to the previous area (corridor in this case). Then, if a room is entered and more than one exit is detected, again the door with unknown destination will be chosen. In the end, all unknown exits are explored and PICO is back in the corridor. At this moment PICO should move to its starting position and parking phase will begin.<br />
<br />
===Parking===<br />
When the map building is complete, PICO has to park backwards to the wall behind the starting position. Parking is done upon touching the wall. After PICO parked, PICO should say: "I am parked!". <br />
<br />
This is done by letting PICO drive forward to the starting position and stopping in front of the wall. Then PICO will turn around such that he can drive backwards to the wall. Since PICO cannnot scan what is behind him, a diffrent method is used to see/feel the wall he should touch. This is done using the control effort. If the control effort becomes large enough, PICO will stop since this increase in control effort is caused by touching the wall. All in all, a short video will summarize the result far better, so let's watch the parking skills of PICO:<br />
<br />
[[File:BackwardParking.gif]]<br />
<br />
<br />
Note that this is a GIF, so you can't hear PICO say "I am parked!".<br />
After parking, the last phase of the challenge can begin. This phase will be explained in Search and Rescue.<br />
<br />
===Search and Rescue===<br />
At this moment, the hospital is explored and mapped. In the world model, a graph is saved. As discussed before, the hint states that the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, the position of the object should be known and PICO can drive towards it. Standing still in front of this object will be the end of the challenge. In case there are multiple rooms for which the most doors have to be passed through, PICO should just try one and in case the object is not found, the other possibility should be tried.<br />
For now, the code calculates the longest path and stores this value. Because of the graph, PICO always knows which exit to take. After taking all these exits, the room with the object is entered. As explained, there can be multiple options. However, this is not fixed yet and will be one of the recommendations. After entering the room with the object, the object search function will be called. In this function, the LRF data is used. For each laserpoint, the differences between its distance and the distance of laserpoints on the left and on the right are measured. If that difference is high enough, there has to be an object in the room. This function places a point in front of the object and PICO will drive towards that point with the normal motion functions and will speak 'I found the object'. This search and rescue is shown in the GIF below.<br />
<br />
=Hospital Challenge=<br />
On June 13th, the hospital challenge took place. It is expected to fail on localization. Besides that, most of the code works the way it should, independent of the way the hospital is build.<br />
<br />
==Evaluation==<br />
Since localization did not work yet, PICO was localized with the help of its odometry. As known, this odometry is not accurate. After a few meters, the errors are increasing and after a while the position where PICO thinks to be and its actual position differed lot. This was the reason the challenge was not successful. PICO started mapping the corridor. It located two exits and moved through one of these, as it is expected to do. Mapping the first room again worked as it should. Two exits were found and PICO knew it should take the door to an unknown place. Moving through that door worked just fine. Mapping that room worked, but then PICO should move to the door through where it entered. However, this door was not at the right position anymore. Or better, PICOs location was too different from where it thought it was. This meant there was a wall on a place of an exit, meaning PICO wanted to go through that wall. The force field made sure PICO did not bump into the wall, but the door was not found. This was the end of the challenge. Both trials did not succeed because of this reason. This was not the only disadvantage of our code. Mapping the corridor did not work perfectly, because of its dimensions. Since the width of the corridor was a lot smaller than its height, mapping the corridor was hard. There was not enough laserdata to have a good visualization of the end of the corridor. That is why only two exits were mapped instead of three. To correct this, PICO should move further into the corridor and map again.<br />
<br />
==Simulator==<br />
The main reason why the hospital challenge did not succeed was because of localization. This is not a problem in simulation. Localizing on odometry works just fine in simulation. Both the mapping and parking phase are shown in the YouTube video. As can be seen, mapping in the corridor starts in the middle of the corridor:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailHospital.png|300px|link=https://youtu.be/xx87YWtambs]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:HospitalSearch.gif]]<br />
<br />
==The Real Challenge==<br />
As seen above, PICO thinks the hospital challenge is not an actual challenge for him... To see what PICO can do, a real challenge was created. This is done with the following map, which is far more challenging due to its size, number of rooms, and especially more diversity of door sizes and positions.<br />
<br />
[[File:TheRealChallenge.png|350px]]<br />
<br />
Without wasting any more words, both the mapping and parking phase are shown in the YouTube video:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailReal.png|300px|link=https://youtu.be/pVJy6qWZcw8]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:RealSearch.gif]]<br />
<br />
=Documents=<br />
All the documents made, besides the Wiki page itself, are shared here.<br />
<br />
==Report of Initial Design==<br />
Due to a misunderstanding, the report was not uploaded as a PDF yet. However, the full report was uploaded on this Wiki page (see below) before May 11th (17.00h), and now it is also uploaded as a PDF file (<1Mb). Our apologies for any inconvenience. The PDF of the report of the initial design can be found here: [[File:InitialDesign_Group3_Report.pdf]]<br />
<br />
==Presentation of Initial Design==<br />
On May 16th, all groups presented their initial design. So we presented our initial design too and included two GIFs of our process so far. A PDF of the slides can be found here: [[File:InitialDesign_Group3_Presentation.pdf]]<br />
<br />
==Presentation of Final Design==<br />
On June 6th, the final presentation was presented to the other groups. This presentation of the final design mainly focussed on the architecture. A PDF of the slides can be found here: [[File:FinalDesign_Group3_Presentation.pdf]]<br />
<br />
=Code=<br />
Still to come...</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2018_Group_3&diff=59508Embedded Motion Control 2018 Group 32018-06-16T16:13:22Z<p>S131974: /* Fit Room */</p>
<hr />
<div>= Group Members =<br />
{| border="1" cellpadding="5" cellspacing="1" style="float:left;"<br />
! TU/e Number<br />
! Name<br />
! E-mail<br />
|- <br />
| 0848904<br />
| Luc (L.L.M.) van den Aker<br />
| <tt>l dot l dot m dot v dot d dot aker at student dot tue dot nl</tt><br />
|-<br />
| 0852908<br />
| Thomas (T.) Neilen<br />
| <tt>t dot neilen at student dot tue dot nl</tt><br />
|-<br />
| 0909434<br />
| Jeroen (J.W.) van de Valk<br />
| <tt>j dot w dot v dot d dot valk at student dot tue dot nl</tt><br />
|-<br />
| 0896947<br />
| Nourdin (N.) Kaai<br />
| <tt>n dot kaai at student dot tue dot nl</tt><br />
|-<br />
| 0883056<br />
| Peter (P.) van Dooren<br />
| <tt>p dot v dot dooren at student dot tue dot nl</tt><br />
|-<br />
| 0861750<br />
| Ties (T.J.) van Loon<br />
| <tt>t dot j dot v dot loon at student dot tue dot nl</tt><br />
|-<br />
|}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Wiki Info=<br />
'''NOTE: This is just for the menbers of Group 3 and will be deleted before the deadline!'''<br />
<br />
==Wiki Deadline==<br />
The Wiki, code and peer review deadline is: Wednesday, 20 June, 23:59h.<br />
<br />
==Wiki Content==<br />
Make sure the Wiki of your group contains:<br />
* An overview of the software architecture and approach used. How does it map to the paradigms explained in this course?<br />
* A description of the methods that make your solution work so well, preferably using nice explanatory images (explain what makes your solution unique; what are you most proud of?)<br />
* Which difficult problems were identified, and how were they solved?<br />
* An evaluation of the hospital challenge: What went well? What went wrong? Why? How could it be improved?<br />
* Videos / GIFs / animations / diagrams / pictures are very welcome! The simulator map for the Hospital Room challenge will be posted after the challenge (of course), so you can show that you are able to solve the challenge in simulation.<br />
<br />
==Publishing Code==<br />
A part of the grading criteria in this course is the quality of your code. We will not dive into your full code base. Instead, link to one or a few pieces of code or code files of which you are particularly proud, and which you think reflect the lessons taught: you can use the code snippet system as included in Gitlab. Do ensure we can access the code! Of course, feel free to also add some introductory/explanatory remarks on the Wiki, or as comments in the code. Make sure the links to your code snippets are clearly visible from your Wiki. For example, put them in a separate section called: ''Code''.<br />
<br />
=Initial Design=<br />
The initial design is explained in the following parts:<br />
* Requirements<br />
* Functions<br />
* Components<br />
* Specifications<br />
* Interfaces<br />
Note that the report of the initial design is shared in Documents.<br />
<br />
==Requirements==<br />
* PICO should make no collisions with any walls<br />
* PICO cannot stand still for 30 seconds or longer<br />
* For the escape room challenge, the robot should leave the room within 5 minutes<br />
* For the hospital challenge, within 5 minutes, mapping, reverse parking and obtaining the object should be done<br />
* Its surroundings should be made visible in a map<br />
* PICO should be able to reach every position in the room<br />
* PICO should be able to leave every room<br />
* PICO should make distinction between the hall and rooms<br />
* It should run autonomously, so in each challenge there should be no additional input<br />
* To start your software, only one executable has to be called<br />
* PICO should be able to recognize an object and stand still close to it<br />
<br />
==Functions==<br />
* PICO should be able to drive in any direction<br />
* PICO should be able to turn around<br />
* It should be able to detect walls<br />
* PICO has to know its own position within the mapped map<br />
* PICO is able to construct a map<br />
* It should be possible to create a trajectory to a room<br />
* PICO should be able to recognize an object<br />
<br />
==Components==<br />
* Sensors:<br />
** Laser Range Finder (LRF)<br />
** Wheel encoders (odometry)<br />
* Actuator:<br />
** Holonomic base (omni-wheels)<br />
* Computer:<br />
** Intel i7<br />
** Ubuntu 16.04<br />
<br />
==Specifications==<br />
* Translation maximum: 0.5 m/s<br />
* Rotation maximum: 1.2 rad/s<br />
* Range of Laser Range Finder is assumed to be bigger than maximum room dimension<br />
* The field of view of the Laser Range Finder is from -2 rad to 2 rad, divided in pieces of 0.004004<br />
* The Laser Range Finder can only measure at one height<br />
<br />
==Interfaces==<br />
The interfaces of the initial design are shown here:<br />
<br />
[[File:InterfaceGroup3.png]]<br />
<br />
As shown in the figure above, a world model is the link between all other parts. The tasks represent the highest level, meaning the most global work PICO has to do. The skills are needed to complete these tasks and some motions together form a skill. The perception contains the sensors, the continuous data. Below an overview of the different parts are given:<br />
<br />
''World model:''<br />
* Compose map<br />
* Object recognition<br />
<br />
''Tasks:''<br />
* Mapping of the environment <br />
* Backward parking at the specified location<br />
* Searching for the object<br />
<br />
''Skills:''<br />
* Planning a trajectory<br />
* Collision avoidance<br />
* Backward parking<br />
* Navigate<br />
* Positioning in front of an opening<br />
* Compose maps<br />
<br />
''Motion:''<br />
* Translation <br />
* Rotation<br />
<br />
''Perception:''<br />
* Odometry <br />
* Laser Range Finder<br />
* Control effort<br />
<br />
=Escape Room Challenge=<br />
Since our code to map a room was not finished completely, a new code for the escape room challenge was made. This code was kept simple and effective. PICO should drive to a wall, turn to the left when it detects a wall within 0.4 meters from itself, and follow the wall (without hitting it of course). Then it will scan for a hallway to exit the room. When he sees a way to exit the room, PICO will go through the opening in the wall. <br />
<br />
Our first attempt during the escape room challange was very successful! PICO drove out of the room, but we were convinced he could do it even faster. So we set the speed higher for the second try, and it was even faster. PICO drove out of the room within 29 seconds. This resulted in a second place and being one of the two teams that made it out of the room.<br />
<br />
Here a shot video is shown of PICO leaving a room. Note that this is not filmed during the 'official' escape room challenge. Due to our enthousiasm, we forgot to film, so we reconstructed the room during one of our test sessions.<br />
<br />
[[File:EscapeRoomChallenge.gif]]<br />
<br />
=Final Design=<br />
First off, the architecture is explained. This architecture is based on the theorem and takes the requirements of the hospital challenge into account. The architecture is explained in six steps:<br />
* World model<br />
* Detection<br />
* Localization<br />
* Trajectory planning<br />
* Motion control <br />
* Task manager<br />
The overall architecture is visualized here:<br />
<br />
[[File:Architecture_Group3.png|650px]]<br />
<br />
All six main components that are in this archtecture will be explained now.<br />
<br />
==World Model==<br />
To build a map of the hospital a twofold mapping procedure will be used. First PICO will map the room it is currently standing in. Secondly a graph connecting all mapped rooms with each other is stored. By using this two level mapping abstraction it is easier to locate PICO in a certain room. Also trajectory planning to a desired room can be more efficiently by using the graph. <br />
The data structures used to store the obtained data are the Rooms, Exits and a graph with all the Rooms.<br />
Once a room is mapped it is stored in a Room object. This object contains the width and height of the room, a global ID of the room and Exit objects. The Exit objects have a local ID, ie the ID of the exit has only meaning when the room it belongs to is also know. The exits also have a location in the coordinate frame of the room and a destination. <br />
The world model also holds the current position and the current position based on odometry.<br />
<br />
==Line Extraction==<br />
The first step in mapping a room is to extract line segments from the obtained laser data. For this a pre-made laser line extraction package was used. This code was slightly modified to remove the ROS layer. the source code can be found on: https://github.com/kam3k/laser_line_extraction<br />
<br />
This package employs a split and merge algorithm [T. Pavlidis and S. L. Horowitz, "Segmentation of Plane Curves," in IEEE Transactions on Computers, vol. C-23, no. 8, pp. 860-870, Aug. 1974] The obtained laser data for the rooms was relatively clean, thus no filtering before the line extraction was applied. The parameters used in the algorithm needed some additional tuning to give the optimal result.<br />
In the figures below, the lines can be seen:<br />
<br />
[[File:Line_detection_Sim.png|300px]] [[File:Line_detection_Lines.png|300px]]<br />
<br />
==Fit Room==<br />
The mapping of a room is done using the lines found by the line extraction.<br />
<br />
===Angle Estimation===<br />
The odometry on PICO gives an estimate of the orientation of PICO. However due to the nature of odometry this estimate will drift over time. Therefore an absolute measurement of the angle is necessary to reset the odometry measurement. This is done using the lines extracted by PICO. These lines have a radius and an angle relative to PICO. Since the hospital is contructed of perpendicular lines PICO can determine it's angle relative to the walls. By using an initial guess, which will give the general direction PICO is oriented in, i.e. whether its angle is around <math>0</math>, <math>\dfrac{1}{2}\pi</math>, <math>\pi</math>, or <math>-\frac{1}{2}\pi</math>. Then the angle is corrected y using the following equation on the measurement:<br />
<br />
<math>estimate +mod_{0.5 * \pi}(measuredAngle)</math><br />
<br />
===Saving Lines===<br />
To map a room PICO needs to look 360° around him, however the laser range finder only has a limited range. Therefore a PICO will scan lines, turn around 180° and scan another time. It will then combine these two sets to end up with a set of lines which describe the entire room around PICO.<br />
<br />
The first time this is done pico’s position will be saved. The lines are transformed using the orientation of pico. This way the resulting lines are aligned with the global axis system but the 0,0 position is at pico’s location. This new frame will be called the mappedFrame.<br />
<br />
after rotating 180 degrees. Pico will merge the detected lines. First the lines are transformed to the mapping frame. Then the lines are compared to the lines already saved. If the lines are collinear, (they have similar same radius and angle) the lines are checked for overlap. The start and end points of the new line are projected on the compared line. If either of the projected point lies on the old line with some margin of error. The line is merged. This is done by taking the furthest start and end point. <br />
<br />
In the figures below, the two sets of lines can be seen: <br />
<br />
[[File:Transform_sim.png|300px]] [[File:Transform_lines.png|300px]]<br />
<br />
===Determine dimensions===<br />
Once PICO has assembled a set of lines all around him, he can determine the properties of the room he is in. This is done in two steps: <br />
* The dimensions of the room are found.<br />
* All the exits of the room are found.<br />
<br />
A box is defined with a distances to the left, to the right, above and below pico. The width and height of the room are determined by fitting the largest possible box inside the lines in mergedLines. An initial guess for the distances is made using the minimum radii of all lines which have the right orientation. Each line in mergedLines can be determined to be either to the left, to the right, above and below pico.<br />
<br />
For example, consider the left wall of the room. In the figure below three lines have the correct orientation to belong to that wall. The initial estimate for the distance to the left of pico is chosen as the smallest radius among those three lines. The same is done for the other three walls.<br />
<br />
After the initial estimate it is possible that the box is still smaller than the room. This can be caused by lines outside the room which happen to have a smaller radius. To expand the size of the room an iterative procedure is used. One side at a time the function checks whether the room can be expanded in this direction. It again searches for a minimum radius among a selection of lines, however this time a criteria is added that the line must fall within the estimated box after expansion. This will filter out most lines outside of the room. The procedure continues until it has gone one cycle without updating the distances. There are edge cases where this procedure goes wrong however they are considered rare enough that they are not taken into account.<br />
Using the distances left, right, up and down the width and height of the room can be determined as well as the location of pico in this new room, expressed in the new room frame.<br />
<br />
Picture of expanding procedure <br />
picture of edge cases. <br />
<br />
===Find exits===<br />
In order to find the exits a function is made which once again loops over the lines in mergedLines. It will determine whether a line belongs to the room as determined by the dimensions previously established. If the gap between two consecutive lines which belong to the room is the size of a door (between 0.4 and 1.7m). An exit is added there. After looping over all lines a final check is done to determine whether an exit exists between the first and last lines in mergedLines.<br />
<br />
===Adding the room to the world model===<br />
After the room has been fitted it must be added to the map in the world model. There are several properties of the room which still need to be determined. <br />
The location of the room coordinate frame is calculated using the room coordinate frame of the previous room, the location of pico in the previous room frame (mappedFrame) and the location of pico in the new room.<br />
The exit pico went through in the previous room must be linked to an exit found in the new room. This is done by calculating the distance from the exits in the new room to the exit taken in the previous room. The exit with the smallest distance is linked to this new room. The destinations of the two exits are set and the exit in the new room is moved to the front of the vector with exits so that exits[0] always leads back to the hallway.<br />
Finally pico's location and current room are updated to be in the new room.<br />
<br />
===Graph===<br />
Every room (square in figure) and door (circle in figure) will be numbered with an ID and then stored in the world model in the form of a graph. An visual representation of such graph can be seen below:<br />
<br />
[[File:Graph.png|200px]]<br />
<br />
Using the grapgh, it can be easily seen what trajectory PICO should take to find the object. As the hint states, the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, it can be quickly determined what sequence of room ID and door IDs is the longest. Knowing this makes finding the object easier, since PICO does not have to look in every room again, bit can immeadily go to the room with the longest sequence.<br />
<br />
==Localization==<br />
Once a room has been mapped. PICO will be able to compare the detected lines to the map it has made. Based on this, PICO's location can be determined. As the odometry data of PICO is unreliable, another solution had to be made to reliably navigate through the environment. A solution had to be made that navigates PICO based on the local coordinates of a room. To do this three different functionalities had to be implemented:<br />
* Make an initial guess of PICO’s position within a room.<br />
* Determine which lines are part of a specific room.<br />
* Determine PICO’s position based on LRF-data.<br />
[[File:Localisation_animation.gif]]<br />
===Initial guess===<br />
The localisation script constantly provides information on PICO’s position. When PICO is leaving a room through a door to another room, this position is used as an initial guess for PICO’s current coordinates. Using these coordinates the lines that PICO sees can be transformed to the coordinate frame of the new room.<br />
<br />
===Line filtering===<br />
The lines that PICO sees are converted to the coordinate system of the room. Based on the information previously gathered about a specific room it is determined which of the lines that PICO currently sees are actually part of the room itself. This is to prevent that for example lines from a hallway are used in the localisation. First it is checked if the end points of the lines directly coincide with the corners of the room. A vector is spanned between the coordinates of a corner and the end point under consideration. The norm of this vector should not exceed a certain parameter in order to be considered to be part of the room. Another possibility is that the end point of a line lies on the contour of a room. In order to determine if this is happening the closest distance of this end point to the line spanned by the two nearby corners should be determined. This can be done using simple vector calculus.<br />
<br />
The shortest distance between a line the origin is expressed in the following equation:<br />
<br />
<br />
<math>\left(\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}\right)\cdot\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}=0</math><br />
<br />
<br />
In this equation <math>p_{1}</math> and <math>p_{2}</math> are calculated by substracting the end point of the line under consideration from the corners of the room. <math>t</math> is calculated, and substituted in the following equation to obtain the vector spanned between the end point and the line:<br />
<br />
<br />
<math>\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}</math><br />
<br />
<br />
The length of this vector is also compared with the fixed parameter used to test the coincidence of the end points and the corners.<br />
<br />
===Localisation===<br />
Because the lines are created in a certain way, it can be derived to which of the four walls they belong. The start- and end points of lines are defined in a counter-clockwise manner around the coordinate system, and the angle of the lines is calculated with respect to the x-axis of a this coordinate system. The lines corresponding to the rightmost wall would thus have an angle corresponding to <math>0</math> radians, the upper walls <math>\frac{1}{2}\pi</math> radians, the leftmost walls <math>\pi</math> radians and the lower walls <math>\frac{3}{2}\pi</math> radians. When it is determined which lines belong to which walls, information about the distance from PICO to these walls is extracted from the untransformed lines. This information is used to calculate PICO’s x and y coordinates in a room, by comparing the data to the previously stored width and height of a room.<br />
<br />
==Trajectory Planning==<br />
This part plans the trajectory PICO should take during the hospital challenge.<br />
<br />
===Approaching a Door===<br />
From the worldmodel PICO obtains his current position, and the position of the two corners of the door. A function is made which basically calculates a point right in the middle of the two corners, and puts a setpoint at a specified distance in front of the midpoint of the door and behind the midpoint of the door seen in the Figure below. Using the P-controller and the repulsion, this setpoint can be reached by PICO. PICO first changes the angle and drives forwards to the 'DES 1' setpoint, when this setpoint is reached the angle changes again and starts driving to the second 'DES 2' setpoint.<br />
<br />
[[File:Draw1x.png|300px]]<br />
<br />
==Motion Control==<br />
This part explains the methods used to perform the motion as dictated from the trajectory planning.<br />
<br />
===Repulsion===<br />
A function is implemented which keeps PICO from touching the walls. This is done using virtual repulsion forces. The repulsion force is calculated using the reciprocal of the laser scan data. The laser data is scanned over the entire range of the sensor, except for the first 10 points and the last 10 points because the returned laser data at these points was not trustworthy. For each sensor reading a repulsion force is calculated in the x and y direction. By adding up all the repulsion forces over the entire scan range a single force vector is obtained. By putting this 'force' combined with a gain directly into PICO's speed input, it will have the tendency to drive away from walls. A tuning parameter has been made in the form of a maximum distance of 0.35m in which PICO can approach a wall. All laser data points which are larger than this value are ignored. Since the laser data only covers 240° of view PICO always changes its angle to drive with its head forward to the destination coordinates. This way there is always available laser data to avoid obstacles.<br />
<br />
[[File:draw2x.jpg]]<br />
<br />
[[File:Draw3x.png|220px]]<br />
<br />
===P-controller===<br />
In order to have PICO move from point A to point B a simple P-controller has been implemented. For testing purposes the P-controller currently relies on odometry data. The 'error' is calculated by subtracting the current position from the target position. The error is multiplied with a proportional action. During testing these parameters will be tuned to ensure optimal behavior of PICO.<br />
<br />
===P-controller with Repulsion===<br />
The speed outputted by the P-controller and the speed generated by the repulsion function are simultaneously used in the PICO speed command. This means that, for example, when PICO is closing in on a corner, the speed (depending on the direction in which PICO is oriented) is temporarily reduced in the direction of the walls, ensuring that PICO gets enough clearance before returning on his path. A problem arises however when a setpoint is located directly behind a wall. In this case PICO cannot reach his goal, as the P-controller 'pulls' PICO towards the setpoint, while the repulsion 'pushes' PICO away from the walls. Therefore it is necessary to give PICO setpoints which he can roughly 'see'. The generation of these setpoints is handled in one of the previous sections. To make sure the maximum translation velocity in the x and y direction is not exceeded the norm of both speeds are calculated, when the velocity exceeds the maximum translation speed it is lowered.<br />
<br />
==Task Manager==<br />
The task manager states what task should take place at what moment. The task manager contains three tasks:<br />
* Exploration<br />
* Parking<br />
* Search and rescue<br />
The charts of these tasks are shown below. The left one shows exploration and parking, and the right one shows search and rescue:<br />
<br />
[[File:MappingX.png|350px]] [[File:SearchRescueX.png|400px]]<br />
<br />
<br />
These three tasks will be highlighted in more detail now.<br />
<br />
===Exploration===<br />
Starting the hospital challenge, exploration is the first task to complete. Starting in the corridor, the detection of this area will be done. This corridor is saved in a struct, which contains a vector of exits. These exits have a destination. In the beginning, each of these destinations have value -1. The exploration is programmed in such a way that always the exit with a destination of -1 will be taken, so always an unexplored room will be entered. After entering a new room, again detection will scan the area. The destination of the door through which PICO has entered the room, will change from -1 to a value belonging to the previous area (corridor in this case). Then, if a room is entered and more than one exit is detected, again the door with unknown destination will be chosen. In the end, all unknown exits are explored and PICO is back in the corridor. At this moment PICO should move to its starting position and parking phase will begin.<br />
<br />
===Parking===<br />
When the map building is complete, PICO has to park backwards to the wall behind the starting position. Parking is done upon touching the wall. After PICO parked, PICO should say: "I am parked!". <br />
<br />
This is done by letting PICO drive forward to the starting position and stopping in front of the wall. Then PICO will turn around such that he can drive backwards to the wall. Since PICO cannnot scan what is behind him, a diffrent method is used to see/feel the wall he should touch. This is done using the control effort. If the control effort becomes large enough, PICO will stop since this increase in control effort is caused by touching the wall. All in all, a short video will summarize the result far better, so let's watch the parking skills of PICO:<br />
<br />
[[File:BackwardParking.gif]]<br />
<br />
<br />
Note that this is a GIF, so you can't hear PICO say "I am parked!".<br />
After parking, the last phase of the challenge can begin. This phase will be explained in Search and Rescue.<br />
<br />
===Search and Rescue===<br />
At this moment, the hospital is explored and mapped. In the world model, a graph is saved. As discussed before, the hint states that the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, the position of the object should be known and PICO can drive towards it. Standing still in front of this object will be the end of the challenge. In case there are multiple rooms for which the most doors have to be passed through, PICO should just try one and in case the object is not found, the other possibility should be tried.<br />
For now, the code calculates the longest path and stores this value. Because of the graph, PICO always knows which exit to take. After taking all these exits, the room with the object is entered. As explained, there can be multiple options. However, this is not fixed yet and will be one of the recommendations. After entering the room with the object, the object search function will be called. In this function, the LRF data is used. For each laserpoint, the differences between its distance and the distance of laserpoints on the left and on the right are measured. If that difference is high enough, there has to be an object in the room. This function places a point in front of the object and PICO will drive towards that point with the normal motion functions and will speak 'I found the object'. This search and rescue is shown in the GIF below.<br />
<br />
=Hospital Challenge=<br />
On June 13th, the hospital challenge took place. It is expected to fail on localization. Besides that, most of the code works the way it should, independent of the way the hospital is build.<br />
<br />
==Evaluation==<br />
Since localization did not work yet, PICO was localized with the help of its odometry. As known, this odometry is not accurate. After a few meters, the errors are increasing and after a while the position where PICO thinks to be and its actual position differed lot. This was the reason the challenge was not successful. PICO started mapping the corridor. It located two exits and moved through one of these, as it is expected to do. Mapping the first room again worked as it should. Two exits were found and PICO knew it should take the door to an unknown place. Moving through that door worked just fine. Mapping that room worked, but then PICO should move to the door through where it entered. However, this door was not at the right position anymore. Or better, PICOs location was too different from where it thought it was. This meant there was a wall on a place of an exit, meaning PICO wanted to go through that wall. The force field made sure PICO did not bump into the wall, but the door was not found. This was the end of the challenge. Both trials did not succeed because of this reason. This was not the only disadvantage of our code. Mapping the corridor did not work perfectly, because of its dimensions. Since the width of the corridor was a lot smaller than its height, mapping the corridor was hard. There was not enough laserdata to have a good visualization of the end of the corridor. That is why only two exits were mapped instead of three. To correct this, PICO should move further into the corridor and map again.<br />
<br />
==Simulator==<br />
The main reason why the hospital challenge did not succeed was because of localization. This is not a problem in simulation. Localizing on odometry works just fine in simulation. Both the mapping and parking phase are shown in the YouTube video. As can be seen, mapping in the corridor starts in the middle of the corridor:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailHospital.png|300px|link=https://youtu.be/xx87YWtambs]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:HospitalSearch.gif]]<br />
<br />
==The Real Challenge==<br />
As seen above, PICO thinks the hospital challenge is not an actual challenge for him... To see what PICO can do, a real challenge was created. This is done with the following map, which is far more challenging due to its size, number of rooms, and especially more diversity of door sizes and positions.<br />
<br />
[[File:TheRealChallenge.png|350px]]<br />
<br />
Without wasting any more words, both the mapping and parking phase are shown in the YouTube video:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailReal.png|300px|link=https://youtu.be/pVJy6qWZcw8]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:RealSearch.gif]]<br />
<br />
=Documents=<br />
All the documents made, besides the Wiki page itself, are shared here.<br />
<br />
==Report of Initial Design==<br />
Due to a misunderstanding, the report was not uploaded as a PDF yet. However, the full report was uploaded on this Wiki page (see below) before May 11th (17.00h), and now it is also uploaded as a PDF file (<1Mb). Our apologies for any inconvenience. The PDF of the report of the initial design can be found here: [[File:InitialDesign_Group3_Report.pdf]]<br />
<br />
==Presentation of Initial Design==<br />
On May 16th, all groups presented their initial design. So we presented our initial design too and included two GIFs of our process so far. A PDF of the slides can be found here: [[File:InitialDesign_Group3_Presentation.pdf]]<br />
<br />
==Presentation of Final Design==<br />
On June 6th, the final presentation was presented to the other groups. This presentation of the final design mainly focussed on the architecture. A PDF of the slides can be found here: [[File:FinalDesign_Group3_Presentation.pdf]]<br />
<br />
=Code=<br />
Still to come...</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2018_Group_3&diff=59507Embedded Motion Control 2018 Group 32018-06-16T16:06:32Z<p>S131974: </p>
<hr />
<div>= Group Members =<br />
{| border="1" cellpadding="5" cellspacing="1" style="float:left;"<br />
! TU/e Number<br />
! Name<br />
! E-mail<br />
|- <br />
| 0848904<br />
| Luc (L.L.M.) van den Aker<br />
| <tt>l dot l dot m dot v dot d dot aker at student dot tue dot nl</tt><br />
|-<br />
| 0852908<br />
| Thomas (T.) Neilen<br />
| <tt>t dot neilen at student dot tue dot nl</tt><br />
|-<br />
| 0909434<br />
| Jeroen (J.W.) van de Valk<br />
| <tt>j dot w dot v dot d dot valk at student dot tue dot nl</tt><br />
|-<br />
| 0896947<br />
| Nourdin (N.) Kaai<br />
| <tt>n dot kaai at student dot tue dot nl</tt><br />
|-<br />
| 0883056<br />
| Peter (P.) van Dooren<br />
| <tt>p dot v dot dooren at student dot tue dot nl</tt><br />
|-<br />
| 0861750<br />
| Ties (T.J.) van Loon<br />
| <tt>t dot j dot v dot loon at student dot tue dot nl</tt><br />
|-<br />
|}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Wiki Info=<br />
'''NOTE: This is just for the menbers of Group 3 and will be deleted before the deadline!'''<br />
<br />
==Wiki Deadline==<br />
The Wiki, code and peer review deadline is: Wednesday, 20 June, 23:59h.<br />
<br />
==Wiki Content==<br />
Make sure the Wiki of your group contains:<br />
* An overview of the software architecture and approach used. How does it map to the paradigms explained in this course?<br />
* A description of the methods that make your solution work so well, preferably using nice explanatory images (explain what makes your solution unique; what are you most proud of?)<br />
* Which difficult problems were identified, and how were they solved?<br />
* An evaluation of the hospital challenge: What went well? What went wrong? Why? How could it be improved?<br />
* Videos / GIFs / animations / diagrams / pictures are very welcome! The simulator map for the Hospital Room challenge will be posted after the challenge (of course), so you can show that you are able to solve the challenge in simulation.<br />
<br />
==Publishing Code==<br />
A part of the grading criteria in this course is the quality of your code. We will not dive into your full code base. Instead, link to one or a few pieces of code or code files of which you are particularly proud, and which you think reflect the lessons taught: you can use the code snippet system as included in Gitlab. Do ensure we can access the code! Of course, feel free to also add some introductory/explanatory remarks on the Wiki, or as comments in the code. Make sure the links to your code snippets are clearly visible from your Wiki. For example, put them in a separate section called: ''Code''.<br />
<br />
=Initial Design=<br />
The initial design is explained in the following parts:<br />
* Requirements<br />
* Functions<br />
* Components<br />
* Specifications<br />
* Interfaces<br />
Note that the report of the initial design is shared in Documents.<br />
<br />
==Requirements==<br />
* PICO should make no collisions with any walls<br />
* PICO cannot stand still for 30 seconds or longer<br />
* For the escape room challenge, the robot should leave the room within 5 minutes<br />
* For the hospital challenge, within 5 minutes, mapping, reverse parking and obtaining the object should be done<br />
* Its surroundings should be made visible in a map<br />
* PICO should be able to reach every position in the room<br />
* PICO should be able to leave every room<br />
* PICO should make distinction between the hall and rooms<br />
* It should run autonomously, so in each challenge there should be no additional input<br />
* To start your software, only one executable has to be called<br />
* PICO should be able to recognize an object and stand still close to it<br />
<br />
==Functions==<br />
* PICO should be able to drive in any direction<br />
* PICO should be able to turn around<br />
* It should be able to detect walls<br />
* PICO has to know its own position within the mapped map<br />
* PICO is able to construct a map<br />
* It should be possible to create a trajectory to a room<br />
* PICO should be able to recognize an object<br />
<br />
==Components==<br />
* Sensors:<br />
** Laser Range Finder (LRF)<br />
** Wheel encoders (odometry)<br />
* Actuator:<br />
** Holonomic base (omni-wheels)<br />
* Computer:<br />
** Intel i7<br />
** Ubuntu 16.04<br />
<br />
==Specifications==<br />
* Translation maximum: 0.5 m/s<br />
* Rotation maximum: 1.2 rad/s<br />
* Range of Laser Range Finder is assumed to be bigger than maximum room dimension<br />
* The field of view of the Laser Range Finder is from -2 rad to 2 rad, divided in pieces of 0.004004<br />
* The Laser Range Finder can only measure at one height<br />
<br />
==Interfaces==<br />
The interfaces of the initial design are shown here:<br />
<br />
[[File:InterfaceGroup3.png]]<br />
<br />
As shown in the figure above, a world model is the link between all other parts. The tasks represent the highest level, meaning the most global work PICO has to do. The skills are needed to complete these tasks and some motions together form a skill. The perception contains the sensors, the continuous data. Below an overview of the different parts are given:<br />
<br />
''World model:''<br />
* Compose map<br />
* Object recognition<br />
<br />
''Tasks:''<br />
* Mapping of the environment <br />
* Backward parking at the specified location<br />
* Searching for the object<br />
<br />
''Skills:''<br />
* Planning a trajectory<br />
* Collision avoidance<br />
* Backward parking<br />
* Navigate<br />
* Positioning in front of an opening<br />
* Compose maps<br />
<br />
''Motion:''<br />
* Translation <br />
* Rotation<br />
<br />
''Perception:''<br />
* Odometry <br />
* Laser Range Finder<br />
* Control effort<br />
<br />
=Escape Room Challenge=<br />
Since our code to map a room was not finished completely, a new code for the escape room challenge was made. This code was kept simple and effective. PICO should drive to a wall, turn to the left when it detects a wall within 0.4 meters from itself, and follow the wall (without hitting it of course). Then it will scan for a hallway to exit the room. When he sees a way to exit the room, PICO will go through the opening in the wall. <br />
<br />
Our first attempt during the escape room challange was very successful! PICO drove out of the room, but we were convinced he could do it even faster. So we set the speed higher for the second try, and it was even faster. PICO drove out of the room within 29 seconds. This resulted in a second place and being one of the two teams that made it out of the room.<br />
<br />
Here a shot video is shown of PICO leaving a room. Note that this is not filmed during the 'official' escape room challenge. Due to our enthousiasm, we forgot to film, so we reconstructed the room during one of our test sessions.<br />
<br />
[[File:EscapeRoomChallenge.gif]]<br />
<br />
=Final Design=<br />
First off, the architecture is explained. This architecture is based on the theorem and takes the requirements of the hospital challenge into account. The architecture is explained in six steps:<br />
* World model<br />
* Detection<br />
* Localization<br />
* Trajectory planning<br />
* Motion control <br />
* Task manager<br />
The overall architecture is visualized here:<br />
<br />
[[File:Architecture_Group3.png|650px]]<br />
<br />
All six main components that are in this archtecture will be explained now.<br />
<br />
==World Model==<br />
To build a map of the hospital a twofold mapping procedure will be used. First PICO will map the room it is currently standing in. Secondly a graph connecting all mapped rooms with each other is stored. By using this two level mapping abstraction it is easier to locate PICO in a certain room. Also trajectory planning to a desired room can be more efficiently by using the graph. <br />
The data structures used to store the obtained data are the Rooms, Exits and a graph with all the Rooms.<br />
Once a room is mapped it is stored in a Room object. This object contains the width and height of the room, a global ID of the room and Exit objects. The Exit objects have a local ID, ie the ID of the exit has only meaning when the room it belongs to is also know. The exits also have a location in the coordinate frame of the room and a destination. <br />
The world model also holds the current position and the current position based on odometry.<br />
<br />
==Line Extraction==<br />
The first step in mapping a room is to extract line segments from the obtained laser data. For this a pre-made laser line extraction package was used. This code was slightly modified to remove the ROS layer. the source code can be found on: https://github.com/kam3k/laser_line_extraction<br />
<br />
This package employs a split and merge algorithm [T. Pavlidis and S. L. Horowitz, "Segmentation of Plane Curves," in IEEE Transactions on Computers, vol. C-23, no. 8, pp. 860-870, Aug. 1974] The obtained laser data for the rooms was relatively clean, thus no filtering before the line extraction was applied. The parameters used in the algorithm needed some additional tuning to give the optimal result.<br />
In the figures below, the lines can be seen:<br />
<br />
[[File:Line_detection_Sim.png|300px]] [[File:Line_detection_Lines.png|300px]]<br />
<br />
==Fit Room==<br />
The mapping of a room is done by scanning the environment using the laser range scanner. Through this data lines are fitted. By using these lines, a room is fitted, giving the dimensions of the room and the locations of the doors.<br />
<br />
===Angle Estimation===<br />
The odometry on PICO gives an estimate of the orientation of PICO. However due to the nature of odometry this estimate will drift over time. Therefore an absolute measurement of the angle is necessary to reset the odometry measurement. This is done using the lines extracted by PICO. These lines have a radius and an angle relative to PICO. Since the hospital is contructed of perpendicular lines PICO can determine it's angle relative to the walls. By using an initial guess, which will give the general direction PICO is oriented in, i.e. whether its angle is around <math>0</math>, <math>\dfrac{1}{2}\pi</math>, <math>\pi</math>, or <math>-\frac{1}{2}\pi</math>. Then the angle is corrected y using the following equation on the measurement:<br />
<br />
<math>estimate +mod_{0.5 * \pi}(measuredAngle)</math><br />
<br />
===Saving Lines===<br />
To map a room PICO needs to look 360° around him, however the laser range finder only has a limited range. Therefore a PICO will scan lines, turn around 180° and scan another time. It will then combine these two sets to end up with a set of lines which describe the entire room around PICO.<br />
<br />
In the figures below, the two sets of lines can be seen: <br />
<br />
[[File:Transform_sim.png|300px]] [[File:Transform_lines.png|300px]]<br />
<br />
===Determine dimensions===<br />
Once PICO has assembled a set of lines all around him, he can determine the properties of the room he is in. This is done in two steps: <br />
* The dimensions of the room are found.<br />
* All the exits of the room are found.<br />
<br />
===Find exits===<br />
<br />
===Graph===<br />
Every room (square in figure) and door (circle in figure) will be numbered with an ID and then stored in the world model in the form of a graph. An visual representation of such graph can be seen below:<br />
<br />
[[File:Graph.png|200px]]<br />
<br />
Using the grapgh, it can be easily seen what trajectory PICO should take to find the object. As the hint states, the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, it can be quickly determined what sequence of room ID and door IDs is the longest. Knowing this makes finding the object easier, since PICO does not have to look in every room again, bit can immeadily go to the room with the longest sequence.<br />
<br />
==Localization==<br />
Once a room has been mapped. PICO will be able to compare the detected lines to the map it has made. Based on this, PICO's location can be determined. As the odometry data of PICO is unreliable, another solution had to be made to reliably navigate through the environment. A solution had to be made that navigates PICO based on the local coordinates of a room. To do this three different functionalities had to be implemented:<br />
* Make an initial guess of PICO’s position within a room.<br />
* Determine which lines are part of a specific room.<br />
* Determine PICO’s position based on LRF-data.<br />
[[File:Localisation_animation.gif]]<br />
===Initial guess===<br />
The localisation script constantly provides information on PICO’s position. When PICO is leaving a room through a door to another room, this position is used as an initial guess for PICO’s current coordinates. Using these coordinates the lines that PICO sees can be transformed to the coordinate frame of the new room.<br />
<br />
===Line filtering===<br />
The lines that PICO sees are converted to the coordinate system of the room. Based on the information previously gathered about a specific room it is determined which of the lines that PICO currently sees are actually part of the room itself. This is to prevent that for example lines from a hallway are used in the localisation. First it is checked if the end points of the lines directly coincide with the corners of the room. A vector is spanned between the coordinates of a corner and the end point under consideration. The norm of this vector should not exceed a certain parameter in order to be considered to be part of the room. Another possibility is that the end point of a line lies on the contour of a room. In order to determine if this is happening the closest distance of this end point to the line spanned by the two nearby corners should be determined. This can be done using simple vector calculus.<br />
<br />
The shortest distance between a line the origin is expressed in the following equation:<br />
<br />
<br />
<math>\left(\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}\right)\cdot\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}=0</math><br />
<br />
<br />
In this equation <math>p_{1}</math> and <math>p_{2}</math> are calculated by substracting the end point of the line under consideration from the corners of the room. <math>t</math> is calculated, and substituted in the following equation to obtain the vector spanned between the end point and the line:<br />
<br />
<br />
<math>\begin{pmatrix}x_{p_{1}}\\y_{p_{1}}\\\alpha_{p_{1}}\end{pmatrix}+t\begin{pmatrix}x_{p_{1}}-x_{p_{2}}\\y_{p_{1}}-y_{p_{2}}\\\alpha_{p_{1}}-\alpha_{p_{2}}\end{pmatrix}</math><br />
<br />
<br />
The length of this vector is also compared with the fixed parameter used to test the coincidence of the end points and the corners.<br />
<br />
===Localisation===<br />
Because the lines are created in a certain way, it can be derived to which of the four walls they belong. The start- and end points of lines are defined in a counter-clockwise manner around the coordinate system, and the angle of the lines is calculated with respect to the x-axis of a this coordinate system. The lines corresponding to the rightmost wall would thus have an angle corresponding to <math>0</math> radians, the upper walls <math>\frac{1}{2}\pi</math> radians, the leftmost walls <math>\pi</math> radians and the lower walls <math>\frac{3}{2}\pi</math> radians. When it is determined which lines belong to which walls, information about the distance from PICO to these walls is extracted from the untransformed lines. This information is used to calculate PICO’s x and y coordinates in a room, by comparing the data to the previously stored width and height of a room.<br />
<br />
==Trajectory Planning==<br />
This part plans the trajectory PICO should take during the hospital challenge.<br />
<br />
===Approaching a Door===<br />
From the worldmodel PICO obtains his current position, and the position of the two corners of the door. A function is made which basically calculates a point right in the middle of the two corners, and puts a setpoint at a specified distance in front of the midpoint of the door and behind the midpoint of the door seen in the Figure below. Using the P-controller and the repulsion, this setpoint can be reached by PICO. PICO first changes the angle and drives forwards to the 'DES 1' setpoint, when this setpoint is reached the angle changes again and starts driving to the second 'DES 2' setpoint.<br />
<br />
[[File:Draw1x.png|300px]]<br />
<br />
==Motion Control==<br />
This part explains the methods used to perform the motion as dictated from the trajectory planning.<br />
<br />
===Repulsion===<br />
A function is implemented which keeps PICO from touching the walls. This is done using virtual repulsion forces. The repulsion force is calculated using the reciprocal of the laser scan data. The laser data is scanned over the entire range of the sensor, except for the first 10 points and the last 10 points because the returned laser data at these points was not trustworthy. For each sensor reading a repulsion force is calculated in the x and y direction. By adding up all the repulsion forces over the entire scan range a single force vector is obtained. By putting this 'force' combined with a gain directly into PICO's speed input, it will have the tendency to drive away from walls. A tuning parameter has been made in the form of a maximum distance of 0.35m in which PICO can approach a wall. All laser data points which are larger than this value are ignored. Since the laser data only covers 240° of view PICO always changes its angle to drive with its head forward to the destination coordinates. This way there is always available laser data to avoid obstacles.<br />
<br />
[[File:draw2x.jpg]]<br />
<br />
[[File:Draw3x.png|220px]]<br />
<br />
===P-controller===<br />
In order to have PICO move from point A to point B a simple P-controller has been implemented. For testing purposes the P-controller currently relies on odometry data. The 'error' is calculated by subtracting the current position from the target position. The error is multiplied with a proportional action. During testing these parameters will be tuned to ensure optimal behavior of PICO.<br />
<br />
===P-controller with Repulsion===<br />
The speed outputted by the P-controller and the speed generated by the repulsion function are simultaneously used in the PICO speed command. This means that, for example, when PICO is closing in on a corner, the speed (depending on the direction in which PICO is oriented) is temporarily reduced in the direction of the walls, ensuring that PICO gets enough clearance before returning on his path. A problem arises however when a setpoint is located directly behind a wall. In this case PICO cannot reach his goal, as the P-controller 'pulls' PICO towards the setpoint, while the repulsion 'pushes' PICO away from the walls. Therefore it is necessary to give PICO setpoints which he can roughly 'see'. The generation of these setpoints is handled in one of the previous sections. To make sure the maximum translation velocity in the x and y direction is not exceeded the norm of both speeds are calculated, when the velocity exceeds the maximum translation speed it is lowered.<br />
<br />
==Task Manager==<br />
The task manager states what task should take place at what moment. The task manager contains three tasks:<br />
* Exploration<br />
* Parking<br />
* Search and rescue<br />
The charts of these tasks are shown below. The left one shows exploration and parking, and the right one shows search and rescue:<br />
<br />
[[File:MappingX.png|350px]] [[File:SearchRescueX.png|400px]]<br />
<br />
<br />
These three tasks will be highlighted in more detail now.<br />
<br />
===Exploration===<br />
Starting the hospital challenge, exploration is the first task to complete. Starting in the corridor, the detection of this area will be done. This corridor is saved in a struct, which contains a vector of exits. These exits have a destination. In the beginning, each of these destinations have value -1. The exploration is programmed in such a way that always the exit with a destination of -1 will be taken, so always an unexplored room will be entered. After entering a new room, again detection will scan the area. The destination of the door through which PICO has entered the room, will change from -1 to a value belonging to the previous area (corridor in this case). Then, if a room is entered and more than one exit is detected, again the door with unknown destination will be chosen. In the end, all unknown exits are explored and PICO is back in the corridor. At this moment PICO should move to its starting position and parking phase will begin.<br />
<br />
===Parking===<br />
When the map building is complete, PICO has to park backwards to the wall behind the starting position. Parking is done upon touching the wall. After PICO parked, PICO should say: "I am parked!". <br />
<br />
This is done by letting PICO drive forward to the starting position and stopping in front of the wall. Then PICO will turn around such that he can drive backwards to the wall. Since PICO cannnot scan what is behind him, a diffrent method is used to see/feel the wall he should touch. This is done using the control effort. If the control effort becomes large enough, PICO will stop since this increase in control effort is caused by touching the wall. All in all, a short video will summarize the result far better, so let's watch the parking skills of PICO:<br />
<br />
[[File:BackwardParking.gif]]<br />
<br />
<br />
Note that this is a GIF, so you can't hear PICO say "I am parked!".<br />
After parking, the last phase of the challenge can begin. This phase will be explained in Search and Rescue.<br />
<br />
===Search and Rescue===<br />
At this moment, the hospital is explored and mapped. In the world model, a graph is saved. As discussed before, the hint states that the object will be located in the room for which most openings (i.e., doors) have to be passed through to enter it. With the use of this hint and the graph, the position of the object should be known and PICO can drive towards it. Standing still in front of this object will be the end of the challenge. In case there are multiple rooms for which the most doors have to be passed through, PICO should just try one and in case the object is not found, the other possibility should be tried.<br />
For now, the code calculates the longest path and stores this value. Because of the graph, PICO always knows which exit to take. After taking all these exits, the room with the object is entered. As explained, there can be multiple options. However, this is not fixed yet and will be one of the recommendations. After entering the room with the object, the object search function will be called. In this function, the LRF data is used. For each laserpoint, the differences between its distance and the distance of laserpoints on the left and on the right are measured. If that difference is high enough, there has to be an object in the room. This function places a point in front of the object and PICO will drive towards that point with the normal motion functions and will speak 'I found the object'. This search and rescue is shown in the GIF below.<br />
<br />
=Hospital Challenge=<br />
On June 13th, the hospital challenge took place. It is expected to fail on localization. Besides that, most of the code works the way it should, independent of the way the hospital is build.<br />
<br />
==Evaluation==<br />
Since localization did not work yet, PICO was localized with the help of its odometry. As known, this odometry is not accurate. After a few meters, the errors are increasing and after a while the position where PICO thinks to be and its actual position differed lot. This was the reason the challenge was not successful. PICO started mapping the corridor. It located two exits and moved through one of these, as it is expected to do. Mapping the first room again worked as it should. Two exits were found and PICO knew it should take the door to an unknown place. Moving through that door worked just fine. Mapping that room worked, but then PICO should move to the door through where it entered. However, this door was not at the right position anymore. Or better, PICOs location was too different from where it thought it was. This meant there was a wall on a place of an exit, meaning PICO wanted to go through that wall. The force field made sure PICO did not bump into the wall, but the door was not found. This was the end of the challenge. Both trials did not succeed because of this reason. This was not the only disadvantage of our code. Mapping the corridor did not work perfectly, because of its dimensions. Since the width of the corridor was a lot smaller than its height, mapping the corridor was hard. There was not enough laserdata to have a good visualization of the end of the corridor. That is why only two exits were mapped instead of three. To correct this, PICO should move further into the corridor and map again.<br />
<br />
==Simulator==<br />
The main reason why the hospital challenge did not succeed was because of localization. This is not a problem in simulation. Localizing on odometry works just fine in simulation. Both the mapping and parking phase are shown in the YouTube video. As can be seen, mapping in the corridor starts in the middle of the corridor:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailHospital.png|300px|link=https://youtu.be/xx87YWtambs]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:HospitalSearch.gif]]<br />
<br />
==The Real Challenge==<br />
As seen above, PICO thinks the hospital challenge is not an actual challenge for him... To see what PICO can do, a real challenge was created. This is done with the following map, which is far more challenging due to its size, number of rooms, and especially more diversity of door sizes and positions.<br />
<br />
[[File:TheRealChallenge.png|350px]]<br />
<br />
Without wasting any more words, both the mapping and parking phase are shown in the YouTube video:<br />
<br />
''Click on the image to go to the YouTube video.''<br />
<br />
[[File:ThumbnailReal.png|300px|link=https://youtu.be/pVJy6qWZcw8]]<br />
<br />
<br />
The search and rescue phase is shown in the following GIF:<br />
<br />
[[File:RealSearch.gif]]<br />
<br />
=Documents=<br />
All the documents made, besides the Wiki page itself, are shared here.<br />
<br />
==Report of Initial Design==<br />
Due to a misunderstanding, the report was not uploaded as a PDF yet. However, the full report was uploaded on this Wiki page (see below) before May 11th (17.00h), and now it is also uploaded as a PDF file (<1Mb). Our apologies for any inconvenience. The PDF of the report of the initial design can be found here: [[File:InitialDesign_Group3_Report.pdf]]<br />
<br />
==Presentation of Initial Design==<br />
On May 16th, all groups presented their initial design. So we presented our initial design too and included two GIFs of our process so far. A PDF of the slides can be found here: [[File:InitialDesign_Group3_Presentation.pdf]]<br />
<br />
==Presentation of Final Design==<br />
On June 6th, the final presentation was presented to the other groups. This presentation of the final design mainly focussed on the architecture. A PDF of the slides can be found here: [[File:FinalDesign_Group3_Presentation.pdf]]<br />
<br />
=Code=<br />
Still to come...</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2018_Group_3&diff=58174Embedded Motion Control 2018 Group 32018-06-04T21:29:25Z<p>S131974: /* Angle estimation */</p>
<hr />
<div>= Group Members =<br />
{| border="1" cellpadding="5" cellspacing="1" style="float:left;"<br />
! TU/e Number<br />
! Name<br />
! E-mail<br />
|- <br />
| 0848904<br />
| Luc (L.L.M.) van den Aker<br />
| l.l.m.v.d.aker at student.tue.nl<br />
|-<br />
| 0852908<br />
| Thomas (T.) Neilen<br />
| t.neilen at student.tue.nl <br />
|-<br />
| 0909434<br />
| Jeroen (J.W.) van de Valk<br />
| j.w.v.d.valk at student.tue.nl<br />
|-<br />
| 0896947<br />
| Nourdin (N.) Kaai<br />
| n.kaai at student.tue.nl<br />
|-<br />
| 0883056<br />
| Peter (P.) van Dooren<br />
| p.v.dooren at student.tue.nl<br />
|-<br />
| 0861750<br />
| Ties (T.J.) van Loon<br />
| t.j.v.loon at student.tue.nl<br />
|-<br />
|}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Initial Design=<br />
First off, the initial design itself is explained. After that, the report and presentation of it are shared. <br />
<br />
==Initial Design==<br />
===Requirements===<br />
* PICO should make no collisions with any walls<br />
* PICO cannot stand still for 30 seconds or longer<br />
* For the escape room challenge, the robot should leave the room within 5 minutes<br />
* For the hospital challenge, within 5 minutes, mapping, reverse parking and obtaining the object should be done<br />
* Its surroundings should be made visible in a map<br />
* PICO should be able to reach every position in the room<br />
* PICO should be able to leave every room<br />
* PICO should make distinction between the hall and rooms<br />
* It should run autonomously, so in each challenge there should be no additional input<br />
* To start your software, only one executable has to be called<br />
* PICO should be able to recognize an object and stand still close to it<br />
<br />
===Functions===<br />
* PICO should be able to drive in any direction<br />
* PICO should be able to turn around<br />
* It should be able to detect walls<br />
* PICO has to know its own position within the mapped map<br />
* PICO is able to construct a map<br />
* It should be possible to create a trajectory to a room<br />
* PICO should be able to recognize an object<br />
<br />
===Components===<br />
* Sensors:<br />
** Laser Range Finder (LRF)<br />
** Wheel encoders (odometry)<br />
* Actuator:<br />
** Holonomic base (omni-wheels)<br />
* Computer:<br />
** Intel i7<br />
** Ubuntu 16.04<br />
<br />
===Specifications===<br />
* Translation maximum: 0.5 m/s<br />
* Rotation maximum: 1.2 rad/s<br />
* Range of Laser Range Finder is assumed to be bigger than maximum room dimension<br />
* The field of view of the Laser Range Finder is from -2 rad to 2 rad, divided in pieces of 0.004004<br />
* The Laser Range Finder can only measure at one height<br />
<br />
===Interfaces===<br />
<br />
The interfaces of the initial design are shown here:<br />
<br />
[[File:InterfaceGroup3.png|300px|thumb|center|Interface of Group 3.]]<br />
<br />
As shown in Figure 1, a world model is the link between all other parts. The tasks represent the highest level, meaning the most global work PICO has to do. The skills are needed to complete these tasks and some motions together form a skill. The perception contains the sensors, the continuous data. Below an overview of the different parts are given:<br />
<br />
''World model:''<br />
* Compose map<br />
* Object recognition<br />
<br />
''Tasks:''<br />
* Mapping of the environment <br />
* Backward parking at the specified location<br />
* Searching for the object<br />
<br />
''Skills:''<br />
* Planning a trajectory<br />
* Collision avoidance<br />
* Backward parking<br />
* Navigate<br />
* Positioning in front of an opening<br />
* Compose maps<br />
<br />
''Motion:''<br />
* Translation <br />
* Rotation<br />
<br />
''Perception:''<br />
* Odometry <br />
* Laser Range Finder<br />
* Control effort<br />
<br />
==Report of Initial Design==<br />
Due to a misunderstanding, the report was not uploaded as a PDF yet. However, the full report was uploaded on this Wiki page (see below) before May 11th (17.00h), and now it is also uploaded as a PDF file (<1Mb). Our apologies for any inconvenience. The PDF of the report of the initial design can be found here: [[File:InitialDesign_Group3_Report.pdf]]<br />
<br />
==Presentation of Initial Design==<br />
On May 16th, all groups presnted their initial design. So we also presented our initial design and included two GIFs of our process so far. A PDF of the slides can be found here: [[File:InitialDesign_Group3_Presentation.pdf]]<br />
<br />
=Escape Room Challenge=<br />
Since our code to map a room was not finished completely, a new code for the Escape Room Challenge was made. This code was kept simple and effective. PICO should drive to a wall, turn to the left when it detects a wall within 0.4 meters from itself, and follow the wall (without hitting it of course). Then it will scan for a hallway to exit the room. When he sees a way to exit the room, PICO will go through the opening in the wall. <br />
<br />
Our first attempt during the Escape Room Challange was very successful! PICO drove out of the room, but we were convinced he could do it even faster. So we set the speed higher for the second try, and it was even faster. PICO drove out of the room within 29 seconds. This resulted in a second place and being one of the two teams that made it out of the room.<br />
<br />
Here a shot video is shown of PICO leaving a room. Note that this is not filmed during the 'official' Escape Room Challenge. Due to our enthousiasm, we forgot to film, so we reconstructed the room during one of our test sessions.<br />
<br />
[[File:EscapeRoomChallenge.gif|thumb|center|600px|The reconstruction of the Escape Room Challenge.]]<br />
<br />
=Hospital Challange=<br />
To succeed in this challenge, we have divided the the 'problem' into three parts. These are the three part:<br />
* Mapping<br />
* Trajectory planning<br />
* Motion control<br />
<br />
==Mapping==<br />
To build a map of the hospital a two fold mapping procedure will be used. First Pico will map the room it is currently standing in. The parameters of this room are then stored. Secondly a graph connecting all mapped routes with each other is build. By using this two level mapping abstraction it is easier to locate pico in a certain room. Also trajectory planning to a desired room can be more efficiently by using the graph.<br />
<br />
The mapping of a room is done by scanning the environment using the laser range scanner. Through this data lines are fitted. By using these lines, a room is fitted, giving the dimensions of the room and the locations of the doors.<br />
<br />
===Line extraction===<br />
A pre made laser line extraction algorithm was used, the source code can be found on<br />
https://github.com/kam3k/laser_line_extraction<br />
<br />
The code uses a split and merge algorithm to extract lines from laser data. This code was slightly modified to remove the ROS layer.<br />
<br />
[[File:Line_detection_Sim.png]] [[File:Line_detection_Lines.png]]<br />
<br />
===Angle estimation===<br />
The odometry on PICO gives an estimate of the orientation of PICO. However due to the nature of odometry this estimate will drift over time. Therefore an absolute measurement of the angle is necessary. This is done using the lines extracted by PICO. The hospital is contructed of perpendicular lines. This allows the angle to be estimated modulo <math>0.5 * pi</math>.<br />
<br />
A function was written which uses the lines from the line extraction to calculate the angle. The function does require an initial estimate of the angle to determine the general direction of the angle.<br />
<br />
===Merge Lines===<br />
To map a room pico needs to look 360 degrees around him, however the laser range finder only has a limited range. Therefore a PICO will scan lines, turn around 180 degrees and scan another time. It will then combine these two sets to end up with a set of lines which describe the entire room around PICO.<br />
<br />
In the figures below the two sets of lines can be seen. <br />
<br />
[[File:Transform_sim.png]] [[File:Transform_lines.png]]<br />
<br />
===Fit room===<br />
Once PICO has assembled a set of lines all around him he can determine the properties of the room he is in. This is done in two steps: First the dimensions of the room are found, then all the exits of the room are found. <br />
<br />
===Localisation===<br />
Once a room has been mapped. PICO will be able to compare the detected lines to the map it has made. Based on this picos location can be determined.<br />
<br />
==Trajectory Planning==<br />
This part plans the trajectory PICO should take during the Hospital Challenge.<br />
<br />
===Approaching a door===<br />
From the worldmodel PICO obtains his current position, and the position of the two corners of the door. A function is made which basically calculates a point right in the middle of the two corners, and puts a setpoint at a specified distance in front of the midpoint of the door. Using the PD-controller and the repulsion this setpoint can be reached by PICO.<br />
<br />
==Motion Control==<br />
This part makes sure that PICO moves as he should and follows the planned trajectory.<br />
<br />
===Repulsion===<br />
A function is implemented which keeps PICO from touching the walls. This is done using virtual repulsion forces. The repulsion force is calculated using the reciprocal of the laser scan data. The laser data is scanned over the entire range of the sensor. For each sensor reading a repulsion force is calculated. By adding up all the repulsion forces over the entire scan range a single force vector is obtained. By putting this 'force' directly into PICO's speed input, it will have the tendency to drive away from walls. A tuning parameter has been made in the form of a maximum distance in which PICO can approach a wall. All laser data points which are larger than this value are set to 10 meters, to ensure that the walls closest to PICO deliver the most 'force'. A virtual force is added in places where PICO does not have any sensor readings. This force is also made using the 10 meter bias, to ensure that when PICO is not near any walls, the repulsion force equals zero.<br />
<br />
===PD-control===<br />
In order to have PICO move from point A to point B a simple PD-controller has been implemented. For testing purposes the PD-controller currently relies on odometry data. The 'error' is calculated by subtracting the current position from the target position. The 'derivative' of the error is calculated by simply subtracting the new error from the old one. The error is multiplied with a proportional action, while the derivative of the error is multiplied with a derivative action. During testing these parameters will be tuned to ensure optimal behavior of PICO.<br />
<br />
===PD + Repulsion===<br />
The speed outputted by the PD-controller and the speed generated by the repulsion function are simultaneously used in the PICO speed command. This means that, for example, when PICO is closing in on a corner, the speed (depending on the direction in which PICO is oriented) is temporarily reduced in the direction of the walls, ensuring that PICO gets enough clearance before returning on his path. A problem arises however when a setpoint is located directly behind a wall. In this case PICO cannot reach his goal, as the PD-controller 'pulls' PICO towards the setpoint, while the repulsion 'pushes' PICO away from the walls. Therefore it is necessary to give PICO setpoints which he can roughly 'see'. The generation of these setpoints is handled in one of the previous sections.<br />
<br />
===Backward Parking===<br />
When the map building is complete, PICO has to park backwards to the wall behind the starting position. Parking is done upon touching the wall. After PICO parked, PICO should say: "I am parked!". <br />
<br />
This is done by letting PICO drive forward to the starting position and stopping in front of the wall. Then PICO will turn around such that he can drive backwards to the wall. Since PICO cannnot scan what is behind him, a diffrent method is used to see/feel the wall he should touch. This is done using the control effort. If the control effort becomes large enough, PICO will stop since this increase in control effort is caused by touching the wall. All in all, a short video will summarize the result far better, so let's watch the parking skills of PICO:<br />
<br />
[[File:BackwardParking.gif|thumb|center|480px|Backward parking.]]<br />
<br />
Note that this is a GIF, so you can't hear PICO say "I am parked!".</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2018_Group_3&diff=58173Embedded Motion Control 2018 Group 32018-06-04T21:28:19Z<p>S131974: /* Angle estimation */</p>
<hr />
<div>= Group Members =<br />
{| border="1" cellpadding="5" cellspacing="1" style="float:left;"<br />
! TU/e Number<br />
! Name<br />
! E-mail<br />
|- <br />
| 0848904<br />
| Luc (L.L.M.) van den Aker<br />
| l.l.m.v.d.aker at student.tue.nl<br />
|-<br />
| 0852908<br />
| Thomas (T.) Neilen<br />
| t.neilen at student.tue.nl <br />
|-<br />
| 0909434<br />
| Jeroen (J.W.) van de Valk<br />
| j.w.v.d.valk at student.tue.nl<br />
|-<br />
| 0896947<br />
| Nourdin (N.) Kaai<br />
| n.kaai at student.tue.nl<br />
|-<br />
| 0883056<br />
| Peter (P.) van Dooren<br />
| p.v.dooren at student.tue.nl<br />
|-<br />
| 0861750<br />
| Ties (T.J.) van Loon<br />
| t.j.v.loon at student.tue.nl<br />
|-<br />
|}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Initial Design=<br />
First off, the initial design itself is explained. After that, the report and presentation of it are shared. <br />
<br />
==Initial Design==<br />
===Requirements===<br />
* PICO should make no collisions with any walls<br />
* PICO cannot stand still for 30 seconds or longer<br />
* For the escape room challenge, the robot should leave the room within 5 minutes<br />
* For the hospital challenge, within 5 minutes, mapping, reverse parking and obtaining the object should be done<br />
* Its surroundings should be made visible in a map<br />
* PICO should be able to reach every position in the room<br />
* PICO should be able to leave every room<br />
* PICO should make distinction between the hall and rooms<br />
* It should run autonomously, so in each challenge there should be no additional input<br />
* To start your software, only one executable has to be called<br />
* PICO should be able to recognize an object and stand still close to it<br />
<br />
===Functions===<br />
* PICO should be able to drive in any direction<br />
* PICO should be able to turn around<br />
* It should be able to detect walls<br />
* PICO has to know its own position within the mapped map<br />
* PICO is able to construct a map<br />
* It should be possible to create a trajectory to a room<br />
* PICO should be able to recognize an object<br />
<br />
===Components===<br />
* Sensors:<br />
** Laser Range Finder (LRF)<br />
** Wheel encoders (odometry)<br />
* Actuator:<br />
** Holonomic base (omni-wheels)<br />
* Computer:<br />
** Intel i7<br />
** Ubuntu 16.04<br />
<br />
===Specifications===<br />
* Translation maximum: 0.5 m/s<br />
* Rotation maximum: 1.2 rad/s<br />
* Range of Laser Range Finder is assumed to be bigger than maximum room dimension<br />
* The field of view of the Laser Range Finder is from -2 rad to 2 rad, divided in pieces of 0.004004<br />
* The Laser Range Finder can only measure at one height<br />
<br />
===Interfaces===<br />
<br />
The interfaces of the initial design are shown here:<br />
<br />
[[File:InterfaceGroup3.png|300px|thumb|center|Interface of Group 3.]]<br />
<br />
As shown in Figure 1, a world model is the link between all other parts. The tasks represent the highest level, meaning the most global work PICO has to do. The skills are needed to complete these tasks and some motions together form a skill. The perception contains the sensors, the continuous data. Below an overview of the different parts are given:<br />
<br />
''World model:''<br />
* Compose map<br />
* Object recognition<br />
<br />
''Tasks:''<br />
* Mapping of the environment <br />
* Backward parking at the specified location<br />
* Searching for the object<br />
<br />
''Skills:''<br />
* Planning a trajectory<br />
* Collision avoidance<br />
* Backward parking<br />
* Navigate<br />
* Positioning in front of an opening<br />
* Compose maps<br />
<br />
''Motion:''<br />
* Translation <br />
* Rotation<br />
<br />
''Perception:''<br />
* Odometry <br />
* Laser Range Finder<br />
* Control effort<br />
<br />
==Report of Initial Design==<br />
Due to a misunderstanding, the report was not uploaded as a PDF yet. However, the full report was uploaded on this Wiki page (see below) before May 11th (17.00h), and now it is also uploaded as a PDF file (<1Mb). Our apologies for any inconvenience. The PDF of the report of the initial design can be found here: [[File:InitialDesign_Group3_Report.pdf]]<br />
<br />
==Presentation of Initial Design==<br />
On May 16th, all groups presnted their initial design. So we also presented our initial design and included two GIFs of our process so far. A PDF of the slides can be found here: [[File:InitialDesign_Group3_Presentation.pdf]]<br />
<br />
=Escape Room Challenge=<br />
Since our code to map a room was not finished completely, a new code for the Escape Room Challenge was made. This code was kept simple and effective. PICO should drive to a wall, turn to the left when it detects a wall within 0.4 meters from itself, and follow the wall (without hitting it of course). Then it will scan for a hallway to exit the room. When he sees a way to exit the room, PICO will go through the opening in the wall. <br />
<br />
Our first attempt during the Escape Room Challange was very successful! PICO drove out of the room, but we were convinced he could do it even faster. So we set the speed higher for the second try, and it was even faster. PICO drove out of the room within 29 seconds. This resulted in a second place and being one of the two teams that made it out of the room.<br />
<br />
Here a shot video is shown of PICO leaving a room. Note that this is not filmed during the 'official' Escape Room Challenge. Due to our enthousiasm, we forgot to film, so we reconstructed the room during one of our test sessions.<br />
<br />
[[File:EscapeRoomChallenge.gif|thumb|center|600px|The reconstruction of the Escape Room Challenge.]]<br />
<br />
=Hospital Challange=<br />
To succeed in this challenge, we have divided the the 'problem' into three parts. These are the three part:<br />
* Mapping<br />
* Trajectory planning<br />
* Motion control<br />
<br />
==Mapping==<br />
To build a map of the hospital a two fold mapping procedure will be used. First Pico will map the room it is currently standing in. The parameters of this room are then stored. Secondly a graph connecting all mapped routes with each other is build. By using this two level mapping abstraction it is easier to locate pico in a certain room. Also trajectory planning to a desired room can be more efficiently by using the graph.<br />
<br />
The mapping of a room is done by scanning the environment using the laser range scanner. Through this data lines are fitted. By using these lines, a room is fitted, giving the dimensions of the room and the locations of the doors.<br />
<br />
===Line extraction===<br />
A pre made laser line extraction algorithm was used, the source code can be found on<br />
https://github.com/kam3k/laser_line_extraction<br />
<br />
The code uses a split and merge algorithm to extract lines from laser data. This code was slightly modified to remove the ROS layer.<br />
<br />
[[File:Line_detection_Sim.png]] [[File:Line_detection_Lines.png]]<br />
<br />
===Angle estimation===<br />
The odometry on PICO gives an estimate of the orientation of PICO. However due to the nature of odometry this estimate will drift over time. Therefore an absolute measurement of the angle is necessary. This is done using the lines extracted by PICO. The hospital is contructed of perpendicular lines. This allows the angle to be estimated modulo <math>1/2 pi</math>.<br />
<br />
A function was written which uses the lines from the line extraction to calculate the angle. The function does require an estimate of the angle beforehand to determine the range of size <math>1/2 pi</math> which the angle could be.<br />
<br />
===Merge Lines===<br />
To map a room pico needs to look 360 degrees around him, however the laser range finder only has a limited range. Therefore a PICO will scan lines, turn around 180 degrees and scan another time. It will then combine these two sets to end up with a set of lines which describe the entire room around PICO.<br />
<br />
In the figures below the two sets of lines can be seen. <br />
<br />
[[File:Transform_sim.png]] [[File:Transform_lines.png]]<br />
<br />
===Fit room===<br />
Once PICO has assembled a set of lines all around him he can determine the properties of the room he is in. This is done in two steps: First the dimensions of the room are found, then all the exits of the room are found. <br />
<br />
===Localisation===<br />
Once a room has been mapped. PICO will be able to compare the detected lines to the map it has made. Based on this picos location can be determined.<br />
<br />
==Trajectory Planning==<br />
This part plans the trajectory PICO should take during the Hospital Challenge.<br />
<br />
===Approaching a door===<br />
From the worldmodel PICO obtains his current position, and the position of the two corners of the door. A function is made which basically calculates a point right in the middle of the two corners, and puts a setpoint at a specified distance in front of the midpoint of the door. Using the PD-controller and the repulsion this setpoint can be reached by PICO.<br />
<br />
==Motion Control==<br />
This part makes sure that PICO moves as he should and follows the planned trajectory.<br />
<br />
===Repulsion===<br />
A function is implemented which keeps PICO from touching the walls. This is done using virtual repulsion forces. The repulsion force is calculated using the reciprocal of the laser scan data. The laser data is scanned over the entire range of the sensor. For each sensor reading a repulsion force is calculated. By adding up all the repulsion forces over the entire scan range a single force vector is obtained. By putting this 'force' directly into PICO's speed input, it will have the tendency to drive away from walls. A tuning parameter has been made in the form of a maximum distance in which PICO can approach a wall. All laser data points which are larger than this value are set to 10 meters, to ensure that the walls closest to PICO deliver the most 'force'. A virtual force is added in places where PICO does not have any sensor readings. This force is also made using the 10 meter bias, to ensure that when PICO is not near any walls, the repulsion force equals zero.<br />
<br />
===PD-control===<br />
In order to have PICO move from point A to point B a simple PD-controller has been implemented. For testing purposes the PD-controller currently relies on odometry data. The 'error' is calculated by subtracting the current position from the target position. The 'derivative' of the error is calculated by simply subtracting the new error from the old one. The error is multiplied with a proportional action, while the derivative of the error is multiplied with a derivative action. During testing these parameters will be tuned to ensure optimal behavior of PICO.<br />
<br />
===PD + Repulsion===<br />
The speed outputted by the PD-controller and the speed generated by the repulsion function are simultaneously used in the PICO speed command. This means that, for example, when PICO is closing in on a corner, the speed (depending on the direction in which PICO is oriented) is temporarily reduced in the direction of the walls, ensuring that PICO gets enough clearance before returning on his path. A problem arises however when a setpoint is located directly behind a wall. In this case PICO cannot reach his goal, as the PD-controller 'pulls' PICO towards the setpoint, while the repulsion 'pushes' PICO away from the walls. Therefore it is necessary to give PICO setpoints which he can roughly 'see'. The generation of these setpoints is handled in one of the previous sections.<br />
<br />
===Backward Parking===<br />
When the map building is complete, PICO has to park backwards to the wall behind the starting position. Parking is done upon touching the wall. After PICO parked, PICO should say: "I am parked!". <br />
<br />
This is done by letting PICO drive forward to the starting position and stopping in front of the wall. Then PICO will turn around such that he can drive backwards to the wall. Since PICO cannnot scan what is behind him, a diffrent method is used to see/feel the wall he should touch. This is done using the control effort. If the control effort becomes large enough, PICO will stop since this increase in control effort is caused by touching the wall. All in all, a short video will summarize the result far better, so let's watch the parking skills of PICO:<br />
<br />
[[File:BackwardParking.gif|thumb|center|480px|Backward parking.]]<br />
<br />
Note that this is a GIF, so you can't hear PICO say "I am parked!".</div>S131974https://cstwiki.wtb.tue.nl/index.php?title=Embedded_Motion_Control_2018_Group_3&diff=58172Embedded Motion Control 2018 Group 32018-06-04T21:20:14Z<p>S131974: /* Merge Lines */</p>
<hr />
<div>= Group Members =<br />
{| border="1" cellpadding="5" cellspacing="1" style="float:left;"<br />
! TU/e Number<br />
! Name<br />
! E-mail<br />
|- <br />
| 0848904<br />
| Luc (L.L.M.) van den Aker<br />
| l.l.m.v.d.aker at student.tue.nl<br />
|-<br />
| 0852908<br />
| Thomas (T.) Neilen<br />
| t.neilen at student.tue.nl <br />
|-<br />
| 0909434<br />
| Jeroen (J.W.) van de Valk<br />
| j.w.v.d.valk at student.tue.nl<br />
|-<br />
| 0896947<br />
| Nourdin (N.) Kaai<br />
| n.kaai at student.tue.nl<br />
|-<br />
| 0883056<br />
| Peter (P.) van Dooren<br />
| p.v.dooren at student.tue.nl<br />
|-<br />
| 0861750<br />
| Ties (T.J.) van Loon<br />
| t.j.v.loon at student.tue.nl<br />
|-<br />
|}<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
=Initial Design=<br />
First off, the initial design itself is explained. After that, the report and presentation of it are shared. <br />
<br />
==Initial Design==<br />
===Requirements===<br />
* PICO should make no collisions with any walls<br />
* PICO cannot stand still for 30 seconds or longer<br />
* For the escape room challenge, the robot should leave the room within 5 minutes<br />
* For the hospital challenge, within 5 minutes, mapping, reverse parking and obtaining the object should be done<br />
* Its surroundings should be made visible in a map<br />
* PICO should be able to reach every position in the room<br />
* PICO should be able to leave every room<br />
* PICO should make distinction between the hall and rooms<br />
* It should run autonomously, so in each challenge there should be no additional input<br />
* To start your software, only one executable has to be called<br />
* PICO should be able to recognize an object and stand still close to it<br />
<br />
===Functions===<br />
* PICO should be able to drive in any direction<br />
* PICO should be able to turn around<br />
* It should be able to detect walls<br />
* PICO has to know its own position within the mapped map<br />
* PICO is able to construct a map<br />
* It should be possible to create a trajectory to a room<br />
* PICO should be able to recognize an object<br />
<br />
===Components===<br />
* Sensors:<br />
** Laser Range Finder (LRF)<br />
** Wheel encoders (odometry)<br />
* Actuator:<br />
** Holonomic base (omni-wheels)<br />
* Computer:<br />
** Intel i7<br />
** Ubuntu 16.04<br />
<br />
===Specifications===<br />
* Translation maximum: 0.5 m/s<br />
* Rotation maximum: 1.2 rad/s<br />
* Range of Laser Range Finder is assumed to be bigger than maximum room dimension<br />
* The field of view of the Laser Range Finder is from -2 rad to 2 rad, divided in pieces of 0.004004<br />
* The Laser Range Finder can only measure at one height<br />
<br />
===Interfaces===<br />
<br />
The interfaces of the initial design are shown here:<br />
<br />
[[File:InterfaceGroup3.png|300px|thumb|center|Interface of Group 3.]]<br />
<br />
As shown in Figure 1, a world model is the link between all other parts. The tasks represent the highest level, meaning the most global work PICO has to do. The skills are needed to complete these tasks and some motions together form a skill. The perception contains the sensors, the continuous data. Below an overview of the different parts are given:<br />
<br />
''World model:''<br />
* Compose map<br />
* Object recognition<br />
<br />
''Tasks:''<br />
* Mapping of the environment <br />
* Backward parking at the specified location<br />
* Searching for the object<br />
<br />
''Skills:''<br />
* Planning a trajectory<br />
* Collision avoidance<br />
* Backward parking<br />
* Navigate<br />
* Positioning in front of an opening<br />
* Compose maps<br />
<br />
''Motion:''<br />
* Translation <br />
* Rotation<br />
<br />
''Perception:''<br />
* Odometry <br />
* Laser Range Finder<br />
* Control effort<br />
<br />
==Report of Initial Design==<br />
Due to a misunderstanding, the report was not uploaded as a PDF yet. However, the full report was uploaded on this Wiki page (see below) before May 11th (17.00h), and now it is also uploaded as a PDF file (<1Mb). Our apologies for any inconvenience. The PDF of the report of the initial design can be found here: [[File:InitialDesign_Group3_Report.pdf]]<br />
<br />
==Presentation of Initial Design==<br />
On May 16th, all groups presnted their initial design. So we also presented our initial design and included two GIFs of our process so far. A PDF of the slides can be found here: [[File:InitialDesign_Group3_Presentation.pdf]]<br />
<br />
=Escape Room Challenge=<br />
Since our code to map a room was not finished completely, a new code for the Escape Room Challenge was made. This code was kept simple and effective. PICO should drive to a wall, turn to the left when it detects a wall within 0.4 meters from itself, and follow the wall (without hitting it of course). Then it will scan for a hallway to exit the room. When he sees a way to exit the room, PICO will go through the opening in the wall. <br />
<br />
Our first attempt during the Escape Room Challange was very successful! PICO drove out of the room, but we were convinced he could do it even faster. So we set the speed higher for the second try, and it was even faster. PICO drove out of the room within 29 seconds. This resulted in a second place and being one of the two teams that made it out of the room.<br />
<br />
Here a shot video is shown of PICO leaving a room. Note that this is not filmed during the 'official' Escape Room Challenge. Due to our enthousiasm, we forgot to film, so we reconstructed the room during one of our test sessions.<br />
<br />
[[File:EscapeRoomChallenge.gif|thumb|center|600px|The reconstruction of the Escape Room Challenge.]]<br />
<br />
=Hospital Challange=<br />
To succeed in this challenge, we have divided the the 'problem' into three parts. These are the three part:<br />
* Mapping<br />
* Trajectory planning<br />
* Motion control<br />
<br />
==Mapping==<br />
To build a map of the hospital a two fold mapping procedure will be used. First Pico will map the room it is currently standing in. The parameters of this room are then stored. Secondly a graph connecting all mapped routes with each other is build. By using this two level mapping abstraction it is easier to locate pico in a certain room. Also trajectory planning to a desired room can be more efficiently by using the graph.<br />
<br />
The mapping of a room is done by scanning the environment using the laser range scanner. Through this data lines are fitted. By using these lines, a room is fitted, giving the dimensions of the room and the locations of the doors.<br />
<br />
===Line extraction===<br />
A pre made laser line extraction algorithm was used, the source code can be found on<br />
https://github.com/kam3k/laser_line_extraction<br />
<br />
The code uses a split and merge algorithm to extract lines from laser data. This code was slightly modified to remove the ROS layer.<br />
<br />
[[File:Line_detection_Sim.png]] [[File:Line_detection_Lines.png]]<br />
<br />
===Angle estimation===<br />
Using the extracted lines the angle of pico can be found. <br />
<br />
===Merge Lines===<br />
To map a room pico needs to look 360 degrees around him, however the laser range finder only has a limited range. Therefore a PICO will scan lines, turn around 180 degrees and scan another time. It will then combine these two sets to end up with a set of lines which describe the entire room around PICO.<br />
<br />
In the figures below the two sets of lines can be seen. <br />
<br />
[[File:Transform_sim.png]] [[File:Transform_lines.png]]<br />
<br />
===Fit room===<br />
Once PICO has assembled a set of lines all around him he can determine the properties of the room he is in. This is done in two steps: First the dimensions of the room are found, then all the exits of the room are found. <br />
<br />
===Localisation===<br />
Once a room has been mapped. PICO will be able to compare the detected lines to the map it has made. Based on this picos location can be determined.<br />
<br />
==Trajectory Planning==<br />
This part plans the trajectory PICO should take during the Hospital Challenge.<br />
<br />
===Approaching a door===<br />
From the worldmodel PICO obtains his current position, and the position of the two corners of the door. A function is made which basically calculates a point right in the middle of the two corners, and puts a setpoint at a specified distance in front of the midpoint of the door. Using the PD-controller and the repulsion this setpoint can be reached by PICO.<br />
<br />
==Motion Control==<br />
This part makes sure that PICO moves as he should and follows the planned trajectory.<br />
<br />
===Repulsion===<br />
A function is implemented which keeps PICO from touching the walls. This is done using virtual repulsion forces. The repulsion force is calculated using the reciprocal of the laser scan data. The laser data is scanned over the entire range of the sensor. For each sensor reading a repulsion force is calculated. By adding up all the repulsion forces over the entire scan range a single force vector is obtained. By putting this 'force' directly into PICO's speed input, it will have the tendency to drive away from walls. A tuning parameter has been made in the form of a maximum distance in which PICO can approach a wall. All laser data points which are larger than this value are set to 10 meters, to ensure that the walls closest to PICO deliver the most 'force'. A virtual force is added in places where PICO does not have any sensor readings. This force is also made using the 10 meter bias, to ensure that when PICO is not near any walls, the repulsion force equals zero.<br />
<br />
===PD-control===<br />
In order to have PICO move from point A to point B a simple PD-controller has been implemented. For testing purposes the PD-controller currently relies on odometry data. The 'error' is calculated by subtracting the current position from the target position. The 'derivative' of the error is calculated by simply subtracting the new error from the old one. The error is multiplied with a proportional action, while the derivative of the error is multiplied with a derivative action. During testing these parameters will be tuned to ensure optimal behavior of PICO.<br />
<br />
===PD + Repulsion===<br />
The speed outputted by the PD-controller and the speed generated by the repulsion function are simultaneously used in the PICO speed command. This means that, for example, when PICO is closing in on a corner, the speed (depending on the direction in which PICO is oriented) is temporarily reduced in the direction of the walls, ensuring that PICO gets enough clearance before returning on his path. A problem arises however when a setpoint is located directly behind a wall. In this case PICO cannot reach his goal, as the PD-controller 'pulls' PICO towards the setpoint, while the repulsion 'pushes' PICO away from the walls. Therefore it is necessary to give PICO setpoints which he can roughly 'see'. The generation of these setpoints is handled in one of the previous sections.<br />
<br />
===Backward Parking===<br />
When the map building is complete, PICO has to park backwards to the wall behind the starting position. Parking is done upon touching the wall. After PICO parked, PICO should say: "I am parked!". <br />
<br />
This is done by letting PICO drive forward to the starting position and stopping in front of the wall. Then PICO will turn around such that he can drive backwards to the wall. Since PICO cannnot scan what is behind him, a diffrent method is used to see/feel the wall he should touch. This is done using the control effort. If the control effort becomes large enough, PICO will stop since this increase in control effort is caused by touching the wall. All in all, a short video will summarize the result far better, so let's watch the parking skills of PICO:<br />
<br />
[[File:BackwardParking.gif|thumb|center|480px|Backward parking.]]<br />
<br />
Note that this is a GIF, so you can't hear PICO say "I am parked!".</div>S131974