diff --git a/docs/_site/404.html b/docs/_site/404.html index 2b5a4822c..1f75f9381 100755 --- a/docs/_site/404.html +++ b/docs/_site/404.html @@ -1 +1 @@ - Navigator | Navigator is an open-source autonomous driving system developed by Nova, an applied research group at UT Dallas. Skip to main content Link Menu Expand (external link) Document Search Copy Copied

404

Page not found :(

The requested page could not be found.

+ Navigator | Navigator is an open-source autonomous driving system developed by Nova, an applied research group at UT Dallas. Skip to main content Link Menu Expand (external link) Document Search Copy Copied

404

Page not found :(

The requested page could not be found.

diff --git a/docs/_site/assets/css/just-the-docs-dark.css b/docs/_site/assets/css/just-the-docs-dark.css index 310c952a7..596348f6a 100755 --- a/docs/_site/assets/css/just-the-docs-dark.css +++ b/docs/_site/assets/css/just-the-docs-dark.css @@ -1,139 +1,135 @@ @charset "UTF-8"; -.highlight .c { color: #586e75; } +.highlight, pre.highlight { background: #f9f9f9; color: #383942; } -.highlight .err { color: #93a1a1; } +.highlight pre { background: #f9f9f9; } -.highlight .g { color: #93a1a1; } +.highlight .hll { background: #f9f9f9; } -.highlight .k { color: #859900; } +.highlight .c { color: #9fa0a6; font-style: italic; } -.highlight .l { color: #93a1a1; } +.highlight .err { color: #fff; background-color: #e05151; } -.highlight .n { color: #93a1a1; } +.highlight .k { color: #a625a4; } -.highlight .o { color: #859900; } +.highlight .l { color: #50a04f; } -.highlight .x { color: #cb4b16; } +.highlight .n { color: #383942; } -.highlight .p { color: #93a1a1; } +.highlight .o { color: #383942; } -.highlight .cm { color: #586e75; } +.highlight .p { color: #383942; } -.highlight .cp { color: #859900; } +.highlight .cm { color: #9fa0a6; font-style: italic; } -.highlight .c1 { color: #586e75; } +.highlight .cp { color: #9fa0a6; font-style: italic; } -.highlight .cs { color: #859900; } +.highlight .c1 { color: #9fa0a6; font-style: italic; } -.highlight .gd { color: #2aa198; } +.highlight .cs { color: #9fa0a6; font-style: italic; } -.highlight .ge { font-style: italic; color: #93a1a1; } - -.highlight .gr { color: #dc322f; } - -.highlight .gh { color: #cb4b16; } +.highlight .ge { font-style: italic; } -.highlight .gi { color: #859900; } +.highlight .gs { font-weight: 700; } -.highlight .go { color: #93a1a1; } +.highlight .kc { color: #a625a4; } -.highlight .gp { color: #93a1a1; } +.highlight .kd { color: #a625a4; } -.highlight .gs { font-weight: bold; color: #93a1a1; } +.highlight .kn { color: #a625a4; } -.highlight .gu { color: #cb4b16; } +.highlight .kp { color: #a625a4; } -.highlight .gt { color: #93a1a1; } +.highlight .kr { color: #a625a4; } -.highlight .kc { color: #cb4b16; } +.highlight .kt { color: #a625a4; } -.highlight .kd { color: #268bd2; } +.highlight .ld { color: #50a04f; } -.highlight .kn { color: #859900; } +.highlight .m { color: #b66a00; } -.highlight .kp { color: #859900; } +.highlight .s { color: #50a04f; } -.highlight .kr { color: #268bd2; } +.highlight .na { color: #b66a00; } -.highlight .kt { color: #dc322f; } +.highlight .nb { color: #ca7601; } -.highlight .ld { color: #93a1a1; } +.highlight .nc { color: #ca7601; } -.highlight .m { color: #2aa198; } +.highlight .no { color: #ca7601; } -.highlight .s { color: #2aa198; } +.highlight .nd { color: #ca7601; } -.highlight .na { color: #555; } +.highlight .ni { color: #ca7601; } -.highlight .nb { color: #b58900; } +.highlight .ne { color: #ca7601; } -.highlight .nc { color: #268bd2; } +.highlight .nf { color: #383942; } -.highlight .no { color: #cb4b16; } +.highlight .nl { color: #ca7601; } -.highlight .nd { color: #268bd2; } +.highlight .nn { color: #383942; } -.highlight .ni { color: #cb4b16; } +.highlight .nx { color: #383942; } -.highlight .ne { color: #cb4b16; } +.highlight .py { color: #ca7601; } -.highlight .nf { color: #268bd2; } +.highlight .nt { color: #e35549; } -.highlight .nl { color: #555; } +.highlight .nv { color: #ca7601; } -.highlight .nn { color: #93a1a1; } +.highlight .ow { font-weight: 700; } -.highlight .nx { color: #555; } +.highlight .w { color: #f8f8f2; } -.highlight .py { color: #93a1a1; } +.highlight .mf { color: #b66a00; } -.highlight .nt { color: #268bd2; } +.highlight .mh { color: #b66a00; } -.highlight .nv { color: #268bd2; } +.highlight .mi { color: #b66a00; } -.highlight .ow { color: #859900; } +.highlight .mo { color: #b66a00; } -.highlight .w { color: #93a1a1; } +.highlight .sb { color: #50a04f; } -.highlight .mf { color: #2aa198; } +.highlight .sc { color: #50a04f; } -.highlight .mh { color: #2aa198; } +.highlight .sd { color: #50a04f; } -.highlight .mi { color: #2aa198; } +.highlight .s2 { color: #50a04f; } -.highlight .mo { color: #2aa198; } +.highlight .se { color: #50a04f; } -.highlight .sb { color: #586e75; } +.highlight .sh { color: #50a04f; } -.highlight .sc { color: #2aa198; } +.highlight .si { color: #50a04f; } -.highlight .sd { color: #93a1a1; } +.highlight .sx { color: #50a04f; } -.highlight .s2 { color: #2aa198; } +.highlight .sr { color: #0083bb; } -.highlight .se { color: #cb4b16; } +.highlight .s1 { color: #50a04f; } -.highlight .sh { color: #93a1a1; } +.highlight .ss { color: #0083bb; } -.highlight .si { color: #2aa198; } +.highlight .bp { color: #ca7601; } -.highlight .sx { color: #2aa198; } +.highlight .vc { color: #ca7601; } -.highlight .sr { color: #dc322f; } +.highlight .vg { color: #ca7601; } -.highlight .s1 { color: #2aa198; } +.highlight .vi { color: #e35549; } -.highlight .ss { color: #2aa198; } +.highlight .il { color: #b66a00; } -.highlight .bp { color: #268bd2; } +.highlight .gu { color: #75715e; } -.highlight .vc { color: #268bd2; } +.highlight .gd { color: #e05151; } -.highlight .vg { color: #268bd2; } +.highlight .gi { color: #43d089; } -.highlight .vi { color: #268bd2; } +.highlight .language-json .w + .s2 { color: #e35549; } -.highlight .il { color: #2aa198; } +.highlight .language-json .kc { color: #0083bb; } .highlight, pre.highlight { background: #31343f; color: #dee2f7; } @@ -372,14 +368,14 @@ template { display: none; } /** Add the correct display in IE 10. */ [hidden] { display: none; } -* { box-sizing: border-box; } +:root { color-scheme: dark; } -::selection { color: #fff; background: #2c84fa; } +* { box-sizing: border-box; } -html { font-size: 14px !important; scroll-behavior: smooth; } -@media (min-width: 31.25rem) { html { font-size: 16px !important; } } +html { font-size: 0.875rem !important; scroll-behavior: smooth; } +@media (min-width: 31.25rem) { html { font-size: 1rem !important; } } -body { font-family: system-ui, -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, sans-serif; font-size: inherit; line-height: 1.4; color: #e6e1e8; background-color: #27262b; overflow-wrap: break-word; } +body { font-family: system-ui, -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, sans-serif, "Segoe UI Emoji"; font-size: inherit; line-height: 1.4; color: #e6e1e8; background-color: #27262b; overflow-wrap: break-word; } ol, ul, dl, pre, address, blockquote, table, div, hr, form, fieldset, noscript .table-wrapper { margin-top: 0; } @@ -402,37 +398,37 @@ img { max-width: 100%; height: auto; } hr { height: 1px; padding: 0; margin: 2rem 0; background-color: #44434d; border: 0; } -blockquote { margin: 10px 0; margin-block-start: 0; margin-inline-start: 0; padding-left: 15px; border-left: 3px solid #44434d; } +blockquote { margin: 10px 0; margin-block-start: 0; margin-inline-start: 0; padding-left: 1rem; border-left: 3px solid #44434d; } .side-bar { z-index: 0; display: flex; flex-wrap: wrap; background-color: #27262b; } -@media (min-width: 50rem) { .side-bar { flex-flow: column nowrap; position: fixed; width: 248px; height: 100%; border-right: 1px solid #44434d; align-items: flex-end; } } -@media (min-width: 66.5rem) { .side-bar { width: calc((100% - 1064px) / 2 + 264px); min-width: 264px; } } +@media (min-width: 50rem) { .side-bar { flex-flow: column nowrap; position: fixed; width: 15.5rem; height: 100%; border-right: 1px solid #44434d; align-items: flex-end; } } +@media (min-width: 66.5rem) { .side-bar { width: calc((100% - 66.5rem) / 2 + 16.5rem); min-width: 16.5rem; } } -@media (min-width: 50rem) { .main { position: relative; max-width: 800px; margin-left: 248px; } } -@media (min-width: 66.5rem) { .main { margin-left: calc( (100% - 1064px) / 2 + 264px ); } } +@media (min-width: 50rem) { .main { position: relative; max-width: 50rem; margin-left: 15.5rem; } } +@media (min-width: 66.5rem) { .main { margin-left: Max(16.5rem, calc((100% - 66.5rem) / 2 + 16.5rem)); } } .main-content-wrap { padding-right: 1rem; padding-left: 1rem; padding-top: 1rem; padding-bottom: 1rem; } @media (min-width: 50rem) { .main-content-wrap { padding-right: 2rem; padding-left: 2rem; } } @media (min-width: 50rem) { .main-content-wrap { padding-top: 2rem; padding-bottom: 2rem; } } .main-header { z-index: 0; display: none; background-color: #27262b; } -@media (min-width: 50rem) { .main-header { display: flex; justify-content: space-between; height: 60px; background-color: #27262b; border-bottom: 1px solid #44434d; } } +@media (min-width: 50rem) { .main-header { display: flex; justify-content: space-between; height: 3.75rem; background-color: #27262b; border-bottom: 1px solid #44434d; } } .main-header.nav-open { display: block; } @media (min-width: 50rem) { .main-header.nav-open { display: flex; } } .site-nav, .site-header, .site-footer { width: 100%; } -@media (min-width: 66.5rem) { .site-nav, .site-header, .site-footer { width: 264px; } } +@media (min-width: 66.5rem) { .site-nav, .site-header, .site-footer { width: 16.5rem; } } .site-nav { display: none; } .site-nav.nav-open { display: block; } @media (min-width: 50rem) { .site-nav { display: block; padding-top: 3rem; padding-bottom: 1rem; overflow-y: auto; flex: 1 1 auto; } } -.site-header { display: flex; min-height: 60px; align-items: center; } -@media (min-width: 50rem) { .site-header { height: 60px; max-height: 60px; border-bottom: 1px solid #44434d; } } +.site-header { display: flex; min-height: 3.75rem; align-items: center; } +@media (min-width: 50rem) { .site-header { height: 3.75rem; max-height: 3.75rem; border-bottom: 1px solid #44434d; } } -.site-title { padding-right: 1rem; padding-left: 1rem; flex-grow: 1; display: flex; height: 100%; align-items: center; padding-top: 0.75rem; padding-bottom: 0.75rem; color: #f5f6fa; font-size: 18px !important; } +.site-title { padding-right: 1rem; padding-left: 1rem; flex-grow: 1; display: flex; height: 100%; align-items: center; padding-top: 0.75rem; padding-bottom: 0.75rem; color: #f5f6fa; font-size: 1.125rem !important; } @media (min-width: 50rem) { .site-title { padding-right: 2rem; padding-left: 2rem; } } -@media (min-width: 31.25rem) { .site-title { font-size: 24px !important; line-height: 1.25; } } +@media (min-width: 31.25rem) { .site-title { font-size: 1.5rem !important; line-height: 1.25; } } @media (min-width: 50rem) { .site-title { padding-top: 0.5rem; padding-bottom: 0.5rem; } } .site-logo { width: 100%; height: 100%; background-image: url("/navigator/assets/res/logo.png"); background-repeat: no-repeat; background-position: left center; background-size: contain; } @@ -447,9 +443,9 @@ blockquote { margin: 10px 0; margin-block-start: 0; margin-inline-start: 0; padd body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } @media (min-width: 50rem) { body { position: static; padding-bottom: 0; } } -.site-footer { padding-right: 1rem; padding-left: 1rem; position: absolute; bottom: 0; left: 0; padding-top: 1rem; padding-bottom: 1rem; color: #959396; font-size: 11px !important; } +.site-footer { padding-right: 1rem; padding-left: 1rem; position: absolute; bottom: 0; left: 0; padding-top: 1rem; padding-bottom: 1rem; color: #959396; font-size: 0.6875rem !important; } @media (min-width: 50rem) { .site-footer { padding-right: 2rem; padding-left: 2rem; } } -@media (min-width: 31.25rem) { .site-footer { font-size: 12px !important; } } +@media (min-width: 31.25rem) { .site-footer { font-size: 0.75rem !important; } } @media (min-width: 50rem) { .site-footer { position: static; justify-self: end; } } .icon { width: 1.5rem; height: 1.5rem; color: #2c84fa; } @@ -461,8 +457,8 @@ body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } .main-content li .highlight { margin-top: 0.25rem; } .main-content ol { list-style-type: none; counter-reset: step-counter; } .main-content ol > li { position: relative; } -.main-content ol > li::before { position: absolute; top: 0.2em; left: -1.6em; color: #959396; content: counter(step-counter); counter-increment: step-counter; font-size: 12px !important; } -@media (min-width: 31.25rem) { .main-content ol > li::before { font-size: 14px !important; } } +.main-content ol > li::before { position: absolute; top: 0.2em; left: -1.6em; color: #959396; content: counter(step-counter); counter-increment: step-counter; font-size: 0.75rem !important; } +@media (min-width: 31.25rem) { .main-content ol > li::before { font-size: 0.875rem !important; } } @media (min-width: 31.25rem) { .main-content ol > li::before { top: 0.11em; } } .main-content ol > li ol { counter-reset: sub-counter; } .main-content ol > li ol > li::before { content: counter(sub-counter,lower-alpha); counter-increment: sub-counter; } @@ -490,10 +486,10 @@ body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } .main-content > h1:first-child, .main-content > h2:first-child, .main-content > h3:first-child, .main-content > h4:first-child, .main-content > h5:first-child, .main-content > h6:first-child, .main-content > .sect1:first-child > h2, .main-content > .sect2:first-child > h3, .main-content > .sect3:first-child > h4, .main-content > .sect4:first-child > h5, .main-content > .sect5:first-child > h6 { margin-top: 0.5rem; } .nav-list { padding: 0; margin-top: 0; margin-bottom: 0; list-style: none; } -.nav-list .nav-list-item { font-size: 14px !important; position: relative; margin: 0; } -@media (min-width: 31.25rem) { .nav-list .nav-list-item { font-size: 16px !important; } } -@media (min-width: 50rem) { .nav-list .nav-list-item { font-size: 12px !important; } } -@media (min-width: 50rem) and (min-width: 31.25rem) { .nav-list .nav-list-item { font-size: 14px !important; } } +.nav-list .nav-list-item { font-size: 0.875rem !important; position: relative; margin: 0; } +@media (min-width: 31.25rem) { .nav-list .nav-list-item { font-size: 1rem !important; } } +@media (min-width: 50rem) { .nav-list .nav-list-item { font-size: 0.75rem !important; } } +@media (min-width: 50rem) and (min-width: 31.25rem) { .nav-list .nav-list-item { font-size: 0.875rem !important; } } .nav-list .nav-list-item .nav-list-link { display: block; min-height: 3rem; padding-top: 0.25rem; padding-bottom: 0.25rem; line-height: 2.5rem; padding-right: 3rem; padding-left: 1rem; } @media (min-width: 50rem) { .nav-list .nav-list-item .nav-list-link { min-height: 2rem; line-height: 1.5rem; padding-right: 2rem; padding-left: 2rem; } } @@ -511,8 +507,8 @@ body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } .nav-list .nav-list-item.active > .nav-list-expander svg { transform: rotate(-90deg); } .nav-list .nav-list-item.active > .nav-list { display: block; } -.nav-category { padding: 0.5rem 1rem; font-weight: 600; text-align: start; text-transform: uppercase; border-bottom: 1px solid #44434d; font-size: 11px !important; } -@media (min-width: 31.25rem) { .nav-category { font-size: 12px !important; } } +.nav-category { padding: 0.5rem 1rem; font-weight: 600; text-align: start; text-transform: uppercase; border-bottom: 1px solid #44434d; font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .nav-category { font-size: 0.75rem !important; } } @media (min-width: 50rem) { .nav-category { padding: 0.5rem 2rem; margin-top: 1rem; text-align: start; } .nav-category:first-child { margin-top: 0; } } @@ -521,8 +517,8 @@ body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } .nav-list.nav-category-list > .nav-list-item > .nav-list > .nav-list-item > .nav-list-link { color: #2c84fa; } .nav-list.nav-category-list > .nav-list-item > .nav-list > .nav-list-item > .nav-list-expander { color: #2c84fa; } -.aux-nav { height: 100%; overflow-x: auto; font-size: 11px !important; } -@media (min-width: 31.25rem) { .aux-nav { font-size: 12px !important; } } +.aux-nav { height: 100%; overflow-x: auto; font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .aux-nav { font-size: 0.75rem !important; } } .aux-nav .aux-nav-list { display: flex; height: 100%; padding: 0; margin: 0; list-style: none; } .aux-nav .aux-nav-list-item { display: inline-block; height: 100%; padding: 0; margin: 0; } @media (min-width: 50rem) { .aux-nav { padding-right: 1rem; } } @@ -531,34 +527,34 @@ body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } .breadcrumb-nav-list { padding-left: 0; margin-bottom: 0.75rem; list-style: none; } -.breadcrumb-nav-list-item { display: table-cell; font-size: 11px !important; } -@media (min-width: 31.25rem) { .breadcrumb-nav-list-item { font-size: 12px !important; } } +.breadcrumb-nav-list-item { display: table-cell; font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .breadcrumb-nav-list-item { font-size: 0.75rem !important; } } .breadcrumb-nav-list-item::before { display: none; } .breadcrumb-nav-list-item::after { display: inline-block; margin-right: 0.5rem; margin-left: 0.5rem; color: #959396; content: "/"; } .breadcrumb-nav-list-item:last-child::after { content: ""; } -h1, .text-alpha { font-size: 32px !important; line-height: 1.25; font-weight: 300; } -@media (min-width: 31.25rem) { h1, .text-alpha { font-size: 36px !important; } } +h1, .text-alpha { font-size: 2rem !important; line-height: 1.25; font-weight: 300; } +@media (min-width: 31.25rem) { h1, .text-alpha { font-size: 2.25rem !important; } } -h2, .text-beta, #toctitle { font-size: 18px !important; } -@media (min-width: 31.25rem) { h2, .text-beta, #toctitle { font-size: 24px !important; line-height: 1.25; } } +h2, .text-beta, #toctitle { font-size: 1.125rem !important; } +@media (min-width: 31.25rem) { h2, .text-beta, #toctitle { font-size: 1.5rem !important; line-height: 1.25; } } -h3, .text-gamma { font-size: 16px !important; } -@media (min-width: 31.25rem) { h3, .text-gamma { font-size: 18px !important; } } +h3, .text-gamma { font-size: 1rem !important; } +@media (min-width: 31.25rem) { h3, .text-gamma { font-size: 1.125rem !important; } } -h4, .text-delta { font-size: 11px !important; font-weight: 400; text-transform: uppercase; letter-spacing: 0.1em; } -@media (min-width: 31.25rem) { h4, .text-delta { font-size: 12px !important; } } +h4, .text-delta { font-size: 0.6875rem !important; font-weight: 400; text-transform: uppercase; letter-spacing: 0.1em; } +@media (min-width: 31.25rem) { h4, .text-delta { font-size: 0.75rem !important; } } h4 code { text-transform: none; } -h5, .text-epsilon { font-size: 12px !important; } -@media (min-width: 31.25rem) { h5, .text-epsilon { font-size: 14px !important; } } +h5, .text-epsilon { font-size: 0.75rem !important; } +@media (min-width: 31.25rem) { h5, .text-epsilon { font-size: 0.875rem !important; } } -h6, .text-zeta { font-size: 11px !important; } -@media (min-width: 31.25rem) { h6, .text-zeta { font-size: 12px !important; } } +h6, .text-zeta { font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { h6, .text-zeta { font-size: 0.75rem !important; } } -.text-small { font-size: 11px !important; } -@media (min-width: 31.25rem) { .text-small { font-size: 12px !important; } } +.text-small { font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .text-small { font-size: 0.75rem !important; } } .text-mono { font-family: "SFMono-Regular", menlo, consolas, monospace !important; } @@ -568,16 +564,16 @@ h6, .text-zeta { font-size: 11px !important; } .text-right { text-align: right !important; } -.label, .label-blue { display: inline-block; padding: 0.16em 0.56em; margin-right: 0.5rem; margin-left: 0.5rem; color: #fff; text-transform: uppercase; vertical-align: middle; background-color: #2869e6; font-size: 11px !important; border-radius: 12px; } -@media (min-width: 31.25rem) { .label, .label-blue { font-size: 12px !important; } } +.label:not(g), .label-blue:not(g) { display: inline-block; padding: 0.16em 0.56em; margin-right: 0.5rem; margin-left: 0.5rem; color: #fff; text-transform: uppercase; vertical-align: middle; background-color: #2869e6; font-size: 0.6875rem !important; border-radius: 12px; } +@media (min-width: 31.25rem) { .label:not(g), .label-blue:not(g) { font-size: 0.75rem !important; } } -.label-green { background-color: #009c7b; } +.label-green:not(g) { background-color: #009c7b; } -.label-purple { background-color: #5e41d0; } +.label-purple:not(g) { background-color: #5e41d0; } -.label-red { background-color: #e94c4c; } +.label-red:not(g) { background-color: #e94c4c; } -.label-yellow { color: #44434d; background-color: #f7d12e; } +.label-yellow:not(g) { color: #44434d; background-color: #f7d12e; } .btn { display: inline-block; box-sizing: border-box; padding: 0.3em 1em; margin: 0; font-family: inherit; font-size: inherit; font-weight: 500; line-height: 1.5; color: #2c84fa; text-decoration: none; vertical-align: baseline; cursor: pointer; background-color: #302d36; border-width: 0; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); appearance: none; } .btn:focus { text-decoration: none; outline: none; box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.25); } @@ -613,14 +609,16 @@ h6, .text-zeta { font-size: 11px !important; } .btn-green:active, .btn-green.selected, .btn-green.zeroclipboard-is-active { background-color: #0f9e73; background-image: none; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); } .btn-green.selected:hover { background-color: #0d8662; } +.btn-reset { background: none; border: none; margin: 0; text-align: inherit; font: inherit; border-radius: 0; appearance: none; } + .search { position: relative; z-index: 2; flex-grow: 1; height: 4rem; padding: 0.5rem; transition: padding linear 200ms; } @media (min-width: 50rem) { .search { position: relative !important; width: auto !important; height: 100% !important; padding: 0; transition: none; } } .search-input-wrap { position: relative; z-index: 1; height: 3rem; overflow: hidden; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); transition: height linear 200ms; } -@media (min-width: 50rem) { .search-input-wrap { position: absolute; width: 100%; max-width: 536px; height: 100% !important; border-radius: 0; box-shadow: none; transition: width ease 400ms; } } +@media (min-width: 50rem) { .search-input-wrap { position: absolute; width: 100%; max-width: 33.5rem; height: 100% !important; border-radius: 0; box-shadow: none; transition: width ease 400ms; } } -.search-input { position: absolute; width: 100%; height: 100%; padding: 0.5rem 1rem 0.5rem 2.5rem; font-size: 16px; color: #e6e1e8; background-color: #302d36; border-top: 0; border-right: 0; border-bottom: 0; border-left: 0; border-radius: 0; } -@media (min-width: 50rem) { .search-input { padding: 0.5rem 1rem 0.5rem 3.5rem; font-size: 14px; background-color: #27262b; transition: padding-left linear 200ms; } } +.search-input { position: absolute; width: 100%; height: 100%; padding: 0.5rem 1rem 0.5rem 2.5rem; font-size: 1rem; color: #e6e1e8; background-color: #302d36; border-top: 0; border-right: 0; border-bottom: 0; border-left: 0; border-radius: 0; } +@media (min-width: 50rem) { .search-input { padding: 0.5rem 1rem 0.5rem 3.5rem; font-size: 0.875rem; background-color: #27262b; transition: padding-left linear 200ms; } } .search-input:focus { outline: 0; } .search-input:focus + .search-label .search-icon { color: #2c84fa; } @@ -629,12 +627,12 @@ h6, .text-zeta { font-size: 11px !important; } .search-label .search-icon { width: 1.2rem; height: 1.2rem; align-self: center; color: #959396; } .search-results { position: absolute; left: 0; display: none; width: 100%; max-height: calc(100% - 4rem); overflow-y: auto; background-color: #302d36; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); } -@media (min-width: 50rem) { .search-results { top: 100%; width: 536px; max-height: calc(100vh - 200%) !important; } } +@media (min-width: 50rem) { .search-results { top: 100%; width: 33.5rem; max-height: calc(100vh - 200%) !important; } } -.search-results-list { padding-left: 0; margin-bottom: 0.25rem; list-style: none; font-size: 14px !important; } -@media (min-width: 31.25rem) { .search-results-list { font-size: 16px !important; } } -@media (min-width: 50rem) { .search-results-list { font-size: 12px !important; } } -@media (min-width: 50rem) and (min-width: 31.25rem) { .search-results-list { font-size: 14px !important; } } +.search-results-list { padding-left: 0; margin-bottom: 0.25rem; list-style: none; font-size: 0.875rem !important; } +@media (min-width: 31.25rem) { .search-results-list { font-size: 1rem !important; } } +@media (min-width: 50rem) { .search-results-list { font-size: 0.75rem !important; } } +@media (min-width: 50rem) and (min-width: 31.25rem) { .search-results-list { font-size: 0.875rem !important; } } .search-results-list-item { padding: 0; margin: 0; } @@ -645,29 +643,29 @@ h6, .text-zeta { font-size: 11px !important; } @media (min-width: 31.25rem) { .search-result-title { display: inline-block; width: 40%; padding-right: 0.5rem; vertical-align: top; } } .search-result-doc { display: flex; align-items: center; word-wrap: break-word; } -.search-result-doc.search-result-doc-parent { opacity: 0.5; font-size: 12px !important; } -@media (min-width: 31.25rem) { .search-result-doc.search-result-doc-parent { font-size: 14px !important; } } -@media (min-width: 50rem) { .search-result-doc.search-result-doc-parent { font-size: 11px !important; } } -@media (min-width: 50rem) and (min-width: 31.25rem) { .search-result-doc.search-result-doc-parent { font-size: 12px !important; } } +.search-result-doc.search-result-doc-parent { opacity: 0.5; font-size: 0.75rem !important; } +@media (min-width: 31.25rem) { .search-result-doc.search-result-doc-parent { font-size: 0.875rem !important; } } +@media (min-width: 50rem) { .search-result-doc.search-result-doc-parent { font-size: 0.6875rem !important; } } +@media (min-width: 50rem) and (min-width: 31.25rem) { .search-result-doc.search-result-doc-parent { font-size: 0.75rem !important; } } .search-result-doc .search-result-icon { width: 1rem; height: 1rem; margin-right: 0.5rem; color: #2c84fa; flex-shrink: 0; } .search-result-doc .search-result-doc-title { overflow: auto; } .search-result-section { margin-left: 1.5rem; word-wrap: break-word; } -.search-result-rel-url { display: block; margin-left: 1.5rem; overflow: hidden; color: #959396; text-overflow: ellipsis; white-space: nowrap; font-size: 9px !important; } -@media (min-width: 31.25rem) { .search-result-rel-url { font-size: 10px !important; } } +.search-result-rel-url { display: block; margin-left: 1.5rem; overflow: hidden; color: #959396; text-overflow: ellipsis; white-space: nowrap; font-size: 0.5625rem !important; } +@media (min-width: 31.25rem) { .search-result-rel-url { font-size: 0.625rem !important; } } -.search-result-previews { display: block; padding-top: 0.5rem; padding-bottom: 0.5rem; padding-left: 1rem; margin-left: 0.5rem; color: #959396; word-wrap: break-word; border-left: 1px solid; border-left-color: #44434d; font-size: 11px !important; } -@media (min-width: 31.25rem) { .search-result-previews { font-size: 12px !important; } } +.search-result-previews { display: block; padding-top: 0.5rem; padding-bottom: 0.5rem; padding-left: 1rem; margin-left: 0.5rem; color: #959396; word-wrap: break-word; border-left: 1px solid; border-left-color: #44434d; font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .search-result-previews { font-size: 0.75rem !important; } } @media (min-width: 31.25rem) { .search-result-previews { display: inline-block; width: 60%; padding-left: 0.5rem; margin-left: 0; vertical-align: top; } } .search-result-preview + .search-result-preview { margin-top: 0.25rem; } .search-result-highlight { font-weight: bold; } -.search-no-result { padding: 0.5rem 0.75rem; font-size: 12px !important; } -@media (min-width: 31.25rem) { .search-no-result { font-size: 14px !important; } } +.search-no-result { padding: 0.5rem 0.75rem; font-size: 0.75rem !important; } +@media (min-width: 31.25rem) { .search-no-result { font-size: 0.875rem !important; } } .search-button { position: fixed; right: 1rem; bottom: 1rem; display: flex; width: 3.5rem; height: 3.5rem; background-color: #302d36; border: 1px solid rgba(44, 132, 250, 0.3); border-radius: 1.75rem; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); align-items: center; justify-content: center; } @@ -675,7 +673,7 @@ h6, .text-zeta { font-size: 11px !important; } .search-active .search { position: fixed; top: 0; left: 0; width: 100%; height: 100%; padding: 0; } .search-active .search-input-wrap { height: 4rem; border-radius: 0; } -@media (min-width: 50rem) { .search-active .search-input-wrap { width: 536px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); } } +@media (min-width: 50rem) { .search-active .search-input-wrap { width: 33.5rem; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); } } .search-active .search-input { background-color: #302d36; } @media (min-width: 50rem) { .search-active .search-input { padding-left: 2.3rem; } } @media (min-width: 50rem) { .search-active .search-label { padding-left: 0.6rem; } } @@ -689,8 +687,8 @@ h6, .text-zeta { font-size: 11px !important; } table { display: table; min-width: 100%; border-collapse: separate; } -th, td { font-size: 12px !important; min-width: 120px; padding: 0.5rem 0.75rem; background-color: #302d36; border-bottom: 1px solid rgba(68, 67, 77, 0.5); border-left: 1px solid #44434d; } -@media (min-width: 31.25rem) { th, td { font-size: 14px !important; } } +th, td { font-size: 0.75rem !important; min-width: 7.5rem; padding: 0.5rem 0.75rem; background-color: #302d36; border-bottom: 1px solid rgba(68, 67, 77, 0.5); border-left: 1px solid #44434d; } +@media (min-width: 31.25rem) { th, td { font-size: 0.875rem !important; } } th:first-of-type, td:first-of-type { border-left: 0; } tbody tr:last-of-type th, tbody tr:last-of-type td { border-bottom: 0; } @@ -709,14 +707,18 @@ div.highlighter-rouge > button:active, div.listingblock > div.content > button:a div.highlighter-rouge > button:focus, div.listingblock > div.content > button:focus, figure.highlight > button:focus { opacity: 1; } div.highlighter-rouge:hover > button, div.listingblock > div.content:hover > button, figure.highlight:hover > button { cursor: copy; opacity: 1; } -div.highlighter-rouge div.highlight, div.listingblock div.highlight { overflow-x: auto; padding: 0.75rem; margin: 0; border: 0; } -div.highlighter-rouge pre.highlight, div.highlighter-rouge code, div.listingblock pre.highlight, div.listingblock code { padding: 0; margin: 0; border: 0; } +div.highlighter-rouge div.highlight { overflow-x: auto; padding: 0.75rem; margin: 0; border: 0; } +div.highlighter-rouge pre.highlight, div.highlighter-rouge code { padding: 0; margin: 0; border: 0; } + +div.listingblock { margin-top: 0; margin-bottom: 0.75rem; } +div.listingblock div.content { overflow-x: auto; padding: 0.75rem; margin: 0; border: 0; } +div.listingblock div.content > pre, div.listingblock code { padding: 0; margin: 0; border: 0; } figure.highlight pre, figure.highlight :not(pre) > code { overflow-x: auto; padding: 0.75rem; margin: 0; border: 0; } .highlight .table-wrapper { padding: 0.75rem 0; margin: 0; border: 0; box-shadow: none; } -.highlight .table-wrapper td, .highlight .table-wrapper pre { font-size: 11px !important; min-width: 0; padding: 0; background-color: #31343f; border: 0; } -@media (min-width: 31.25rem) { .highlight .table-wrapper td, .highlight .table-wrapper pre { font-size: 12px !important; } } +.highlight .table-wrapper td, .highlight .table-wrapper pre { font-size: 0.6875rem !important; min-width: 0; padding: 0; background-color: #31343f; border: 0; } +@media (min-width: 31.25rem) { .highlight .table-wrapper td, .highlight .table-wrapper pre { font-size: 0.75rem !important; } } .highlight .table-wrapper td.gl { width: 1em; padding-right: 0.75rem; padding-left: 0.75rem; } .highlight .table-wrapper pre { margin: 0; line-height: 2; } @@ -1154,35 +1156,35 @@ code.language-mermaid { padding: 0; background-color: inherit; border: 0; } .v-align-top { vertical-align: top !important; } -.fs-1 { font-size: 9px !important; } -@media (min-width: 31.25rem) { .fs-1 { font-size: 10px !important; } } +.fs-1 { font-size: 0.5625rem !important; } +@media (min-width: 31.25rem) { .fs-1 { font-size: 0.625rem !important; } } -.fs-2 { font-size: 11px !important; } -@media (min-width: 31.25rem) { .fs-2 { font-size: 12px !important; } } +.fs-2 { font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .fs-2 { font-size: 0.75rem !important; } } -.fs-3 { font-size: 12px !important; } -@media (min-width: 31.25rem) { .fs-3 { font-size: 14px !important; } } +.fs-3 { font-size: 0.75rem !important; } +@media (min-width: 31.25rem) { .fs-3 { font-size: 0.875rem !important; } } -.fs-4 { font-size: 14px !important; } -@media (min-width: 31.25rem) { .fs-4 { font-size: 16px !important; } } +.fs-4 { font-size: 0.875rem !important; } +@media (min-width: 31.25rem) { .fs-4 { font-size: 1rem !important; } } -.fs-5 { font-size: 16px !important; } -@media (min-width: 31.25rem) { .fs-5 { font-size: 18px !important; } } +.fs-5 { font-size: 1rem !important; } +@media (min-width: 31.25rem) { .fs-5 { font-size: 1.125rem !important; } } -.fs-6 { font-size: 18px !important; } -@media (min-width: 31.25rem) { .fs-6 { font-size: 24px !important; line-height: 1.25; } } +.fs-6 { font-size: 1.125rem !important; } +@media (min-width: 31.25rem) { .fs-6 { font-size: 1.5rem !important; line-height: 1.25; } } -.fs-7 { font-size: 24px !important; line-height: 1.25; } -@media (min-width: 31.25rem) { .fs-7 { font-size: 32px !important; } } +.fs-7 { font-size: 1.5rem !important; line-height: 1.25; } +@media (min-width: 31.25rem) { .fs-7 { font-size: 2rem !important; } } -.fs-8 { font-size: 32px !important; line-height: 1.25; } -@media (min-width: 31.25rem) { .fs-8 { font-size: 36px !important; } } +.fs-8 { font-size: 2rem !important; line-height: 1.25; } +@media (min-width: 31.25rem) { .fs-8 { font-size: 2.25rem !important; } } -.fs-9 { font-size: 36px !important; line-height: 1.25; } -@media (min-width: 31.25rem) { .fs-9 { font-size: 42px !important; } } +.fs-9 { font-size: 2.25rem !important; line-height: 1.25; } +@media (min-width: 31.25rem) { .fs-9 { font-size: 2.625rem !important; } } -.fs-10 { font-size: 42px !important; line-height: 1.25; } -@media (min-width: 31.25rem) { .fs-10 { font-size: 48px !important; } } +.fs-10 { font-size: 2.625rem !important; line-height: 1.25; } +@media (min-width: 31.25rem) { .fs-10 { font-size: 3rem !important; } } .fw-300 { font-weight: 300 !important; } @@ -2391,7 +2393,7 @@ code.language-mermaid { padding: 0; background-color: inherit; border: 0; } @media print { .site-footer, .site-button, #edit-this-page, #back-to-top, .site-nav, .main-header { display: none !important; } .side-bar { width: 100%; height: auto; border-right: 0 !important; } .site-header { border-bottom: 1px solid #44434d; } - .site-title { font-size: 16px !important; font-weight: 700 !important; } + .site-title { font-size: 1rem !important; font-weight: 700 !important; } .text-small { font-size: 8pt !important; } pre.highlight { border: 1px solid #44434d; } .main { max-width: none; margin-left: 0; } } diff --git a/docs/_site/assets/css/just-the-docs-default.css b/docs/_site/assets/css/just-the-docs-default.css index 8c6c195d4..18eddaeae 100755 --- a/docs/_site/assets/css/just-the-docs-default.css +++ b/docs/_site/assets/css/just-the-docs-default.css @@ -1,139 +1,135 @@ @charset "UTF-8"; -.highlight .c { color: #586e75; } +.highlight, pre.highlight { background: #f9f9f9; color: #383942; } -.highlight .err { color: #93a1a1; } +.highlight pre { background: #f9f9f9; } -.highlight .g { color: #93a1a1; } +.highlight .hll { background: #f9f9f9; } -.highlight .k { color: #859900; } +.highlight .c { color: #9fa0a6; font-style: italic; } -.highlight .l { color: #93a1a1; } +.highlight .err { color: #fff; background-color: #e05151; } -.highlight .n { color: #93a1a1; } +.highlight .k { color: #a625a4; } -.highlight .o { color: #859900; } +.highlight .l { color: #50a04f; } -.highlight .x { color: #cb4b16; } +.highlight .n { color: #383942; } -.highlight .p { color: #93a1a1; } +.highlight .o { color: #383942; } -.highlight .cm { color: #586e75; } +.highlight .p { color: #383942; } -.highlight .cp { color: #859900; } +.highlight .cm { color: #9fa0a6; font-style: italic; } -.highlight .c1 { color: #586e75; } +.highlight .cp { color: #9fa0a6; font-style: italic; } -.highlight .cs { color: #859900; } +.highlight .c1 { color: #9fa0a6; font-style: italic; } -.highlight .gd { color: #2aa198; } +.highlight .cs { color: #9fa0a6; font-style: italic; } -.highlight .ge { font-style: italic; color: #93a1a1; } +.highlight .ge { font-style: italic; } -.highlight .gr { color: #dc322f; } +.highlight .gs { font-weight: 700; } -.highlight .gh { color: #cb4b16; } +.highlight .kc { color: #a625a4; } -.highlight .gi { color: #859900; } +.highlight .kd { color: #a625a4; } -.highlight .go { color: #93a1a1; } +.highlight .kn { color: #a625a4; } -.highlight .gp { color: #93a1a1; } +.highlight .kp { color: #a625a4; } -.highlight .gs { font-weight: bold; color: #93a1a1; } +.highlight .kr { color: #a625a4; } -.highlight .gu { color: #cb4b16; } +.highlight .kt { color: #a625a4; } -.highlight .gt { color: #93a1a1; } +.highlight .ld { color: #50a04f; } -.highlight .kc { color: #cb4b16; } +.highlight .m { color: #b66a00; } -.highlight .kd { color: #268bd2; } +.highlight .s { color: #50a04f; } -.highlight .kn { color: #859900; } +.highlight .na { color: #b66a00; } -.highlight .kp { color: #859900; } +.highlight .nb { color: #ca7601; } -.highlight .kr { color: #268bd2; } +.highlight .nc { color: #ca7601; } -.highlight .kt { color: #dc322f; } +.highlight .no { color: #ca7601; } -.highlight .ld { color: #93a1a1; } +.highlight .nd { color: #ca7601; } -.highlight .m { color: #2aa198; } +.highlight .ni { color: #ca7601; } -.highlight .s { color: #2aa198; } +.highlight .ne { color: #ca7601; } -.highlight .na { color: #555; } +.highlight .nf { color: #383942; } -.highlight .nb { color: #b58900; } +.highlight .nl { color: #ca7601; } -.highlight .nc { color: #268bd2; } +.highlight .nn { color: #383942; } -.highlight .no { color: #cb4b16; } +.highlight .nx { color: #383942; } -.highlight .nd { color: #268bd2; } +.highlight .py { color: #ca7601; } -.highlight .ni { color: #cb4b16; } +.highlight .nt { color: #e35549; } -.highlight .ne { color: #cb4b16; } +.highlight .nv { color: #ca7601; } -.highlight .nf { color: #268bd2; } +.highlight .ow { font-weight: 700; } -.highlight .nl { color: #555; } +.highlight .w { color: #f8f8f2; } -.highlight .nn { color: #93a1a1; } +.highlight .mf { color: #b66a00; } -.highlight .nx { color: #555; } +.highlight .mh { color: #b66a00; } -.highlight .py { color: #93a1a1; } +.highlight .mi { color: #b66a00; } -.highlight .nt { color: #268bd2; } +.highlight .mo { color: #b66a00; } -.highlight .nv { color: #268bd2; } +.highlight .sb { color: #50a04f; } -.highlight .ow { color: #859900; } +.highlight .sc { color: #50a04f; } -.highlight .w { color: #93a1a1; } +.highlight .sd { color: #50a04f; } -.highlight .mf { color: #2aa198; } +.highlight .s2 { color: #50a04f; } -.highlight .mh { color: #2aa198; } +.highlight .se { color: #50a04f; } -.highlight .mi { color: #2aa198; } +.highlight .sh { color: #50a04f; } -.highlight .mo { color: #2aa198; } +.highlight .si { color: #50a04f; } -.highlight .sb { color: #586e75; } +.highlight .sx { color: #50a04f; } -.highlight .sc { color: #2aa198; } +.highlight .sr { color: #0083bb; } -.highlight .sd { color: #93a1a1; } +.highlight .s1 { color: #50a04f; } -.highlight .s2 { color: #2aa198; } +.highlight .ss { color: #0083bb; } -.highlight .se { color: #cb4b16; } +.highlight .bp { color: #ca7601; } -.highlight .sh { color: #93a1a1; } +.highlight .vc { color: #ca7601; } -.highlight .si { color: #2aa198; } +.highlight .vg { color: #ca7601; } -.highlight .sx { color: #2aa198; } +.highlight .vi { color: #e35549; } -.highlight .sr { color: #dc322f; } +.highlight .il { color: #b66a00; } -.highlight .s1 { color: #2aa198; } +.highlight .gu { color: #75715e; } -.highlight .ss { color: #2aa198; } +.highlight .gd { color: #e05151; } -.highlight .bp { color: #268bd2; } +.highlight .gi { color: #43d089; } -.highlight .vc { color: #268bd2; } +.highlight .language-json .w + .s2 { color: #e35549; } -.highlight .vg { color: #268bd2; } - -.highlight .vi { color: #268bd2; } - -.highlight .il { color: #2aa198; } +.highlight .language-json .kc { color: #0083bb; } .swatch { padding: 0.5rem; vertical-align: middle; display: inline-block; box-sizing: border-box; margin-right: 0.25rem; } @@ -284,12 +280,12 @@ template { display: none; } /** Add the correct display in IE 10. */ [hidden] { display: none; } -* { box-sizing: border-box; } +:root { color-scheme: light; } -::selection { color: #fff; background: #F08700; } +* { box-sizing: border-box; } -html { font-size: 14px !important; scroll-behavior: smooth; } -@media (min-width: 31.25rem) { html { font-size: 16px !important; } } +html { font-size: 0.875rem !important; scroll-behavior: smooth; } +@media (min-width: 31.25rem) { html { font-size: 1rem !important; } } body { font-family: "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: inherit; line-height: 1.4; color: #5c5962; background-color: #fff; overflow-wrap: break-word; } @@ -314,37 +310,37 @@ img { max-width: 100%; height: auto; } hr { height: 1px; padding: 0; margin: 2rem 0; background-color: #eeebee; border: 0; } -blockquote { margin: 10px 0; margin-block-start: 0; margin-inline-start: 0; padding-left: 15px; border-left: 3px solid #eeebee; } +blockquote { margin: 10px 0; margin-block-start: 0; margin-inline-start: 0; padding-left: 1rem; border-left: 3px solid #eeebee; } .side-bar { z-index: 0; display: flex; flex-wrap: wrap; background-color: #f5f6fa; } -@media (min-width: 50rem) { .side-bar { flex-flow: column nowrap; position: fixed; width: 248px; height: 100%; border-right: 1px solid #eeebee; align-items: flex-end; } } -@media (min-width: 66.5rem) { .side-bar { width: calc((100% - 1064px) / 2 + 264px); min-width: 264px; } } +@media (min-width: 50rem) { .side-bar { flex-flow: column nowrap; position: fixed; width: 15.5rem; height: 100%; border-right: 1px solid #eeebee; align-items: flex-end; } } +@media (min-width: 66.5rem) { .side-bar { width: calc((100% - 66.5rem) / 2 + 16.5rem); min-width: 16.5rem; } } -@media (min-width: 50rem) { .main { position: relative; max-width: 800px; margin-left: 248px; } } -@media (min-width: 66.5rem) { .main { margin-left: calc( (100% - 1064px) / 2 + 264px ); } } +@media (min-width: 50rem) { .main { position: relative; max-width: 50rem; margin-left: 15.5rem; } } +@media (min-width: 66.5rem) { .main { margin-left: Max(16.5rem, calc((100% - 66.5rem) / 2 + 16.5rem)); } } .main-content-wrap { padding-right: 1rem; padding-left: 1rem; padding-top: 1rem; padding-bottom: 1rem; } @media (min-width: 50rem) { .main-content-wrap { padding-right: 2rem; padding-left: 2rem; } } @media (min-width: 50rem) { .main-content-wrap { padding-top: 2rem; padding-bottom: 2rem; } } .main-header { z-index: 0; display: none; background-color: #f5f6fa; } -@media (min-width: 50rem) { .main-header { display: flex; justify-content: space-between; height: 60px; background-color: #fff; border-bottom: 1px solid #eeebee; } } +@media (min-width: 50rem) { .main-header { display: flex; justify-content: space-between; height: 3.75rem; background-color: #fff; border-bottom: 1px solid #eeebee; } } .main-header.nav-open { display: block; } @media (min-width: 50rem) { .main-header.nav-open { display: flex; } } .site-nav, .site-header, .site-footer { width: 100%; } -@media (min-width: 66.5rem) { .site-nav, .site-header, .site-footer { width: 264px; } } +@media (min-width: 66.5rem) { .site-nav, .site-header, .site-footer { width: 16.5rem; } } .site-nav { display: none; } .site-nav.nav-open { display: block; } @media (min-width: 50rem) { .site-nav { display: block; padding-top: 3rem; padding-bottom: 1rem; overflow-y: auto; flex: 1 1 auto; } } -.site-header { display: flex; min-height: 60px; align-items: center; } -@media (min-width: 50rem) { .site-header { height: 60px; max-height: 60px; border-bottom: 1px solid #eeebee; } } +.site-header { display: flex; min-height: 3.75rem; align-items: center; } +@media (min-width: 50rem) { .site-header { height: 3.75rem; max-height: 3.75rem; border-bottom: 1px solid #eeebee; } } -.site-title { padding-right: 1rem; padding-left: 1rem; flex-grow: 1; display: flex; height: 100%; align-items: center; padding-top: 0.75rem; padding-bottom: 0.75rem; color: #27262b; font-size: 18px !important; } +.site-title { padding-right: 1rem; padding-left: 1rem; flex-grow: 1; display: flex; height: 100%; align-items: center; padding-top: 0.75rem; padding-bottom: 0.75rem; color: #27262b; font-size: 1.125rem !important; } @media (min-width: 50rem) { .site-title { padding-right: 2rem; padding-left: 2rem; } } -@media (min-width: 31.25rem) { .site-title { font-size: 24px !important; line-height: 1.25; } } +@media (min-width: 31.25rem) { .site-title { font-size: 1.5rem !important; line-height: 1.25; } } @media (min-width: 50rem) { .site-title { padding-top: 0.5rem; padding-bottom: 0.5rem; } } .site-logo { width: 100%; height: 100%; background-image: url("/navigator/assets/res/logo.png"); background-repeat: no-repeat; background-position: left center; background-size: contain; } @@ -359,9 +355,9 @@ blockquote { margin: 10px 0; margin-block-start: 0; margin-inline-start: 0; padd body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } @media (min-width: 50rem) { body { position: static; padding-bottom: 0; } } -.site-footer { padding-right: 1rem; padding-left: 1rem; position: absolute; bottom: 0; left: 0; padding-top: 1rem; padding-bottom: 1rem; color: #959396; font-size: 11px !important; } +.site-footer { padding-right: 1rem; padding-left: 1rem; position: absolute; bottom: 0; left: 0; padding-top: 1rem; padding-bottom: 1rem; color: #959396; font-size: 0.6875rem !important; } @media (min-width: 50rem) { .site-footer { padding-right: 2rem; padding-left: 2rem; } } -@media (min-width: 31.25rem) { .site-footer { font-size: 12px !important; } } +@media (min-width: 31.25rem) { .site-footer { font-size: 0.75rem !important; } } @media (min-width: 50rem) { .site-footer { position: static; justify-self: end; } } .icon { width: 1.5rem; height: 1.5rem; color: #F08700; } @@ -373,8 +369,8 @@ body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } .main-content li .highlight { margin-top: 0.25rem; } .main-content ol { list-style-type: none; counter-reset: step-counter; } .main-content ol > li { position: relative; } -.main-content ol > li::before { position: absolute; top: 0.2em; left: -1.6em; color: #959396; content: counter(step-counter); counter-increment: step-counter; font-size: 12px !important; } -@media (min-width: 31.25rem) { .main-content ol > li::before { font-size: 14px !important; } } +.main-content ol > li::before { position: absolute; top: 0.2em; left: -1.6em; color: #959396; content: counter(step-counter); counter-increment: step-counter; font-size: 0.75rem !important; } +@media (min-width: 31.25rem) { .main-content ol > li::before { font-size: 0.875rem !important; } } @media (min-width: 31.25rem) { .main-content ol > li::before { top: 0.11em; } } .main-content ol > li ol { counter-reset: sub-counter; } .main-content ol > li ol > li::before { content: counter(sub-counter,lower-alpha); counter-increment: sub-counter; } @@ -402,10 +398,10 @@ body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } .main-content > h1:first-child, .main-content > h2:first-child, .main-content > h3:first-child, .main-content > h4:first-child, .main-content > h5:first-child, .main-content > h6:first-child, .main-content > .sect1:first-child > h2, .main-content > .sect2:first-child > h3, .main-content > .sect3:first-child > h4, .main-content > .sect4:first-child > h5, .main-content > .sect5:first-child > h6 { margin-top: 0.5rem; } .nav-list { padding: 0; margin-top: 0; margin-bottom: 0; list-style: none; } -.nav-list .nav-list-item { font-size: 14px !important; position: relative; margin: 0; } -@media (min-width: 31.25rem) { .nav-list .nav-list-item { font-size: 16px !important; } } -@media (min-width: 50rem) { .nav-list .nav-list-item { font-size: 12px !important; } } -@media (min-width: 50rem) and (min-width: 31.25rem) { .nav-list .nav-list-item { font-size: 14px !important; } } +.nav-list .nav-list-item { font-size: 0.875rem !important; position: relative; margin: 0; } +@media (min-width: 31.25rem) { .nav-list .nav-list-item { font-size: 1rem !important; } } +@media (min-width: 50rem) { .nav-list .nav-list-item { font-size: 0.75rem !important; } } +@media (min-width: 50rem) and (min-width: 31.25rem) { .nav-list .nav-list-item { font-size: 0.875rem !important; } } .nav-list .nav-list-item .nav-list-link { display: block; min-height: 3rem; padding-top: 0.25rem; padding-bottom: 0.25rem; line-height: 2.5rem; padding-right: 3rem; padding-left: 1rem; } @media (min-width: 50rem) { .nav-list .nav-list-item .nav-list-link { min-height: 2rem; line-height: 1.5rem; padding-right: 2rem; padding-left: 2rem; } } @@ -423,8 +419,8 @@ body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } .nav-list .nav-list-item.active > .nav-list-expander svg { transform: rotate(-90deg); } .nav-list .nav-list-item.active > .nav-list { display: block; } -.nav-category { padding: 0.5rem 1rem; font-weight: 600; text-align: start; text-transform: uppercase; border-bottom: 1px solid #eeebee; font-size: 11px !important; } -@media (min-width: 31.25rem) { .nav-category { font-size: 12px !important; } } +.nav-category { padding: 0.5rem 1rem; font-weight: 600; text-align: start; text-transform: uppercase; border-bottom: 1px solid #eeebee; font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .nav-category { font-size: 0.75rem !important; } } @media (min-width: 50rem) { .nav-category { padding: 0.5rem 2rem; margin-top: 1rem; text-align: start; } .nav-category:first-child { margin-top: 0; } } @@ -433,8 +429,8 @@ body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } .nav-list.nav-category-list > .nav-list-item > .nav-list > .nav-list-item > .nav-list-link { color: #F08700; } .nav-list.nav-category-list > .nav-list-item > .nav-list > .nav-list-item > .nav-list-expander { color: #F08700; } -.aux-nav { height: 100%; overflow-x: auto; font-size: 11px !important; } -@media (min-width: 31.25rem) { .aux-nav { font-size: 12px !important; } } +.aux-nav { height: 100%; overflow-x: auto; font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .aux-nav { font-size: 0.75rem !important; } } .aux-nav .aux-nav-list { display: flex; height: 100%; padding: 0; margin: 0; list-style: none; } .aux-nav .aux-nav-list-item { display: inline-block; height: 100%; padding: 0; margin: 0; } @media (min-width: 50rem) { .aux-nav { padding-right: 1rem; } } @@ -443,34 +439,34 @@ body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } .breadcrumb-nav-list { padding-left: 0; margin-bottom: 0.75rem; list-style: none; } -.breadcrumb-nav-list-item { display: table-cell; font-size: 11px !important; } -@media (min-width: 31.25rem) { .breadcrumb-nav-list-item { font-size: 12px !important; } } +.breadcrumb-nav-list-item { display: table-cell; font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .breadcrumb-nav-list-item { font-size: 0.75rem !important; } } .breadcrumb-nav-list-item::before { display: none; } .breadcrumb-nav-list-item::after { display: inline-block; margin-right: 0.5rem; margin-left: 0.5rem; color: #959396; content: "/"; } .breadcrumb-nav-list-item:last-child::after { content: ""; } -h1, .text-alpha { font-size: 32px !important; line-height: 1.25; font-weight: 300; } -@media (min-width: 31.25rem) { h1, .text-alpha { font-size: 36px !important; } } +h1, .text-alpha { font-size: 2rem !important; line-height: 1.25; font-weight: 300; } +@media (min-width: 31.25rem) { h1, .text-alpha { font-size: 2.25rem !important; } } -h2, .text-beta, #toctitle { font-size: 18px !important; } -@media (min-width: 31.25rem) { h2, .text-beta, #toctitle { font-size: 24px !important; line-height: 1.25; } } +h2, .text-beta, #toctitle { font-size: 1.125rem !important; } +@media (min-width: 31.25rem) { h2, .text-beta, #toctitle { font-size: 1.5rem !important; line-height: 1.25; } } -h3, .text-gamma { font-size: 16px !important; } -@media (min-width: 31.25rem) { h3, .text-gamma { font-size: 18px !important; } } +h3, .text-gamma { font-size: 1rem !important; } +@media (min-width: 31.25rem) { h3, .text-gamma { font-size: 1.125rem !important; } } -h4, .text-delta { font-size: 11px !important; font-weight: 400; text-transform: uppercase; letter-spacing: 0.1em; } -@media (min-width: 31.25rem) { h4, .text-delta { font-size: 12px !important; } } +h4, .text-delta { font-size: 0.6875rem !important; font-weight: 400; text-transform: uppercase; letter-spacing: 0.1em; } +@media (min-width: 31.25rem) { h4, .text-delta { font-size: 0.75rem !important; } } h4 code { text-transform: none; } -h5, .text-epsilon { font-size: 12px !important; } -@media (min-width: 31.25rem) { h5, .text-epsilon { font-size: 14px !important; } } +h5, .text-epsilon { font-size: 0.75rem !important; } +@media (min-width: 31.25rem) { h5, .text-epsilon { font-size: 0.875rem !important; } } -h6, .text-zeta { font-size: 11px !important; } -@media (min-width: 31.25rem) { h6, .text-zeta { font-size: 12px !important; } } +h6, .text-zeta { font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { h6, .text-zeta { font-size: 0.75rem !important; } } -.text-small { font-size: 11px !important; } -@media (min-width: 31.25rem) { .text-small { font-size: 12px !important; } } +.text-small { font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .text-small { font-size: 0.75rem !important; } } .text-mono { font-family: "SFMono-Regular", menlo, consolas, monospace !important; } @@ -480,16 +476,16 @@ h6, .text-zeta { font-size: 11px !important; } .text-right { text-align: right !important; } -.label, .label-blue { display: inline-block; padding: 0.16em 0.56em; margin-right: 0.5rem; margin-left: 0.5rem; color: #fff; text-transform: uppercase; vertical-align: middle; background-color: #2869e6; font-size: 11px !important; border-radius: 12px; } -@media (min-width: 31.25rem) { .label, .label-blue { font-size: 12px !important; } } +.label:not(g), .label-blue:not(g) { display: inline-block; padding: 0.16em 0.56em; margin-right: 0.5rem; margin-left: 0.5rem; color: #fff; text-transform: uppercase; vertical-align: middle; background-color: #2869e6; font-size: 0.6875rem !important; border-radius: 12px; } +@media (min-width: 31.25rem) { .label:not(g), .label-blue:not(g) { font-size: 0.75rem !important; } } -.label-green { background-color: #009c7b; } +.label-green:not(g) { background-color: #009c7b; } -.label-purple { background-color: #5e41d0; } +.label-purple:not(g) { background-color: #5e41d0; } -.label-red { background-color: #e94c4c; } +.label-red:not(g) { background-color: #e94c4c; } -.label-yellow { color: #44434d; background-color: #f7d12e; } +.label-yellow:not(g) { color: #44434d; background-color: #f7d12e; } .btn { display: inline-block; box-sizing: border-box; padding: 0.3em 1em; margin: 0; font-family: inherit; font-size: inherit; font-weight: 500; line-height: 1.5; color: #F08700; text-decoration: none; vertical-align: baseline; cursor: pointer; background-color: #f7f7f7; border-width: 0; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); appearance: none; } .btn:focus { text-decoration: none; outline: none; box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.25); } @@ -525,14 +521,16 @@ h6, .text-zeta { font-size: 11px !important; } .btn-green:active, .btn-green.selected, .btn-green.zeroclipboard-is-active { background-color: #0f9e73; background-image: none; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); } .btn-green.selected:hover { background-color: #0d8662; } +.btn-reset { background: none; border: none; margin: 0; text-align: inherit; font: inherit; border-radius: 0; appearance: none; } + .search { position: relative; z-index: 2; flex-grow: 1; height: 4rem; padding: 0.5rem; transition: padding linear 200ms; } @media (min-width: 50rem) { .search { position: relative !important; width: auto !important; height: 100% !important; padding: 0; transition: none; } } .search-input-wrap { position: relative; z-index: 1; height: 3rem; overflow: hidden; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); transition: height linear 200ms; } -@media (min-width: 50rem) { .search-input-wrap { position: absolute; width: 100%; max-width: 536px; height: 100% !important; border-radius: 0; box-shadow: none; transition: width ease 400ms; } } +@media (min-width: 50rem) { .search-input-wrap { position: absolute; width: 100%; max-width: 33.5rem; height: 100% !important; border-radius: 0; box-shadow: none; transition: width ease 400ms; } } -.search-input { position: absolute; width: 100%; height: 100%; padding: 0.5rem 1rem 0.5rem 2.5rem; font-size: 16px; color: #5c5962; background-color: #fff; border-top: 0; border-right: 0; border-bottom: 0; border-left: 0; border-radius: 0; } -@media (min-width: 50rem) { .search-input { padding: 0.5rem 1rem 0.5rem 3.5rem; font-size: 14px; background-color: #fff; transition: padding-left linear 200ms; } } +.search-input { position: absolute; width: 100%; height: 100%; padding: 0.5rem 1rem 0.5rem 2.5rem; font-size: 1rem; color: #5c5962; background-color: #fff; border-top: 0; border-right: 0; border-bottom: 0; border-left: 0; border-radius: 0; } +@media (min-width: 50rem) { .search-input { padding: 0.5rem 1rem 0.5rem 3.5rem; font-size: 0.875rem; background-color: #fff; transition: padding-left linear 200ms; } } .search-input:focus { outline: 0; } .search-input:focus + .search-label .search-icon { color: #F08700; } @@ -541,12 +539,12 @@ h6, .text-zeta { font-size: 11px !important; } .search-label .search-icon { width: 1.2rem; height: 1.2rem; align-self: center; color: #959396; } .search-results { position: absolute; left: 0; display: none; width: 100%; max-height: calc(100% - 4rem); overflow-y: auto; background-color: #fff; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); } -@media (min-width: 50rem) { .search-results { top: 100%; width: 536px; max-height: calc(100vh - 200%) !important; } } +@media (min-width: 50rem) { .search-results { top: 100%; width: 33.5rem; max-height: calc(100vh - 200%) !important; } } -.search-results-list { padding-left: 0; margin-bottom: 0.25rem; list-style: none; font-size: 14px !important; } -@media (min-width: 31.25rem) { .search-results-list { font-size: 16px !important; } } -@media (min-width: 50rem) { .search-results-list { font-size: 12px !important; } } -@media (min-width: 50rem) and (min-width: 31.25rem) { .search-results-list { font-size: 14px !important; } } +.search-results-list { padding-left: 0; margin-bottom: 0.25rem; list-style: none; font-size: 0.875rem !important; } +@media (min-width: 31.25rem) { .search-results-list { font-size: 1rem !important; } } +@media (min-width: 50rem) { .search-results-list { font-size: 0.75rem !important; } } +@media (min-width: 50rem) and (min-width: 31.25rem) { .search-results-list { font-size: 0.875rem !important; } } .search-results-list-item { padding: 0; margin: 0; } @@ -557,29 +555,29 @@ h6, .text-zeta { font-size: 11px !important; } @media (min-width: 31.25rem) { .search-result-title { display: inline-block; width: 40%; padding-right: 0.5rem; vertical-align: top; } } .search-result-doc { display: flex; align-items: center; word-wrap: break-word; } -.search-result-doc.search-result-doc-parent { opacity: 0.5; font-size: 12px !important; } -@media (min-width: 31.25rem) { .search-result-doc.search-result-doc-parent { font-size: 14px !important; } } -@media (min-width: 50rem) { .search-result-doc.search-result-doc-parent { font-size: 11px !important; } } -@media (min-width: 50rem) and (min-width: 31.25rem) { .search-result-doc.search-result-doc-parent { font-size: 12px !important; } } +.search-result-doc.search-result-doc-parent { opacity: 0.5; font-size: 0.75rem !important; } +@media (min-width: 31.25rem) { .search-result-doc.search-result-doc-parent { font-size: 0.875rem !important; } } +@media (min-width: 50rem) { .search-result-doc.search-result-doc-parent { font-size: 0.6875rem !important; } } +@media (min-width: 50rem) and (min-width: 31.25rem) { .search-result-doc.search-result-doc-parent { font-size: 0.75rem !important; } } .search-result-doc .search-result-icon { width: 1rem; height: 1rem; margin-right: 0.5rem; color: #F08700; flex-shrink: 0; } .search-result-doc .search-result-doc-title { overflow: auto; } .search-result-section { margin-left: 1.5rem; word-wrap: break-word; } -.search-result-rel-url { display: block; margin-left: 1.5rem; overflow: hidden; color: #959396; text-overflow: ellipsis; white-space: nowrap; font-size: 9px !important; } -@media (min-width: 31.25rem) { .search-result-rel-url { font-size: 10px !important; } } +.search-result-rel-url { display: block; margin-left: 1.5rem; overflow: hidden; color: #959396; text-overflow: ellipsis; white-space: nowrap; font-size: 0.5625rem !important; } +@media (min-width: 31.25rem) { .search-result-rel-url { font-size: 0.625rem !important; } } -.search-result-previews { display: block; padding-top: 0.5rem; padding-bottom: 0.5rem; padding-left: 1rem; margin-left: 0.5rem; color: #959396; word-wrap: break-word; border-left: 1px solid; border-left-color: #eeebee; font-size: 11px !important; } -@media (min-width: 31.25rem) { .search-result-previews { font-size: 12px !important; } } +.search-result-previews { display: block; padding-top: 0.5rem; padding-bottom: 0.5rem; padding-left: 1rem; margin-left: 0.5rem; color: #959396; word-wrap: break-word; border-left: 1px solid; border-left-color: #eeebee; font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .search-result-previews { font-size: 0.75rem !important; } } @media (min-width: 31.25rem) { .search-result-previews { display: inline-block; width: 60%; padding-left: 0.5rem; margin-left: 0; vertical-align: top; } } .search-result-preview + .search-result-preview { margin-top: 0.25rem; } .search-result-highlight { font-weight: bold; } -.search-no-result { padding: 0.5rem 0.75rem; font-size: 12px !important; } -@media (min-width: 31.25rem) { .search-no-result { font-size: 14px !important; } } +.search-no-result { padding: 0.5rem 0.75rem; font-size: 0.75rem !important; } +@media (min-width: 31.25rem) { .search-no-result { font-size: 0.875rem !important; } } .search-button { position: fixed; right: 1rem; bottom: 1rem; display: flex; width: 3.5rem; height: 3.5rem; background-color: #fff; border: 1px solid rgba(240, 135, 0, 0.3); border-radius: 1.75rem; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); align-items: center; justify-content: center; } @@ -587,7 +585,7 @@ h6, .text-zeta { font-size: 11px !important; } .search-active .search { position: fixed; top: 0; left: 0; width: 100%; height: 100%; padding: 0; } .search-active .search-input-wrap { height: 4rem; border-radius: 0; } -@media (min-width: 50rem) { .search-active .search-input-wrap { width: 536px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); } } +@media (min-width: 50rem) { .search-active .search-input-wrap { width: 33.5rem; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); } } .search-active .search-input { background-color: #fff; } @media (min-width: 50rem) { .search-active .search-input { padding-left: 2.3rem; } } @media (min-width: 50rem) { .search-active .search-label { padding-left: 0.6rem; } } @@ -601,8 +599,8 @@ h6, .text-zeta { font-size: 11px !important; } table { display: table; min-width: 100%; border-collapse: separate; } -th, td { font-size: 12px !important; min-width: 120px; padding: 0.5rem 0.75rem; background-color: #fff; border-bottom: 1px solid rgba(238, 235, 238, 0.5); border-left: 1px solid #eeebee; } -@media (min-width: 31.25rem) { th, td { font-size: 14px !important; } } +th, td { font-size: 0.75rem !important; min-width: 7.5rem; padding: 0.5rem 0.75rem; background-color: #fff; border-bottom: 1px solid rgba(238, 235, 238, 0.5); border-left: 1px solid #eeebee; } +@media (min-width: 31.25rem) { th, td { font-size: 0.875rem !important; } } th:first-of-type, td:first-of-type { border-left: 0; } tbody tr:last-of-type th, tbody tr:last-of-type td { border-bottom: 0; } @@ -621,14 +619,18 @@ div.highlighter-rouge > button:active, div.listingblock > div.content > button:a div.highlighter-rouge > button:focus, div.listingblock > div.content > button:focus, figure.highlight > button:focus { opacity: 1; } div.highlighter-rouge:hover > button, div.listingblock > div.content:hover > button, figure.highlight:hover > button { cursor: copy; opacity: 1; } -div.highlighter-rouge div.highlight, div.listingblock div.highlight { overflow-x: auto; padding: 0.75rem; margin: 0; border: 0; } -div.highlighter-rouge pre.highlight, div.highlighter-rouge code, div.listingblock pre.highlight, div.listingblock code { padding: 0; margin: 0; border: 0; } +div.highlighter-rouge div.highlight { overflow-x: auto; padding: 0.75rem; margin: 0; border: 0; } +div.highlighter-rouge pre.highlight, div.highlighter-rouge code { padding: 0; margin: 0; border: 0; } + +div.listingblock { margin-top: 0; margin-bottom: 0.75rem; } +div.listingblock div.content { overflow-x: auto; padding: 0.75rem; margin: 0; border: 0; } +div.listingblock div.content > pre, div.listingblock code { padding: 0; margin: 0; border: 0; } figure.highlight pre, figure.highlight :not(pre) > code { overflow-x: auto; padding: 0.75rem; margin: 0; border: 0; } .highlight .table-wrapper { padding: 0.75rem 0; margin: 0; border: 0; box-shadow: none; } -.highlight .table-wrapper td, .highlight .table-wrapper pre { font-size: 11px !important; min-width: 0; padding: 0; background-color: #f5f6fa; border: 0; } -@media (min-width: 31.25rem) { .highlight .table-wrapper td, .highlight .table-wrapper pre { font-size: 12px !important; } } +.highlight .table-wrapper td, .highlight .table-wrapper pre { font-size: 0.6875rem !important; min-width: 0; padding: 0; background-color: #f5f6fa; border: 0; } +@media (min-width: 31.25rem) { .highlight .table-wrapper td, .highlight .table-wrapper pre { font-size: 0.75rem !important; } } .highlight .table-wrapper td.gl { width: 1em; padding-right: 0.75rem; padding-left: 0.75rem; } .highlight .table-wrapper pre { margin: 0; line-height: 2; } @@ -1066,35 +1068,35 @@ code.language-mermaid { padding: 0; background-color: inherit; border: 0; } .v-align-top { vertical-align: top !important; } -.fs-1 { font-size: 9px !important; } -@media (min-width: 31.25rem) { .fs-1 { font-size: 10px !important; } } +.fs-1 { font-size: 0.5625rem !important; } +@media (min-width: 31.25rem) { .fs-1 { font-size: 0.625rem !important; } } -.fs-2 { font-size: 11px !important; } -@media (min-width: 31.25rem) { .fs-2 { font-size: 12px !important; } } +.fs-2 { font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .fs-2 { font-size: 0.75rem !important; } } -.fs-3 { font-size: 12px !important; } -@media (min-width: 31.25rem) { .fs-3 { font-size: 14px !important; } } +.fs-3 { font-size: 0.75rem !important; } +@media (min-width: 31.25rem) { .fs-3 { font-size: 0.875rem !important; } } -.fs-4 { font-size: 14px !important; } -@media (min-width: 31.25rem) { .fs-4 { font-size: 16px !important; } } +.fs-4 { font-size: 0.875rem !important; } +@media (min-width: 31.25rem) { .fs-4 { font-size: 1rem !important; } } -.fs-5 { font-size: 16px !important; } -@media (min-width: 31.25rem) { .fs-5 { font-size: 18px !important; } } +.fs-5 { font-size: 1rem !important; } +@media (min-width: 31.25rem) { .fs-5 { font-size: 1.125rem !important; } } -.fs-6 { font-size: 18px !important; } -@media (min-width: 31.25rem) { .fs-6 { font-size: 24px !important; line-height: 1.25; } } +.fs-6 { font-size: 1.125rem !important; } +@media (min-width: 31.25rem) { .fs-6 { font-size: 1.5rem !important; line-height: 1.25; } } -.fs-7 { font-size: 24px !important; line-height: 1.25; } -@media (min-width: 31.25rem) { .fs-7 { font-size: 32px !important; } } +.fs-7 { font-size: 1.5rem !important; line-height: 1.25; } +@media (min-width: 31.25rem) { .fs-7 { font-size: 2rem !important; } } -.fs-8 { font-size: 32px !important; line-height: 1.25; } -@media (min-width: 31.25rem) { .fs-8 { font-size: 36px !important; } } +.fs-8 { font-size: 2rem !important; line-height: 1.25; } +@media (min-width: 31.25rem) { .fs-8 { font-size: 2.25rem !important; } } -.fs-9 { font-size: 36px !important; line-height: 1.25; } -@media (min-width: 31.25rem) { .fs-9 { font-size: 42px !important; } } +.fs-9 { font-size: 2.25rem !important; line-height: 1.25; } +@media (min-width: 31.25rem) { .fs-9 { font-size: 2.625rem !important; } } -.fs-10 { font-size: 42px !important; line-height: 1.25; } -@media (min-width: 31.25rem) { .fs-10 { font-size: 48px !important; } } +.fs-10 { font-size: 2.625rem !important; line-height: 1.25; } +@media (min-width: 31.25rem) { .fs-10 { font-size: 3rem !important; } } .fw-300 { font-weight: 300 !important; } @@ -2303,7 +2305,7 @@ code.language-mermaid { padding: 0; background-color: inherit; border: 0; } @media print { .site-footer, .site-button, #edit-this-page, #back-to-top, .site-nav, .main-header { display: none !important; } .side-bar { width: 100%; height: auto; border-right: 0 !important; } .site-header { border-bottom: 1px solid #eeebee; } - .site-title { font-size: 16px !important; font-weight: 700 !important; } + .site-title { font-size: 1rem !important; font-weight: 700 !important; } .text-small { font-size: 8pt !important; } pre.highlight { border: 1px solid #eeebee; } .main { max-width: none; margin-left: 0; } } diff --git a/docs/_site/assets/css/just-the-docs-light.css b/docs/_site/assets/css/just-the-docs-light.css index 571bd374b..6acb42929 100755 --- a/docs/_site/assets/css/just-the-docs-light.css +++ b/docs/_site/assets/css/just-the-docs-light.css @@ -1,275 +1,135 @@ @charset "UTF-8"; -.highlight .c { color: #586e75; } +.highlight, pre.highlight { background: #f9f9f9; color: #383942; } -.highlight .err { color: #93a1a1; } +.highlight pre { background: #f9f9f9; } -.highlight .g { color: #93a1a1; } +.highlight .hll { background: #f9f9f9; } -.highlight .k { color: #859900; } +.highlight .c { color: #9fa0a6; font-style: italic; } -.highlight .l { color: #93a1a1; } +.highlight .err { color: #fff; background-color: #e05151; } -.highlight .n { color: #93a1a1; } +.highlight .k { color: #a625a4; } -.highlight .o { color: #859900; } +.highlight .l { color: #50a04f; } -.highlight .x { color: #cb4b16; } +.highlight .n { color: #383942; } -.highlight .p { color: #93a1a1; } +.highlight .o { color: #383942; } -.highlight .cm { color: #586e75; } +.highlight .p { color: #383942; } -.highlight .cp { color: #859900; } +.highlight .cm { color: #9fa0a6; font-style: italic; } -.highlight .c1 { color: #586e75; } +.highlight .cp { color: #9fa0a6; font-style: italic; } -.highlight .cs { color: #859900; } +.highlight .c1 { color: #9fa0a6; font-style: italic; } -.highlight .gd { color: #2aa198; } +.highlight .cs { color: #9fa0a6; font-style: italic; } -.highlight .ge { font-style: italic; color: #93a1a1; } +.highlight .ge { font-style: italic; } -.highlight .gr { color: #dc322f; } +.highlight .gs { font-weight: 700; } -.highlight .gh { color: #cb4b16; } +.highlight .kc { color: #a625a4; } -.highlight .gi { color: #859900; } +.highlight .kd { color: #a625a4; } -.highlight .go { color: #93a1a1; } +.highlight .kn { color: #a625a4; } -.highlight .gp { color: #93a1a1; } +.highlight .kp { color: #a625a4; } -.highlight .gs { font-weight: bold; color: #93a1a1; } +.highlight .kr { color: #a625a4; } -.highlight .gu { color: #cb4b16; } +.highlight .kt { color: #a625a4; } -.highlight .gt { color: #93a1a1; } +.highlight .ld { color: #50a04f; } -.highlight .kc { color: #cb4b16; } +.highlight .m { color: #b66a00; } -.highlight .kd { color: #268bd2; } +.highlight .s { color: #50a04f; } -.highlight .kn { color: #859900; } +.highlight .na { color: #b66a00; } -.highlight .kp { color: #859900; } +.highlight .nb { color: #ca7601; } -.highlight .kr { color: #268bd2; } +.highlight .nc { color: #ca7601; } -.highlight .kt { color: #dc322f; } +.highlight .no { color: #ca7601; } -.highlight .ld { color: #93a1a1; } +.highlight .nd { color: #ca7601; } -.highlight .m { color: #2aa198; } +.highlight .ni { color: #ca7601; } -.highlight .s { color: #2aa198; } +.highlight .ne { color: #ca7601; } -.highlight .na { color: #555; } +.highlight .nf { color: #383942; } -.highlight .nb { color: #b58900; } +.highlight .nl { color: #ca7601; } -.highlight .nc { color: #268bd2; } +.highlight .nn { color: #383942; } -.highlight .no { color: #cb4b16; } +.highlight .nx { color: #383942; } -.highlight .nd { color: #268bd2; } +.highlight .py { color: #ca7601; } -.highlight .ni { color: #cb4b16; } +.highlight .nt { color: #e35549; } -.highlight .ne { color: #cb4b16; } +.highlight .nv { color: #ca7601; } -.highlight .nf { color: #268bd2; } +.highlight .ow { font-weight: 700; } -.highlight .nl { color: #555; } +.highlight .w { color: #f8f8f2; } -.highlight .nn { color: #93a1a1; } +.highlight .mf { color: #b66a00; } -.highlight .nx { color: #555; } +.highlight .mh { color: #b66a00; } -.highlight .py { color: #93a1a1; } +.highlight .mi { color: #b66a00; } -.highlight .nt { color: #268bd2; } +.highlight .mo { color: #b66a00; } -.highlight .nv { color: #268bd2; } +.highlight .sb { color: #50a04f; } -.highlight .ow { color: #859900; } +.highlight .sc { color: #50a04f; } -.highlight .w { color: #93a1a1; } +.highlight .sd { color: #50a04f; } -.highlight .mf { color: #2aa198; } +.highlight .s2 { color: #50a04f; } -.highlight .mh { color: #2aa198; } +.highlight .se { color: #50a04f; } -.highlight .mi { color: #2aa198; } +.highlight .sh { color: #50a04f; } -.highlight .mo { color: #2aa198; } +.highlight .si { color: #50a04f; } -.highlight .sb { color: #586e75; } +.highlight .sx { color: #50a04f; } -.highlight .sc { color: #2aa198; } +.highlight .sr { color: #0083bb; } -.highlight .sd { color: #93a1a1; } +.highlight .s1 { color: #50a04f; } -.highlight .s2 { color: #2aa198; } +.highlight .ss { color: #0083bb; } -.highlight .se { color: #cb4b16; } +.highlight .bp { color: #ca7601; } -.highlight .sh { color: #93a1a1; } +.highlight .vc { color: #ca7601; } -.highlight .si { color: #2aa198; } +.highlight .vg { color: #ca7601; } -.highlight .sx { color: #2aa198; } +.highlight .vi { color: #e35549; } -.highlight .sr { color: #dc322f; } +.highlight .il { color: #b66a00; } -.highlight .s1 { color: #2aa198; } +.highlight .gu { color: #75715e; } -.highlight .ss { color: #2aa198; } +.highlight .gd { color: #e05151; } -.highlight .bp { color: #268bd2; } +.highlight .gi { color: #43d089; } -.highlight .vc { color: #268bd2; } +.highlight .language-json .w + .s2 { color: #e35549; } -.highlight .vg { color: #268bd2; } - -.highlight .vi { color: #268bd2; } - -.highlight .il { color: #2aa198; } - -.highlight .c { color: #586e75; } - -.highlight .err { color: #93a1a1; } - -.highlight .g { color: #93a1a1; } - -.highlight .k { color: #859900; } - -.highlight .l { color: #93a1a1; } - -.highlight .n { color: #93a1a1; } - -.highlight .o { color: #859900; } - -.highlight .x { color: #cb4b16; } - -.highlight .p { color: #93a1a1; } - -.highlight .cm { color: #586e75; } - -.highlight .cp { color: #859900; } - -.highlight .c1 { color: #586e75; } - -.highlight .cs { color: #859900; } - -.highlight .gd { color: #2aa198; } - -.highlight .ge { font-style: italic; color: #93a1a1; } - -.highlight .gr { color: #dc322f; } - -.highlight .gh { color: #cb4b16; } - -.highlight .gi { color: #859900; } - -.highlight .go { color: #93a1a1; } - -.highlight .gp { color: #93a1a1; } - -.highlight .gs { font-weight: bold; color: #93a1a1; } - -.highlight .gu { color: #cb4b16; } - -.highlight .gt { color: #93a1a1; } - -.highlight .kc { color: #cb4b16; } - -.highlight .kd { color: #268bd2; } - -.highlight .kn { color: #859900; } - -.highlight .kp { color: #859900; } - -.highlight .kr { color: #268bd2; } - -.highlight .kt { color: #dc322f; } - -.highlight .ld { color: #93a1a1; } - -.highlight .m { color: #2aa198; } - -.highlight .s { color: #2aa198; } - -.highlight .na { color: #555; } - -.highlight .nb { color: #b58900; } - -.highlight .nc { color: #268bd2; } - -.highlight .no { color: #cb4b16; } - -.highlight .nd { color: #268bd2; } - -.highlight .ni { color: #cb4b16; } - -.highlight .ne { color: #cb4b16; } - -.highlight .nf { color: #268bd2; } - -.highlight .nl { color: #555; } - -.highlight .nn { color: #93a1a1; } - -.highlight .nx { color: #555; } - -.highlight .py { color: #93a1a1; } - -.highlight .nt { color: #268bd2; } - -.highlight .nv { color: #268bd2; } - -.highlight .ow { color: #859900; } - -.highlight .w { color: #93a1a1; } - -.highlight .mf { color: #2aa198; } - -.highlight .mh { color: #2aa198; } - -.highlight .mi { color: #2aa198; } - -.highlight .mo { color: #2aa198; } - -.highlight .sb { color: #586e75; } - -.highlight .sc { color: #2aa198; } - -.highlight .sd { color: #93a1a1; } - -.highlight .s2 { color: #2aa198; } - -.highlight .se { color: #cb4b16; } - -.highlight .sh { color: #93a1a1; } - -.highlight .si { color: #2aa198; } - -.highlight .sx { color: #2aa198; } - -.highlight .sr { color: #dc322f; } - -.highlight .s1 { color: #2aa198; } - -.highlight .ss { color: #2aa198; } - -.highlight .bp { color: #268bd2; } - -.highlight .vc { color: #268bd2; } - -.highlight .vg { color: #268bd2; } - -.highlight .vi { color: #268bd2; } - -.highlight .il { color: #2aa198; } +.highlight .language-json .kc { color: #0083bb; } /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ /* Document ========================================================================== */ @@ -380,14 +240,14 @@ template { display: none; } /** Add the correct display in IE 10. */ [hidden] { display: none; } -* { box-sizing: border-box; } +:root { color-scheme: light; } -::selection { color: #fff; background: #7253ed; } +* { box-sizing: border-box; } -html { font-size: 14px !important; scroll-behavior: smooth; } -@media (min-width: 31.25rem) { html { font-size: 16px !important; } } +html { font-size: 0.875rem !important; scroll-behavior: smooth; } +@media (min-width: 31.25rem) { html { font-size: 1rem !important; } } -body { font-family: system-ui, -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, sans-serif; font-size: inherit; line-height: 1.4; color: #5c5962; background-color: #fff; overflow-wrap: break-word; } +body { font-family: system-ui, -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, sans-serif, "Segoe UI Emoji"; font-size: inherit; line-height: 1.4; color: #5c5962; background-color: #fff; overflow-wrap: break-word; } ol, ul, dl, pre, address, blockquote, table, div, hr, form, fieldset, noscript .table-wrapper { margin-top: 0; } @@ -410,37 +270,37 @@ img { max-width: 100%; height: auto; } hr { height: 1px; padding: 0; margin: 2rem 0; background-color: #eeebee; border: 0; } -blockquote { margin: 10px 0; margin-block-start: 0; margin-inline-start: 0; padding-left: 15px; border-left: 3px solid #eeebee; } +blockquote { margin: 10px 0; margin-block-start: 0; margin-inline-start: 0; padding-left: 1rem; border-left: 3px solid #eeebee; } .side-bar { z-index: 0; display: flex; flex-wrap: wrap; background-color: #f5f6fa; } -@media (min-width: 50rem) { .side-bar { flex-flow: column nowrap; position: fixed; width: 248px; height: 100%; border-right: 1px solid #eeebee; align-items: flex-end; } } -@media (min-width: 66.5rem) { .side-bar { width: calc((100% - 1064px) / 2 + 264px); min-width: 264px; } } +@media (min-width: 50rem) { .side-bar { flex-flow: column nowrap; position: fixed; width: 15.5rem; height: 100%; border-right: 1px solid #eeebee; align-items: flex-end; } } +@media (min-width: 66.5rem) { .side-bar { width: calc((100% - 66.5rem) / 2 + 16.5rem); min-width: 16.5rem; } } -@media (min-width: 50rem) { .main { position: relative; max-width: 800px; margin-left: 248px; } } -@media (min-width: 66.5rem) { .main { margin-left: calc( (100% - 1064px) / 2 + 264px ); } } +@media (min-width: 50rem) { .main { position: relative; max-width: 50rem; margin-left: 15.5rem; } } +@media (min-width: 66.5rem) { .main { margin-left: Max(16.5rem, calc((100% - 66.5rem) / 2 + 16.5rem)); } } .main-content-wrap { padding-right: 1rem; padding-left: 1rem; padding-top: 1rem; padding-bottom: 1rem; } @media (min-width: 50rem) { .main-content-wrap { padding-right: 2rem; padding-left: 2rem; } } @media (min-width: 50rem) { .main-content-wrap { padding-top: 2rem; padding-bottom: 2rem; } } .main-header { z-index: 0; display: none; background-color: #f5f6fa; } -@media (min-width: 50rem) { .main-header { display: flex; justify-content: space-between; height: 60px; background-color: #fff; border-bottom: 1px solid #eeebee; } } +@media (min-width: 50rem) { .main-header { display: flex; justify-content: space-between; height: 3.75rem; background-color: #fff; border-bottom: 1px solid #eeebee; } } .main-header.nav-open { display: block; } @media (min-width: 50rem) { .main-header.nav-open { display: flex; } } .site-nav, .site-header, .site-footer { width: 100%; } -@media (min-width: 66.5rem) { .site-nav, .site-header, .site-footer { width: 264px; } } +@media (min-width: 66.5rem) { .site-nav, .site-header, .site-footer { width: 16.5rem; } } .site-nav { display: none; } .site-nav.nav-open { display: block; } @media (min-width: 50rem) { .site-nav { display: block; padding-top: 3rem; padding-bottom: 1rem; overflow-y: auto; flex: 1 1 auto; } } -.site-header { display: flex; min-height: 60px; align-items: center; } -@media (min-width: 50rem) { .site-header { height: 60px; max-height: 60px; border-bottom: 1px solid #eeebee; } } +.site-header { display: flex; min-height: 3.75rem; align-items: center; } +@media (min-width: 50rem) { .site-header { height: 3.75rem; max-height: 3.75rem; border-bottom: 1px solid #eeebee; } } -.site-title { padding-right: 1rem; padding-left: 1rem; flex-grow: 1; display: flex; height: 100%; align-items: center; padding-top: 0.75rem; padding-bottom: 0.75rem; color: #27262b; font-size: 18px !important; } +.site-title { padding-right: 1rem; padding-left: 1rem; flex-grow: 1; display: flex; height: 100%; align-items: center; padding-top: 0.75rem; padding-bottom: 0.75rem; color: #27262b; font-size: 1.125rem !important; } @media (min-width: 50rem) { .site-title { padding-right: 2rem; padding-left: 2rem; } } -@media (min-width: 31.25rem) { .site-title { font-size: 24px !important; line-height: 1.25; } } +@media (min-width: 31.25rem) { .site-title { font-size: 1.5rem !important; line-height: 1.25; } } @media (min-width: 50rem) { .site-title { padding-top: 0.5rem; padding-bottom: 0.5rem; } } .site-logo { width: 100%; height: 100%; background-image: url("/navigator/assets/res/logo.png"); background-repeat: no-repeat; background-position: left center; background-size: contain; } @@ -455,9 +315,9 @@ blockquote { margin: 10px 0; margin-block-start: 0; margin-inline-start: 0; padd body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } @media (min-width: 50rem) { body { position: static; padding-bottom: 0; } } -.site-footer { padding-right: 1rem; padding-left: 1rem; position: absolute; bottom: 0; left: 0; padding-top: 1rem; padding-bottom: 1rem; color: #959396; font-size: 11px !important; } +.site-footer { padding-right: 1rem; padding-left: 1rem; position: absolute; bottom: 0; left: 0; padding-top: 1rem; padding-bottom: 1rem; color: #959396; font-size: 0.6875rem !important; } @media (min-width: 50rem) { .site-footer { padding-right: 2rem; padding-left: 2rem; } } -@media (min-width: 31.25rem) { .site-footer { font-size: 12px !important; } } +@media (min-width: 31.25rem) { .site-footer { font-size: 0.75rem !important; } } @media (min-width: 50rem) { .site-footer { position: static; justify-self: end; } } .icon { width: 1.5rem; height: 1.5rem; color: #7253ed; } @@ -469,8 +329,8 @@ body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } .main-content li .highlight { margin-top: 0.25rem; } .main-content ol { list-style-type: none; counter-reset: step-counter; } .main-content ol > li { position: relative; } -.main-content ol > li::before { position: absolute; top: 0.2em; left: -1.6em; color: #959396; content: counter(step-counter); counter-increment: step-counter; font-size: 12px !important; } -@media (min-width: 31.25rem) { .main-content ol > li::before { font-size: 14px !important; } } +.main-content ol > li::before { position: absolute; top: 0.2em; left: -1.6em; color: #959396; content: counter(step-counter); counter-increment: step-counter; font-size: 0.75rem !important; } +@media (min-width: 31.25rem) { .main-content ol > li::before { font-size: 0.875rem !important; } } @media (min-width: 31.25rem) { .main-content ol > li::before { top: 0.11em; } } .main-content ol > li ol { counter-reset: sub-counter; } .main-content ol > li ol > li::before { content: counter(sub-counter,lower-alpha); counter-increment: sub-counter; } @@ -498,10 +358,10 @@ body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } .main-content > h1:first-child, .main-content > h2:first-child, .main-content > h3:first-child, .main-content > h4:first-child, .main-content > h5:first-child, .main-content > h6:first-child, .main-content > .sect1:first-child > h2, .main-content > .sect2:first-child > h3, .main-content > .sect3:first-child > h4, .main-content > .sect4:first-child > h5, .main-content > .sect5:first-child > h6 { margin-top: 0.5rem; } .nav-list { padding: 0; margin-top: 0; margin-bottom: 0; list-style: none; } -.nav-list .nav-list-item { font-size: 14px !important; position: relative; margin: 0; } -@media (min-width: 31.25rem) { .nav-list .nav-list-item { font-size: 16px !important; } } -@media (min-width: 50rem) { .nav-list .nav-list-item { font-size: 12px !important; } } -@media (min-width: 50rem) and (min-width: 31.25rem) { .nav-list .nav-list-item { font-size: 14px !important; } } +.nav-list .nav-list-item { font-size: 0.875rem !important; position: relative; margin: 0; } +@media (min-width: 31.25rem) { .nav-list .nav-list-item { font-size: 1rem !important; } } +@media (min-width: 50rem) { .nav-list .nav-list-item { font-size: 0.75rem !important; } } +@media (min-width: 50rem) and (min-width: 31.25rem) { .nav-list .nav-list-item { font-size: 0.875rem !important; } } .nav-list .nav-list-item .nav-list-link { display: block; min-height: 3rem; padding-top: 0.25rem; padding-bottom: 0.25rem; line-height: 2.5rem; padding-right: 3rem; padding-left: 1rem; } @media (min-width: 50rem) { .nav-list .nav-list-item .nav-list-link { min-height: 2rem; line-height: 1.5rem; padding-right: 2rem; padding-left: 2rem; } } @@ -519,8 +379,8 @@ body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } .nav-list .nav-list-item.active > .nav-list-expander svg { transform: rotate(-90deg); } .nav-list .nav-list-item.active > .nav-list { display: block; } -.nav-category { padding: 0.5rem 1rem; font-weight: 600; text-align: start; text-transform: uppercase; border-bottom: 1px solid #eeebee; font-size: 11px !important; } -@media (min-width: 31.25rem) { .nav-category { font-size: 12px !important; } } +.nav-category { padding: 0.5rem 1rem; font-weight: 600; text-align: start; text-transform: uppercase; border-bottom: 1px solid #eeebee; font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .nav-category { font-size: 0.75rem !important; } } @media (min-width: 50rem) { .nav-category { padding: 0.5rem 2rem; margin-top: 1rem; text-align: start; } .nav-category:first-child { margin-top: 0; } } @@ -529,8 +389,8 @@ body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } .nav-list.nav-category-list > .nav-list-item > .nav-list > .nav-list-item > .nav-list-link { color: #7253ed; } .nav-list.nav-category-list > .nav-list-item > .nav-list > .nav-list-item > .nav-list-expander { color: #7253ed; } -.aux-nav { height: 100%; overflow-x: auto; font-size: 11px !important; } -@media (min-width: 31.25rem) { .aux-nav { font-size: 12px !important; } } +.aux-nav { height: 100%; overflow-x: auto; font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .aux-nav { font-size: 0.75rem !important; } } .aux-nav .aux-nav-list { display: flex; height: 100%; padding: 0; margin: 0; list-style: none; } .aux-nav .aux-nav-list-item { display: inline-block; height: 100%; padding: 0; margin: 0; } @media (min-width: 50rem) { .aux-nav { padding-right: 1rem; } } @@ -539,34 +399,34 @@ body { position: relative; padding-bottom: 4rem; overflow-y: scroll; } .breadcrumb-nav-list { padding-left: 0; margin-bottom: 0.75rem; list-style: none; } -.breadcrumb-nav-list-item { display: table-cell; font-size: 11px !important; } -@media (min-width: 31.25rem) { .breadcrumb-nav-list-item { font-size: 12px !important; } } +.breadcrumb-nav-list-item { display: table-cell; font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .breadcrumb-nav-list-item { font-size: 0.75rem !important; } } .breadcrumb-nav-list-item::before { display: none; } .breadcrumb-nav-list-item::after { display: inline-block; margin-right: 0.5rem; margin-left: 0.5rem; color: #959396; content: "/"; } .breadcrumb-nav-list-item:last-child::after { content: ""; } -h1, .text-alpha { font-size: 32px !important; line-height: 1.25; font-weight: 300; } -@media (min-width: 31.25rem) { h1, .text-alpha { font-size: 36px !important; } } +h1, .text-alpha { font-size: 2rem !important; line-height: 1.25; font-weight: 300; } +@media (min-width: 31.25rem) { h1, .text-alpha { font-size: 2.25rem !important; } } -h2, .text-beta, #toctitle { font-size: 18px !important; } -@media (min-width: 31.25rem) { h2, .text-beta, #toctitle { font-size: 24px !important; line-height: 1.25; } } +h2, .text-beta, #toctitle { font-size: 1.125rem !important; } +@media (min-width: 31.25rem) { h2, .text-beta, #toctitle { font-size: 1.5rem !important; line-height: 1.25; } } -h3, .text-gamma { font-size: 16px !important; } -@media (min-width: 31.25rem) { h3, .text-gamma { font-size: 18px !important; } } +h3, .text-gamma { font-size: 1rem !important; } +@media (min-width: 31.25rem) { h3, .text-gamma { font-size: 1.125rem !important; } } -h4, .text-delta { font-size: 11px !important; font-weight: 400; text-transform: uppercase; letter-spacing: 0.1em; } -@media (min-width: 31.25rem) { h4, .text-delta { font-size: 12px !important; } } +h4, .text-delta { font-size: 0.6875rem !important; font-weight: 400; text-transform: uppercase; letter-spacing: 0.1em; } +@media (min-width: 31.25rem) { h4, .text-delta { font-size: 0.75rem !important; } } h4 code { text-transform: none; } -h5, .text-epsilon { font-size: 12px !important; } -@media (min-width: 31.25rem) { h5, .text-epsilon { font-size: 14px !important; } } +h5, .text-epsilon { font-size: 0.75rem !important; } +@media (min-width: 31.25rem) { h5, .text-epsilon { font-size: 0.875rem !important; } } -h6, .text-zeta { font-size: 11px !important; } -@media (min-width: 31.25rem) { h6, .text-zeta { font-size: 12px !important; } } +h6, .text-zeta { font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { h6, .text-zeta { font-size: 0.75rem !important; } } -.text-small { font-size: 11px !important; } -@media (min-width: 31.25rem) { .text-small { font-size: 12px !important; } } +.text-small { font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .text-small { font-size: 0.75rem !important; } } .text-mono { font-family: "SFMono-Regular", menlo, consolas, monospace !important; } @@ -576,16 +436,16 @@ h6, .text-zeta { font-size: 11px !important; } .text-right { text-align: right !important; } -.label, .label-blue { display: inline-block; padding: 0.16em 0.56em; margin-right: 0.5rem; margin-left: 0.5rem; color: #fff; text-transform: uppercase; vertical-align: middle; background-color: #2869e6; font-size: 11px !important; border-radius: 12px; } -@media (min-width: 31.25rem) { .label, .label-blue { font-size: 12px !important; } } +.label:not(g), .label-blue:not(g) { display: inline-block; padding: 0.16em 0.56em; margin-right: 0.5rem; margin-left: 0.5rem; color: #fff; text-transform: uppercase; vertical-align: middle; background-color: #2869e6; font-size: 0.6875rem !important; border-radius: 12px; } +@media (min-width: 31.25rem) { .label:not(g), .label-blue:not(g) { font-size: 0.75rem !important; } } -.label-green { background-color: #009c7b; } +.label-green:not(g) { background-color: #009c7b; } -.label-purple { background-color: #5e41d0; } +.label-purple:not(g) { background-color: #5e41d0; } -.label-red { background-color: #e94c4c; } +.label-red:not(g) { background-color: #e94c4c; } -.label-yellow { color: #44434d; background-color: #f7d12e; } +.label-yellow:not(g) { color: #44434d; background-color: #f7d12e; } .btn { display: inline-block; box-sizing: border-box; padding: 0.3em 1em; margin: 0; font-family: inherit; font-size: inherit; font-weight: 500; line-height: 1.5; color: #7253ed; text-decoration: none; vertical-align: baseline; cursor: pointer; background-color: #f7f7f7; border-width: 0; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); appearance: none; } .btn:focus { text-decoration: none; outline: none; box-shadow: 0 0 0 3px rgba(0, 0, 255, 0.25); } @@ -621,14 +481,16 @@ h6, .text-zeta { font-size: 11px !important; } .btn-green:active, .btn-green.selected, .btn-green.zeroclipboard-is-active { background-color: #0f9e73; background-image: none; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15); } .btn-green.selected:hover { background-color: #0d8662; } +.btn-reset { background: none; border: none; margin: 0; text-align: inherit; font: inherit; border-radius: 0; appearance: none; } + .search { position: relative; z-index: 2; flex-grow: 1; height: 4rem; padding: 0.5rem; transition: padding linear 200ms; } @media (min-width: 50rem) { .search { position: relative !important; width: auto !important; height: 100% !important; padding: 0; transition: none; } } .search-input-wrap { position: relative; z-index: 1; height: 3rem; overflow: hidden; border-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); transition: height linear 200ms; } -@media (min-width: 50rem) { .search-input-wrap { position: absolute; width: 100%; max-width: 536px; height: 100% !important; border-radius: 0; box-shadow: none; transition: width ease 400ms; } } +@media (min-width: 50rem) { .search-input-wrap { position: absolute; width: 100%; max-width: 33.5rem; height: 100% !important; border-radius: 0; box-shadow: none; transition: width ease 400ms; } } -.search-input { position: absolute; width: 100%; height: 100%; padding: 0.5rem 1rem 0.5rem 2.5rem; font-size: 16px; color: #5c5962; background-color: #fff; border-top: 0; border-right: 0; border-bottom: 0; border-left: 0; border-radius: 0; } -@media (min-width: 50rem) { .search-input { padding: 0.5rem 1rem 0.5rem 3.5rem; font-size: 14px; background-color: #fff; transition: padding-left linear 200ms; } } +.search-input { position: absolute; width: 100%; height: 100%; padding: 0.5rem 1rem 0.5rem 2.5rem; font-size: 1rem; color: #5c5962; background-color: #fff; border-top: 0; border-right: 0; border-bottom: 0; border-left: 0; border-radius: 0; } +@media (min-width: 50rem) { .search-input { padding: 0.5rem 1rem 0.5rem 3.5rem; font-size: 0.875rem; background-color: #fff; transition: padding-left linear 200ms; } } .search-input:focus { outline: 0; } .search-input:focus + .search-label .search-icon { color: #7253ed; } @@ -637,12 +499,12 @@ h6, .text-zeta { font-size: 11px !important; } .search-label .search-icon { width: 1.2rem; height: 1.2rem; align-self: center; color: #959396; } .search-results { position: absolute; left: 0; display: none; width: 100%; max-height: calc(100% - 4rem); overflow-y: auto; background-color: #fff; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); } -@media (min-width: 50rem) { .search-results { top: 100%; width: 536px; max-height: calc(100vh - 200%) !important; } } +@media (min-width: 50rem) { .search-results { top: 100%; width: 33.5rem; max-height: calc(100vh - 200%) !important; } } -.search-results-list { padding-left: 0; margin-bottom: 0.25rem; list-style: none; font-size: 14px !important; } -@media (min-width: 31.25rem) { .search-results-list { font-size: 16px !important; } } -@media (min-width: 50rem) { .search-results-list { font-size: 12px !important; } } -@media (min-width: 50rem) and (min-width: 31.25rem) { .search-results-list { font-size: 14px !important; } } +.search-results-list { padding-left: 0; margin-bottom: 0.25rem; list-style: none; font-size: 0.875rem !important; } +@media (min-width: 31.25rem) { .search-results-list { font-size: 1rem !important; } } +@media (min-width: 50rem) { .search-results-list { font-size: 0.75rem !important; } } +@media (min-width: 50rem) and (min-width: 31.25rem) { .search-results-list { font-size: 0.875rem !important; } } .search-results-list-item { padding: 0; margin: 0; } @@ -653,29 +515,29 @@ h6, .text-zeta { font-size: 11px !important; } @media (min-width: 31.25rem) { .search-result-title { display: inline-block; width: 40%; padding-right: 0.5rem; vertical-align: top; } } .search-result-doc { display: flex; align-items: center; word-wrap: break-word; } -.search-result-doc.search-result-doc-parent { opacity: 0.5; font-size: 12px !important; } -@media (min-width: 31.25rem) { .search-result-doc.search-result-doc-parent { font-size: 14px !important; } } -@media (min-width: 50rem) { .search-result-doc.search-result-doc-parent { font-size: 11px !important; } } -@media (min-width: 50rem) and (min-width: 31.25rem) { .search-result-doc.search-result-doc-parent { font-size: 12px !important; } } +.search-result-doc.search-result-doc-parent { opacity: 0.5; font-size: 0.75rem !important; } +@media (min-width: 31.25rem) { .search-result-doc.search-result-doc-parent { font-size: 0.875rem !important; } } +@media (min-width: 50rem) { .search-result-doc.search-result-doc-parent { font-size: 0.6875rem !important; } } +@media (min-width: 50rem) and (min-width: 31.25rem) { .search-result-doc.search-result-doc-parent { font-size: 0.75rem !important; } } .search-result-doc .search-result-icon { width: 1rem; height: 1rem; margin-right: 0.5rem; color: #7253ed; flex-shrink: 0; } .search-result-doc .search-result-doc-title { overflow: auto; } .search-result-section { margin-left: 1.5rem; word-wrap: break-word; } -.search-result-rel-url { display: block; margin-left: 1.5rem; overflow: hidden; color: #959396; text-overflow: ellipsis; white-space: nowrap; font-size: 9px !important; } -@media (min-width: 31.25rem) { .search-result-rel-url { font-size: 10px !important; } } +.search-result-rel-url { display: block; margin-left: 1.5rem; overflow: hidden; color: #959396; text-overflow: ellipsis; white-space: nowrap; font-size: 0.5625rem !important; } +@media (min-width: 31.25rem) { .search-result-rel-url { font-size: 0.625rem !important; } } -.search-result-previews { display: block; padding-top: 0.5rem; padding-bottom: 0.5rem; padding-left: 1rem; margin-left: 0.5rem; color: #959396; word-wrap: break-word; border-left: 1px solid; border-left-color: #eeebee; font-size: 11px !important; } -@media (min-width: 31.25rem) { .search-result-previews { font-size: 12px !important; } } +.search-result-previews { display: block; padding-top: 0.5rem; padding-bottom: 0.5rem; padding-left: 1rem; margin-left: 0.5rem; color: #959396; word-wrap: break-word; border-left: 1px solid; border-left-color: #eeebee; font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .search-result-previews { font-size: 0.75rem !important; } } @media (min-width: 31.25rem) { .search-result-previews { display: inline-block; width: 60%; padding-left: 0.5rem; margin-left: 0; vertical-align: top; } } .search-result-preview + .search-result-preview { margin-top: 0.25rem; } .search-result-highlight { font-weight: bold; } -.search-no-result { padding: 0.5rem 0.75rem; font-size: 12px !important; } -@media (min-width: 31.25rem) { .search-no-result { font-size: 14px !important; } } +.search-no-result { padding: 0.5rem 0.75rem; font-size: 0.75rem !important; } +@media (min-width: 31.25rem) { .search-no-result { font-size: 0.875rem !important; } } .search-button { position: fixed; right: 1rem; bottom: 1rem; display: flex; width: 3.5rem; height: 3.5rem; background-color: #fff; border: 1px solid rgba(114, 83, 237, 0.3); border-radius: 1.75rem; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); align-items: center; justify-content: center; } @@ -683,7 +545,7 @@ h6, .text-zeta { font-size: 11px !important; } .search-active .search { position: fixed; top: 0; left: 0; width: 100%; height: 100%; padding: 0; } .search-active .search-input-wrap { height: 4rem; border-radius: 0; } -@media (min-width: 50rem) { .search-active .search-input-wrap { width: 536px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); } } +@media (min-width: 50rem) { .search-active .search-input-wrap { width: 33.5rem; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08); } } .search-active .search-input { background-color: #fff; } @media (min-width: 50rem) { .search-active .search-input { padding-left: 2.3rem; } } @media (min-width: 50rem) { .search-active .search-label { padding-left: 0.6rem; } } @@ -697,8 +559,8 @@ h6, .text-zeta { font-size: 11px !important; } table { display: table; min-width: 100%; border-collapse: separate; } -th, td { font-size: 12px !important; min-width: 120px; padding: 0.5rem 0.75rem; background-color: #fff; border-bottom: 1px solid rgba(238, 235, 238, 0.5); border-left: 1px solid #eeebee; } -@media (min-width: 31.25rem) { th, td { font-size: 14px !important; } } +th, td { font-size: 0.75rem !important; min-width: 7.5rem; padding: 0.5rem 0.75rem; background-color: #fff; border-bottom: 1px solid rgba(238, 235, 238, 0.5); border-left: 1px solid #eeebee; } +@media (min-width: 31.25rem) { th, td { font-size: 0.875rem !important; } } th:first-of-type, td:first-of-type { border-left: 0; } tbody tr:last-of-type th, tbody tr:last-of-type td { border-bottom: 0; } @@ -717,14 +579,18 @@ div.highlighter-rouge > button:active, div.listingblock > div.content > button:a div.highlighter-rouge > button:focus, div.listingblock > div.content > button:focus, figure.highlight > button:focus { opacity: 1; } div.highlighter-rouge:hover > button, div.listingblock > div.content:hover > button, figure.highlight:hover > button { cursor: copy; opacity: 1; } -div.highlighter-rouge div.highlight, div.listingblock div.highlight { overflow-x: auto; padding: 0.75rem; margin: 0; border: 0; } -div.highlighter-rouge pre.highlight, div.highlighter-rouge code, div.listingblock pre.highlight, div.listingblock code { padding: 0; margin: 0; border: 0; } +div.highlighter-rouge div.highlight { overflow-x: auto; padding: 0.75rem; margin: 0; border: 0; } +div.highlighter-rouge pre.highlight, div.highlighter-rouge code { padding: 0; margin: 0; border: 0; } + +div.listingblock { margin-top: 0; margin-bottom: 0.75rem; } +div.listingblock div.content { overflow-x: auto; padding: 0.75rem; margin: 0; border: 0; } +div.listingblock div.content > pre, div.listingblock code { padding: 0; margin: 0; border: 0; } figure.highlight pre, figure.highlight :not(pre) > code { overflow-x: auto; padding: 0.75rem; margin: 0; border: 0; } .highlight .table-wrapper { padding: 0.75rem 0; margin: 0; border: 0; box-shadow: none; } -.highlight .table-wrapper td, .highlight .table-wrapper pre { font-size: 11px !important; min-width: 0; padding: 0; background-color: #f5f6fa; border: 0; } -@media (min-width: 31.25rem) { .highlight .table-wrapper td, .highlight .table-wrapper pre { font-size: 12px !important; } } +.highlight .table-wrapper td, .highlight .table-wrapper pre { font-size: 0.6875rem !important; min-width: 0; padding: 0; background-color: #f5f6fa; border: 0; } +@media (min-width: 31.25rem) { .highlight .table-wrapper td, .highlight .table-wrapper pre { font-size: 0.75rem !important; } } .highlight .table-wrapper td.gl { width: 1em; padding-right: 0.75rem; padding-left: 0.75rem; } .highlight .table-wrapper pre { margin: 0; line-height: 2; } @@ -1162,35 +1028,35 @@ code.language-mermaid { padding: 0; background-color: inherit; border: 0; } .v-align-top { vertical-align: top !important; } -.fs-1 { font-size: 9px !important; } -@media (min-width: 31.25rem) { .fs-1 { font-size: 10px !important; } } +.fs-1 { font-size: 0.5625rem !important; } +@media (min-width: 31.25rem) { .fs-1 { font-size: 0.625rem !important; } } -.fs-2 { font-size: 11px !important; } -@media (min-width: 31.25rem) { .fs-2 { font-size: 12px !important; } } +.fs-2 { font-size: 0.6875rem !important; } +@media (min-width: 31.25rem) { .fs-2 { font-size: 0.75rem !important; } } -.fs-3 { font-size: 12px !important; } -@media (min-width: 31.25rem) { .fs-3 { font-size: 14px !important; } } +.fs-3 { font-size: 0.75rem !important; } +@media (min-width: 31.25rem) { .fs-3 { font-size: 0.875rem !important; } } -.fs-4 { font-size: 14px !important; } -@media (min-width: 31.25rem) { .fs-4 { font-size: 16px !important; } } +.fs-4 { font-size: 0.875rem !important; } +@media (min-width: 31.25rem) { .fs-4 { font-size: 1rem !important; } } -.fs-5 { font-size: 16px !important; } -@media (min-width: 31.25rem) { .fs-5 { font-size: 18px !important; } } +.fs-5 { font-size: 1rem !important; } +@media (min-width: 31.25rem) { .fs-5 { font-size: 1.125rem !important; } } -.fs-6 { font-size: 18px !important; } -@media (min-width: 31.25rem) { .fs-6 { font-size: 24px !important; line-height: 1.25; } } +.fs-6 { font-size: 1.125rem !important; } +@media (min-width: 31.25rem) { .fs-6 { font-size: 1.5rem !important; line-height: 1.25; } } -.fs-7 { font-size: 24px !important; line-height: 1.25; } -@media (min-width: 31.25rem) { .fs-7 { font-size: 32px !important; } } +.fs-7 { font-size: 1.5rem !important; line-height: 1.25; } +@media (min-width: 31.25rem) { .fs-7 { font-size: 2rem !important; } } -.fs-8 { font-size: 32px !important; line-height: 1.25; } -@media (min-width: 31.25rem) { .fs-8 { font-size: 36px !important; } } +.fs-8 { font-size: 2rem !important; line-height: 1.25; } +@media (min-width: 31.25rem) { .fs-8 { font-size: 2.25rem !important; } } -.fs-9 { font-size: 36px !important; line-height: 1.25; } -@media (min-width: 31.25rem) { .fs-9 { font-size: 42px !important; } } +.fs-9 { font-size: 2.25rem !important; line-height: 1.25; } +@media (min-width: 31.25rem) { .fs-9 { font-size: 2.625rem !important; } } -.fs-10 { font-size: 42px !important; line-height: 1.25; } -@media (min-width: 31.25rem) { .fs-10 { font-size: 48px !important; } } +.fs-10 { font-size: 2.625rem !important; line-height: 1.25; } +@media (min-width: 31.25rem) { .fs-10 { font-size: 3rem !important; } } .fw-300 { font-weight: 300 !important; } @@ -2399,7 +2265,7 @@ code.language-mermaid { padding: 0; background-color: inherit; border: 0; } @media print { .site-footer, .site-button, #edit-this-page, #back-to-top, .site-nav, .main-header { display: none !important; } .side-bar { width: 100%; height: auto; border-right: 0 !important; } .site-header { border-bottom: 1px solid #eeebee; } - .site-title { font-size: 16px !important; font-weight: 700 !important; } + .site-title { font-size: 1rem !important; font-weight: 700 !important; } .text-small { font-size: 8pt !important; } pre.highlight { border: 1px solid #eeebee; } .main { max-width: none; margin-left: 0; } } diff --git a/docs/_site/assets/images/just-the-docs.png b/docs/_site/assets/images/just-the-docs.png deleted file mode 100644 index 81c33065f..000000000 Binary files a/docs/_site/assets/images/just-the-docs.png and /dev/null differ diff --git a/docs/_site/assets/images/search.svg b/docs/_site/assets/images/search.svg deleted file mode 100644 index 421ca4df0..000000000 --- a/docs/_site/assets/images/search.svg +++ /dev/null @@ -1 +0,0 @@ -Search diff --git a/docs/_site/assets/js/just-the-docs.js b/docs/_site/assets/js/just-the-docs.js index 552661d1c..8c1450842 100755 --- a/docs/_site/assets/js/just-the-docs.js +++ b/docs/_site/assets/js/just-the-docs.js @@ -29,13 +29,15 @@ function initNav() { } if (target) { e.preventDefault(); - target.parentNode.classList.toggle('active'); + target.ariaPressed = target.parentNode.classList.toggle('active'); } }); const siteNav = document.getElementById('site-nav'); const mainHeader = document.getElementById('main-header'); const menuButton = document.getElementById('menu-button'); + + disableHeadStyleSheets(); jtd.addEvent(menuButton, 'click', function(e){ e.preventDefault(); @@ -43,12 +45,30 @@ function initNav() { if (menuButton.classList.toggle('nav-open')) { siteNav.classList.add('nav-open'); mainHeader.classList.add('nav-open'); + menuButton.ariaPressed = true; } else { siteNav.classList.remove('nav-open'); mainHeader.classList.remove('nav-open'); + menuButton.ariaPressed = false; } }); } + +// The element is assumed to include the following stylesheets: +// 0. a to /assets/css/just-the-docs-default.css +// 1. a to /assets/css/just-the-docs-head-nav.css +// 2. a Contributing | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Contributing overview

Maintained by Raghav Pillai

Table of contents

  1. Source Control & Git
    1. Branching & Feature Branches
  2. Documentation
    1. Headers
    2. Function & Inline Documentation
      1. Examples:
      2. C++
      3. Python
      4. C++
      5. Python
  3. READMEs
  4. Code Standards and Guidelines
  5. Styling
  6. Variable initialization
  7. Abstraction
  8. Types, typing and type hinting
  9. Constants and parameters
  10. Misc

As an open source project, Navigator is always evolving and improving. We open our arms to anyone who’d like to contribute. To help guide contributors, we’ve developed detailed Code Guidelines & Standards, as well as documentation and branching guidelines that allow us to have a consistent developer experience regardless of author. This revolves around three main philosophies:

  • Inherent Readability
  • Consistency
  • Maintainability

By following these guidelines, we can fulfill these philosophies, which allow us to have the most efficient developer experience possible, along with having a mature and maintainable codebase.

Source Control & Git

  • Use the branching strategy described below. Do not commit directly to the main or dev branch. This applies even to simple changes, like fixing a typo!
  • Don’t merge your own pull requests to main, dev or release branches. Get the software architect or team lead to review your change and merge it.
  • Commit as often or as infrequently as you like. As long as you’re working in a branch (as described below), you can commit even a completely broken change without affecting others.

Branching & Feature Branches

We will maintain both a main branch and a dev branch. main is more stable than dev. When you begin work on a feature or a bugfix, fork the dev branch, implement your change, and create a pull request back to dev once the change is relatively stable and well tested.

Start branch names with ‘feature_’, but other than that, name them however you want. Make the name descriptive and helpful. Don’t name a branch feature_zcc - that name is not helpful to someone trying to understand what the branch is for. However, feature_zed_camera_color clearly describes what the branch is for.

Make sure your commits are meaningful and grouped up. Don’t commit your entire change history into a single commit, group them up so you have a timeline of your progress.

When we are preparing for a release, we will create a branch off of dev to test and and add bugfixes. This release will start with release_ and end with a version number - for example, release_1_0. This allows us to continue merging features into dev while a release is being worked on. Once testing is complete, the release branch will be merged into both main and dev, so that the fixes applied during testing are applied everywhere. The commit in main will be tagged as our new release.

Documentation

A cornerstone of good code is maintainability, which relies on understandable documentation. Navigator uses Doxygen to automatically generate high-level documentation from our user-defined documentation. Further documentation on how this works can be found below:

https://doxygen.nl/manual/docblocks.html

You can also use the VSCode Doxygen Generator to automatically generate proper documentation templates.

Below are the different types of documentation that are required for new contributions for Navigator.

Headers

Each file should have documentation on what the file accomplishes, as well as basic usage information. Below is our sample header comment template.

/*
 * Package:   package_name
 * Filename:  FileName.cpp
 * Author:    John Doe
@@ -49,4 +49,4 @@
 

Code Standards and Guidelines

Code standards and guidelines are a set of rules and best practices that help us create cleaner, readable and more maintainable code with minimal errors. This help us keep a cleaner, more consistent codebase. This helps us guarantee better code quality, lower code complexity and make more meaningful contributions over time. This all comes down to having better maintainability over time as we scale up our project.

Prefer readability over performance in most code. The obvious exception to this is code that is going to process a large amount of data (ie, the inner loop of a downsampler). However, much of our code runs relatively infrequently, so small performance gains are not worth obfuscating our code.

Styling

As our stack mainly contains C++ and Python code, we chose two styling guidelines for such, these being Google’s C++ guidelines for C++, and PEP 8 for Python. We heavily recommend you read at least an overview of these two guidelines. The main takeways for such are below:

  • Classes/class names should be in PascalCase
  • The names of variables (including function parameters) and data members are all lowercase, with underscores between words (snake_case) (eg: our_variable)
  • Constants should be fully uppercase (eg: OUR_CONSTANT)
  • Bracket initialization should be done on the same line as initialization
  • Indentation should be performed with a singular tab, equivalent to four spaces
  • Data members of classes (but not structs) additionally have trailing underscores. (eg: a_local_variable, a_struct_data_member,a_class_data_member_)
  • Filenames should be all lowercase and can include underscores (_)
  • Place a function’s variables in the narrowest scope possible, and initialize variables in the declaration

Variable initialization

Variables should be named in snake_case, and should be as verbose as possible. This allows for inherent readability. Examples of this are as below:

  • boolean functions and variables should be something like is_item_exists
  • integer functions and variables should be something like num_items

Names should be meaningful, even if it makes them very long. Good names are the #1 factor in writing readable code! Do NOT write int inchs = read(sa, b, BUFSZ); - instead write int characters_read = read(socket, buffer, buffer_size)

Abstraction

Abstract as much as possible! This helps with general code cleanliness and readability.

  • Split up as much as possible into different functions, we want to reuse as much code as possible
  • Split common code into libraries, and have libraries on the highest level of use (eg. code across subsystems should be put into that level of directory, code across packages should be put into that level of directory)
  • Don’t reinvent the wheel! If you can use existing code rather than writing your own, you usually should. This saves time and often results in using more mature code than we could write ourselves.
  • If you end up writing a general-purpose utility of some sort, write it in its own package so that other packages can require it later on (see voltron_test_utils for an example)
  • If you need to work with low-level OS functionality (eg, CAN interfaces), either isolate this part of the code in a safe, RAII (Resource Acquisition Is Initilization - look this up if you’re unfamiliar with it), C++-style class, or use a library that provides this same functionality. Don’t scatter the magic system calls, manual memory management, etc throughout your code.

Live by the DRY philisophy - Don’t Repeat Yourself (“Every piece of knowledge must have a single, unambiguous, authoritative representation within a system”). This means reducing repetition of patterns and code duplication, and avoiding code redundancy and duplication.

Types, typing and type hinting

Especially in Python, we want to make sure we use specific types. This helps us catch more error while building instead of during runtime, makes it easier to understand what a piece of code does through inherant code readability, and makes it easier for us to maintain! For example, we don’t want to use auto in C++, as this makes it difficult to infer what the variable actually does, instead specifically define the type. An example in Python of typing and type hinting can be found below.

def func(foo: int, bar: str) -> List:
    ques: str = str(foo)
    return [ques,bar]
-

Constants and parameters

All constants and parameters should be moved out of the file, or on the top of files. This allows us to define constants at the highest possible level, and allow better readability. If constants require redefining at any point, they’ll need to be moved into the root param.yaml file. If not, put them at the top of the file, styled in accordance to our styling guidelines.

Misc

  • Everything should be nested under the navigator::package_name namespace
  • C++ source files should use a .cpp extension. Header files should use a .hpp extension
+

Constants and parameters

All constants and parameters should be moved out of the file, or on the top of files. This allows us to define constants at the highest possible level, and allow better readability. If constants require redefining at any point, they’ll need to be moved into the root param.yaml file. If not, put them at the top of the file, styled in accordance to our styling guidelines.

Misc

diff --git a/docs/_site/contributing/troubleshooting.html b/docs/_site/contributing/troubleshooting.html index 5a743b4bf..acb8bd7c9 100644 --- a/docs/_site/contributing/troubleshooting.html +++ b/docs/_site/contributing/troubleshooting.html @@ -1,4 +1,4 @@ - Troubleshooting | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Troubleshooting

Maintained by Nova members

Table of contents

  1. “New publisher discovered on this topic, offering incompatible QoS”
    1. Solution
  2. “RuntimeError: trying to create rpc server for traffic manager…”
  3. When running the leaderboard evaluator: “No module named ‘agent’”
    1. Solution: Ensure that there isn’t a typo in the --agent flag to leaderboard_evaluator.py. As of writing, this is in leaderboard.bash.
  4. “The RMW implementation has been specified as…”
    1. Solution

“New publisher discovered on this topic, offering incompatible QoS”

[WARN] [1669075701.737584987] [leaderboard_node]: New publisher discovered on this topic, offering incompatible QoS. No messages will be received from it. Last incompatible policy: DURABILITY_QOS_POLICY
+            Troubleshooting | Navigator                 Skip to main content   Link      Menu      Expand       (external link)    Document      Search       Copy       Copied        

Troubleshooting

Maintained by Nova members

Table of contents

  1. “New publisher discovered on this topic, offering incompatible QoS”
    1. Solution
  2. “RuntimeError: trying to create rpc server for traffic manager…”
  3. When running the leaderboard evaluator: “No module named ‘agent’”
    1. Solution: Ensure that there isn’t a typo in the --agent flag to leaderboard_evaluator.py. As of writing, this is in leaderboard.bash.
  4. “The RMW implementation has been specified as…”
    1. Solution

“New publisher discovered on this topic, offering incompatible QoS”

[WARN] [1669075701.737584987] [leaderboard_node]: New publisher discovered on this topic, offering incompatible QoS. No messages will be received from it. Last incompatible policy: DURABILITY_QOS_POLICY
 

A warning similar to the above example will appear when a publisher and subscriber attempt to exchange messages with incompatible quality of service QoS policies.

Solution

Edit the QoS policy of either the relevant publisher or subscriber so that the two can “speak” to each other.

For more information on QoS in ROS2, including compatibility between policies, see here.

“RuntimeError: trying to create rpc server for traffic manager…”

...
   File "/workspace/leaderboard/leaderboard/leaderboard_evaluator.py", line 83, in __init__
     self.traffic_manager = self.client.get_trafficmanager(args.traffic_manager_port)
@@ -22,4 +22,4 @@
    RMW MIDDLEWARE
 middleware name    : rmw_cyclonedds_cpp
 ...
-
+
diff --git a/docs/_site/controls/controls-overview.html b/docs/_site/controls/controls-overview.html index c13d7579c..6dfd7722e 100755 --- a/docs/_site/controls/controls-overview.html +++ b/docs/_site/controls/controls-overview.html @@ -1 +1 @@ - Controls | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Controls overview

Maintained by Egan Johnson

Table of contents

  1. Sources of error
  2. Current controllers

The Controls system takes our vehicle’s current state and our target trajectory as inputs. Based on the difference between our current state and this desired trajectory, the system calculates the ideal:

  • Steering angle
  • Brake position
  • Throttle position

To make our system platform-agnostic, the Controller’s outputs are between (-1.0, 1.0) for steering and (0.0, 1.0) for throttle and brake positions. The Interface system is responsible for scaling these values to a specific platform.

Sources of error

The vehicle does not move perfectly. Physical error is introduced. There will always be errors in our model– that is, our set of assumptions about the vehicle’s physical properties and behavior.

Most importantly, there’s error in our current state, one of the inputs to our controller. In order for our controller to follow the desired trajectory, it must have an accurate understanding of where the car currently is, how fast it’s going, and which way it’s facing.

Current controllers

Our “unified controller” generates the desired steering angle and pedal positions within the same node. However, steering and pedal positions are calculated using two different controllers.

As of Sept. 21, 2022, our steering controller uses Pure Pursuit, while our throttle and brake are calculated using a simple PID controller. This combination works suitably at low speeds, though something more sophisticated like MPC would be necissary for highway driving.

+ Controls | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Controls overview

Maintained by Egan Johnson

Table of contents

  1. Sources of error
  2. Current controllers

The Controls system takes our vehicle’s current state and our target trajectory as inputs. Based on the difference between our current state and this desired trajectory, the system calculates the ideal:

  • Steering angle
  • Brake position
  • Throttle position

To make our system platform-agnostic, the Controller’s outputs are between (-1.0, 1.0) for steering and (0.0, 1.0) for throttle and brake positions. The Interface system is responsible for scaling these values to a specific platform.

Sources of error

The vehicle does not move perfectly. Physical error is introduced. There will always be errors in our model– that is, our set of assumptions about the vehicle’s physical properties and behavior.

Most importantly, there’s error in our current state, one of the inputs to our controller. In order for our controller to follow the desired trajectory, it must have an accurate understanding of where the car currently is, how fast it’s going, and which way it’s facing.

Current controllers

Our “unified controller” generates the desired steering angle and pedal positions within the same node. However, steering and pedal positions are calculated using two different controllers.

As of Sept. 21, 2022, our steering controller uses Pure Pursuit, while our throttle and brake are calculated using a simple PID controller. This combination works suitably at low speeds, though something more sophisticated like MPC would be necissary for highway driving.

diff --git a/docs/_site/feed.xml b/docs/_site/feed.xml index c013ccaff..3752702c7 100755 --- a/docs/_site/feed.xml +++ b/docs/_site/feed.xml @@ -1,4 +1,4 @@ -Jekyll2023-02-15T12:40:13-06:00http://0.0.0.0:8083/navigator/feed.xmlNavigatorNavigator is an open-source autonomous driving system developed by Nova, an applied research group at UT Dallas.Welcome to Jekyll!2022-09-05T21:27:33-05:002022-09-05T21:27:33-05:00http://0.0.0.0:8083/navigator/jekyll/update/2022/09/05/welcome-to-jekyll<p>You’ll find this post in your <code class="language-plaintext highlighter-rouge">_posts</code> directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run <code class="language-plaintext highlighter-rouge">jekyll serve</code>, which launches a web server and auto-regenerates your site when a file is updated.</p> +Jekyll2023-10-24T20:39:34-05:00http://0.0.0.0:8083/navigator/feed.xmlNavigatorNavigator is an open-source autonomous driving system developed by Nova, an applied research group at UT Dallas.Welcome to Jekyll!2022-09-05T21:27:33-05:002022-09-05T21:27:33-05:00http://0.0.0.0:8083/navigator/jekyll/update/2022/09/05/welcome-to-jekyll<p>You’ll find this post in your <code class="language-plaintext highlighter-rouge">_posts</code> directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run <code class="language-plaintext highlighter-rouge">jekyll serve</code>, which launches a web server and auto-regenerates your site when a file is updated.</p> <p>Jekyll requires blog post files to be named according to the following format:</p> diff --git a/docs/_site/index.html b/docs/_site/index.html index ba8aadc9a..abd043c59 100755 --- a/docs/_site/index.html +++ b/docs/_site/index.html @@ -1,8 +1,9 @@ - Navigator | Navigator is an open-source autonomous driving system developed by Nova, an applied research group at UT Dallas. Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Navigator is a simple, extensible, and open-source autonomous driving framework.

System overview View it on GitHub

Why Navigator?

Despite major advances in autonomous driving research, there has yet to exist a single framework that is both simple and extensible, all while being public and transparent.

Navigator is our answer to this delimma. It’s built on standard technologies, is kept as simple as possible, and its modular design makes adding new features straightforward.

System requirements

  • Docker
  • CARLA 0.9.13 for simulated testing (optional)
  • For best results, a dedicated GPU with at least 6 GB of memory, ideally 8 GB
  • x86_64 CPU
  • About 20 GB of disk space

Installation

Note: Lines with “$” are on host, while lines with “#” are within the container.

  1. Install Docker if you haven’t already done so
  2. If not already set, choose a number between 0-100 and use this for your user-wide ROS_DOMAIN_ID. Add this to your .bashrc with echo 'export ROS_DOMAIN_ID=[your number]' >> ~/.bashrc
  3. Clone our repository
    $ git clone --recursive https://github.com/Nova-UTD/navigator
    +            Navigator | Navigator is an open-source autonomous driving system developed by Nova, an applied research group at UT Dallas.                 Skip to main content   Link      Menu      Expand       (external link)    Document      Search       Copy       Copied        

    Navigator is a simple, extensible, and open-source autonomous driving framework.

    System overview View it on GitHub

    Why Navigator?

    Despite major advances in autonomous driving research, there has yet to exist a single framework that is both simple and extensible, all while being public and transparent.

    Navigator is our answer to this delimma. It’s built on standard technologies, is kept as simple as possible, and its modular design makes adding new features straightforward.

    System requirements

    • Docker
    • CARLA 0.9.13 for simulated testing (optional)
    • For best results, a dedicated GPU with at least 6 GB of memory, ideally 8 GB
    • x86_64 CPU
    • About 20 GB of disk space

    Installation

    Note: Lines with “$” are on host, while lines with “#” are within the container.

    1. Install Docker.

      Note: Docker is already installed on the quad.

    2. Choose a number between 0-100 and use this for your user-wide ROS_DOMAIN_ID environment variable. Add the following line to your .bashrc file
      export ROS_DOMAIN_ID=57
      +
    3. Clone our repository
      $ git clone --recursive https://github.com/Nova-UTD/navigator
       $ cd navigator
      -
    4. Build and start our Docker container
      $ docker build . -t navigator
      -$ ./docker.sh
      -

      which gives:

      wheitman@justingpu:~/navigator$ ./docker.sh 
      +
    5. Build our Docker container. The sequence of commands used to build the container is given in the Dockerfile file and the build and run parameters are specified in the docker-compose.yml file.

      Note: A Docker image for Navigator already exists on the Quad, so there is no need to rebuild it (unless you’ve changed it!).

      $ docker compose build navigator
      +
    6. Run the Docker image.
      $ docker compose run navigator
      +

      which gives:

      [username]@justingpu:~/navigator$ ./docker.sh 
       =====================================================================
       ▀█▄   ▀█▀                   ██                    ▄                   
        █▀█   █   ▄▄▄▄   ▄▄▄▄ ▄▄▄ ▄▄▄    ▄▄▄ ▄  ▄▄▄▄   ▄██▄    ▄▄▄   ▄▄▄ ▄▄  
      @@ -13,13 +14,18 @@
       =====================================================================
       Developed by Nova, a student-run autonomous driving group at UT Dallas
       Find out more at https://nova-utd.github.io/navigator
      -🦊 Sourcing ROS2 Foxy...
      -🔗 Configuring the ROS DDS...
      +🐢 Sourcing ROS2 Humble...
       🧭 Sourcing Navigator...
      -🔌 Setting up CARLA API...
      +❗ Finished environment setup
       root@justingpu:/navigator# 
      -
    7. Now that you’re in the container, build our ROS workspace:
      $ colcon build --symlink-install
      -

    That’s it!

    CARLA demo

    1. Make sure you’ve installed Navigator using the steps above.
    2. On the host, start CARLA: ./CarlaUE4.sh See the CARLA docs for more info.

    3. Run the following commands to start our system and connect it to CARLA:
      $ ./docker.sh
      +
    4. Now that you’re in the container, build the navigator ROS workspace:
      $ colcon build --symlink-install
      +

      That’s it!

      Note that if you’ve build the workspace outside the container or want to start with a fresh build, you can delete the build and install directories and call colcon build with the following extra flag:

      $ rm -r -f build
      +$ rm -r -f install
      +$ colcon build --symlink-install --cmake-clean-cache
      +

    CARLA Simulator

    1. Make sure you’ve installed Navigator using the steps above.
    2. On the host, start CARLA: ./CarlaUE4.sh See the CARLA docs for more info.

      Note: On the Quad, CARLA is installed at /home/share/carla/, so you can add an alias to the .bashrc file with the line alias runcarla="/home/share/carla/CarlaUE4.sh".

    CARLA-ROS2 Bridge

    The current CARLA-ROS2 bridge, that allows ROS to communicate with the CARLA simulator is compatible with ROS2 Foxy, not the ROS2 Humble we use for Navigator. We use a second Docker container to run the CARLA-ROS2 bridge.

    1. The Dockerfile and docker-compose.yml for the CARLA-ROS2 bridge container is located in navigator/docker/carla-ros-bridge. Navigate to this directory and build this Docker image:
      $ docker compose build carla_bridge
      +

      Note: The Quad should already have an image for this Docker container built.

    2. Run the Docker container:
      $ docker compose run carla_bridge
      +

      The entrypoint.sh script sources ROS2 (Foxy) and sets environment variables needed for the bridge.

    Launching a Demo

    1. The bridge can be run using the following line within the CARLA-ROS2 bridge container:
      # ros2 launch carla_ros_bridge carla_ros_bridge.launch.py
      +
    2. Run the following commands to start our system and connect it to CARLA:
      $ ./docker.sh
       ...
       root@yourhost:/navigator# ./navigator
       root@yourhost:/navigator# ros2 launch carla_interface carla.launch.py
      @@ -34,4 +40,4 @@
       $ ./docker.sh
       ...
       root@yourhost:/navigator# rviz2
      -
    +

Real-world use

To run in the real-world, you’ll need to provide your own LiDAR stream, map data, and throttle/brake/steering interface. We provide our own interface, for use with our specific hardware, as an example.

To use, run ./docker.sh to enter the container, then source Navigator with . install/setup.bash, and finally launch the real-world script with ros2 launch main.launch.py. If you haven’t built the workspace yet, run colcon build --symlink-install after sourcing.

diff --git a/docs/_site/interface/interface-overview.html b/docs/_site/interface/interface-overview.html index 4d4cb6a59..58ad14edc 100644 --- a/docs/_site/interface/interface-overview.html +++ b/docs/_site/interface/interface-overview.html @@ -1 +1 @@ - Interface | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Interface overview

Table of contents

  1. About Hail Bopp
  2. Electrical overview

The Interface subsystem represents the only code that is vehicle-specific by necessity. It is the link between software and hardware. Since your hardware is probably different than ours, then you’ll likely have to modify our interface code to suit your needs.

The exception is our CARLA bridge, a simple script that spawns an ego vehicle and connects its sensors and actuators to ROS.

In this overview, we’ll go over our hardware platform, Hail Bopp.

About Hail Bopp

Hail Bopp includes an Electronic Power Assisted Steering (EPAS) system, which is a motor on our steering column that allows us to apply steering force programatically.

Our vehicle also has front and rear Velodyne Puck (VLP-16) LiDAR sensors. These generate rich, precise 3D scans of our surroundings using 16 channels of spinning lasers.

Our platform uses ZED stereo cameras to gather color images and their corresponding depth information. Stereo cams can give us limited 3D information, but they are best used in conjuction with more accurate LiDAR data.

We currently use an NVIDIA Jetson AGX Xavier for our onboard computing. This is likely to change soon, as we have exceeded the power capabilities of this device.

Finally, an Adafruit Metro Grand Central serves as our real-time microcontroller. This device handles time-critical services, such as releasing our steering wheel if our high-level software fails.

Electrical overview

Voltron Secondary System schematic

+ Interface | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Interface overview

Table of contents

  1. About Hail Bopp
  2. Electrical overview

The Interface subsystem represents the only code that is vehicle-specific by necessity. It is the link between software and hardware. Since your hardware is probably different than ours, then you’ll likely have to modify our interface code to suit your needs.

The exception is our CARLA bridge, a simple script that spawns an ego vehicle and connects its sensors and actuators to ROS.

In this overview, we’ll go over our hardware platform, Hail Bopp.

About Hail Bopp

Hail Bopp includes an Electronic Power Assisted Steering (EPAS) system, which is a motor on our steering column that allows us to apply steering force programatically.

Our vehicle also has front and rear Velodyne Puck (VLP-16) LiDAR sensors. These generate rich, precise 3D scans of our surroundings using 16 channels of spinning lasers.

Our platform uses ZED stereo cameras to gather color images and their corresponding depth information. Stereo cams can give us limited 3D information, but they are best used in conjuction with more accurate LiDAR data.

We currently use an NVIDIA Jetson AGX Xavier for our onboard computing. This is likely to change soon, as we have exceeded the power capabilities of this device.

Finally, an Adafruit Metro Grand Central serves as our real-time microcontroller. This device handles time-critical services, such as releasing our steering wheel if our high-level software fails.

Electrical overview

Voltron Secondary System schematic

diff --git a/docs/_site/interface/schematics.html b/docs/_site/interface/schematics.html index 4d62640fe..c1fa2242e 100644 --- a/docs/_site/interface/schematics.html +++ b/docs/_site/interface/schematics.html @@ -1 +1 @@ - Schematics | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Schematics

Main Nova Schematic

Nova Schematic


Power Source Schematics

Power Source Schematics


USB Hub Schematics

USB Hub Schematics


Adafruit Grand Central Schematics

Adafruit Grand Central Schematics


CAN Bus Systems

CAN Bus Systems


EPAS

EPAS

+ Schematics | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Schematics

Main Nova Schematic

Nova Schematic


Power Source Schematics

Power Source Schematics


USB Hub Schematics

USB Hub Schematics


Adafruit Grand Central Schematics

Adafruit Grand Central Schematics


CAN Bus Systems

CAN Bus Systems


EPAS

EPAS

diff --git a/docs/_site/jekyll/update/2022/09/05/welcome-to-jekyll.html b/docs/_site/jekyll/update/2022/09/05/welcome-to-jekyll.html index 96f9d3450..b83034f38 100755 --- a/docs/_site/jekyll/update/2022/09/05/welcome-to-jekyll.html +++ b/docs/_site/jekyll/update/2022/09/05/welcome-to-jekyll.html @@ -1,5 +1,5 @@ - Welcome to Jekyll! | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

You’ll find this post in your _posts directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run jekyll serve, which launches a web server and auto-regenerates your site when a file is updated.

Jekyll requires blog post files to be named according to the following format:

YEAR-MONTH-DAY-title.MARKUP

Where YEAR is a four-digit number, MONTH and DAY are both two-digit numbers, and MARKUP is the file extension representing the format used in the file. After that, include the necessary front matter. Take a look at the source for this post to get an idea about how it works.

Jekyll also offers powerful support for code snippets:

def print_hi(name)
+            Welcome to Jekyll! | Navigator                  Skip to main content   Link      Menu      Expand       (external link)    Document      Search       Copy       Copied        

You’ll find this post in your _posts directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run jekyll serve, which launches a web server and auto-regenerates your site when a file is updated.

Jekyll requires blog post files to be named according to the following format:

YEAR-MONTH-DAY-title.MARKUP

Where YEAR is a four-digit number, MONTH and DAY are both two-digit numbers, and MARKUP is the file extension representing the format used in the file. After that, include the necessary front matter. Take a look at the source for this post to get an idea about how it works.

Jekyll also offers powerful support for code snippets:

def print_hi(name)
   puts "Hi, #{name}"
 end
 print_hi('Tom')
-#=> prints 'Hi, Tom' to STDOUT.

Check out the Jekyll docs for more info on how to get the most out of Jekyll. File all bugs/feature requests at Jekyll’s GitHub repo. If you have questions, you can ask them on Jekyll Talk.

+#=> prints 'Hi, Tom' to STDOUT.

Check out the Jekyll docs for more info on how to get the most out of Jekyll. File all bugs/feature requests at Jekyll’s GitHub repo. If you have questions, you can ask them on Jekyll Talk.

diff --git a/docs/_site/opendrivepy.html b/docs/_site/opendrivepy.html index 9c8e01491..b8c6fdfc6 100644 --- a/docs/_site/opendrivepy.html +++ b/docs/_site/opendrivepy.html @@ -1,4 +1,4 @@ - OpenDrivePy | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

OpenDrivePy

Maintained by Will Heitman

Table of contents

  1. TOC

Element tree

Map
+            OpenDrivePy | Navigator                 Skip to main content   Link      Menu      Expand       (external link)    Document      Search       Copy       Copied        

OpenDrivePy

Maintained by Will Heitman

Table of contents

  1. TOC

Element tree

Map
 ├── get_route(): Lane[]
 ├── header: Header (contains north, x0, and other geo ref data)
 ├── shapes: STRTree
@@ -32,4 +32,4 @@
 │                   └── ...
 ├── controllers: Controller[]
 └── junctions: Junction[]
-

image-20230103235217600

Above: Lane polygons. Errors with the rendering of curved lanes and lane ocause some imperfection.

image-20230103235227882

Above: Drivable map using prepared geometry

image-20230104001856539

Above: Drivable map using STRTree

+

image-20230103235217600

Above: Lane polygons. Errors with the rendering of curved lanes and lane ocause some imperfection.

image-20230103235227882

Above: Drivable map using prepared geometry

image-20230104001856539

Above: Drivable map using STRTree

diff --git a/docs/_site/perception/mapping.html b/docs/_site/perception/mapping.html index aa2934059..4211cb1a1 100644 --- a/docs/_site/perception/mapping.html +++ b/docs/_site/perception/mapping.html @@ -1 +1 @@ - Localization and Mapping | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Localization and Mapping

Maintained by Will Heitman

Table of contents

  1. TOC

Octomap Module

Using the open-source Octomap library in conjunction with a particle filter, this module aims to provide a long-term, simultaneous localization and mapping solution.

Target

  • Translational accuracy of $\pm 1.0$ meters at worst, $\pm 0.25$ meters nominal in urban environment.
  • Heading accuracy of $\pm 30 \degree$ at worst, $\pm 10\degree$ nominal in urban environment.
  • Above worst-case accuracy only occurs 1% of the time.
  • Able to operate in case of loss from GNSS and/or IMU.

Behavior

  1. On start, the module should attempt to load an existing map using the map name from /carla/world_info.
    1. If no file exists, create an empty Octree and save this.
  2. When new odometry is received (such as from an IMU), store this as an accumulated offset $(\Delta x, \Delta y, \Delta \theta)$. Update the stored Odometry message and publish it with the new offset.
  3. When a new LiDAR point cloud is received, feed this into the particle filter.
    1. Update all particles using the accumulated offset and Gaussian noise in a motion update.
    2. Evaluate the probability of each particle in an observation update.
    3. Resample all particles using their probabilities.
    4. Compute a new robot pose using the mean and covariance of the particles.
    5. Publish the pose as an Odometry message.
  4. After the pose is updated from the LiDAR cloud, this cloud should be added to the map.
  5. Steps 2-4 should be repeated in a loop.
  6. A timer should prompt a visualization_msgs/Marker to be published periodically that visualizes the voxel map.
  7. Upon termination, the octree map should be saved to a file using the name from (1).

Progressive resolution of visualization

Progressive map visualization

Assumptions

  • The robot will only move along a 2D plane. That is, only 3-DOF motion will be assumed, and the localization will be calculated accordingly.
+ Localization and Mapping | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Localization and Mapping

Maintained by Will Heitman

Table of contents

  1. TOC

Octomap Module

Using the open-source Octomap library in conjunction with a particle filter, this module aims to provide a long-term, simultaneous localization and mapping solution.

Target

  • Translational accuracy of $\pm 1.0$ meters at worst, $\pm 0.25$ meters nominal in urban environment.
  • Heading accuracy of $\pm 30 \degree$ at worst, $\pm 10\degree$ nominal in urban environment.
  • Above worst-case accuracy only occurs 1% of the time.
  • Able to operate in case of loss from GNSS and/or IMU.

Behavior

  1. On start, the module should attempt to load an existing map using the map name from /carla/world_info.
    1. If no file exists, create an empty Octree and save this.
  2. When new odometry is received (such as from an IMU), store this as an accumulated offset $(\Delta x, \Delta y, \Delta \theta)$. Update the stored Odometry message and publish it with the new offset.
  3. When a new LiDAR point cloud is received, feed this into the particle filter.
    1. Update all particles using the accumulated offset and Gaussian noise in a motion update.
    2. Evaluate the probability of each particle in an observation update.
    3. Resample all particles using their probabilities.
    4. Compute a new robot pose using the mean and covariance of the particles.
    5. Publish the pose as an Odometry message.
  4. After the pose is updated from the LiDAR cloud, this cloud should be added to the map.
  5. Steps 2-4 should be repeated in a loop.
  6. A timer should prompt a visualization_msgs/Marker to be published periodically that visualizes the voxel map.
  7. Upon termination, the octree map should be saved to a file using the name from (1).

Progressive resolution of visualization

Progressive map visualization

Assumptions

  • The robot will only move along a 2D plane. That is, only 3-DOF motion will be assumed, and the localization will be calculated accordingly.
diff --git a/docs/_site/perception/perception-overview.html b/docs/_site/perception/perception-overview.html index 16c61c27c..c68dfc304 100755 --- a/docs/_site/perception/perception-overview.html +++ b/docs/_site/perception/perception-overview.html @@ -1 +1 @@ - Perception | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Perception overview

Maintained by Ragib Arnab

Table of contents

  1. darknet_inference
  2. obstacle_detection_3d
  3. obstacle_classes
  4. obstacle_drawer
  5. lidar_fusion
  6. lidar_obstacle_detector

The perception component of the system takes the data from various sensors and extracts meaningful information for downstream components such as planning.

Some of the tasks that are core parts of the perception include, but not limited to:

  • Localization and state estimation
  • Obstacle and scene classifiation
  • Obstacle tracking and prediction

In this page we will go each individual packages that is part of the perception component. A lot of the packages within perception are “in-progress” just as with most other packages within our system. As this project progresses, we will update the existing packages as well as add new ones to meet the growing demands of our autonomous system.

darknet_inference

The darknet_inference package contains Python tools to build and run Darknet-based object detection models in ROS 2. The standard model that is used is YOLOv4 which can achieve real-time inference on a modern GPU with good overall accuracy. There is also an option to use the YOLOv4-tiny model to increase the inference rate but with a sacrifice to accuracy. The node for this package subscribes to a RGB image message topic and outputs 2D bounding box predictions for each class of object in its own message formats. In this current version of navigator, all the detections for the vehicle is performed in this node, which includes detecting cars and pedestrians as well as finding landmarks such as stop signs and fire hydrants. All these detections are also processed within the node itself by using parameters such as object confidence threshold and non-maximum suppression (NMS) threshold to filter out the unwanted detections.

obstacle_detection_3d

This package takes as input the 2D detections along with 3D sensing data from lidars and depth camera to output 3D bounding boxes. 3D detection are required for behavior and planning components of our system. Currently the code simply backprojects the 2D bounding boxes into 3D using information and extends the boxes into a cuboid based on the object’s class. This is a naive approach given that the orientation information of the cuboids will be the same as the vehicle and that the lengths of the objects are fixed. The algorithm is a placeholder and will be replaced by an actual 3-D object detection algorithm in the future.

obstacle_classes

Contains the enumeration definition for the different classes of obstacles.

obstacle_drawer

A simple visualization package that takes the 3D bounding box outputs and produces visualization messages that can be depicted in RViz.

lidar_fusion

This package fuses the 2 different lidar sources within our system into a single point cloud that will be registered into the same frame (base-link) within the system transform tree. The package also performs basic point cloud filtering.

lidar_obstacle_detector

This package is tasked with detecting low-level obstacles around the vehicle for the purpose of collision prevention. The node takes as input a point cloud and output zones around the vehicle for low-level obstacles.

+ Perception | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Perception overview

Maintained by Ragib Arnab

Table of contents

  1. darknet_inference
  2. obstacle_detection_3d
  3. obstacle_classes
  4. obstacle_drawer
  5. lidar_fusion
  6. lidar_obstacle_detector

The perception component of the system takes the data from various sensors and extracts meaningful information for downstream components such as planning.

Some of the tasks that are core parts of the perception include, but not limited to:

  • Localization and state estimation
  • Obstacle and scene classifiation
  • Obstacle tracking and prediction

In this page we will go each individual packages that is part of the perception component. A lot of the packages within perception are “in-progress” just as with most other packages within our system. As this project progresses, we will update the existing packages as well as add new ones to meet the growing demands of our autonomous system.

darknet_inference

The darknet_inference package contains Python tools to build and run Darknet-based object detection models in ROS 2. The standard model that is used is YOLOv4 which can achieve real-time inference on a modern GPU with good overall accuracy. There is also an option to use the YOLOv4-tiny model to increase the inference rate but with a sacrifice to accuracy. The node for this package subscribes to a RGB image message topic and outputs 2D bounding box predictions for each class of object in its own message formats. In this current version of navigator, all the detections for the vehicle is performed in this node, which includes detecting cars and pedestrians as well as finding landmarks such as stop signs and fire hydrants. All these detections are also processed within the node itself by using parameters such as object confidence threshold and non-maximum suppression (NMS) threshold to filter out the unwanted detections.

obstacle_detection_3d

This package takes as input the 2D detections along with 3D sensing data from lidars and depth camera to output 3D bounding boxes. 3D detection are required for behavior and planning components of our system. Currently the code simply backprojects the 2D bounding boxes into 3D using information and extends the boxes into a cuboid based on the object’s class. This is a naive approach given that the orientation information of the cuboids will be the same as the vehicle and that the lengths of the objects are fixed. The algorithm is a placeholder and will be replaced by an actual 3-D object detection algorithm in the future.

obstacle_classes

Contains the enumeration definition for the different classes of obstacles.

obstacle_drawer

A simple visualization package that takes the 3D bounding box outputs and produces visualization messages that can be depicted in RViz.

lidar_fusion

This package fuses the 2 different lidar sources within our system into a single point cloud that will be registered into the same frame (base-link) within the system transform tree. The package also performs basic point cloud filtering.

lidar_obstacle_detector

This package is tasked with detecting low-level obstacles around the vehicle for the purpose of collision prevention. The node takes as input a point cloud and output zones around the vehicle for low-level obstacles.

diff --git a/docs/_site/perception/perception_new.html b/docs/_site/perception/perception_new.html index a468f8df2..3fed477fc 100644 --- a/docs/_site/perception/perception_new.html +++ b/docs/_site/perception/perception_new.html @@ -1,4 +1,4 @@ - Perception and Prediction Design Document (draft) | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Perception and Prediction Design Document (draft)

Maintained by Ashwin

Table of contents

  1. System Overview
    1. Current System:
      1. Prediction:
    2. Planned System:
      1. Perception:
      2. Prediction:
    3. Proposed structures for Phase 1:
      1. 3D/2D bounding boxes:
      2. System overview for Dynamic Environment Prediction
      3. Proposed structure for Dynamic Environment Prediction

System Overview

Current System:

Prediction:

- Zones in place of dynamic object detection 
+            Perception and Prediction Design Document (draft) | Navigator                 Skip to main content   Link      Menu      Expand       (external link)    Document      Search       Copy       Copied        

Perception and Prediction Design Document (draft)

Maintained by Ashwin

Table of contents

  1. System Overview
    1. Current System:
      1. Prediction:
    2. Planned System:
      1. Perception:
      2. Prediction:
    3. Proposed structures for Phase 1:
      1. 3D/2D bounding boxes:
      2. System overview for Dynamic Environment Prediction
      3. Proposed structure for Dynamic Environment Prediction

System Overview

Current System:

Prediction:

- Zones in place of dynamic object detection 
 
 - Acts as a safety net cast over objects in view of the vehicle 
 
@@ -11,4 +11,4 @@
 - Unable to further expand implementation 
 
 - Zone algorithm highlighted more in depth in behavior planning and control document 
-

Planned System:

Perception:

Phase 1:

  • 3D/2D bounding boxes (tracked)

  • Static occupancy grid

Phase 2:

  • Landmark detection (Stop lights priority)

  • Semantic encoding

  • Map masks: Stop lines, Cross walks

Phase 3:

  • Tune models within simulator

  • Eventually deploy and test on vehicle

Prediction:

Phase 1:

  • Physics-based prediction implemented

  • Treats cars like particles (acceleration & velocity)

  • Dynamic occupancy grid

Phase 2:

  • ML-based occupancy grid (from physics-based)

  • Non-sequential learning

  • Sequential learning

  • Recurrent Neural Nets

Dynamic Bayesian Network

Phase 3:

  • ML refined

  • Map priors

  • Deployed and tested on vehicle

**** Insert first image **

perception_flowchart

Proposed structures for Phase 1:

3D/2D bounding boxes:

3D:

Estimating 3D bounding boxes based on 2D images:

A method for 3D object detection using 2D images. This method involves utilizing a deep convolutional network to obtain relatively stable 3D object properties, and utilize this along with some geometric constraints provided by a 2d bounding box (would probably need to figure this out using something like YOLOv3) in order to construct a 3D bounding box for the corresponding object.

Given the pose of the object in the camera coordinate frame (R, T) ∈ SE(3) and the camera intrinsic matrix K, the projection of a 3D point Xo = [X, Y, Z, 1]^T in the object’s coordinate frame into the image x = [x, y, 1]T is:
x = K [R T] Xo [1]

2D:

2D object detection from a BEV representation (Bird’s Eye View, looking down from the Z axis) of our pseudo-lidar point cloud data may be more efficient than processing a generic 3D convolution. This architecture may also include semantic segmentation, effectively enabling us to accomplish landmark detection as well without any additional computation.

Can be a solution for stereo-images.

Depth correction w/ existing LiDAR sensors

2D BEVDetNet Object Detection

Pseudo-LiDAR

System overview for Dynamic Environment Prediction

Our system uses point clouds for dynamic environment prediction. We use a ConvLSTM architecture intended for video frame prediction to instead predict the local environment surrounding an autonomous agent across future time steps. For this purpose, we adapt the PredNet architecture designed for video frame prediction in autonomous driving scenes. The ConvLSTM is expected to learn an internal representation of the dynamics within the local environment from occupancy grid data. The grid inputs are generated from LiDAR measurement recordings in the KITTI dataset taken across a variety of urban scenes [1].

Proposed structure for Dynamic Environment Prediction

dep_flow

Inputs for Dynamic Environment Prediction

  • Point Cloud

Produces for Dynamic Environment Prediction

  • Ground Segmentation

  • Occupancy grid and DOGMA

  • PredNet (Neural Network Architecture)

Dynamic Environment Prediction does not handle…

  • More research needed…

Dynamic Environment Prediction: Ground Segmentation

Prior to generating an occupancy grid, the ground must be segmented and removed from the LiDAR point cloud. Markov Random Field (MRF) algorithm that exploits local spatial relationships, avoiding the assumption of a planar ground [2][1].

Dynamic Environment Prediction: Dynamic Occupancy Grid Maps (DOGMas)

A DOGMa is an evidential grid containing both occupancy and dynamic state information (e.g., velocity). We generate DOGMas via the procedure outlined by Nuss et al. [4]. There are two parallel processes that occur: occupancy grid updates and cell-wise velocity estimates [1].

Occupancy Grids

We consider DST-based occupancy grids computed from LiDAR measurements as detailed by Nuss et al. [4]. DST deals with a set of exhaustive hypotheses formed from a frame of discernment and the associated belief masses. In the case of an occupancy grid, our frame of discernment is: Ω = {F, O}, where F is free space and O is occupied space. Thus, the set of hypotheses is: {∅, {F }, {O}, {F, O}}. The null set ∅ is impossible in this context as a cell physically cannot be neither occupied nor unoccupied. Thus, our exhaustive set of hypotheses is: {{F }, {O}, {F, O}}. The sum of the belief masses over the possible hypotheses for each individual cell must equal one by definition, akin to probabilities [1].

Velocity Estimation

To incorporate dynamics, we estimate the velocity for each cell. The velocity estimates use a DST approximation for a probability hypothesis density filter with multi-instance Bernoulli (PHD/MIB) [5]. DST allows for the particle filter to run more efficiently by initializing particles only in cells with occupied masses above a specified threshold, avoiding occluded regions without measurements[1].

Dynamic Environment Prediction: Neural Network Architecture

We repurpose the PredNet architecture to learn the spatial and temporal representation of the environment by training it on occupancy grids instead of images. The convolutional layers exploit contextual information to correlate the occupied cells, removing the cell independence assumption [6]. The self-supervised nature of sequential data prediction is advantageous as human-labeled LiDAR data is expensive to obtain [6]. In this framework, the labels are simply the input environment representation (grids) at a later time instance. Although the original PredNet model was designed for video data, we demonstrate that the architecture can be re-used in the LiDAR setting [1].

Dynamic Environment Prediction: Experiments

  • Dataset Generation

    • LiDAR Measurement Grids

    • The KITTI HDL-64E Velodyne LiDAR dataset was augmented for use in occu- pancy grid prediction [7]. The dataset contains a variety of urban road scenes in Karlsruhe, Germany. We use 35, 417 frames (138 driving sequences) for training, 496 frames (3 driving sequences) for validation, and 2, 024 frames (7 driving sequences) for testing. Velodyne LiDAR point cloud measurements are obtained at 10 Hz.

    • Each LiDAR point cloud is filtered to remove the points corresponding to the ground as described in Section II. Then, a simple form of ray-tracing is performed to determine the free space between a LiDAR measurement and the ego vehicle. Each resulting local grid is centered at the ego vehicle GPS coordinate position. The shorter grid range is acceptable for slower speeds in urban settings, as is the case in the KITTI dataset [7][1].

    • Dynamic Occupancy Grid Maps

      • Dynamic Occupancy Grid Maps: The DOGMa’s occupancy and velocity information is computed from the LiDAR data as outlined in Section II. The velocities are then filtered to remove static measurements according to the cell-wise Mahalanobis distance: τ = vT P v, where v is the velocity vector and P is the cell’s covariance matrix as computed from the particles [21]. Cells with occupancy masses below a threshold are also removed. The velocities are then normalized to the range [−1, 1] and stacked with either (1) the pignistic probability (Eq. (5)) or (2) the DST mass (Eq. (2) and Eq. (3)) occupancy grids, forming the input to the network. [1]
  • PredNet Experiments

    • PredNet was trained and tested on an NVIDIA GeForce GTX 1070 GPU. At test time, one sequence (15 predictions totaling 1.5 s ahead) took on average 0.1 s to run. [1]
+

Planned System:

Perception:

Phase 1:

  • 3D/2D bounding boxes (tracked)

  • Static occupancy grid

Phase 2:

  • Landmark detection (Stop lights priority)

  • Semantic encoding

  • Map masks: Stop lines, Cross walks

Phase 3:

  • Tune models within simulator

  • Eventually deploy and test on vehicle

Prediction:

Phase 1:

  • Physics-based prediction implemented

  • Treats cars like particles (acceleration & velocity)

  • Dynamic occupancy grid

Phase 2:

  • ML-based occupancy grid (from physics-based)

  • Non-sequential learning

  • Sequential learning

  • Recurrent Neural Nets

Dynamic Bayesian Network

Phase 3:

  • ML refined

  • Map priors

  • Deployed and tested on vehicle

**** Insert first image **

perception_flowchart

Proposed structures for Phase 1:

3D/2D bounding boxes:

3D:

Estimating 3D bounding boxes based on 2D images:

A method for 3D object detection using 2D images. This method involves utilizing a deep convolutional network to obtain relatively stable 3D object properties, and utilize this along with some geometric constraints provided by a 2d bounding box (would probably need to figure this out using something like YOLOv3) in order to construct a 3D bounding box for the corresponding object.

Given the pose of the object in the camera coordinate frame (R, T) ∈ SE(3) and the camera intrinsic matrix K, the projection of a 3D point Xo = [X, Y, Z, 1]^T in the object’s coordinate frame into the image x = [x, y, 1]T is:
x = K [R T] Xo [1]

2D:

2D object detection from a BEV representation (Bird’s Eye View, looking down from the Z axis) of our pseudo-lidar point cloud data may be more efficient than processing a generic 3D convolution. This architecture may also include semantic segmentation, effectively enabling us to accomplish landmark detection as well without any additional computation.

Can be a solution for stereo-images.

Depth correction w/ existing LiDAR sensors

2D BEVDetNet Object Detection

Pseudo-LiDAR

System overview for Dynamic Environment Prediction

Our system uses point clouds for dynamic environment prediction. We use a ConvLSTM architecture intended for video frame prediction to instead predict the local environment surrounding an autonomous agent across future time steps. For this purpose, we adapt the PredNet architecture designed for video frame prediction in autonomous driving scenes. The ConvLSTM is expected to learn an internal representation of the dynamics within the local environment from occupancy grid data. The grid inputs are generated from LiDAR measurement recordings in the KITTI dataset taken across a variety of urban scenes [1].

Proposed structure for Dynamic Environment Prediction

dep_flow

Inputs for Dynamic Environment Prediction

  • Point Cloud

Produces for Dynamic Environment Prediction

  • Ground Segmentation

  • Occupancy grid and DOGMA

  • PredNet (Neural Network Architecture)

Dynamic Environment Prediction does not handle…

  • More research needed…

Dynamic Environment Prediction: Ground Segmentation

Prior to generating an occupancy grid, the ground must be segmented and removed from the LiDAR point cloud. Markov Random Field (MRF) algorithm that exploits local spatial relationships, avoiding the assumption of a planar ground [2][1].

Dynamic Environment Prediction: Dynamic Occupancy Grid Maps (DOGMas)

A DOGMa is an evidential grid containing both occupancy and dynamic state information (e.g., velocity). We generate DOGMas via the procedure outlined by Nuss et al. [4]. There are two parallel processes that occur: occupancy grid updates and cell-wise velocity estimates [1].

Occupancy Grids

We consider DST-based occupancy grids computed from LiDAR measurements as detailed by Nuss et al. [4]. DST deals with a set of exhaustive hypotheses formed from a frame of discernment and the associated belief masses. In the case of an occupancy grid, our frame of discernment is: Ω = {F, O}, where F is free space and O is occupied space. Thus, the set of hypotheses is: {∅, {F }, {O}, {F, O}}. The null set ∅ is impossible in this context as a cell physically cannot be neither occupied nor unoccupied. Thus, our exhaustive set of hypotheses is: {{F }, {O}, {F, O}}. The sum of the belief masses over the possible hypotheses for each individual cell must equal one by definition, akin to probabilities [1].

Velocity Estimation

To incorporate dynamics, we estimate the velocity for each cell. The velocity estimates use a DST approximation for a probability hypothesis density filter with multi-instance Bernoulli (PHD/MIB) [5]. DST allows for the particle filter to run more efficiently by initializing particles only in cells with occupied masses above a specified threshold, avoiding occluded regions without measurements[1].

Dynamic Environment Prediction: Neural Network Architecture

We repurpose the PredNet architecture to learn the spatial and temporal representation of the environment by training it on occupancy grids instead of images. The convolutional layers exploit contextual information to correlate the occupied cells, removing the cell independence assumption [6]. The self-supervised nature of sequential data prediction is advantageous as human-labeled LiDAR data is expensive to obtain [6]. In this framework, the labels are simply the input environment representation (grids) at a later time instance. Although the original PredNet model was designed for video data, we demonstrate that the architecture can be re-used in the LiDAR setting [1].

Dynamic Environment Prediction: Experiments

  • Dataset Generation

    • LiDAR Measurement Grids

    • The KITTI HDL-64E Velodyne LiDAR dataset was augmented for use in occu- pancy grid prediction [7]. The dataset contains a variety of urban road scenes in Karlsruhe, Germany. We use 35, 417 frames (138 driving sequences) for training, 496 frames (3 driving sequences) for validation, and 2, 024 frames (7 driving sequences) for testing. Velodyne LiDAR point cloud measurements are obtained at 10 Hz.

    • Each LiDAR point cloud is filtered to remove the points corresponding to the ground as described in Section II. Then, a simple form of ray-tracing is performed to determine the free space between a LiDAR measurement and the ego vehicle. Each resulting local grid is centered at the ego vehicle GPS coordinate position. The shorter grid range is acceptable for slower speeds in urban settings, as is the case in the KITTI dataset [7][1].

    • Dynamic Occupancy Grid Maps

      • Dynamic Occupancy Grid Maps: The DOGMa’s occupancy and velocity information is computed from the LiDAR data as outlined in Section II. The velocities are then filtered to remove static measurements according to the cell-wise Mahalanobis distance: τ = vT P v, where v is the velocity vector and P is the cell’s covariance matrix as computed from the particles [21]. Cells with occupancy masses below a threshold are also removed. The velocities are then normalized to the range [−1, 1] and stacked with either (1) the pignistic probability (Eq. (5)) or (2) the DST mass (Eq. (2) and Eq. (3)) occupancy grids, forming the input to the network. [1]
  • PredNet Experiments

    • PredNet was trained and tested on an NVIDIA GeForce GTX 1070 GPU. At test time, one sequence (15 predictions totaling 1.5 s ahead) took on average 0.1 s to run. [1]
diff --git a/docs/_site/planning/design.html b/docs/_site/planning/design.html index d0421b4b4..f08895802 100644 --- a/docs/_site/planning/design.html +++ b/docs/_site/planning/design.html @@ -1 +1 @@ - Behavior Planning and Controls Design Document (draft) | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Behavior Planning and Controls Design Document (draft)

Maintained by Hansika

Table of contents

  1. Important Definitions Used in Doc:
  2. System overview
    1. Current system:
      1. Planning:
      2. Controls:
    2. What Planning intends to accomplish:
    3. What Planning needs:
      1. Input:
      2. Justification:
      3. Proposed Planning System:
  3. Proposed structure
    1. Current-State Information Required:
    2. Representation of Surrounding Environment:
    3. Dynamic Occupancy Grid:
      1. Structure of Grid:
      2. Information within cell:
    4. Conversion to Cost Map:
      1. Determination of Cost:
      2. Distance From End:
      3. Number of merges/turns:
        1. Good traffic navigation protocols:
      4. Calculation of Path Costs:

Important Definitions Used in Doc:

Configuration Space: set of all configurations of a vehicle

System overview

Current system:

Planning:

We use zones to determine speed at given way points, acting like an ‘on-rails’ vehicle. Zones are an enclosed region of space (represented as a polygon) with a maximum speed, which may be 0 to indicate a no-entry zone. Zones may overlap (in which case the lower speed wins). Zones may come from a variety of sources but currently originate from the Behavior Planner (Traffic Planner) and the Obstacle Zoner. Zones are currently not tagged with a type or origin: all zones are anonymous and equal.

Controls:

Uses pure pursuit for steering control. The velocity controller is best not mentioned and should be replaced.

What Planning intends to accomplish:

Develop a planning system that can take in a prediction about where cars, pedestrians, and other dynamic agents will be several seconds in the future and how we can find the most efficient trajectory for our autonomous vehicle (hereinafter referred to as the AV) on a short-term distance to get from point A to B (< a hundred feet) on a long-term path determined by widely spaced waypoints (> several miles).

What Planning needs:

Input:

We choose to represent our prediction of the ground-truth state environment surrounding the AV several seconds in advanced using a Dynamic Occupancy Grid. This Dynamic Occupancy Grid will ideally hold information (in the form of probabilities) about whether a given grid cell (xn, yn) in a 2-Dimensional representation of real space (x, y) is occupied by an obstacle at some time tick t. This Dynamic Occupancy Grid will contain an individual grid frame (hereinafter referred to as a frame) for every discrete decisecond time tick for up to 3 seconds in advance of the current time state t = 0. Each of the frames in the Dynamic Occupancy Grid will be based on the local coordinate grid system around the AV.

Justification:

Because safety is the highest priority when designing a AV planning system, our primary goal is to ensure that crashes never occur when our vehicle has the ability to avoid them. For simplicity, we treat all crashes with equal importance, meaning crashing with an animal, pedestrian, or other vehicles are all given equal “badness”. Defining a crash as the collision between the bounding boxes of two objects within real space, the only information we need to know is when another object’s bounding box will collide with our own. Knowing this, we can track all possible collisions with other dynamic and static objects through creating a Dynamic Occupancy Grid that tells us the spaces that contain other objects at some time t, for which we should not also occupy at that time t. The usefulness of the Dynamic Occupancy Grid is that all agents within our environment can be easily represented under the Grid because they all can be easily and efficiently sampled for any (x, y, t), whereas Zones struggled with efficiency and was unable to represent time altogether.

Proposed Planning System:

Our proposed behavior planning and controls subsystem takes in a dynamic Occupancy Grid as the input for our planning system. Our planning system will output a path of waypoints finely spaced by equal time steps to help navigate the car to the correct location.

In order to make this possible, we have outlined some approaches/options for planning and controls. This document outlines our proposed methods and how they fit together to form a cohesive subsystem. It describes what our system is not responsible for as well. Finally, it compares our proposed methods to Navigator’s current approach and to other popular methods in the literature.

Proposed structure

BPC_Flow

Current-State Information Required:

Position (x,y,z) Linear velocities (vx, vy, vz)

Orientation (Theta_x, Theya_y, Theta_z) angular velocities (wx, wy, wz) (Egan: take a brief look into use of quaternions for modeling orientation and its derivatives, as that’s what currently is used)

Short-term local coordinate transform history

Representation of Surrounding Environment:

Source: [1]

BPC_options

Voroni Diagrams: unsuitable for non-holonomic vehicles (cars)

State lattices: repeating primitive paths which connect possible states for the vehicle [1]

Dynamic Occupancy Grid:

Structure of Grid:

Each frame of the grid will be created around the local coordinate grid of the AV. It will span 40 meters to the left, 40 meters to the right, 40 meters behind, and 80 meters in front of the current position of the AV at time t = 0. Each grid cell will be made of squares spanning 0.2 meters long and wide. Each frame will represent a discrete time t = a/10 where a = (0, 30) such that our dynamic grid includes predictions from times t = (0, 3).

The grid must be timestamped with when it was created so coordinate systems can be properly matched. The map is accessed via M[t, x,y], where higher values of x and y are to the front and right of the vehicle respectively. (The rear leftmost point is index (0,0)).

Information within cell:

Each cell is associated with a probability of cell being occupied by an obstacle (float value). This probability will be in the range [0, 1].

Conversion to Cost Map:

Determination of Cost:

The primary factor associated with cost will be crashes. Trajectories that lead to crashes will be given extremely high costs to deter the planner from choosing them. The Dynamic Occupancy Grid can be converted into a Cost Map. Other factors to associate with cost are: Travel distance, number of merges/turns, good traffic navigation protocols, etc. We would also use the measure of traffic in different lanes to help us determine cost of a given path.

Distance From End:

Each path should be assigned a cost value proportional to the maximum distance from its final position of the AV and the next waypoint.

(Egan: I’m confused about this one. The point is that we maximize travel distance in the direction we want to go, and costs are relative to other paths, so consant cost increase don’t matter.) (Response – Chitsein: I think I was thinking incorrectly about travel distance’s relevance to the cost map – I meant for it to originally represent the travel distance between two points a and b. I realize that the RRT won’t be creating paths to get from a point a to b, but will rather find all paths that could be taken by the AV, so I think making Travel Distance represent a cost proportional to the maximum distance like you suggested would be the better design. )

Number of merges/turns:

Increasing the cost of a path every time the AV merges or makes a turn to deter from paths that make unneccessary merges or turns. For example, we probably don’t want the vehicle to be merging in and out of lanes constantly on the highway to move a little faster at the expense of slowing down others cars it merges in front of and possibly increasing risk of collision.

Good traffic navigation protocols:

Increase the cost of a path that do not follow good traffic navigation protocols. For example, imagine there is a line up of cars to turn right into the highway. Based on the cost map before good traffic navigation protocols are applied, the car could choose to turn into the left lane and then try to merge at the front of the line because it would decrease the time taken to get onto the highway. However, this would go against courteous driving practices, so we should teach the AV to wait it’s turn in the line.

Calculation of Path Costs:

Each path’s cost is calculated based on the summation of the costs of each grid cell at time t (C[t, x, y]) plus the other factors associated with cost, including distance from end, number of merges/turns, and good traffic navigation protocols.

Cost for travel from a given to another: Source [4]

We can represent the points into a graph with vertices being possible options given current position and environment. Edges are the transition from a given point (where AV currently is) to next point. We weight transition to be the following equation: Source [4]

Cost_math_method

Proposal (Egan, I think this makes sense, I also think that we may need to tweak this conversion when we try to decide algorithms that work best for RRTs - Hansika): We may additionally want a cost function more general than a summation over occupied cells. The specific case I’m thinking of is we want to encode that, where possible, the vehicle should end in drivable area at the prediction horizon- we don’t want to attempt to overtake where since it looks good now, but when the horizon rolls forward the vehicle realizes it was impossible halfway through. This cannot be encoded by a cost map alone. So a more general approach is: C(P)=∑C_i (P), where Pis the path under consideration, C(P) is the associated cost, and C_i (P) is a component cost function. So grid cost C_g (P)=∑8t▒∑{x \〖in X〗t }▒∑{y∈Y_t }▒〖C[t,x,y]〗

Tweaks based on the 10/13 meeting: We have two places to inject cost, which is the RRT cost function evaluated on a per-node basis and a function of the leaf nodes. • RRT cost: cost that can be evaluated at each node without knowing where it will end up ○ Cost map: occupancy grid, road semantics (drivable area) ○ Safety/Dynamic considerations: physical obtainability, difference between trajectory speed and road speed limit. A function of the state more than a lookup in the cost map. • Leaf nodes: ○ Whether the trajectory ends up in drivable area ○ Whether the trajectory ends up closer to the goal? This may be possible to push into RRT cost but makes more sense based on endpoints.

RRTs:

Approach 1: Algorithm for RRTs with random sampling: [1] Input requirements: Configuration Space Ouputs: best state to go to next or Xnear

Benefits: 1. probabilistically complete a. If solution for path problem exists, RRT will find a soln with probability of 1 as running time goes to infinity 2. Guarantee kinematic feasibility 3. Quick to explore free space

Detractions: 1. Jerky paths created 2. Strong dependence on Neares Neighbor metric 3. Need to do collision checking for every expanded node

bpc_rrt_algo

Approach 2: Source [3]

RRT* - works towards shortest path

  1. Records distance each vertex has traveled relative to parent
  2. Closest node to parent vertex can be replaced by node with lower cost in given radius
  3. Neighbhors can be changed higher up in the tree if a cheaper path is found.

Disadvantages:

  1. More computationally expensive

Psuedo Code: Source [3]:

bpc_rrt_algo

Approach 3: Instead of using random point, all feasible connections are evaluated and only minimum cost paths are added to the tree.

Given a cost map, we could build off it in the following manner:

  1. Cost functions: c_safety and c_time calculations can be found in source [4]

To expand tree: souce [5]

  1. Sample a pposition uniformly at random and then sample two dimenssionaly gaussian distribution centered at the around intial path.

bpc_rrt*_algo

Approach 4: CL-RRT

Tree expansion: grows a tree of feasible trajectories originating from the current vehicle state that attempts to reach a specified goal set [2]

bpc_cl_rrt_algo

Further RRT approaches are described here: https://en.wikipedia.org/wiki/Rapidly-exploring_random_tree Once we decide on a cost map approach, we can determine an algorithm to use using the cost map to create edge weights. Using heuristic algorithms such as A-star, greedy, BFS, etc. We can see if building off the avalaible methods (cost-functions, and weight functions) mentioned above into one of these algorithms, will help with making the best decision.

Other choices than RRTs:

Lattice Planners: We don’t wnat to use this because we are getting a dynamic grid:

bpc_rrt_vs_lattice_planners

Source 1: https://www.sciencedirect.com/science/article/pii/S0968090X15003447

Source 2: https://dspace.mit.edu/bitstream/handle/1721.1/65396/Frazzoli-2009-Real-Time%20Motion%20Planning%20With%20Applications%20to%20Autonomous%20Urban%20Driving.pdf?sequence=1&isAllowed=y

Source 3: https://theclassytim.medium.com/robotic-path-planning-rrt-and-rrt-212319121378

Source 4: https://www.scitepress.org/Papers/2012/40334/pdf/index.html

Source 5: https://www.researchgate.net/profile/Michael-Brunner-9/publication/236847575_Hierarchical_Rough_Terrain_Motion_Planning_using_an_Optimal_Sampling-Based_Method/links/0c9605196187ad600f000000/Hierarchical-Rough-Terrain-Motion-Planning-using-an-Optimal-Sampling-Based-Method.pdf

Creating occupancy map: https://www.scitepress.org/Papers/2012/40334/pdf/index.html -> to share with perception team if they want

Control:

Current System (Severely lacking, high potential): • PurePursuit ○ Tracking algorithm enabling the vehicle’s steering wheel to smoothly adjust steering angle in relation to the curve of the given trajectory. ○ ***Possibly can breakdown this algorithm and apply similar smoothing to other aspects of our vehicle’s movement, such as velocity, acceleration, breaking.

Input: Final, Unidisputed Trajectory: Set of discrete points, x(t), in a local coordinate system taken at time t0 Current Vehicle State Coordinate transform history between t0 and now

Output: Commands to hardware on vehicle

Planned System: • PurePursuit likely kept ○ Possibly expanded/using similar approaches to smoothing velocity along trajectory • Input: ○ Final, Unidisputed Trajectory: Set of discrete points (waypoints), x(t) or v(t) [Depends on RRT and how we determine cost-effective routes) • Output: ○ Precise commands to vehicle hardware ▪ Steering ▪ Pedal ▪ Break ○ Communicate with HFE team PurePursuit More PurePursuit

+ Behavior Planning and Controls Design Document (draft) | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Behavior Planning and Controls Design Document (draft)

Maintained by Hansika

Table of contents

  1. Important Definitions Used in Doc:
  2. System overview
    1. Current system:
      1. Planning:
      2. Controls:
    2. What Planning intends to accomplish:
    3. What Planning needs:
      1. Input:
      2. Justification:
      3. Proposed Planning System:
  3. Proposed structure
    1. Current-State Information Required:
    2. Representation of Surrounding Environment:
    3. Dynamic Occupancy Grid:
      1. Structure of Grid:
      2. Information within cell:
    4. Conversion to Cost Map:
      1. Determination of Cost:
      2. Distance From End:
      3. Number of merges/turns:
        1. Good traffic navigation protocols:
      4. Calculation of Path Costs:

Important Definitions Used in Doc:

Configuration Space: set of all configurations of a vehicle

System overview

Current system:

Planning:

We use zones to determine speed at given way points, acting like an ‘on-rails’ vehicle. Zones are an enclosed region of space (represented as a polygon) with a maximum speed, which may be 0 to indicate a no-entry zone. Zones may overlap (in which case the lower speed wins). Zones may come from a variety of sources but currently originate from the Behavior Planner (Traffic Planner) and the Obstacle Zoner. Zones are currently not tagged with a type or origin: all zones are anonymous and equal.

Controls:

Uses pure pursuit for steering control. The velocity controller is best not mentioned and should be replaced.

What Planning intends to accomplish:

Develop a planning system that can take in a prediction about where cars, pedestrians, and other dynamic agents will be several seconds in the future and how we can find the most efficient trajectory for our autonomous vehicle (hereinafter referred to as the AV) on a short-term distance to get from point A to B (< a hundred feet) on a long-term path determined by widely spaced waypoints (> several miles).

What Planning needs:

Input:

We choose to represent our prediction of the ground-truth state environment surrounding the AV several seconds in advanced using a Dynamic Occupancy Grid. This Dynamic Occupancy Grid will ideally hold information (in the form of probabilities) about whether a given grid cell (xn, yn) in a 2-Dimensional representation of real space (x, y) is occupied by an obstacle at some time tick t. This Dynamic Occupancy Grid will contain an individual grid frame (hereinafter referred to as a frame) for every discrete decisecond time tick for up to 3 seconds in advance of the current time state t = 0. Each of the frames in the Dynamic Occupancy Grid will be based on the local coordinate grid system around the AV.

Justification:

Because safety is the highest priority when designing a AV planning system, our primary goal is to ensure that crashes never occur when our vehicle has the ability to avoid them. For simplicity, we treat all crashes with equal importance, meaning crashing with an animal, pedestrian, or other vehicles are all given equal “badness”. Defining a crash as the collision between the bounding boxes of two objects within real space, the only information we need to know is when another object’s bounding box will collide with our own. Knowing this, we can track all possible collisions with other dynamic and static objects through creating a Dynamic Occupancy Grid that tells us the spaces that contain other objects at some time t, for which we should not also occupy at that time t. The usefulness of the Dynamic Occupancy Grid is that all agents within our environment can be easily represented under the Grid because they all can be easily and efficiently sampled for any (x, y, t), whereas Zones struggled with efficiency and was unable to represent time altogether.

Proposed Planning System:

Our proposed behavior planning and controls subsystem takes in a dynamic Occupancy Grid as the input for our planning system. Our planning system will output a path of waypoints finely spaced by equal time steps to help navigate the car to the correct location.

In order to make this possible, we have outlined some approaches/options for planning and controls. This document outlines our proposed methods and how they fit together to form a cohesive subsystem. It describes what our system is not responsible for as well. Finally, it compares our proposed methods to Navigator’s current approach and to other popular methods in the literature.

Proposed structure

BPC_Flow

Current-State Information Required:

Position (x,y,z) Linear velocities (vx, vy, vz)

Orientation (Theta_x, Theya_y, Theta_z) angular velocities (wx, wy, wz) (Egan: take a brief look into use of quaternions for modeling orientation and its derivatives, as that’s what currently is used)

Short-term local coordinate transform history

Representation of Surrounding Environment:

Source: [1]

BPC_options

Voroni Diagrams: unsuitable for non-holonomic vehicles (cars)

State lattices: repeating primitive paths which connect possible states for the vehicle [1]

Dynamic Occupancy Grid:

Structure of Grid:

Each frame of the grid will be created around the local coordinate grid of the AV. It will span 40 meters to the left, 40 meters to the right, 40 meters behind, and 80 meters in front of the current position of the AV at time t = 0. Each grid cell will be made of squares spanning 0.2 meters long and wide. Each frame will represent a discrete time t = a/10 where a = (0, 30) such that our dynamic grid includes predictions from times t = (0, 3).

The grid must be timestamped with when it was created so coordinate systems can be properly matched. The map is accessed via M[t, x,y], where higher values of x and y are to the front and right of the vehicle respectively. (The rear leftmost point is index (0,0)).

Information within cell:

Each cell is associated with a probability of cell being occupied by an obstacle (float value). This probability will be in the range [0, 1].

Conversion to Cost Map:

Determination of Cost:

The primary factor associated with cost will be crashes. Trajectories that lead to crashes will be given extremely high costs to deter the planner from choosing them. The Dynamic Occupancy Grid can be converted into a Cost Map. Other factors to associate with cost are: Travel distance, number of merges/turns, good traffic navigation protocols, etc. We would also use the measure of traffic in different lanes to help us determine cost of a given path.

Distance From End:

Each path should be assigned a cost value proportional to the maximum distance from its final position of the AV and the next waypoint.

(Egan: I’m confused about this one. The point is that we maximize travel distance in the direction we want to go, and costs are relative to other paths, so consant cost increase don’t matter.) (Response – Chitsein: I think I was thinking incorrectly about travel distance’s relevance to the cost map – I meant for it to originally represent the travel distance between two points a and b. I realize that the RRT won’t be creating paths to get from a point a to b, but will rather find all paths that could be taken by the AV, so I think making Travel Distance represent a cost proportional to the maximum distance like you suggested would be the better design. )

Number of merges/turns:

Increasing the cost of a path every time the AV merges or makes a turn to deter from paths that make unneccessary merges or turns. For example, we probably don’t want the vehicle to be merging in and out of lanes constantly on the highway to move a little faster at the expense of slowing down others cars it merges in front of and possibly increasing risk of collision.

Good traffic navigation protocols:

Increase the cost of a path that do not follow good traffic navigation protocols. For example, imagine there is a line up of cars to turn right into the highway. Based on the cost map before good traffic navigation protocols are applied, the car could choose to turn into the left lane and then try to merge at the front of the line because it would decrease the time taken to get onto the highway. However, this would go against courteous driving practices, so we should teach the AV to wait it’s turn in the line.

Calculation of Path Costs:

Each path’s cost is calculated based on the summation of the costs of each grid cell at time t (C[t, x, y]) plus the other factors associated with cost, including distance from end, number of merges/turns, and good traffic navigation protocols.

Cost for travel from a given to another: Source [4]

We can represent the points into a graph with vertices being possible options given current position and environment. Edges are the transition from a given point (where AV currently is) to next point. We weight transition to be the following equation: Source [4]

Cost_math_method

Proposal (Egan, I think this makes sense, I also think that we may need to tweak this conversion when we try to decide algorithms that work best for RRTs - Hansika): We may additionally want a cost function more general than a summation over occupied cells. The specific case I’m thinking of is we want to encode that, where possible, the vehicle should end in drivable area at the prediction horizon- we don’t want to attempt to overtake where since it looks good now, but when the horizon rolls forward the vehicle realizes it was impossible halfway through. This cannot be encoded by a cost map alone. So a more general approach is: C(P)=∑C_i (P), where Pis the path under consideration, C(P) is the associated cost, and C_i (P) is a component cost function. So grid cost C_g (P)=∑8t▒∑{x \〖in X〗t }▒∑{y∈Y_t }▒〖C[t,x,y]〗

Tweaks based on the 10/13 meeting: We have two places to inject cost, which is the RRT cost function evaluated on a per-node basis and a function of the leaf nodes. • RRT cost: cost that can be evaluated at each node without knowing where it will end up ○ Cost map: occupancy grid, road semantics (drivable area) ○ Safety/Dynamic considerations: physical obtainability, difference between trajectory speed and road speed limit. A function of the state more than a lookup in the cost map. • Leaf nodes: ○ Whether the trajectory ends up in drivable area ○ Whether the trajectory ends up closer to the goal? This may be possible to push into RRT cost but makes more sense based on endpoints.

RRTs:

Approach 1: Algorithm for RRTs with random sampling: [1] Input requirements: Configuration Space Ouputs: best state to go to next or Xnear

Benefits: 1. probabilistically complete a. If solution for path problem exists, RRT will find a soln with probability of 1 as running time goes to infinity 2. Guarantee kinematic feasibility 3. Quick to explore free space

Detractions: 1. Jerky paths created 2. Strong dependence on Neares Neighbor metric 3. Need to do collision checking for every expanded node

bpc_rrt_algo

Approach 2: Source [3]

RRT* - works towards shortest path

  1. Records distance each vertex has traveled relative to parent
  2. Closest node to parent vertex can be replaced by node with lower cost in given radius
  3. Neighbhors can be changed higher up in the tree if a cheaper path is found.

Disadvantages:

  1. More computationally expensive

Psuedo Code: Source [3]:

bpc_rrt_algo

Approach 3: Instead of using random point, all feasible connections are evaluated and only minimum cost paths are added to the tree.

Given a cost map, we could build off it in the following manner:

  1. Cost functions: c_safety and c_time calculations can be found in source [4]

To expand tree: souce [5]

  1. Sample a pposition uniformly at random and then sample two dimenssionaly gaussian distribution centered at the around intial path.

bpc_rrt*_algo

Approach 4: CL-RRT

Tree expansion: grows a tree of feasible trajectories originating from the current vehicle state that attempts to reach a specified goal set [2]

bpc_cl_rrt_algo

Further RRT approaches are described here: https://en.wikipedia.org/wiki/Rapidly-exploring_random_tree Once we decide on a cost map approach, we can determine an algorithm to use using the cost map to create edge weights. Using heuristic algorithms such as A-star, greedy, BFS, etc. We can see if building off the avalaible methods (cost-functions, and weight functions) mentioned above into one of these algorithms, will help with making the best decision.

Other choices than RRTs:

Lattice Planners: We don’t wnat to use this because we are getting a dynamic grid:

bpc_rrt_vs_lattice_planners

Source 1: https://www.sciencedirect.com/science/article/pii/S0968090X15003447

Source 2: https://dspace.mit.edu/bitstream/handle/1721.1/65396/Frazzoli-2009-Real-Time%20Motion%20Planning%20With%20Applications%20to%20Autonomous%20Urban%20Driving.pdf?sequence=1&isAllowed=y

Source 3: https://theclassytim.medium.com/robotic-path-planning-rrt-and-rrt-212319121378

Source 4: https://www.scitepress.org/Papers/2012/40334/pdf/index.html

Source 5: https://www.researchgate.net/profile/Michael-Brunner-9/publication/236847575_Hierarchical_Rough_Terrain_Motion_Planning_using_an_Optimal_Sampling-Based_Method/links/0c9605196187ad600f000000/Hierarchical-Rough-Terrain-Motion-Planning-using-an-Optimal-Sampling-Based-Method.pdf

Creating occupancy map: https://www.scitepress.org/Papers/2012/40334/pdf/index.html -> to share with perception team if they want

Control:

Current System (Severely lacking, high potential): • PurePursuit ○ Tracking algorithm enabling the vehicle’s steering wheel to smoothly adjust steering angle in relation to the curve of the given trajectory. ○ ***Possibly can breakdown this algorithm and apply similar smoothing to other aspects of our vehicle’s movement, such as velocity, acceleration, breaking.

Input: Final, Unidisputed Trajectory: Set of discrete points, x(t), in a local coordinate system taken at time t0 Current Vehicle State Coordinate transform history between t0 and now

Output: Commands to hardware on vehicle

Planned System: • PurePursuit likely kept ○ Possibly expanded/using similar approaches to smoothing velocity along trajectory • Input: ○ Final, Unidisputed Trajectory: Set of discrete points (waypoints), x(t) or v(t) [Depends on RRT and how we determine cost-effective routes) • Output: ○ Precise commands to vehicle hardware ▪ Steering ▪ Pedal ▪ Break ○ Communicate with HFE team PurePursuit More PurePursuit

diff --git a/docs/_site/planning/planning-overview.html b/docs/_site/planning/planning-overview.html index 0f26457ee..716b14d9d 100755 --- a/docs/_site/planning/planning-overview.html +++ b/docs/_site/planning/planning-overview.html @@ -1 +1 @@ - Planning | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

The car should follow three instructions, in order of priority:

  1. Don’t run into anything.
  2. Drive forward along a route until the goal is reached.
  3. Obey traffic laws.

The car should be rewarded for obeying these three instructions, and the Planning system’s objective should be to maximize this reward.

To help the car make appropriate decisions, we can feed it “costmaps” that represent the reward that the car will receive if it drives through a given spot on the map. Each costmap might represent a specific quality (the drivable surfaces near the car, for example), and we can simply take the weighted sum of each costmap to generate a hollistic overview for the car.

Keep in mind that “cost” and “reward” are really the same concept. The car’s goal is to select a path that moves through regions of the greatest reward, a.k.a. of the least cost.

The more costmaps we sum together and the more carefully we select the weights for the sum, the better our car will be at making decisions.

Costmaps

Here are the costmaps that we should calculate at minimum, along with their justification:

Drivable area

This describes a surface that the car is allowed to drive over, mainly lanes, parking spaces, and intersections.

We can expand this drivable area if the car’s current options are exhausted. For example, the default drivable area may only include lanes that match the car’s current driving direction, but this region can be expanded to include lanes with oncoming traffic if the current region is blocked.

Justification: The car should only be allowed to drive on “drivable” surfaces: no sidewalks, lawns, etc.

Suggested format: 0.4m cell size, 40m range.

Example where drivable region expansion may be useful Above: Example where drivable region expansion may be useful. Credit: CARLA Leaderboard.

Predicted occupancy

Occupancy grids are a common concept in robotics used to describe obstacles. The world is divided into cells. If a given cell contains an obstacle, then it is marked as occupied.

Using machine learning, we can generate occupancy grids not just for the present ($t=0$), but also for the future (such as $t=3s$).

For a simple costmap that compresses all temporal considerations into the present, we can simply add the predicted occupancies across all frames, creating a single costmap for both the current and future occupancies.

Justification: The car should not run into anything.

Suggested format: 0.4m, 20m range minimum, 40m ideal.

Distance to route & goal

This is a combined costmap that describes both how far the car is from the route and from the goal.

Justification: The car should drive along the route until the goal is reached.

Costmap specifications

  1. All costmaps should be in the base_link frame, centered on the vehicle.
  2. All costmaps should have resolutions (cell sizes) that are multiples of the same base resolution. Example: 0.4, 0.8, and 1.6 meters. This allows them to be cleanly scaled.
  3. The costmaps do not necessarily need to share an origin nor size, though their sum will only be accurate in the region where they align.
+ Planning | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

The car should follow three instructions, in order of priority:

  1. Don’t run into anything.
  2. Drive forward along a route until the goal is reached.
  3. Obey traffic laws.

The car should be rewarded for obeying these three instructions, and the Planning system’s objective should be to maximize this reward.

To help the car make appropriate decisions, we can feed it “costmaps” that represent the reward that the car will receive if it drives through a given spot on the map. Each costmap might represent a specific quality (the drivable surfaces near the car, for example), and we can simply take the weighted sum of each costmap to generate a hollistic overview for the car.

Keep in mind that “cost” and “reward” are really the same concept. The car’s goal is to select a path that moves through regions of the greatest reward, a.k.a. of the least cost.

The more costmaps we sum together and the more carefully we select the weights for the sum, the better our car will be at making decisions.

Costmaps

Here are the costmaps that we should calculate at minimum, along with their justification:

Drivable area

This describes a surface that the car is allowed to drive over, mainly lanes, parking spaces, and intersections.

We can expand this drivable area if the car’s current options are exhausted. For example, the default drivable area may only include lanes that match the car’s current driving direction, but this region can be expanded to include lanes with oncoming traffic if the current region is blocked.

Justification: The car should only be allowed to drive on “drivable” surfaces: no sidewalks, lawns, etc.

Suggested format: 0.4m cell size, 40m range.

Example where drivable region expansion may be useful Above: Example where drivable region expansion may be useful. Credit: CARLA Leaderboard.

Predicted occupancy

Occupancy grids are a common concept in robotics used to describe obstacles. The world is divided into cells. If a given cell contains an obstacle, then it is marked as occupied.

Using machine learning, we can generate occupancy grids not just for the present ($t=0$), but also for the future (such as $t=3s$).

For a simple costmap that compresses all temporal considerations into the present, we can simply add the predicted occupancies across all frames, creating a single costmap for both the current and future occupancies.

Justification: The car should not run into anything.

Suggested format: 0.4m, 20m range minimum, 40m ideal.

Distance to route & goal

This is a combined costmap that describes both how far the car is from the route and from the goal.

Justification: The car should drive along the route until the goal is reached.

Costmap specifications

  1. All costmaps should be in the base_link frame, centered on the vehicle.
  2. All costmaps should have resolutions (cell sizes) that are multiples of the same base resolution. Example: 0.4, 0.8, and 1.6 meters. This allows them to be cleanly scaled.
  3. The costmaps do not necessarily need to share an origin nor size, though their sum will only be accurate in the region where they align.
diff --git a/docs/_site/sensing/sensing-overview.html b/docs/_site/sensing/sensing-overview.html index 8cfeb166b..5ceb9ef17 100755 --- a/docs/_site/sensing/sensing-overview.html +++ b/docs/_site/sensing/sensing-overview.html @@ -1 +1 @@ - Sensing | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Sensing overview

Table of contents


The Sensing system is responsible for processing raw sensor data into a usable form for the Perception system.

For example, raw LiDAR data from our front and rear sensors is merged into a single reference frame, downsampled, and cropped to remove points along the vehicle itself (points of our vehicle’s doors, for example).

More info to come! But our filters aren’t reinvinting the wheel.

+ Sensing | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Sensing overview

Table of contents


The Sensing system is responsible for processing raw sensor data into a usable form for the Perception system.

For example, raw LiDAR data from our front and rear sensors is merged into a single reference frame, downsampled, and cropped to remove points along the vehicle itself (points of our vehicle’s doors, for example).

More info to come! But our filters aren’t reinvinting the wheel.

diff --git a/docs/_site/simulation/simulation-overview.html b/docs/_site/simulation/simulation-overview.html index 7ab4411c0..a1993fea6 100755 --- a/docs/_site/simulation/simulation-overview.html +++ b/docs/_site/simulation/simulation-overview.html @@ -1,2 +1,2 @@ - Simulation | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Simulation overview

Maintained by Connor Scally & Daniel Vayman

Table of contents

  1. Simulation Enviroment
  2. Launching the simulator & running Navigator:
  3. Using the Simulator:
  4. Troubleshooting:
  5. Sourcing Foxy Automatically in Bash:

Before demonstrating our codebase on the vehicle, in the real world, we must first test our stack in a virtual one. The following documentation outlines essential CARLA usage and syntax, to allow for simulating our stack in a virtual enviroment.

Nova utilizes CARLA for virtualization. For further information on CARLA, and to learn more about advanced usage, please see the following links:

  • https://carla.org/
  • https://carla.readthedocs.io/en/latest/

Simulation Enviroment

  • Prerequisites:

    1. CARLA Simulator: Please follow the instructions in the above links to install CARLA on your chosen operating system
    2. Navigator: Please see our GitHub page for the latest releases of Navigator
    3. RVIZ (Or an equivalent ROS visualizer)
    4. ROS2
    5. Dependencies for the above: Self-explanatory, Navigator comes with most of what you need, CARLA may not, do not forget to check!

Launching the simulator & running Navigator:

  • Launching CARLA:

    1. Your first step should be to navigate to your CARLA directory and launch CARLA with the CARLAUE4.sh script with the -RenderOffScreen flag. If you are on a unix system, the command will look like this:
      $ /home/share/carla/CarlaUE4.sh -RenderOffscreen
    -
  • The “RenderOffscreen” flag hides the rendering window, which saves some resources. See here for more details

  • Launching RVIZ (within our Docker container):

    1. Open a new terminal window.

    2. Navigate to the root directory of Navigator

    3. Enable Docker to launch GUI programs

      $ xhost +

    4. Run our docker container start script. (If first time running container, refer to step 3)

      $ ./start.sh

    5. Source the setup script via a command like: . install/setup.bash

    6. Run: rviz2
    7. Select File followed by Open Config Select default.rviz from the share folder. It is recommended that you have your own copy of this as well for your own configuration.
  • Launching Navigator:

    1. Open a new terminal window.

    2. Navigate to the root directory of Navigator.

    3. Run the docker container ./start.sh

    4. Run source /install/setup.bash (if you have bash sourcing ROS automatically (see below), that works too)

    5. Run ros2 launch carla_interface carla-lite.launch.py

    6. Check RVIZ and terminal output. The sim_bridge will publish sensor data just as if you were driving on campus, and it will similary accept commands from our standard topics. As of writing, our custom bridge publishes:

    • GNSS (GPS)
    • IMU
    • Front and rear Lidar (not fully functional)
    • Front RGB camera
    • Front depth camera
    • CARLA ground truths for
    • Car’s odometry (position, orientation, speed)
    • CARLA virtual bird’s-eye camera (/carla/birds_eye_rgb)

    The most up-to-date information on our bridge’s capabilities can be found at the top of the script itself.

Using the Simulator:

  • You can control our ego vehicle with ros2 run manual_control manual_control_node
    • At the moment, this only supports keyboard control through NoMachine or similar, not SSH.
    • If you get a “pynput” error, try running pip3 install pynput.
  • You can change a number of simulation settings by editing our script’s contants (here).
    • Don’t forget to rebuild the package or use colcon build --symlink-install (recommended).
    • ROS param support in the works.

Troubleshooting:

  • If you get a “pynput” error, try running pip3 install pynput.
  • If you get a CARLA segmentation fault, it’s likely you just need to restart CARLA. This will be fixed… eventually. This should only happen after starting the bridge 10 times or so, and should not happen while the bridge is running.
  • If CARLA gives you a SIGFAULT error attach the -carla-rpc-port=N where N = your favorite (Not in use) port number.

Sourcing Foxy Automatically in Bash:

  1. Open your terminal
  2. Write the command –> gedit ~/.bashrc (or nano, whatever really)
  3. Go under the last line line and write –> source /opt/ros/foxy/setup.bash
  4. Save and exit
  5. Now with every new shell you open, it will source automatically
+ Simulation | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Simulation overview

Maintained by Connor Scally & Daniel Vayman

Table of contents

  1. Simulation Enviroment
  2. Launching the simulator & running Navigator:
  3. Using the Simulator:
  4. Troubleshooting:
  5. Sourcing Foxy Automatically in Bash:

Before demonstrating our codebase on the vehicle, in the real world, we must first test our stack in a virtual one. The following documentation outlines essential CARLA usage and syntax, to allow for simulating our stack in a virtual enviroment.

Nova utilizes CARLA for virtualization. For further information on CARLA, and to learn more about advanced usage, please see the following links:

  • https://carla.org/
  • https://carla.readthedocs.io/en/latest/

Simulation Enviroment

  • Prerequisites:

    1. CARLA Simulator: Please follow the instructions in the above links to install CARLA on your chosen operating system
    2. Navigator: Please see our GitHub page for the latest releases of Navigator
    3. RVIZ (Or an equivalent ROS visualizer)
    4. ROS2
    5. Dependencies for the above: Self-explanatory, Navigator comes with most of what you need, CARLA may not, do not forget to check!

Launching the simulator & running Navigator:

  • Launching CARLA:

    1. Your first step should be to navigate to your CARLA directory and launch CARLA with the CARLAUE4.sh script with the -RenderOffScreen flag. If you are on a unix system, the command will look like this:
      $ /home/share/carla/CarlaUE4.sh -RenderOffscreen
    +
  • The “RenderOffscreen” flag hides the rendering window, which saves some resources. See here for more details

  • Launching RVIZ (within our Docker container):

    1. Open a new terminal window.

    2. Navigate to the root directory of Navigator

    3. Enable Docker to launch GUI programs

      $ xhost +

    4. Run our docker container start script. (If first time running container, refer to step 3)

      $ ./start.sh

    5. Source the setup script via a command like: . install/setup.bash

    6. Run: rviz2
    7. Select File followed by Open Config Select default.rviz from the share folder. It is recommended that you have your own copy of this as well for your own configuration.
  • Launching Navigator:

    1. Open a new terminal window.

    2. Navigate to the root directory of Navigator.

    3. Run the docker container ./start.sh

    4. Run source /install/setup.bash (if you have bash sourcing ROS automatically (see below), that works too)

    5. Run ros2 launch carla_interface carla-lite.launch.py

    6. Check RVIZ and terminal output. The sim_bridge will publish sensor data just as if you were driving on campus, and it will similary accept commands from our standard topics. As of writing, our custom bridge publishes:

    • GNSS (GPS)
    • IMU
    • Front and rear Lidar (not fully functional)
    • Front RGB camera
    • Front depth camera
    • CARLA ground truths for
    • Car’s odometry (position, orientation, speed)
    • CARLA virtual bird’s-eye camera (/carla/birds_eye_rgb)

    The most up-to-date information on our bridge’s capabilities can be found at the top of the script itself.

Using the Simulator:

  • You can control our ego vehicle with ros2 run manual_control manual_control_node
    • At the moment, this only supports keyboard control through NoMachine or similar, not SSH.
    • If you get a “pynput” error, try running pip3 install pynput.
  • You can change a number of simulation settings by editing our script’s contants (here).
    • Don’t forget to rebuild the package or use colcon build --symlink-install (recommended).
    • ROS param support in the works.

Troubleshooting:

  • If you get a “pynput” error, try running pip3 install pynput.
  • If you get a CARLA segmentation fault, it’s likely you just need to restart CARLA. This will be fixed… eventually. This should only happen after starting the bridge 10 times or so, and should not happen while the bridge is running.
  • If CARLA gives you a SIGFAULT error attach the -carla-rpc-port=N where N = your favorite (Not in use) port number.

Sourcing Foxy Automatically in Bash:

  1. Open your terminal
  2. Write the command –> gedit ~/.bashrc (or nano, whatever really)
  3. Go under the last line line and write –> source /opt/ros/foxy/setup.bash
  4. Save and exit
  5. Now with every new shell you open, it will source automatically
diff --git a/docs/_site/system-overview.html b/docs/_site/system-overview.html index 83d7f1c83..71581d761 100755 --- a/docs/_site/system-overview.html +++ b/docs/_site/system-overview.html @@ -1 +1 @@ - System overview | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

System overview

Maintained by Will Heitman

Table of contents

  1. Design
    1. About nodes and topics
  2. Subsystems
  3. Cost maps
  4. Topics

Design

Navigator is designed to be:

  • Simple, with components that are easy to use an extend
    • When a more powerful but complex algorithm is used, a simpler alternative should also be present
  • Modular, with nodes that can be swapped, added, and updated with the help of ROS2
    • Since nodes are all built using standard C++ and Python libraries, code is future-proofed.
  • Open source, with all of our code licensed under the highly permissable MIT license
    • Our dependencies are also open-source

About nodes and topics

Navigator is built upon ROS2, a communications framework where individual executables called “nodes” exchange messages throguh “topics.” A node can either subscribe to a topic or publish to it. In this fashion, individual nodes form a dense network where everything from camera streams to steering commands are passed from one node to the next.

Nodes can be grouped into packages. Packages are then grouped in workspaces. Navigator itself is a ROS workspace. It contains many packages, and each package contains at least one node.

Using ROS2, one node can gather raw LiDAR data from a sensor, where it publishes the pointcloud as a PointCloud2 message to a topic called /lidar/raw. Another node can then subscribe to /lidar/raw, filter the data, and publish the result to /lidar/filtered.

To learn more about ROS, watch this lecture by Katherine Scott, a developer advocate at Open Robotics. <!– ## Subsystems Navigator's general structure

Navigator is split into five main subsystems:

  • Sensing, where raw sensor data from cameras, GNSS, and more is filtered before being passed along
  • Perception, which uses the filtered sensor data to build a rich understanding of the car’s surroundings
  • Planning, which uses this rich understanding, plus the desired destination, to decide how the car should act on a high level
  • Controls, where the desired action is compared to the car’s current state and low-level action is calculated
  • Interface, where the low-level action is sent to the steering wheel and pedals. –>

Subsystems

We can divide Navigator’s nodes into four groups.

The sensing subsystem takes raw sensor data and publishes them as Image messages, PointCloud2 messages, Imu messages, and so on. This subsystem also include sensor filters, which subscribe to raw data and publish their filtered results.

The perception subsystem draws inferences from the sensor data, including the location of pedestrians, our position on the map, and the predicted motion of surrounding vehicles. Nodes in this subsystem often publish their results as cost maps.

The planning subsystem takes our perception results and decides what our vehicle should do. This subsystem handles both high-level decisions (Should we pass a car that’s stopped in the road?) and low-level ones (How far should we press the throttle pedal to reach our desired speed?).

The interface subsystem is the link between our software and hardware. It includes nodes that communicate with our steering hardware, our microcontroller, and more. Both the sensing and interface subsystems are vehicle-specific, which means that they need to be configured to suite each individual vehicle. At Nova, we have separate configurations for simulated driving and real-world use.

Cost maps

During execution, Navigator calculates several cost maps, which are grid-based maps of our surrounding area that describe where our car should or should not drive.

Each cell in the grid is assigned a cost. The higher the cost, the less likely our car will generate a path that moves through the cell. This results in paths that weave their way through only low-cost cells. If no low-cost cells are available, the car stops and waits.

We calculate and use multiple cost maps, each one representing a unique factor to consider. For example:

  • Our occupancy grid generator describes the location of objects (cars, people, curbs).
  • Our prediction network (PredNet) node describes the future location of obstacles.
  • Our red light detector marks intersections as high-cost regions if the light is red.
  • Our map manager assigns costs based on how far a cell is from the route and from the goal.

We add as many of these layers together to form a single, holisitic costmap that our motion planner uses as its input.

Cost map dimensions

Above: Cost map dimensions

Cost maps should be in the base_link (vehicle) reference frame. They should extend 40 meters in front and to the side of the car and 20 meters behind, forming a total area of 80 x 60 meters. Cells should have a side length of either 0.2, 0.4, 0.8, or 1.6 meters.

Examples of cost maps

In the above example, each image is 200 x 150 pixels, representing a cost map layer with a resolution of 0.4 meters/cell. Clockwise from top left: Current occupancy, junction cost (due to a stop sign), route distance, and drivable area.

Topics

  • /lidar/fused: Raw LiDAR fused together to create a 360-degree picture. Otherwise unfiltered.
  • /lidar/filtered: Filtered LiDAR, with ground points removed.
  • /grid/drivable
  • /grid/route_distance
  • /grid/occupancy/current: Only the current occupancy grid.
  • /grid/occupancy/combined: Both the current and all future prediction occupancy grids, summed together.
+ System overview | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

System overview

Maintained by Will Heitman

Table of contents

  1. Design
    1. About nodes and topics
  2. Subsystems
  3. Cost maps
  4. Topics

Design

Navigator is designed to be:

  • Simple, with components that are easy to use an extend
    • When a more powerful but complex algorithm is used, a simpler alternative should also be present
  • Modular, with nodes that can be swapped, added, and updated with the help of ROS2
    • Since nodes are all built using standard C++ and Python libraries, code is future-proofed.
  • Open source, with all of our code licensed under the highly permissable MIT license
    • Our dependencies are also open-source

About nodes and topics

Navigator is built upon ROS2, a communications framework where individual executables called “nodes” exchange messages throguh “topics.” A node can either subscribe to a topic or publish to it. In this fashion, individual nodes form a dense network where everything from camera streams to steering commands are passed from one node to the next.

Nodes can be grouped into packages. Packages are then grouped in workspaces. Navigator itself is a ROS workspace. It contains many packages, and each package contains at least one node.

Using ROS2, one node can gather raw LiDAR data from a sensor, where it publishes the pointcloud as a PointCloud2 message to a topic called /lidar/raw. Another node can then subscribe to /lidar/raw, filter the data, and publish the result to /lidar/filtered.

To learn more about ROS, watch this lecture by Katherine Scott, a developer advocate at Open Robotics. <!– ## Subsystems Navigator's general structure

Navigator is split into five main subsystems:

  • Sensing, where raw sensor data from cameras, GNSS, and more is filtered before being passed along
  • Perception, which uses the filtered sensor data to build a rich understanding of the car’s surroundings
  • Planning, which uses this rich understanding, plus the desired destination, to decide how the car should act on a high level
  • Controls, where the desired action is compared to the car’s current state and low-level action is calculated
  • Interface, where the low-level action is sent to the steering wheel and pedals. –>

Subsystems

We can divide Navigator’s nodes into four groups.

The sensing subsystem takes raw sensor data and publishes them as Image messages, PointCloud2 messages, Imu messages, and so on. This subsystem also include sensor filters, which subscribe to raw data and publish their filtered results.

The perception subsystem draws inferences from the sensor data, including the location of pedestrians, our position on the map, and the predicted motion of surrounding vehicles. Nodes in this subsystem often publish their results as cost maps.

The planning subsystem takes our perception results and decides what our vehicle should do. This subsystem handles both high-level decisions (Should we pass a car that’s stopped in the road?) and low-level ones (How far should we press the throttle pedal to reach our desired speed?).

The interface subsystem is the link between our software and hardware. It includes nodes that communicate with our steering hardware, our microcontroller, and more. Both the sensing and interface subsystems are vehicle-specific, which means that they need to be configured to suite each individual vehicle. At Nova, we have separate configurations for simulated driving and real-world use.

Cost maps

During execution, Navigator calculates several cost maps, which are grid-based maps of our surrounding area that describe where our car should or should not drive.

Each cell in the grid is assigned a cost. The higher the cost, the less likely our car will generate a path that moves through the cell. This results in paths that weave their way through only low-cost cells. If no low-cost cells are available, the car stops and waits.

We calculate and use multiple cost maps, each one representing a unique factor to consider. For example:

  • Our occupancy grid generator describes the location of objects (cars, people, curbs).
  • Our prediction network (PredNet) node describes the future location of obstacles.
  • Our red light detector marks intersections as high-cost regions if the light is red.
  • Our map manager assigns costs based on how far a cell is from the route and from the goal.

We add as many of these layers together to form a single, holisitic costmap that our motion planner uses as its input.

Cost map dimensions

Above: Cost map dimensions

Cost maps should be in the base_link (vehicle) reference frame. They should extend 40 meters in front and to the side of the car and 20 meters behind, forming a total area of 80 x 60 meters. Cells should have a side length of either 0.2, 0.4, 0.8, or 1.6 meters.

Examples of cost maps

In the above example, each image is 200 x 150 pixels, representing a cost map layer with a resolution of 0.4 meters/cell. Clockwise from top left: Current occupancy, junction cost (due to a stop sign), route distance, and drivable area.

Topics

  • /lidar/fused: Raw LiDAR fused together to create a 360-degree picture. Otherwise unfiltered.
  • /lidar/filtered: Filtered LiDAR, with ground points removed.
  • /grid/drivable
  • /grid/route_distance
  • /grid/occupancy/current: Only the current occupancy grid.
  • /grid/occupancy/combined: Both the current and all future prediction occupancy grids, summed together.
diff --git a/docs/_site/writing-documentation.html b/docs/_site/writing-documentation.html index d82168571..670ed9408 100644 --- a/docs/_site/writing-documentation.html +++ b/docs/_site/writing-documentation.html @@ -1,2 +1,2 @@ - Writing documentation | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

System overview

Table of contents

  1. Testing locally
  2. Editing online

This documentation site is built off of Navigator’s dev branch. All files within the /doc directory are remapped to nova-utd.github.io.

Adding to the site is easy. Here are two good options:

Testing locally

To test locally, cd into /docs and run

docker run --rm --volume="$PWD:/srv/jekyll:Z" -p 8083:8083 jekyll/jekyll jekyll serve --port 8083
-

Use a browser to view localhost:8083. Refresh the page to show the latest updates. See the official Docker README for more info.

Editing online

On GitHub, move to the /docs directory on the dev branch (here), then press the period key on your keyboard. This will open GitHub’s web editor. See here for more info.

+ Writing documentation | Navigator Skip to main content Link Menu Expand (external link) Document Search Copy Copied

System overview

Table of contents

  1. Testing locally
  2. Editing online

This documentation site is built off of Navigator’s dev branch. All files within the /doc directory are remapped to nova-utd.github.io.

Adding to the site is easy. Here are two good options:

Testing locally

To test locally, cd into /docs and run

docker run --rm --volume="$PWD:/srv/jekyll:Z" -p 8083:8083 jekyll/jekyll jekyll serve --port 8083
+

Use a browser to view localhost:8083. Refresh the page to show the latest updates. See the official Docker README for more info.

Editing online

On GitHub, move to the /docs directory on the dev branch (here), then press the period key on your keyboard. This will open GitHub’s web editor. See here for more info.