<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "UTF-8" >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< meta name = "generator" content = "Asciidoctor 2.0.10" >
< title > Smart & Autonomous Parking< / title >
< link rel = "stylesheet" href = "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700" >
< style >
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment @import statement to use as custom stylesheet */
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}
audio,video{display:inline-block}
audio:not([controls]){display:none;height:0}
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
a{background:none}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
abbr[title]{border-bottom:1px dotted}
b,strong{font-weight:bold}
dfn{font-style:italic}
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:0}
p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
abbr{text-transform:none}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
blockquote cite::before{content:"\2014 \0020"}
blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt{background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
:not(pre)>code.nobreak{word-wrap:normal}
:not(pre)>code.nowrap{white-space:nowrap}
pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed}
pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit}
pre>code{display:block}
pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:100%;background:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
details>summary:first-of-type{cursor:pointer;display:list-item;outline:none;margin-bottom:.75em}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border-style:solid;border-width:1px;border-color:#dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;-webkit-border-radius:4px;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock>.content>pre{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}}
.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class="highlight"],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8}
.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.prettyprint{background:#f7f7f8}
pre.prettyprint .linenums{line-height:1.45;margin-left:2em}
pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0}
pre.prettyprint li code[data-lang]::before{opacity:1}
pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none}
table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal}
table.linenotable td.code{padding-left:.75em}
table.linenotable td.linenos{border-right:1px solid currentColor;opacity:.35;padding-right:.5em}
pre.pygments .lineno{border-right:1px solid currentColor;opacity:.35;display:inline-block;margin-right:.75em}
pre.pygments .lineno::before{content:"";margin-right:-.125em}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
table.tableblock{max-width:100%;border-collapse:separate}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content>:last-child{margin-bottom:-1.25em}
td.tableblock>.content>:last-child.sidebarblock{margin-bottom:0}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px}
table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0}
table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
table.frame-all{border-width:1px}
table.frame-sides{border-width:0 1px}
table.frame-topbot,table.frame-ends{border-width:1px 0}
table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd),table.stripes-even tr:nth-of-type(even),table.stripes-hover tr:hover{background:#f8f8f7}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
ul.checklist{margin-left:.625em}
ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
.gist .file-data>table td.line-data{width:99%}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background:#00fafa}
.black{color:#000}
.black-background{background:#000}
.blue{color:#0000bf}
.blue-background{background:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background:#fa00fa}
.gray{color:#606060}
.gray-background{background:#7d7d7d}
.green{color:#006000}
.green-background{background:#007d00}
.lime{color:#00bf00}
.lime-background{background:#00fa00}
.maroon{color:#600000}
.maroon-background{background:#7d0000}
.navy{color:#000060}
.navy-background{background:#00007d}
.olive{color:#606000}
.olive-background{background:#7d7d00}
.purple{color:#600060}
.purple-background{background:#7d007d}
.red{color:#bf0000}
.red-background{background:#fa0000}
.silver{color:#909090}
.silver-background{background:#bcbcbc}
.teal{color:#006060}
.teal-background{background:#007d7d}
.white{color:#bfbfbf}
.white-background{background:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
< / style >
< / head >
< body class = "article" >
< div id = "header" >
< h1 > Smart & Autonomous Parking< / h1 >
< / div >
< div id = "content" >
< div id = "preamble" >
< div class = "sectionbody" >
< div class = "paragraph" >
< p > < strong > < em > Authors< / em > < / strong > < / p >
< / div >
< table class = "tableblock frame-all grid-all stretch" >
< colgroup >
< col style = "width: 50%;" >
< col style = "width: 50%;" >
< / colgroup >
< tbody >
< tr >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Ουλής Ευάγγελος< / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < a href = "mailto:cs151051@uniwa.gr" > cs151051@uniwa.gr< / a > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Ουλής Νικόλαος< / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < a href = "mailto:cs161079@uniwa.gr" > cs161079@uniwa.gr< / a > < / p > < / td >
< / tr >
< tr >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > Κατσίμπρας Δρόσος< / p > < / td >
< td class = "tableblock halign-left valign-top" > < p class = "tableblock" > < a href = "mailto:cs131110@uniwa.gr" > cs131110@uniwa.gr< / a > < / p > < / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< div class = "sect1" >
< h2 id = "_smart_parking" > 1. Smart Parking< / h2 >
< div class = "sectionbody" >
< div class = "paragraph" >
< p > Το "Smart Parking" Έξυπνο πάρκινγκ βασίζεται στη ιδέα όπου η κατάσταση του πάρκινγκ κοινοποιείται
μέσω ενός συνόλου hardware και software στο διαδίκτυο έτσι ώστε να πετύχουμε η κατάσταση του να είναι διαθέσιμη
"accesable" από το διαδίκτυο. Αυτό το χαρακτηριστικό κάνει αυτό το αντικειμένο μέρος του διαδικτύου και του κόσμου του IoT.< / p >
< / div >
< div class = "paragraph" >
< p > < strong > Η υλοποίηση του Smart Parking χωρίζεται σε 4 βασικά μέρη:< / strong > < / p >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > Το 1< sub > ο< / sub > μέρος αποτελείται από ένα σύνολο αισθητήρων (ultrasonic) που εγκαθιστούνται σε κάθε θέση parking (sensor) και
έναν μικροελεγκτή (Arduino Uno), έτσι ώστε να ανιχνεύει και να κωδικοποιεί για μία συγκεκριμένη θέση έαν υπάρχει
κάποιο όχημα ή όχι.< / p >
< / li >
< / ul >
< / div >
< div class = "admonitionblock note" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-note" title = "Note" > < / i >
< / td >
< td class = "content" >
< div class = "title" > Φάκελος Κώδικα< / div >
< div class = "paragraph" >
< p > < a href = "https://git.swarmlab.io:3000/cs151051/smartParking/src/branch/master/sensorNode/sensorNode.ino" class = "bare" > https://git.swarmlab.io:3000/cs151051/smartParking/src/branch/master/sensorNode/sensorNode.ino< / a > < / p >
< / div >
< / td >
< / tr >
< / table >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > Το 2< sub > ο< / sub > μέρος αποτελείται από τον συσκευή gateway σε Raspberry Pi1, η οποία διαβάζει στη σειριακή του
τη πληροφορία από το Arduino Uno, που κάνει "sense" μία θέση parking, και στέλνει αυτή την πληροφορία
σε έναν web server με χρήση REST API.< / p >
< / li >
< / ul >
< / div >
< div class = "admonitionblock note" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-note" title = "Note" > < / i >
< / td >
< td class = "content" >
< div class = "title" > Φάκελος Κώδικα< / div >
< div class = "paragraph" >
< p > < a href = "https://git.swarmlab.io:3000/cs151051/smartParking/src/branch/master/gatewayNode" class = "bare" > https://git.swarmlab.io:3000/cs151051/smartParking/src/branch/master/gatewayNode< / a > < / p >
< / div >
< / td >
< / tr >
< / table >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > To 3< sub > o< / sub > μέρος αποτελείται από τον WEB Server ο οποίος αποτελείται από ένα process υλοποιημένο σε γλώσσα προγραμματιμού python.
Το proccess αυτό υλοποιεί έναν REST API WEB Server έτσι ώστε να μπορεί να αποθηκεύει την κατάσταση κάθε θέσης parking σε μία βάση
δεδομένων δύο δομή λίστας με χαρακτηριστικό κλειδί τον κωδικό κάθε θέσης parking.< / p >
< / li >
< / ul >
< / div >
< div class = "admonitionblock note" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-note" title = "Note" > < / i >
< / td >
< td class = "content" >
< div class = "title" > Φάκελος Κώδικα< / div >
< div class = "paragraph" >
< p > < a href = "https://git.swarmlab.io:3000/cs151051/smartParking/src/branch/master/serverNode" class = "bare" > https://git.swarmlab.io:3000/cs151051/smartParking/src/branch/master/serverNode< / a > < / p >
< / div >
< / td >
< / tr >
< / table >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > Το 4< sub > o< / sub > μέρος αποτελείται από την διεπαφή χρήστη (Interface), η οποία μέσω WEB σελίδας βλέπει κανείς την κατάσταση
του parking, δηλαδή πόσες και ποιές θέσεις μέσα στον χώρο είναι ελεύθερες.< / p >
< / li >
< / ul >
< / div >
< div class = "admonitionblock note" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-note" title = "Note" > < / i >
< / td >
< td class = "content" >
< div class = "title" > Φάκελος Κώδικα< / div >
< div class = "paragraph" >
< p > < a href = "https://git.swarmlab.io:3000/cs151051/smartParking/src/branch/master/webInterface" class = "bare" > https://git.swarmlab.io:3000/cs151051/smartParking/src/branch/master/webInterface< / a > < / p >
< / div >
< / td >
< / tr >
< / table >
< / div >
< div class = "sect2" >
< h3 id = "_parking_sensor_node_1ο_μέρος" > 1.1. Parking Sensor Node (1< sub > ο< / sub > μέρος)< / h3 >
< div class = "sect3" >
< h4 id = "_υλικά_κόμβου" > 1.1.1. Υλικά Κόμβου< / h4 >
< div class = "ulist" >
< ul >
< li >
< p > 1 x Arduino Uno< / p >
< / li >
< li >
< p > 1 x Red led< / p >
< / li >
< li >
< p > 1 x Blue led< / p >
< / li >
< li >
< p > 8 x links< / p >
< / li >
< li >
< p > 1 x Ultrasonic Sensor< / p >
< / li >
< / ul >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_υλοποίηση_του_parking_sensor" > 1.1.2. Υλοποίηση του Parking Sensor< / h4 >
< div class = "paragraph" >
< p > Σε κάθε θέση parking υπάρχει ένας κόμβος που αποτελείται από ένα Arduino Uno και έναν αισθητήρα
απόστασης (ultrasonic) εγκατεστημένο πάνω σε μικροελεγκτή Arduino Uno. Η λειτουργία αυτού βασίζεται στην
ανίχνευση ύπαρξης οχήματος στην αντίστοιχη θέση μέσω μέτρησης της απόστασης από τον αισθητήρα μέχρι
κάποιο αντικείμενο (πιθανό αυτοκίνητο) που εμποδίσει τη θέση του parking, καθώς και την εξαγωγή της
κατάστασης της αντίστοιχης θέσης στη σειριακή θύρα του Arduino.< / p >
< / div >
< div class = "openblock float-group" >
< div class = "content" >
< div class = "imageblock left" >
< div class = "content" >
< img src = "data:image/jpg;base64,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
< / div >
< div class = "title" > Figure 1. Ο κόμβος αντιλαμβάνεται παρουσία οχήματος στη θέση.< / div >
< / div >
< div class = "imageblock right" >
< div class = "content" >
< img src = "data:image/jpg;base64,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
< / div >
< div class = "title" > Figure 2. Ο κόμβος αντιλαμβάνεται κενή θέση.< / div >
< / div >
< / div >
< / div >
< div class = "paragraph" >
< p > Ο κόμβος διαθέτει επιπλέον δύο leds ένα κόκκινο και ένα μπλε, σαν έξοδο της κατάστασης
της θέσης του parking για τον οποίο είναι υπεύθυνος. Με κόκκινο χαρακτηρίζεται η θέση που είναι
δεσμευμένη από ένα όχημα και με μπλε η ελεύθερη θέση, όπως φαίνεται στις παραπάνω εικόνες.< / p >
< / div >
< div class = "openblock float-group" >
< div class = "content" >
< div class = "imageblock center" >
< div class = "content" >
< img src = "data:image/png;base64,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
< / div >
< div class = "title" > Figure 3. Παρουσίαση ενός σχηματικού του κυκλώματος.< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_προγραμματισμός_κόμβου" > 1.1.3. Προγραμματισμός Κόμβου< / h4 >
< div class = "paragraph" >
< p > Για τον προγραμματισμό του Arduino Uno χρησιμοποιήσαμε μία σειριακή σύνδεση του μικροελεγκτή με τον
υπολογιστή μας ο οποίος έφερε εγκατεστημένο το IDE του Arduino στον οποίο υπήρχαν όλες οι απαραίτητες
βιβλιοθήκες για την υλοποίηση του. Η διαδικασία "καψίματος" ενός μικροελεγκτή Arduino είναι πολύ απλή.
Το μόνο που χρειάζεται να κάνει κανείς είναι να δώσει δικαιώματα γραψήματος και ανάγνωσης στην συσκευή
ttyACM0 που βρίσκεται στο directory (/dev/ στα linux) και λίγες γνώσεις από κώδικα.< / p >
< / div >
< div class = "paragraph" >
< p > Η γλώσσα του Arduino είναι γλώσσα που μοιάζει πάρα πολύ με τη C.< / p >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_λειτουργία_του_parking_sensor" > 1.1.4. Λειτουργία του Parking Sensor< / h4 >
< div class = "paragraph" >
< p > Κάθε κόμβος στέλνει στην σειριακή του τον κωδικό της θέσης, με τον οποίο έχει προγραμματιστεί το Arduino,
και την κατάσταση του parking, κωδικοποιημένα με τον διαχωριστή "#". Για την κατάσταση του parking ορίζουμε
με "1" ότι η θέση είναι ελεύθεση και με "0" ότι η θέση είναι δεσμευμένη. Ο έλεγχος του sensor γίνεται κάθε
500ms. Η έξοδος στη σειριακή γίνεται με την μορφή μίας συμβολοσειράς "string".< / p >
< / div >
< div class = "paragraph" >
< p > < κωδικός θέσης> #< διαθεσιμότητα 0 ή 1> < / p >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_διασύνδεση_κόμβου" > 1.1.5. Διασύνδεση Κόμβου< / h4 >
< div class = "paragraph" >
< p > Ο κόμβος αυτός συνδέεται με ένας "Gateway" κόμβο (βασισμένος σε Raspberry Pi) ο οποίος είναι υπεύθυνος για την
μετάδοση της πληροφορίας στο διαδίκτυο. Η πληροφορία αυτή λαμβάνεται στον "Gateway" κόμβο ο οποίος στη συνέχεια
την αποκωδικοποιεί με βάση το πρότυπο < κωδικός θέσης> #< διαθεσιμότητα> και την αποστέλει σε έναν WEB server μέσω του διαδικτύου.< / p >
< / div >
< / div >
< / div >
< div class = "sect2" >
< h3 id = "_gateway_node_2ο_μέρος" > 1.2. Gateway Node (2< sub > ο< / sub > μέρος)< / h3 >
< div class = "sect3" >
< h4 id = "_υλικά_κόμβου_2" > 1.2.1. Υλικά Κόμβου< / h4 >
< div class = "ulist" >
< ul >
< li >
< p > 1 x Raspberry Pi 1< / p >
< / li >
< li >
< p > 1 x Serial Link (Connects to Arduino)< / p >
< / li >
< li >
< p > 1 x Power Link (Micro Usb)< / p >
< / li >
< li >
< p > 1 x micro SD (Loaded with Raspbian OS)< / p >
< / li >
< li >
< p > 1 x Ethernet Link (Connects to nearest Network) or WiFi adapter< / p >
< / li >
< / ul >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_υλοποίηση_gateway_κόμβου" > 1.2.2. Υλοποίηση Gateway Κόμβου< / h4 >
< div class = "paragraph" >
< p > Η υλοποίηση αποτελείται από την εγκατάσταση του Raspbian OS (light version) στο Raspberry και τη δημιουργία ενός proccess
σε γλώσσα Python (v3). Το process αυτό διαβάζει από την σειριακή θύρα του την πληροφορία που λαμβάνει από ένα Arduino Uno με
την μορφή < κωδικός θέσης> #< διαθεσιμότητα 0 ή 1> . Ύστερα αποκωδικοποιεί αυτή την πληροφορία, η οποία περιγράφει τον κωδικό της θέσης
και την διαθεσιμότητα της, και την αποστέλει μέσω ενός REST API με την μέθοδο POST σε έναν WEB Server. Για να αποσταλεί η πληροφορία
στον WEB Server πρέπει να πάρει την μορφή JSON (JavaScript Object Notation) και να έχει αυθεντικοποιηθεί από αυτό (** βλέπε παρακάτω).< / p >
< / div >
< div class = "paragraph" >
< p > Η μέθοδος του [POST] γίνεται στην περίπτωσή που η κατάσταση του Parking μεταβληθεί. Σε αντίθετη περίπτωση ο Server δεν ενημερώνεται.< / p >
< / div >
< div class = "paragraph" >
< p > Στον ίδιο φάκελο του κώδικα βρίσκεται ένα configuration αρχείο το οποίο περιέχει κάποιες ρυθμίσεις του κόμβουσε μορφή JSON.
Οι ρυθμίσεις αυτές αφορούν ουσιαστικά την IP και την πόρτα του WEB Server που ένας τέτοιος κόμβος θα πρέπει να επικοινωνεί,
τα στοιχεία αυθεντικοποίησής του καθώς και τον κωδικό της θέσης του parking που εξυπηρετεί. Το αρχείο θα έχει τη μορφή:< / p >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-JSON" data-lang = "JSON" > {
"ip": "iot-smart-parking.herokuapp.com",
"port": "443",
"username": "root",
"password": "root",
"device": 1
}< / code > < / pre >
< / div >
< / div >
< div class = "paragraph" >
< p > Μετά της αυθεντικοποίηση του από τον Server τότε λαμβάνει ένα μύνημα το οποίο περιέχει το Session ID το οποίο χρησιμοποιεί
για την μετέπειτα επικοινωνία με αυτόν. Η απάντηση του αιτήματος αυθεντικοποίησης έχει την παρκάτω μορφή.< / p >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-JSON" data-lang = "JSON" > {
"cookie": "8yhuxQL0iCid++BPZFXPM959EclBhDmvvrZrqt+yv1s="
}< / code > < / pre >
< / div >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_προγραμματισμός_κόμβου_2" > 1.2.3. Προγραμματισμός Κόμβου< / h4 >
< div class = "paragraph" >
< p > Ο επικοινωνία και ο προγραμματισμός του κόμβου αυτού, που είναι βασισμένος σε ένα Raspberry Pi 1, έγινε με σύνδεση (ssh)
έχοντας βέβαια και οι δύο (Raspberry και εμείς) πρόσβαση στο ίδιο δίκτυο. Η γλώσσα που χρησιμοποιήσαμε για τον έλεγχο
της σειριακής θύρας και την επικοινωνία του με ένα REST WEB Server ήταν η Python (version 3).< / p >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_διασύνδεηση_στο_διαδίκτυο" > 1.2.4. Διασύνδεηση στο Διαδίκτυο< / h4 >
< div class = "paragraph" >
< p > Ο κόμβος Gateway έχει διασύνδεση με το διαδίκτυο μέσω ενός καλωδίου Ethernet (UTP) έτσι ώστε να μπορέσει
να στείλει την πληροφορία που παράγει από τα δεδομένα του μικροελεγκτή Arduino (sensor) στο διαδίκτυο, δηλαδή
στον REST WEB Server. Από την άλλη επικοινωνεί με το Arduino με μία σειριακή σύνδεση.< / p >
< / div >
< / div >
< / div >
< div class = "sect2" >
< h3 id = "_server_node_3ο_μέρος_κεντρικός_server_όπου_κρατά_την_κατάσταση_της_κάθε_θέσης_του_parking" > 1.3. Server Node (3< sub > ο< / sub > μέρος - Κεντρικός Server όπου κρατά την κατάσταση της κάθε θέσης του Parking)< / h3 >
< div class = "paragraph" >
< p > Ο κόμβος αυτός υλοποιεί ένα process γραμμένο σε γλώσσα προγραμματισμού Python (v3). Αυτό το process υλοποιεί ένα
REST API έτσι ώστε να μπορούν να επικοινωνούν εύκολα οι Gateway κόμβοι μας με αυτόν. Στην είσοδό του και στην έξοδό του
η πληροφορία έχει την μορφή JSON.< / p >
< / div >
< div class = "paragraph" >
< p > Ο Server αποθηκεύει όλα τα απαραίτητα δεδομένα σε μία σχεσιακή βάση δεδομένων MySQL, η οποία διαθέτει έναν πίνακα.
Ο πίνακας κρατά όλα τα απαραίτητα πεδία που είναι:< / p >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > Τον κωδικό της θέσης parking< / p >
< / li >
< li >
< p > Την διαθεσιμότητά της αντίστοιχης θέση (0 ή 1)< / p >
< / li >
< / ul >
< / div >
< div class = "paragraph" >
< p > Ακόμα υπάρχει και ένας δεύτερος πίνακας σε αυτή που έχει καταχωρημένα στοιχεία αυθεντικοποίησης που μπορεί να
χρησιμοποιήσει ένας κόμβος (Gateway Node) για να μπορεί να ενημερώνει την κατάσταση μίας θέσης Parking. Ο πίνακας
αυτός έχει τα απαραίτητα πεδία:< / p >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > Τον κωδικό του χρήστη.< / p >
< / li >
< li >
< p > Το όνομα χρήστη (username).< / p >
< / li >
< li >
< p > Έναν κωδικό πρόσβασης (password).< / p >
< / li >
< / ul >
< / div >
< div class = "paragraph" >
< p > Τέλος σε έναν τρίτο πίνακα καταχωρούμε ένα ιστορίκό για την διαθεσιμότητα άρα και για την ζήτηση που έχει το parking.
Ελέγχοντας κάθε φορά που αλλάζει η κατάσταση μίας θέσης του parking, το πλήθος των ελεύθερων θέσεων, το καταχωρούμε
σε αυτόν τον πίνακα σε συνδυασμό με ένα timestamp, εκείνης τις στιγμής.< / p >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-sql" data-lang = "sql" > CREATE TABLE IF NOT EXISTS PARKING (
PARKING_CODE INT(4) NOT NULL UNIQUE,
PARKING_STATUS BOOLEAN NOT NULL
);
CREATE TABLE IF NOT EXISTS USERS (
USER_NO INT(4) AUTO_INCREMENT,
USER_NAME VARCHAR(40) NOT NULL UNIQUE,
USER_PASS VARCHAR(40) NOT NULL,
PRIMARY KEY(USER_NO)
);
CREATE TABLE IF NOT EXISTS PARKING_USAGE (
PARKING_USAGE_NO INT(10) AUTO_INCREMENT,
PARKING_METER INT(10) NOT NULL,
PARKING_DATE DATETIME NOT NULL,
PRIMARY KEY(PARKING_USAGE_NO)
);< / code > < / pre >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_υλοποίηση_κόμβου" > 1.3.1. Υλοποίηση Κόμβου< / h4 >
< div class = "paragraph" >
< p > Για τον προγραμματισμό του κόμβου επιλέχθηκε η γλώσσα προγραμματισμού Python (version 3). Για την υλοποίηση του WEB Server
χρησιμοποιήσαμε ένα WSGI και συγκεκριμένα το FLASK module της Python. Για την εκτέλεσή του έχουμε δύο υλοποιήσεις. Τη μία
που είναι με το FLASK όπου η εκτέλεση θα πραγματοποιηθεί σε έναν από τους υπολογιστές μας και η άλλη που είναι με gunicorn-
WEB Server στη Python όπου η εκτέλεση θα πραγματοποιηθεί σε μία υπηρεσία του Heroku.< / p >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_προγραμματισμός_rest_api_web_server" > 1.3.2. Προγραμματισμός REST API WEB Server< / h4 >
< div class = "paragraph" >
< p > Το REST API ενεργοποιεί δύο (τρεις) υπηρεσίες. Αυτές είναι:< / p >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > / [GET]: επιστρέφει ένα Array από JSON objects, ένα JSON για κάθε θέση του parking αν είναι διαθέσιμη ή όχι κωδικοποιημένα με 0 ή 1.
Τα δεδομένα που επιστρέφει γίνονται fetch από τη βάση δεδομένων.< / p >
< / li >
< / ul >
< / div >
< div class = "paragraph" >
< p > Για παράδειγμα:< / p >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-json" data-lang = "json" > [{"no": 1, "status": false}, {"no": 2, "status": false}, {"no": 3, "status": false}, {"no": 4, "status": true}, {"no": 5, "status": false}, {"no": 6, "status": false}, {"no": 7, "status": false}, {"no": 8, "status": false}]< / code > < / pre >
< / div >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > /chart [GET]: επιστρέφει ένα array από JSON objects, το καθένα από τα οποία εκφράζουν το πλήθως των ελεύθερων parking και
το αντίστοιχο timestamp της ενημέρωσης. Αυτή η υπηρεσία θα μας βοηθήσει στο να σχεδιάσουμε ένα γράφημα με ματρήσεις ενός 24 ώρου,
της ημέρας.< / p >
< / li >
< / ul >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-json" data-lang = "json" > [
{
"usage": 6,
"time": "2020-01-23 01:15:52"
},
{
"usage": 1,
"time": "2020-01-23 01:22:29"
},
{
"usage": 0,
"time": "2020-01-23 01:22:33"
},
{
"usage": 1,
"time": "2020-01-23 01:23:01"
}
]< / code > < / pre >
< / div >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > /parkingStatus [POST] (content-type = "application/json"): που μας επιτρέπει να αλλάξουμε την κατάσταση μίας θέσης parking. Στο POST τα δεδομένα
ορίζονται στο body σε αναπαράσταση JSON, έτσι ώστε ο Server να είναι ικανός να τα επεξεργαστεί και να τα αποθηκεύσει
στη βάση δεδομένων που χρησιμοποιούμε.< / p >
< / li >
< / ul >
< / div >
< div class = "paragraph" >
< p > Για παράδειγμα:< / p >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-json" data-lang = "json" > {"no": 2, "status": false}< / code > < / pre >
< / div >
< / div >
< div class = "paragraph" >
< p > Ακόμα το REST API υλοποιεί μηχανιμσό αυθεντικοποίησης έτσι ώστε οι μεταβολές-ενημερώσεις των θέσεων του parking
να γίνονται μόνο από τους εξουσιοδοτημένους κόμβους του συστήματος. Αυτό επιτυγχάνεται με την ενεργοποίηση μίας
υπηρεσίας όπως περιγράφεται παρακάτω:< / p >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > /authentication [POST] (content-type = "application/json): Η υπηρεσία αυτή κάνει register ένα Session σε κάθε
εξουσιοδοτημένο κόμβο ο οποίος αυθεντικοποιείται από τον Server με username και password. Όταν ο server αυθεντικοποιήσει
έναν κόμβο τότε ορίζει για αυτόν ένα χαρακτηριστικό που είναι ο κωδικός της θέσης που βρίσκεται, και ο Server του γυρνάει
ένα Session_id. Με βάση αυτό το κλειδί μπορεί ο κάθε (εξουσιοδοτημένος) κόμβος να χρησιμοποιήσει μία τέτοια υπηρεσία
όπως αυτή της καταχώρησης της διαθεσιμότητας κάθε θέσης από τους κόμβους αντίστοιχα.< / p >
< / li >
< / ul >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_εκτέλεση_του_process_στο_cloud" > 1.3.3. Εκτέλεση του Process στο Cloud< / h4 >
< div class = "paragraph" >
< p > Για την εκτέλεση του process χρησιμοποιούμε μία πλατφόρμα IAAS (Infrastructure as a Service) -
< a href = "https://www.heroku.com/platform" > Heroku< / a > , για την οποιά μπορούμε να βρούμε περεταίρω πληροφορίες στον σύνδεσμο
παραπάνω.< / p >
< / div >
< div class = "paragraph" >
< p > Η πλατφόρμα μας επιτρέπει να ανεβάσουμε τον κώδικα του Server μας (Python) και να τον εκτελέσουμε στο Cloud.< / p >
< / div >
< div class = "paragraph" >
< p > Στην δωρεάν έκδοσή του δεν έχουμε περιορισμούς στο τμήμα του HTTP service που εκτελούμε, ενώ στη βάση δεδομένων
υπάρχουν περιοριμοί στις συνδέδεις που μπορούν να γίνουν ανα κάποιο χρονικό διάστημα (περίπου 10 συνδέσει ανα 1 ώρα) και ένας
αριθμός Query (~3500) ανά 1~2 ώρες.< / p >
< / div >
< div class = "paragraph" >
< p > Στα πλαίσια της άσκησης δεν θα δημιουργηθεί κάποιο πρόβλημα όσων αφορά την εκτέλεση του κεντρικού Server στο Cloud.< / p >
< / div >
< div class = "openblock float-group" >
< div class = "content" >
< div class = "imageblock center" >
< div class = "content" >
< img src = "data:image/png;base64,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
< / div >
< div class = "title" > Figure 4. Describe Infrastructure as a Service as an example.< / div >
< / div >
< / div >
< / div >
< div class = "paragraph" >
< p > Για το deployment εκτελούμε ένα σύνολο βημάτων τα οποία αποτελούνται από την ανάρτηση του κώδικα
σε ένα repository του < a href = "https://github.com/oulievancs/serverNode" > GitHub< / a > και την δημιουργία ενός project στην πλατφόρμα Heroku.
, < a href = "https://stackabuse.com/deploying-a-flask-application-to-heroku/" > περισσότερα για το deployment εδώ< / a > . Ακόμα
εγκαθισούμε στο project που μόλις φτιάξαμε μία MySQL βάση δεδομένων για να μπορούμε να αποθηκεύσουμε τα δεδομένα μας.< / p >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_deployment" > 1.3.4. Deployment< / h4 >
< div class = "ulist" >
< ul >
< li >
< p > Το πρώτο πράγμα που χρειαζόμαστε είναι όλες οι απαραίτητες βιβλιοθήκες που χρησιμοποιεί ο κώδικας, έτσι ώστε να γνωρίζει
το Heroku τι να μας προσφέρει. Αυτό επιτυγχάνεται με την αρχειοθέτηση αυτών σε ένα αρχείο με όνομα requirements.txt .< / p >
< / li >
< / ul >
< / div >
< div class = "paragraph" >
< p > Το αρχείο που περιέχει όλα τα απαραίτητα modules για τον κώδικά μας είναι:< / p >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-text" data-lang = "text" > flask
flask_restful
flask_cors
gunicorn==19.9.0
mysql-connector< / code > < / pre >
< / div >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > Έπειτα την δημιουργία ενός αρχείου που περιγράφει το που βρίσκεται η κύρια συνάρτηση μας (main) για την
έναρξη του process. Αυτό το αρχείο ονομάζεται Procfile . Στο αρχείο αυτό αναφέτεται ένα gunicorn module.
Το gunicorn είναι ένα Python HTTP WEB server. Αυτό ουσιαστικά είναι ο πυρήνας για την εκτέλεση του REST API μας.< / p >
< / li >
< li >
< p > Έπειτα με μια απομακρυσμένη σύνδεση στη βάση μας της οποίας τα στοιχεία πρόσβασης γίνονται στο Heroku,
πραγματοποιούμε μία σύνδεση και δημιουργούμε τον πίνακά μας για την αποθήκευση.< / p >
< / li >
< li >
< p > Τέλος το αρχείο Procfile το οποίο περιέχει το αρχείο το οποίο φορτώσει το gunicorn το οποίο έχει τη μορφή:< / p >
< / li >
< / ul >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-conf" data-lang = "conf" > web: gunicorn serv:app --preload --timeout 150000< / code > < / pre >
< / div >
< / div >
< div class = "admonitionblock note" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-note" title = "Note" > < / i >
< / td >
< td class = "content" >
< div class = "title" > Gunicorn< / div >
< div class = "paragraph" >
< p > Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. It’ s a pre-fork worker model. The Gunicorn server is broadly compatible with various web frameworks, simply implemented, light on server resources, and fairly speedy.< / p >
< / div >
< div class = "paragraph" >
< p > Source: < a href = "https://gunicorn.org" class = "bare" > https://gunicorn.org< / a > < / p >
< / div >
< / td >
< / tr >
< / table >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > Έπειτα με μια απομακρυσμένη σύνδεση στη βάση μας της οποίας τα στοιχεία πρόσβασης δίνονται από Heroku,
πραγματοποιούμε μία σύνδεση και δημιουργούμε τον πίνακά μας για την αποθήκευση των δεδομένων.< / p >
< / li >
< / ul >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_σε_άλλη_περίπτωση_deployment_στο_localhost" > 1.3.5. Σε άλλη περίπτωση Deployment στο Localhost< / h4 >
< div class = "paragraph" >
< p > Στην περίπτωση όπου η πλατφόρμα Heroku μας περιορίζει στα ερωτήματα στη βάση δεδομένων που χρησιμοποιούμε
κάνουμε deploy της εφαρμογής στον localhost. Για να το επιτύχουμε αυτό θα εκτελέσουμε τις εξής εντολές στο
terminal.< / p >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-script" data-lang = "script" > export FLASK_APP=serv
export FLASK_DEBUG=1
flask run --host=[IP-v4] --port=8080< / code > < / pre >
< / div >
< / div >
< / div >
< / div >
< div class = "sect2" >
< h3 id = "_διεπαφή_χρήστη_4ο_μέρος" > 1.4. Διεπαφή Χρήστη (4< sub > ο< / sub > μέρος)< / h3 >
< div class = "sect3" >
< h4 id = "_η_διεπαφή_του_χρήστη" > 1.4.1. Η διεπαφή του χρήστη< / h4 >
< div class = "paragraph" >
< p > Η διεπαφή του χρήστη αποτελείται από μία HTML σελίδα η οποία ενσωματώνει δύο JavaScript Processes.
Σκοπός αυτής είναι η αναπαράσταση της κατάστασης του Parking σε ένα γραφικό, φιλικό προς τον χρήστη περιβάλλον.
Η σελίδα λοιπόν επεικονίζει για κάθε θέση parking με χρώμα κόκκινο την "μη ελεύθεση" και με πράσινο την "ελεύθερη".< / p >
< / div >
< div class = "paragraph" >
< p > Ακόμα, μέσω της υπηρεσία /charts [GET] του REST API, απεικονίσεται ένα διάγραμμα με βάση την διαθεσιμότητα του parking
το τελευταίο 24 ώρο, πιο συσκεκριμένα την τελευταία μέρα.< / p >
< / div >
< div class = "paragraph" >
< p > Ένα παράδειγμα μέσω στιγμιοτύπου παρουσιάζεται παρακάτω.< / p >
< / div >
< div class = "openblock float-group" >
< div class = "content" >
< div class = "imageblock center" >
< div class = "content" >
< img src = "data:image/png;base64,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
< / div >
< div class = "title" > Figure 5. Στιγμιότυπο παραδείγματος εκτέλεσης της διεπαφής χρήστη.< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "sect1" >
< h2 id = "_autonomous_parking" > 2. Autonomous Parking< / h2 >
< div class = "sectionbody" >
< div class = "paragraph" >
< p > Το αυτόνομο παρκάριμα αποτελείται από το όχημα με εγκατεστημένους τους απαραίτητους αισθητήρες και ελεγκτές
καθώς & έναν μικροελεγκτή (Arduino) για τον έλεγχο αυτών των ελεγκτών και ένα Raspberry Pi1. Σκοπός είναι το όχημα να μπορεί
να μάθει μέσω του διαδικτύου το "Status" του parking και να παρκάρει στην 1η διαθέσιμη θέση εφ' όσων
υπάρχει μία τουλάχιστoν διαθέσιμη θέση στον χώρο στάθμευσης.< / p >
< / div >
< div class = "paragraph" >
< p > < strong > Η υλοποίηση του αυτόνομου parking χωρίζεται σε δύο βασικά μέρη.< / strong > < / p >
< / div >
< div class = "ulist" >
< ul >
< li >
< p > Το 1< sub > ο< / sub > μέρος αποτελείται από τον μικροελεγκτή για τον έλεγχο των αισθητήρων και των κινητήρων του οχήματος και
εκτελώντας τα απαραίτητα βήματα, να μπορέσει να παρκάρει το όχημα.< / p >
< / li >
< li >
< p > Το 2< sub > ο< / sub > μέρος αποτείται από τον κόμβο ο οποίος θα έχει πρόσβαση στο διαδίκτυο, όπου αφού ελέγξει αν υπάρχει
διαθέσιμη θέση και γνωρίζει ποια είναι η πρώτη ελεύθερη θέση, να δώσει εντολή στον μικροελεγκτή να παρκάρει σε αυτή.< / p >
< / li >
< / ul >
< / div >
< div class = "sect2" >
< h3 id = "_microcotroller_and_car_1ο_μέρος" > 2.1. Microcotroller and Car (1< sub > ο< / sub > Μέρος)< / h3 >
< div class = "sect3" >
< h4 id = "_υλικά_κόμβου_3" > 2.1.1. Υλικά Κόμβου< / h4 >
< div class = "ulist" >
< ul >
< li >
< p > 1 x Arduino Uno< / p >
< / li >
< li >
< p > 1 x Servo Motor< / p >
< / li >
< li >
< p > 1 x Motor Driver (Shield 1.1 - L2981)< / p >
< / li >
< li >
< p > 4 x Moter για τους 4 τροχούς< / p >
< / li >
< li >
< p > 1 x Ultrasonic< / p >
< / li >
< li >
< p > 1 x USB Power from Raspberry PI< / p >
< / li >
< li >
< p > 1 x Car< / p >
< / li >
< / ul >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_υλοποίηση_microcontroller_on_car" > 2.1.2. Υλοποίηση Microcontroller on Car< / h4 >
< div class = "paragraph" >
< p > Ο motor driver, το Servo motor καθώς και ο Ultrasonic αισθητήρας κουμπώνουν στον μικροελεγκτή Arduino Uno που χρησιμοποιούμε,
τον οποίο τον εγκαθηστούμε πάνω στο καλούπι του οχήματος το οποίο έχει εγκατεστημένα 4 τροχούς. Οι τροχοί οδηοούνται από 4 moters
τα οποία τροφοδοτούνται από τον motor driver. Ο motor driver πέρνει εντολές από το Arduino , ενώ το Arduino περιμένει μέχρι το Rasperry να στείλει πληροφορία.
Μόλις λάβει την πληροφορία από το Rasperry, υπολογίζουμε με το υπόλοιπο & το πηλίκο της θέσης του parking με το 2, την γραμμή και την θέση που το όχημα πρέπει να παρκάρει.
Στην συνέχεια , μόλις το όχημα έχει φτάσει μπροστά από την θέση που πρέπει να παρκάρει , με τις μετρήσεις του ultrasonic ελέγχει το πόσο μπροστά ή πίσω θα πάει το όχημα.< / p >
< / div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" > < code class = "language-C" data-lang = "C" > row = (parkingNo / 2);
side = (parkingNo % 2);
if (side == 0) {
row = row - 1;
}< / code > < / pre >
< / div >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_προγραμματισμός_microcontroller_on_car" > 2.1.3. Προγραμματισμός Microcontroller on Car< / h4 >
< div class = "paragraph" >
< p > O προγραμματισμός του Arduino έγινε με την ίδια λογική όπως έγινε και ο προγραμματισμός του Arduino παραπάνω.< / p >
< / div >
< div class = "paragraph" >
< p > Η συνδεσμολογία έχει την διάταξη που παρουσιάζεται παρακάτω:< / p >
< / div >
< div class = "openblock float-group" >
< div class = "content" >
< div class = "imageblock center" >
< div class = "content" >
< img src = "data:image/png;base64,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
< / div >
< div class = "title" > Figure 6. Συνδεσμολογία moter, motor driver, arduino, ultrasonic sensor και servo motor.< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "sect2" >
< h3 id = "_gateway_κόμβος_2ο_μέρος" > 2.2. Gateway Κόμβος (2< sub > ο< / sub > Μέρος)< / h3 >
< div class = "sect3" >
< h4 id = "_υλικά_κόμβου_4" > 2.2.1. Υλικά Κόμβου< / h4 >
< div class = "ulist" >
< ul >
< li >
< p > 1 x Raspberry Pi 1< / p >
< / li >
< li >
< p > 1 x TP-Link WiFi Adapter< / p >
< / li >
< li >
< p > 1 x Powerbank Power< / p >
< / li >
< / ul >
< / div >
< div class = "paragraph" >
< p > Ο Gateway κόμβος του αυτόνομου οχήματος που θα έρθει στην θέση να παρκάρει μόνο του στο parking, είναι υπεύθυνος
για την διασύνδεση του οχήματος με το διαδίκτυο. Γι' αυτό το λόγο το process που σχεδιάσαμε να τρέχει σε αυτό το σημείο
είναι υπεύθυνο για την αναζήτηση της πληροφορίας, ποια είναι η πρώτη ελεύθερη για να παρκάρει το όχημα και στη συνέχεια
να αποστέλει τον αριθμό της θέσης στον μικροελεγκτή Arduino ο οποίος είναι υπεύθυνος να πάρει αυτή την τιμή και να κατευθύνει
το όχημα.< / p >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_υλοποίηση_gateway_on_car" > 2.2.2. Υλοποίηση Gateway on Car< / h4 >
< div class = "paragraph" >
< p > Ο gateway κόμβος ξεκινά μια HTTP σύνδεση με τον κετντρικό Server, ζητώντας μέσω υπηρεσίας REST API το 1< sub > ο< / sub > διαθέσιμο parking.
Αφού διαβάσει την απάντησή του τότε την απόστέλει σε μορφή String στο Arduino μέσω σειριακής επικοινωνίας στο arduino.< / p >
< / div >
< / div >
< div class = "sect3" >
< h4 id = "_προγραμματιμός_gateway_on_car" > 2.2.3. Προγραμματιμός Gateway on Car< / h4 >
< div class = "paragraph" >
< p > Το process που εκτελεί αυτή την επικοινωνία μεταξύ του κεντρικου Server και το Arduino στο όχημα είναι προγραμματισμένο σε γλώσσα
προγραμματισμού Python.< / p >
< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "sect1" >
< h2 id = "_προβλήματα_που_αντιμετωπίσαμε" > 3. Προβλήματα που αντιμετωπίσαμε< / h2 >
< div class = "sectionbody" >
< div class = "ulist" >
< ul >
< li >
< p > Δεν καταφέραμε να κάνουμε Deploy στο swarmlab τον κεντρικό Server μας έτσι ώστε να έχουμε
via Internet επικοινωνία.< / p >
< / li >
< li >
< p > Δεν καταφέραμε να τελειοποιήσουμε το αυτόνομο παρκάριμα, και την ενορχύστρωσή του με το υπόλοιπο σύστημα. Το πρόβλημα που
αντιμετωπίσαμε συγκεκριμένα ήταν ο έλεγχος των δεδομένων που από το raspberry στο Arduino και το καθαρισμό του buffer στο
Arduino. Αυτό συνεπώς δεν μας επέτρεπε στο Arduino να διαβάσουμε από την σειριακή τον ακέραιο αριθμό (θέση parking) που έστελνε
το raspberry.< / p >
< / li >
< / ul >
< / div >
< div class = "admonitionblock note" >
< table >
< tr >
< td class = "icon" >
< i class = "fa icon-note" title = "Note" > < / i >
< / td >
< td class = "content" >
< div class = "title" > Reminder< / div >
SLOW SUCCESS BUILDS CHARACTER, FAST SUCCESS BUILDS EGO.
< / td >
< / tr >
< / table >
< / div >
< / div >
< / div >
< / div >
< div id = "footer" >
< div id = "footer-text" >
Last updated 2020-01-23 01:31:38 +0200
< / div >
< / div >
< / body >
< / html >