diff --git a/master/3d_printing.html b/master/3d_printing.html index 13567d03..d06a9530 100644 --- a/master/3d_printing.html +++ b/master/3d_printing.html @@ -14,8 +14,9 @@ + - + @@ -23,22 +24,25 @@ - + - + + + + - - + + @@ -55,9 +59,7 @@ - - - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/master/404.html b/master/404.html index 94e238d6..ad7f88db 100644 --- a/master/404.html +++ b/master/404.html @@ -10,8 +10,9 @@ + - + @@ -19,22 +20,25 @@ - + - + + + + - - + + @@ -51,9 +55,7 @@ - - - + @@ -72,7 +74,6 @@ - @@ -100,6 +101,7 @@
@@ -123,7 +125,9 @@ + - + + - + diff --git a/master/CHANGELOG.html b/master/CHANGELOG.html index ef0b4d5c..e9292f7f 100644 --- a/master/CHANGELOG.html +++ b/master/CHANGELOG.html @@ -14,8 +14,9 @@ + - + @@ -23,22 +24,25 @@ - + - + + + + - - + + @@ -55,9 +59,7 @@ - - - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/master/CONTRIBUTING.html b/master/CONTRIBUTING.html index c5998e1d..b21a3e95 100644 --- a/master/CONTRIBUTING.html +++ b/master/CONTRIBUTING.html @@ -14,8 +14,9 @@ + - + @@ -23,22 +24,25 @@ - + - + + + + - - + + @@ -55,9 +59,7 @@ - - - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/master/assets/javascripts/bundle.b4d07000.min.js b/master/assets/javascripts/bundle.b4d07000.min.js deleted file mode 100644 index 3c0bdad9..00000000 --- a/master/assets/javascripts/bundle.b4d07000.min.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict";(()=>{var Ci=Object.create;var gr=Object.defineProperty;var Ri=Object.getOwnPropertyDescriptor;var ki=Object.getOwnPropertyNames,Ht=Object.getOwnPropertySymbols,Hi=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,nn=Object.prototype.propertyIsEnumerable;var rn=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&rn(e,r,t[r]);if(Ht)for(var r of Ht(t))nn.call(t,r)&&rn(e,r,t[r]);return e};var on=(e,t)=>{var r={};for(var n in e)yr.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&Ht)for(var n of Ht(e))t.indexOf(n)<0&&nn.call(e,n)&&(r[n]=e[n]);return r};var Pt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Pi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ki(t))!yr.call(e,o)&&o!==r&&gr(e,o,{get:()=>t[o],enumerable:!(n=Ri(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Ci(Hi(e)):{},Pi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var sn=Pt((xr,an)=>{(function(e,t){typeof xr=="object"&&typeof an!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(xr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(O){return!!(O&&O!==document&&O.nodeName!=="HTML"&&O.nodeName!=="BODY"&&"classList"in O&&"contains"in O.classList)}function f(O){var Qe=O.type,De=O.tagName;return!!(De==="INPUT"&&s[Qe]&&!O.readOnly||De==="TEXTAREA"&&!O.readOnly||O.isContentEditable)}function c(O){O.classList.contains("focus-visible")||(O.classList.add("focus-visible"),O.setAttribute("data-focus-visible-added",""))}function u(O){O.hasAttribute("data-focus-visible-added")&&(O.classList.remove("focus-visible"),O.removeAttribute("data-focus-visible-added"))}function p(O){O.metaKey||O.altKey||O.ctrlKey||(a(r.activeElement)&&c(r.activeElement),n=!0)}function m(O){n=!1}function d(O){a(O.target)&&(n||f(O.target))&&c(O.target)}function h(O){a(O.target)&&(O.target.classList.contains("focus-visible")||O.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(O.target))}function v(O){document.visibilityState==="hidden"&&(o&&(n=!0),Y())}function Y(){document.addEventListener("mousemove",N),document.addEventListener("mousedown",N),document.addEventListener("mouseup",N),document.addEventListener("pointermove",N),document.addEventListener("pointerdown",N),document.addEventListener("pointerup",N),document.addEventListener("touchmove",N),document.addEventListener("touchstart",N),document.addEventListener("touchend",N)}function B(){document.removeEventListener("mousemove",N),document.removeEventListener("mousedown",N),document.removeEventListener("mouseup",N),document.removeEventListener("pointermove",N),document.removeEventListener("pointerdown",N),document.removeEventListener("pointerup",N),document.removeEventListener("touchmove",N),document.removeEventListener("touchstart",N),document.removeEventListener("touchend",N)}function N(O){O.target.nodeName&&O.target.nodeName.toLowerCase()==="html"||(n=!1,B())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),Y(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var cn=Pt(Er=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(c){return!1}},r=t(),n=function(c){var u={next:function(){var p=c.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(c){return encodeURIComponent(c).replace(/%20/g,"+")},i=function(c){return decodeURIComponent(String(c).replace(/\+/g," "))},s=function(){var c=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof p;if(m!=="undefined")if(m==="string")p!==""&&this._fromString(p);else if(p instanceof c){var d=this;p.forEach(function(B,N){d.append(N,B)})}else if(p!==null&&m==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),c._entries&&(c._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(f,c){typeof f!="string"&&(f=String(f)),c&&typeof c!="string"&&(c=String(c));var u=document,p;if(c&&(e.location===void 0||c!==e.location.href)){c=c.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=c,u.head.appendChild(p);try{if(p.href.indexOf(c)!==0)throw new Error(p.href)}catch(O){throw new Error("URL unable to set base "+c+" due to "+O)}}var m=u.createElement("a");m.href=f,p&&(u.body.appendChild(m),m.href=m.href);var d=u.createElement("input");if(d.type="url",d.value=f,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!c)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,Y=!0,B=this;["append","delete","set"].forEach(function(O){var Qe=h[O];h[O]=function(){Qe.apply(h,arguments),v&&(Y=!1,B.search=h.toString(),Y=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var N=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==N&&(N=this.search,Y&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},s=i.prototype,a=function(f){Object.defineProperty(s,f,{get:function(){return this._anchorElement[f]},set:function(c){this._anchorElement[f]=c},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(f){a(f)}),Object.defineProperty(s,"search",{get:function(){return this._anchorElement.search},set:function(f){this._anchorElement.search=f,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(s,{toString:{get:function(){var f=this;return function(){return f.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(f){this._anchorElement.href=f,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(f){this._anchorElement.pathname=f},enumerable:!0},origin:{get:function(){var f={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],c=this._anchorElement.port!=f&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(c?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(f){},enumerable:!0},username:{get:function(){return""},set:function(f){},enumerable:!0}}),i.createObjectURL=function(f){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(f){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er)});var qr=Pt((Mt,Nr)=>{/*! - * clipboard.js v2.0.11 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */(function(t,r){typeof Mt=="object"&&typeof Nr=="object"?Nr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Mt=="object"?Mt.ClipboardJS=r():t.ClipboardJS=r()})(Mt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return Ai}});var s=i(279),a=i.n(s),f=i(370),c=i.n(f),u=i(817),p=i.n(u);function m(j){try{return document.execCommand(j)}catch(T){return!1}}var d=function(T){var E=p()(T);return m("cut"),E},h=d;function v(j){var T=document.documentElement.getAttribute("dir")==="rtl",E=document.createElement("textarea");E.style.fontSize="12pt",E.style.border="0",E.style.padding="0",E.style.margin="0",E.style.position="absolute",E.style[T?"right":"left"]="-9999px";var H=window.pageYOffset||document.documentElement.scrollTop;return E.style.top="".concat(H,"px"),E.setAttribute("readonly",""),E.value=j,E}var Y=function(T,E){var H=v(T);E.container.appendChild(H);var I=p()(H);return m("copy"),H.remove(),I},B=function(T){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},H="";return typeof T=="string"?H=Y(T,E):T instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(T==null?void 0:T.type)?H=Y(T.value,E):(H=p()(T),m("copy")),H},N=B;function O(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?O=function(E){return typeof E}:O=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},O(j)}var Qe=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=T.action,H=E===void 0?"copy":E,I=T.container,q=T.target,Me=T.text;if(H!=="copy"&&H!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&O(q)==="object"&&q.nodeType===1){if(H==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(H==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Me)return N(Me,{container:I});if(q)return H==="cut"?h(q):N(q,{container:I})},De=Qe;function $e(j){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?$e=function(E){return typeof E}:$e=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},$e(j)}function Ei(j,T){if(!(j instanceof T))throw new TypeError("Cannot call a class as a function")}function tn(j,T){for(var E=0;E0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof I.action=="function"?I.action:this.defaultAction,this.target=typeof I.target=="function"?I.target:this.defaultTarget,this.text=typeof I.text=="function"?I.text:this.defaultText,this.container=$e(I.container)==="object"?I.container:document.body}},{key:"listenClick",value:function(I){var q=this;this.listener=c()(I,"click",function(Me){return q.onClick(Me)})}},{key:"onClick",value:function(I){var q=I.delegateTarget||I.currentTarget,Me=this.action(q)||"copy",kt=De({action:Me,container:this.container,target:this.target(q),text:this.text(q)});this.emit(kt?"success":"error",{action:Me,text:kt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(I){return vr("action",I)}},{key:"defaultTarget",value:function(I){var q=vr("target",I);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(I){return vr("text",I)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(I){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return N(I,q)}},{key:"cut",value:function(I){return h(I)}},{key:"isSupported",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof I=="string"?[I]:I,Me=!!document.queryCommandSupported;return q.forEach(function(kt){Me=Me&&!!document.queryCommandSupported(kt)}),Me}}]),E}(a()),Ai=Li},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,f){for(;a&&a.nodeType!==o;){if(typeof a.matches=="function"&&a.matches(f))return a;a=a.parentNode}}n.exports=s},438:function(n,o,i){var s=i(828);function a(u,p,m,d,h){var v=c.apply(this,arguments);return u.addEventListener(m,v,h),{destroy:function(){u.removeEventListener(m,v,h)}}}function f(u,p,m,d,h){return typeof u.addEventListener=="function"?a.apply(null,arguments):typeof m=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return a(v,p,m,d,h)}))}function c(u,p,m,d){return function(h){h.delegateTarget=s(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=f},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(n,o,i){var s=i(879),a=i(438);function f(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(h))throw new TypeError("Third argument must be a Function");if(s.node(m))return c(m,d,h);if(s.nodeList(m))return u(m,d,h);if(s.string(m))return p(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function u(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function p(m,d,h){return a(document.body,m,d,h)}n.exports=f},817:function(n){function o(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var f=window.getSelection(),c=document.createRange();c.selectNodeContents(i),f.removeAllRanges(),f.addRange(c),s=f.toString()}return s}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,s,a){var f=this.e||(this.e={});return(f[i]||(f[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var f=this;function c(){f.off(i,c),s.apply(a,arguments)}return c._=s,this.on(i,c,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),f=0,c=a.length;for(f;f{"use strict";/*! - * escape-html - * Copyright(c) 2012-2013 TJ Holowaychuk - * Copyright(c) 2015 Andreas Lubbe - * Copyright(c) 2015 Tiancheng "Timothy" Gu - * MIT Licensed - */var rs=/["'&<>]/;Yo.exports=ns;function ns(e){var t=""+e,r=rs.exec(t);if(!r)return t;var n,o="",i=0,s=0;for(i=r.index;i0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],s;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(a){s={error:a}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(s)throw s.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n1||a(m,d)})})}function a(m,d){try{f(n[m](d))}catch(h){p(i[0][3],h)}}function f(m){m.value instanceof et?Promise.resolve(m.value.v).then(c,u):p(i[0][2],m)}function c(m){a("next",m)}function u(m){a("throw",m)}function p(m,d){m(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function pn(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Ee=="function"?Ee(e):e[Symbol.iterator](),r={},n("next"),n("throw"),n("return"),r[Symbol.asyncIterator]=function(){return this},r);function n(i){r[i]=e[i]&&function(s){return new Promise(function(a,f){s=e[i](s),o(a,f,s.done,s.value)})}}function o(i,s,a,f){Promise.resolve(f).then(function(c){i({value:c,done:a})},s)}}function C(e){return typeof e=="function"}function at(e){var t=function(n){Error.call(n),n.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var It=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: -`+r.map(function(n,o){return o+1+") "+n.toString()}).join(` - `):"",this.name="UnsubscriptionError",this.errors=r}});function Ve(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,n,o,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Ee(s),f=a.next();!f.done;f=a.next()){var c=f.value;c.remove(this)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var u=this.initialTeardown;if(C(u))try{u()}catch(v){i=v instanceof It?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=Ee(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{ln(h)}catch(v){i=i!=null?i:[],v instanceof It?i=D(D([],W(i)),W(v.errors)):i.push(v)}}}catch(v){n={error:v}}finally{try{d&&!d.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}}if(i)throw new It(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)ln(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ve(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ve(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Sr=Ie.EMPTY;function jt(e){return e instanceof Ie||e&&"closed"in e&&C(e.remove)&&C(e.add)&&C(e.unsubscribe)}function ln(e){C(e)?e():e.unsubscribe()}var Le={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],n=2;n0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,s=o.isStopped,a=o.observers;return i||s?Sr:(this.currentObservers=null,a.push(r),new Ie(function(){n.currentObservers=null,Ve(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,s=n.isStopped;o?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,n){return new xn(r,n)},t}(F);var xn=function(e){ie(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Sr},t}(x);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ie(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=Et);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,s=n._infiniteTimeWindow,a=n._timestampProvider,f=n._windowTime;o||(i.push(r),!s&&i.push(a.now()+f)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,s=o._buffer,a=s.slice(),f=0;f0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var s=r.actions;n!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Wt);var Sn=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Dt);var Oe=new Sn(wn);var _=new F(function(e){return e.complete()});function Vt(e){return e&&C(e.schedule)}function Cr(e){return e[e.length-1]}function Ye(e){return C(Cr(e))?e.pop():void 0}function Te(e){return Vt(Cr(e))?e.pop():void 0}function zt(e,t){return typeof Cr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Nt(e){return C(e==null?void 0:e.then)}function qt(e){return C(e[ft])}function Kt(e){return Symbol.asyncIterator&&C(e==null?void 0:e[Symbol.asyncIterator])}function Qt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Yt=zi();function Gt(e){return C(e==null?void 0:e[Yt])}function Bt(e){return un(this,arguments,function(){var r,n,o,i;return $t(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,et(r.read())];case 3:return n=s.sent(),o=n.value,i=n.done,i?[4,et(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,et(o)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Jt(e){return C(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(qt(e))return Ni(e);if(pt(e))return qi(e);if(Nt(e))return Ki(e);if(Kt(e))return On(e);if(Gt(e))return Qi(e);if(Jt(e))return Yi(e)}throw Qt(e)}function Ni(e){return new F(function(t){var r=e[ft]();if(C(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function qi(e){return new F(function(t){for(var r=0;r=2;return function(n){return n.pipe(e?A(function(o,i){return e(o,i,n)}):de,ge(1),r?He(t):Dn(function(){return new Zt}))}}function Vn(){for(var e=[],t=0;t=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,f=a===void 0?!0:a;return function(c){var u,p,m,d=0,h=!1,v=!1,Y=function(){p==null||p.unsubscribe(),p=void 0},B=function(){Y(),u=m=void 0,h=v=!1},N=function(){var O=u;B(),O==null||O.unsubscribe()};return y(function(O,Qe){d++,!v&&!h&&Y();var De=m=m!=null?m:r();Qe.add(function(){d--,d===0&&!v&&!h&&(p=$r(N,f))}),De.subscribe(Qe),!u&&d>0&&(u=new rt({next:function($e){return De.next($e)},error:function($e){v=!0,Y(),p=$r(B,o,$e),De.error($e)},complete:function(){h=!0,Y(),p=$r(B,s),De.complete()}}),U(O).subscribe(u))})(c)}}function $r(e,t){for(var r=[],n=2;ne.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function z(e,t=document){let r=ce(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ce(e,t=document){return t.querySelector(e)||void 0}function _e(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function tr(e){return L(b(document.body,"focusin"),b(document.body,"focusout")).pipe(ke(1),l(()=>{let t=_e();return typeof t!="undefined"?e.contains(t):!1}),V(e===_e()),J())}function Xe(e){return{x:e.offsetLeft,y:e.offsetTop}}function Kn(e){return L(b(window,"load"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>Xe(e)),V(Xe(e)))}function rr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return L(b(e,"scroll"),b(window,"resize")).pipe(Ce(0,Oe),l(()=>rr(e)),V(rr(e)))}var Yn=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!Wr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),va?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!Wr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=ba.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Gn=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Jn=typeof WeakMap!="undefined"?new WeakMap:new Yn,Xn=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=ga.getInstance(),n=new La(t,r,this);Jn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){Xn.prototype[e]=function(){var t;return(t=Jn.get(this))[e].apply(t,arguments)}});var Aa=function(){return typeof nr.ResizeObserver!="undefined"?nr.ResizeObserver:Xn}(),Zn=Aa;var eo=new x,Ca=$(()=>k(new Zn(e=>{for(let t of e)eo.next(t)}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ye(e){return Ca.pipe(S(t=>t.observe(e)),g(t=>eo.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(()=>he(e)))),V(he(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ar(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var to=new x,Ra=$(()=>k(new IntersectionObserver(e=>{for(let t of e)to.next(t)},{threshold:0}))).pipe(g(e=>L(ze,k(e)).pipe(R(()=>e.disconnect()))),X(1));function sr(e){return Ra.pipe(S(t=>t.observe(e)),g(t=>to.pipe(A(({target:r})=>r===e),R(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function ro(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=he(e),o=bt(e);return r>=o.height-n.height-t}),J())}var cr={drawer:z("[data-md-toggle=drawer]"),search:z("[data-md-toggle=search]")};function no(e){return cr[e].checked}function Ke(e,t){cr[e].checked!==t&&cr[e].click()}function Ue(e){let t=cr[e];return b(t,"change").pipe(l(()=>t.checked),V(t.checked))}function ka(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ha(){return L(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(V(!1))}function oo(){let e=b(window,"keydown").pipe(A(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:no("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),A(({mode:t,type:r})=>{if(t==="global"){let n=_e();if(typeof n!="undefined")return!ka(n,r)}return!0}),pe());return Ha().pipe(g(t=>t?_:e))}function le(){return new URL(location.href)}function ot(e){location.href=e.href}function io(){return new x}function ao(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)ao(e,r)}function M(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)ao(n,o);return n}function fr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function so(){return location.hash.substring(1)}function Dr(e){let t=M("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Pa(e){return L(b(window,"hashchange"),e).pipe(l(so),V(so()),A(t=>t.length>0),X(1))}function co(e){return Pa(e).pipe(l(t=>ce(`[id="${t}"]`)),A(t=>typeof t!="undefined"))}function Vr(e){let t=matchMedia(e);return er(r=>t.addListener(()=>r(t.matches))).pipe(V(t.matches))}function fo(){let e=matchMedia("print");return L(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(V(e.matches))}function zr(e,t){return e.pipe(g(r=>r?t():_))}function ur(e,t={credentials:"same-origin"}){return ue(fetch(`${e}`,t)).pipe(fe(()=>_),g(r=>r.status!==200?Ot(()=>new Error(r.statusText)):k(r)))}function We(e,t){return ur(e,t).pipe(g(r=>r.json()),X(1))}function uo(e,t){let r=new DOMParser;return ur(e,t).pipe(g(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),X(1))}function pr(e){let t=M("script",{src:e});return $(()=>(document.head.appendChild(t),L(b(t,"load"),b(t,"error").pipe(g(()=>Ot(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),R(()=>document.head.removeChild(t)),ge(1))))}function po(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function lo(){return L(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(po),V(po()))}function mo(){return{width:innerWidth,height:innerHeight}}function ho(){return b(window,"resize",{passive:!0}).pipe(l(mo),V(mo()))}function bo(){return G([lo(),ho()]).pipe(l(([e,t])=>({offset:e,size:t})),X(1))}function lr(e,{viewport$:t,header$:r}){let n=t.pipe(ee("size")),o=G([n,r]).pipe(l(()=>Xe(e)));return G([r,t,o]).pipe(l(([{height:i},{offset:s,size:a},{x:f,y:c}])=>({offset:{x:s.x-f,y:s.y-c+i},size:a})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(s=>{let a=document.createElement("script");a.src=i,a.onload=s,document.body.appendChild(a)})),Promise.resolve())}var r=class extends EventTarget{constructor(n){super(),this.url=n,this.m=i=>{i.source===this.w&&(this.dispatchEvent(new MessageEvent("message",{data:i.data})),this.onmessage&&this.onmessage(i))},this.e=(i,s,a,f,c)=>{if(s===`${this.url}`){let u=new ErrorEvent("error",{message:i,filename:s,lineno:a,colno:f,error:c});this.dispatchEvent(u),this.onerror&&this.onerror(u)}};let o=document.createElement("iframe");o.hidden=!0,document.body.appendChild(this.iframe=o),this.w.document.open(),this.w.document.write(` - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/master/bill_of_materials_orin.html b/master/bill_of_materials_orin.html new file mode 100644 index 00000000..6812d584 --- /dev/null +++ b/master/bill_of_materials_orin.html @@ -0,0 +1,1331 @@ + + + + + + + + + + + + + + + + + + + + + + + Bill of Materials (Orin) - JetBot + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Bill of Materials - Jetson Orin Nano version

+

This page lists all the parts you need to build the open-source JetBot with the new Jetson Orin Nano 8GB Developer Kit, along with purchasing links from popular vendors.

+

Some of the parts are 3D printed. We provide the STL files needed to print these parts. Please see our 3d printing page for tips on printing.

+

Common parts

+

You need these components for each JetBot.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PartQuantityCostURLNotes
Jetson Orin Nano 8GB Developer Kit1$499.00NVIDIA
Micro SD card1$14.95Amazon128GB
Battery1$12.99AmazonPD 20W output, 10,000mAh
USB-C PD cable1$10.99AmazonUSB-C to DC 5.5mm x 2.5mm, right angle
Motor2$5.90Adafruit, Amazon(1), Amazon(2)"TT" form factor
Motor Driver1$19.95Adafruit, Amazon
Caster ball1$10.99Amazon1-inch diameter
USB cable pack1$6.99AmazonType A to Micro, right angle
PiOLED display1$13.45Adafruit, Amazon
PiOLED header1$7.99Adafruit, Amazon, Sparkfun2x(3+) right angle male
Chassis1--STL filesee 3D printing
Camera Mount1--STL filesee 3D printing
+

Camera

+

You need a camera module with 22pin cable for interfacing to Jetson Orin Nano 8GB Developer Kit carrier board and the appropriate wide field of view for each JetBot.

+

Select an option and get the parts specified.

+

Option 1 (default) - IMX219 175-degree FoV camera

+ + + + + + + + + + + + + + + + + + + +
PartQuantityCostURLNotes
Camera1$19.99ArduCam, AmazonArduCam B0392 - IMX219 175-degree
+ + +

Wheels

+

You need wheels with a "TT" motor shaft connector for each JetBot. Select an option and get the parts specified.

+

Option 1 - 60mm

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PartQuantityCostURLNotes
Wheel2$5.00Adafruit60mm diameter
Caster base1--STL filefor 60mm wheel
Caster shroud1--STL filefor 60mm wheel
+

Option 2 - 65mm

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PartQuantityCostURLNotes
Wheel2$3.00Adafruit65mm diameter
Caster base1--STL filefor 65mm wheel
Caster shroud1--STL filefor 65mm wheel
+

Assembly Hardware

+

You need the following parts to build JetBot. They come in packs, so order the quantity you need for the number of JetBots you are going to build.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PartQty per JetBotQty per packCost per JetBotURLNotes
Adhesive Strips (Poster Strips)260$0.14Amazon
M2 screw20100$1.40Amazon8mm long, self tapping
M3 screw460$0.47Amazon25mm long
M3 nut4150$0.20Amazon
Jumper wires440$0.56AmazonFemale-female, ~20cm
+ + + + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/master/examples/basic_motion.html b/master/examples/basic_motion.html index 9533c400..b84eacad 100644 --- a/master/examples/basic_motion.html +++ b/master/examples/basic_motion.html @@ -14,8 +14,9 @@ + - + @@ -23,22 +24,25 @@ - + - + + + + - - + + @@ -55,9 +59,7 @@ - - - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/master/examples/collision_avoidance.html b/master/examples/collision_avoidance.html index 4a9364cd..1fd69c2e 100644 --- a/master/examples/collision_avoidance.html +++ b/master/examples/collision_avoidance.html @@ -14,8 +14,9 @@ + - + @@ -23,22 +24,25 @@ - + - + + + + - - + + @@ -55,9 +59,7 @@ - - - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/master/examples/community_examples.html b/master/examples/community_examples.html index ffa95365..cee1f45a 100644 --- a/master/examples/community_examples.html +++ b/master/examples/community_examples.html @@ -14,8 +14,9 @@ + - + @@ -23,22 +24,25 @@ - + - + + + + - - + + @@ -55,9 +59,7 @@ - - - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/master/examples/object_following.html b/master/examples/object_following.html index 7f24c694..23716888 100644 --- a/master/examples/object_following.html +++ b/master/examples/object_following.html @@ -14,8 +14,9 @@ + - + @@ -23,22 +24,25 @@ - + - + + + + - - + + @@ -55,9 +59,7 @@ - - - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/master/examples/road_following.html b/master/examples/road_following.html index fe2de5b4..4369a2b3 100644 --- a/master/examples/road_following.html +++ b/master/examples/road_following.html @@ -14,8 +14,9 @@ + - + @@ -23,22 +24,25 @@ - + - + + + + - - + + @@ -55,9 +59,7 @@ - - - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/master/examples/teleoperation.html b/master/examples/teleoperation.html index f0cdec9c..f2a7c715 100644 --- a/master/examples/teleoperation.html +++ b/master/examples/teleoperation.html @@ -14,8 +14,9 @@ + - + @@ -23,22 +24,25 @@ - + - + + + + - - + + @@ -55,9 +59,7 @@ - - - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/master/getting_started.html b/master/getting_started.html index ae43a64f..e40ebfd5 100644 --- a/master/getting_started.html +++ b/master/getting_started.html @@ -14,8 +14,9 @@ + - + @@ -23,22 +24,25 @@ - + - + + + + - - + + @@ -55,9 +59,7 @@ - - - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/master/hardware_setup.html b/master/hardware_setup.html index 50a3f35d..367be375 100644 --- a/master/hardware_setup.html +++ b/master/hardware_setup.html @@ -9,13 +9,14 @@ - + + - + @@ -23,22 +24,25 @@ - + - + + + + - - + + @@ -55,9 +59,7 @@ - - - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/master/index.html b/master/index.html index aafdcd1b..5be9372c 100644 --- a/master/index.html +++ b/master/index.html @@ -12,8 +12,9 @@ + - + @@ -21,22 +22,25 @@ - + - + + + + - - + + @@ -53,9 +57,7 @@ - - - + @@ -74,7 +76,6 @@ - @@ -107,6 +108,7 @@
@@ -130,7 +132,9 @@ + - + + - + diff --git a/master/reference/docker_tips.html b/master/reference/docker_tips.html index 35ca60fd..a5c8cc0a 100644 --- a/master/reference/docker_tips.html +++ b/master/reference/docker_tips.html @@ -12,8 +12,9 @@ + - + @@ -21,22 +22,25 @@ - + - + + + + - - + + @@ -53,9 +57,7 @@ - - - + @@ -74,7 +76,6 @@ - @@ -107,6 +108,7 @@
@@ -130,7 +132,9 @@ + @@ -821,10 +1025,11 @@

Disabling containers

- + + - + diff --git a/master/search/search_index.json b/master/search/search_index.json index 6b028031..71426a8e 100644 --- a/master/search/search_index.json +++ b/master/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"index.html","title":"JetBot","text":"Go to GitHub Get Started

JetBot is an open-source robot based on NVIDIA Jetson Nano. You'll like it because...

"},{"location":"index.html#its-affordable","title":"It's Affordable","text":"JetBot costs less than $250 in parts, including Jetson Nano. The DIY kit includes a bill of materials which you must purchase and a 3D printed chassis that you can print, or order. If you're looking to get up and running as quick as possible, there are also many third party kits available that come pre-bundled."},{"location":"index.html#its-educational","title":"It's Educational","text":"JetBot includes a set of Jupyter notebooks which cover basic robotics concepts like programatic motor control, to more advanced topics like training a custom AI for avoiding collisions. What you'll learn isn't limited to JetBot. You'll learn concepts related to neural network data collection and training that extend as far as your imagination."},{"location":"index.html#its-easy-to-setup","title":"It's Easy to Setup","text":"JetBot is programmed from your web browser. Just connect your JetBot to Wifi and launch the JetBot Docker container. This enables JetBot's web programming environment, which is available even after the JetBot reboots. Once your JetBot boots, just type it's IP address into your web browser and start programming."},{"location":"index.html#its-fun","title":"It's Fun!","text":"We built JetBot to make exploring ideas related to robotics as fun as possible. In effect, it's a portable, battery powered AI computer with a camera that's super easy to program. This makes it the perfect platform for trying new ideas related to AI, image processing and robotics. Our experiments have led us to new projects like JetRacer, and we're excited to see where your experiments take you."},{"location":"index.html#get-started","title":"Get Started","text":"

To get started with JetBot, follow the Getting Started instructions. If you run into any issues along the way, please let us know!

Go to GitHub Get Started"},{"location":"index.html#get-involved","title":"Get involved","text":"

We really appreciate any feedback related to JetBot, and also just enjoy seeing what you're working on! There is a growing community of Jetson Nano and JetBot users. It's easy to get involved involved...

  • Ask a question and discuss JetBot related topics on the JetBot GitHub Discussions
  • Report a bug by creating an issue
  • Share your project or ask a question on the Jetson Developer Forums
"},{"location":"3d_printing.html","title":"3D Printing","text":"

This page has useful information related to printing the JetBot chassis using a 3D printer. There are two methods for printing JetBot

  • Print by yourself
  • Use a printing service
"},{"location":"3d_printing.html#method-1-print-by-yourself","title":"Method 1 - Print by yourself","text":"

If you have a 3D printer, we recommend printing the JetBot components yourself!

"},{"location":"3d_printing.html#print-facts","title":"Print facts","text":"

Below are some facts related to printing a single JetBot.

  • Print time: 10-12 hours
  • Material used: < 100 grams
  • Material cost: ~ $2
"},{"location":"3d_printing.html#tested-printers","title":"Tested Printers","text":"

We've tested that the following printers are able to print JetBot successfully.

Model Cost URL Monoprice Voxel $320 Amazon Ultimaker 2+ $2500 Amazon"},{"location":"3d_printing.html#tested-filaments","title":"Tested Filaments","text":"

Based on our experience, we recommend using PLA filament when printing JetBot. Below is a collection of filaments that we have tested with the Monoprice Voxel 3D printer.

Brand Thickness Material Color URL Notes AmazonBasics 1.75mm PLA Silver Amazon Smooth, dark metallic finish AmazonBasics 1.75mm PLA Neon Green Amazon Smooth, pale finish AmazonBasics 1.75mm PLA Yellow Amazon Bold yellow, slightly translucent AmazonBasics 1.75mm PLA Purple Amazon Smooth, pale finish"},{"location":"3d_printing.html#printing-and-slicing-configuration","title":"Printing and slicing configuration","text":"
  • STL unit: mm

  • Print orientation

  • Slice configuration (Cura)

"},{"location":"3d_printing.html#method-2-use-a-printing-service","title":"Method 2 - Use a printing service","text":"

If you don't have a 3D printer on hand, and are not interested in purchasing one, there are external services that can print the chassis for you. Below are some quotes from popular 3D printing services

Please note, we have not tested these services yet ourselves, so please proceed with caution. If you find a print service that worked well for you, we'd love to hear! Please let us know by creating an issue on GitHub or mentioning it in the chat channel

Service Quote 3DHubs $36.66 Jinxbot $91.42 Sculpteo ~$100"},{"location":"CHANGELOG.html","title":"Changes","text":""},{"location":"CHANGELOG.html#master","title":"Master","text":""},{"location":"CHANGELOG.html#043","title":"[0.4.3]","text":""},{"location":"CHANGELOG.html#added","title":"Added","text":"
  • Added LocalController class which allows users to directly connect controller to JetBot
"},{"location":"CHANGELOG.html#042-11102020","title":"[0.4.2] - 11/10/2020","text":""},{"location":"CHANGELOG.html#fixed","title":"Fixed","text":"
  • Resolved software issue which affected certain motor driver variants
"},{"location":"CHANGELOG.html#041-10222020","title":"[0.4.1] - 10/22/2020","text":""},{"location":"CHANGELOG.html#added_1","title":"Added","text":"
  • ZMQ Camera publisher to improve stability of Camera and allow camera use in multiple notebooks
  • Docker containers for ML dependencies, PiOLED display, ZMQ Camera publisher, and Jupyter Lab server
  • Inline documentation using mkdocs-material and mike
"},{"location":"CHANGELOG.html#changed","title":"Changed","text":"
  • Default Camera class now uses ZMQ Camera. This means you must run the ZMQ camera publisher to access the camera as before. If you wish to use the old Camera class, do from jetbot.camera.opencv_gst_camera import OpenCvGstCamera and camera = OpenCvGstCamera()
"},{"location":"CHANGELOG.html#deprecated","title":"Deprecated","text":"
  • JetPack 4.3 SD card image
"},{"location":"CHANGELOG.html#fixed_1","title":"Fixed","text":"
  • Camera shutdown failures are avoided by addition of ZMQ Camera. No longer need for constant systemctl restart nvargus-daemon calls.
  • Camera queue buildup for heavier image processing workloads is fixed in ZMQ Camera by dropping old frames using conflate option.
"},{"location":"CHANGELOG.html#040-1152020","title":"0.4.0 - 1/15/2020","text":""},{"location":"CHANGELOG.html#added_2","title":"Added","text":"
  • Added support for JetPack 4.3 SD card image. Found here.
"},{"location":"CHANGELOG.html#changed_1","title":"Changed","text":"
  • Updated Object Detector SD card image. Found here
"},{"location":"CHANGELOG.html#030-392019","title":"0.3.0 - 3/9/2019","text":""},{"location":"CHANGELOG.html#added_3","title":"Added","text":"
  • Initial release with JetPack 4.2 SD card image. Found here
"},{"location":"CONTRIBUTING.html","title":"Contributing","text":""},{"location":"CONTRIBUTING.html#documenting","title":"Documenting","text":"

We use mkdocs-material to easily generate documentation from markdown.

"},{"location":"CONTRIBUTING.html#installing-dependencies","title":"Installing Dependencies","text":"
sudo apt-get update\nsudo apt-get -y install python3-pip\nsudo apt-get -y install mkdocs\npip3 install mkdocs-material mike\n
"},{"location":"CONTRIBUTING.html#testing","title":"Testing","text":"

To quickly test the version of the documentation you're using, without commiting anything to the gh-pages branch, run the following command.

mkdocs serve --dev-addr=0.0.0.0:8000\n
"},{"location":"CONTRIBUTING.html#deploying","title":"Deploying","text":"

We use mike to maintain multiple versions of the documentation. To build the documentation with mike, call

mike deploy <tag>\n

This will build the documentation, and add a static version of the site under the gh-pages branch. For example, to deploy the master documentation we do

mike deploy master\n

To set the default documentation version to master we would do.

mike set-default master\n

To push the documentation to Github Pages.

mike deploy master --push\n
"},{"location":"CONTRIBUTING.html#adding-a-new-page","title":"Adding a new page","text":"

Mkdocs looks for documentation under the docs folder. To add a new documentation page, you will need to first add the file either directly to the docs folder, or to a different folder with a symbolic link to the docs folder. For example, say we wanted to add a page named MAINTAINERS.md to the root of the project

First, we create the file at the root of the project

touch MAINTAINERS.md\n

Next, we add a symbolic link to the docs folder

cd docs/reference\nln -s ../../MAINTAINERS.md .\n

Finally, we add the file to our navigation in mkdocs.yml

- nav:\n- Reference:\n- 'Maintainers': reference/MAINTAINERS.md\n

Now, when you build the documentation you should see the page that we've added in the \"Reference\" section with the title \"Maintainers\".

"},{"location":"CONTRIBUTING.html#updating-the-changelog","title":"Updating the Changelog","text":"

We follow the guidance of Keep a Changelog for best practices in maintaining a chronological human-readable CHANGELOG.md file. If the change is worth developers and users knowing about, consider adding an entry to the change log.

"},{"location":"bill_of_materials.html","title":"Bill of Materials","text":"

This page lists everything you need to build JetBot, along with purchasing links from popular vendors.

Some of the parts are 3D printed. We provide the STL files needed to print these parts. Please see our 3d printing page for tips on printing.

"},{"location":"bill_of_materials.html#common-parts","title":"Common parts","text":"

You need these components for each JetBot.

Part Quantity Cost URL Notes Jetson Nano 1 $99.00 NVIDIA Micro SD card 1 $13.99 Amazon 64GB Power supply 1 $7.50 Adafruit Micro USB, 5V, 2.5A Motor 2 $5.90 Adafruit, Amazon(1), Amazon(2) \"TT\" form factor Motor Driver 1 $19.95 Adafruit, Amazon Caster ball 1 $6.30 Amazon 1-inch diameter Battery 1 $15.99 Amazon 2x 5V/3A output, 10,000mAh USB cable pack 1 $6.99 Amazon Type A to Micro, right angle PiOLED display 1 $14.95 Adafruit, Amazon PiOLED header 1 $5.95 Adafruit, Amazon, Sparkfun 2x(3+) right angle male Chassis 1 -- STL file see 3D printing Camera Mount 1 -- STL file see 3D printing"},{"location":"bill_of_materials.html#camera","title":"Camera","text":"

You need a camera with appropriate sensor and field of view for each JetBot. Select an option and get the parts specified.

"},{"location":"bill_of_materials.html#option-1-default-leopard-imaging-camera","title":"Option 1 (default) - Leopard Imaging Camera","text":"Part Quantity Cost URL Notes Camera 1 $29.00 Leopard Imaging LI-IMX219-MIPI-FF-NANO-H145"},{"location":"bill_of_materials.html#option-2-imx219-160-camera","title":"Option 2 - IMX219-160 Camera","text":"Part Quantity Cost URL Notes Camera 1 $29.90 Amazon IMX219-160 Camera"},{"location":"bill_of_materials.html#option-3-rpi-camera-v2-lens-attachment","title":"Option 3 - RPi Camera V2 + Lens Attachment","text":"Part Quantity Cost URL Notes Camera 1 $23.90 Amazon, Adafruit Raspberry Pi Camera V2 Camera lens attachment 1 $18.99 Amazon(1), Amazon(2), eBay 160-degree FoV"},{"location":"bill_of_materials.html#wifi","title":"WiFi","text":"

You need a WiFi solution for each JetBot. Select an option and get the parts specified.

"},{"location":"bill_of_materials.html#option-1-default-m2-card-antennas","title":"Option 1 (default) - M2 Card + Antennas","text":"

This option is a good choice if you're building JetBot with the original Jetson Nano 4GB. It has been widely tested and used for JetBot.

Attention

Jetson Nano 2GB does not have a M.2 connector, so this option will not work with it.

Part Quantity Cost URL Notes WiFi card 1 $18.95 Amazon, NewEgg M2, Intel Wireless-AC 8265 WiFi antenna 2 $5.06 Arrow U.FL connectors"},{"location":"bill_of_materials.html#option-2-usb-dongle","title":"Option 2 - USB Dongle","text":"

This option is compatible with both the original Jetson Nano (4GB) and Jetson Nano 2GB.

Part Quantity Cost URL Notes WiFi Dongle - TP-Link Archer T2U Nano 1 $17.99 Amazon RTL8811AU chipset WiFi Dongle - TP-Link Archer T2U Plus 1 $19.99 Amazon RTL8811AU chipset Info

For other possible USB Wi-fi dongles that you can use on Jetson Nano, please check the Suported Components List.

  • Jetson Nano 2GB Developer Kit User Guide - Supported Component List
"},{"location":"bill_of_materials.html#wheels","title":"Wheels","text":"

You need wheels with a \"TT\" motor shaft connector for each JetBot. Select an option and get the parts specified.

"},{"location":"bill_of_materials.html#option-1-60mm","title":"Option 1 - 60mm","text":"Part Quantity Cost URL Notes Wheel 2 $5.00 Adafruit 60mm diameter Caster base 1 -- STL file for 60mm wheel Caster shroud 1 -- STL file for 60mm wheel"},{"location":"bill_of_materials.html#option-2-65mm","title":"Option 2 - 65mm","text":"Part Quantity Cost URL Notes Wheel 2 $3.00 Adafruit 65mm diameter Caster base 1 -- STL file for 65mm wheel Caster shroud 1 -- STL file for 65mm wheel"},{"location":"bill_of_materials.html#assembly-hardware","title":"Assembly Hardware","text":"

You need the following parts to build JetBot. They come in packs, so order the quantity you need for the number of JetBots you are going to build.

Part Qty per JetBot Qty per pack Cost per JetBot URL Notes Adhesive pads 2 48 $0.14 Amazon M2 screw 20 100 $1.29 Amazon 8mm long, self tapping M3 screw 4 60 $0.47 Amazon 25mm long M3 nut 4 100 $0.24 Amazon Jumper wires 4 40 $0.13 Amazon Female-female, ~20cm"},{"location":"getting_started.html","title":"Getting Started","text":""},{"location":"getting_started.html#step-1-pick-your-vehicle","title":"Step 1 - Pick your vehicle!","text":"

To get started with JetBot, first pick your vehicle (hardware) you want to make.

For details of NVIDIA-designed open-source JetBot hardware, check Bill of Materials page and Hardware Setup page.

To find kits available from third parties, check Third Party Kits page.

"},{"location":"getting_started.html#step-2-setup-your-jetbot","title":"Step 2 - Setup your JetBot","text":"

After you've decided which vehicle you want to build, you'll need to source the parts and follow the setup instructions. After that, you're ready to move on to the JetBot examples!

"},{"location":"getting_started.html#option-1-diy-jetbot-kit","title":"Option 1 - DIY JetBot Kit","text":"

To get started with the DIY open-source JetBot, follow these steps.

  1. Get the parts from the bill of materials.

  2. Follow the hardware setup

  3. Follow the software setup

"},{"location":"getting_started.html#option-2-third-party-jetbot-kit","title":"Option 2 - Third Party JetBot Kit","text":"

Third party JetBot kits may have different setup instructions from the DIY JetBot. To get started with a third party jetbot, we recommend referring to the third party kit's setup instructions for details on how to setup.

Check out the Third Party Kits page for links and information related to third party kits.

"},{"location":"getting_started.html#step-3-follow-the-examples","title":"Step 3 - Follow the examples","text":"

JetBot comes with many examples to teach robotics and AI basics. These give you the experience you need to begin exploring your own applications with JetBot.

"},{"location":"getting_started.html#example-1-basic-motion","title":"Example 1 - Basic Motion","text":"

The Basic Motion example teaches you how to program JetBot from your web browser with basic motor controls.

"},{"location":"getting_started.html#example-2-teleoperation","title":"Example 2 - Teleoperation","text":"

The Teleoperation example teaches you how to stream live images from JetBot and control JetBot with a gamepad attached to your laptop.

"},{"location":"getting_started.html#example-3-collision-avoidance","title":"Example 3 - Collision Avoidance","text":"

The Collision Avoidance example teaches you how to collect data and train a custom Image Classification model to enable JetBot to avoid collisions in a variety of scenarios. The method learned here can be extended to recognize arbitrary classes of image, which can be extended far beyond JetBot!

"},{"location":"getting_started.html#example-4-road-following","title":"Example 4 - Road Following","text":"

The Road Following example teaches you how to collect data and train a custom Image Regression model to enable JetBot to follow a road. The method learned here can be extended to detect an arbitrary x, y coordinate in an image, which extends far beyond JetBot!

"},{"location":"getting_started.html#example-5-object-following","title":"Example 5 - Object Following","text":"

The Object Following teaches you how to use a pre-trained object detection model for following an object, like a person, cup, or dog. The pre-trained network you'll learn to use here can be used for a variety of new AI projects.

"},{"location":"getting_started.html#and-more","title":"And more!","text":"

Take the examples, modify them, make JetBot do something new, or create an entirely new AI project of your own.

If you do something cool with JetBot, let us know!

Happy JetBotting :)

"},{"location":"hardware_setup.html","title":"Hardware Setup","text":"

This page details the hardware setup instructions for creating JetBot

"},{"location":"hardware_setup.html#tools-needed","title":"Tools needed","text":"

To build JetBot you'll need the following tools

  • Pliers

  • Wire flush cutters/wire stripper

  • Phillips screwdriver (+ Hex screwdriver for M2 hex socket screws )
  • Soldering iron and solder
  • (optional) Precision Electronics Tweezers
"},{"location":"hardware_setup.html#assembly","title":"Assembly","text":""},{"location":"hardware_setup.html#step-1-clean-3d-printed-parts","title":"Step 1 - Clean 3D printed parts","text":"
  1. Remove support material from motor sockets using pliers

  2. Remove support material from all surfaces, openings and screw holes using pliers, tweezers, and/or fingernails

  3. File material from openings if they are too tight
"},{"location":"hardware_setup.html#step-2-mount-motors","title":"Step 2 - Mount motors","text":"
  1. Cut and remove the zip tie from each motor

  2. Tuck the wires beneath transparent band to prevent stress on solder joints

  3. Insert each motor into the 3D printed chassis
  4. Secure each motor with 2x M3x25mm screws
"},{"location":"hardware_setup.html#step-3-solder-motor-driver","title":"Step 3 - Solder motor driver","text":"
  1. Break away 3-pin and 2-pin male headers from header link that comes with motor driver package

  2. Join two of the screw terminal blocks to create a 4-pin screw terminal

  3. Solder the 2-pin and 4-pin screw terminals to motor driver
  4. Solder the 2-pin and 3-pin male headers to motor driver

    Warning

    Pay careful attention to the position of the 3-pin header. It is offset by 1-pin from the corner.

"},{"location":"hardware_setup.html#step-4-strip-motor-driver-power-cable","title":"Step 4 - Strip motor driver power cable","text":"
  1. Select the depicted micro USB from the pack

    Warning

    Pay careful attention to the image. The cables are not identical. The other micro USB cable will be used to power the Jetson Nano. Using the wrong power cable for Nano will block it's Ethernet port.

  2. Cut the depicted cable roughly ~20cm from the type-A terminal

  3. Strip the rubber coating ~3cm from the cut
  4. Remove the green / white wires and metal shielding.
  5. Strip the red and black wires about ~5mm from cut
  6. (optional) Twist the exposed strand wire and coat with solder
"},{"location":"hardware_setup.html#step-5-mount-motor-driver","title":"Step 5 - Mount motor driver","text":"
  1. Route the spliced cable through chassis

  2. Secure exposed red (+) and black (-) wires to the power terminals on motor driver

    Warning

    Pay attention to the markings on the motor driver. Incorrect wiring could damage the driver.

  3. Route the spliced cable under the motor driver to organize and prevent stress on screw terminal

  4. Secure motor driver to chassis using self taping screws
  5. Secure left and right motor wires to motor screw terminals

    Info

    Notice (3/11/2019): We made a slight mistake: the red and black wires for the left and right motor are actually flipped in the image shown above. This will not cause damage, but the motors will spin backwards. Please flip them to the correct orientation.

"},{"location":"hardware_setup.html#step-6-mount-wifi-antennas","title":"Step 6 - Mount WiFi antennas","text":"

Skip this step if you are using a USB WiFi dongle instead of the M.2 WiFi module

  1. Secure one patch antenna to the underside of top plate

  2. Secure the other patch antenna at edge of battery bay

  3. Route connectors as shown
"},{"location":"hardware_setup.html#step-7-remove-jetson-nano-module-from-developer-kit","title":"Step 7 - Remove Jetson Nano module from developer kit","text":"

Skip this step if you are using a USB WiFi dongle instead of the M.2 WiFi module

  1. Remove standoff screws from Jetson Nano module

  2. Release the side latches of SODIMM connector using hands

  3. Slide Jetson Nano module out of SODIMM connector
"},{"location":"hardware_setup.html#step-8-attach-wifi-module-to-developer-kit","title":"Step 8 - Attach WiFi module to developer kit","text":"

Skip this step if you are using a USB WiFi dongle instead of the M.2 WiFi module

  1. Attach developer kit to chassis using self taping screws

  2. Snap antennae on to WiFi module using fingers

  3. Remove the screw from developer kit by the M.2 socket
  4. Insert WiFi module into M.2 slot on developer kit
  5. Fasten WiFi module to developer kit with screw removed in (3)
  6. Re-attach the Jetson Nano module to developer kit
"},{"location":"hardware_setup.html#step-9-mount-ball-caster","title":"Step 9 - Mount ball caster","text":"
  1. Place the caster ball inside of shroud

  2. Insert the caster base into shroud, securing the ball

    Tip

    Depending on how the print turns out, the ball socket enclosure may fit too tight. If this is the case, you can easily use a file to remove some excess material.

  3. Attach the assembled caster onto the chassis with self taping screws

"},{"location":"hardware_setup.html#step-10-solder-header-onto-pioled-display","title":"Step 10 - Solder header onto PiOLED display","text":"
  1. Secure the 6-pin right angle header to PiOLED display by some method

  2. Solder the pins depicted (3.3V, SDA, SCL, and GND solder seen when zoomed in on right image)

    Warning

    The pins are close to the display screen, be careful to avoid the screen with soldering iron tip.

"},{"location":"hardware_setup.html#step-11-wire-motor-driver-to-pioled-display","title":"Step 11 - Wire motor driver to PiOLED display","text":"
  1. Select 4 wire segment of female-female jumper cables.

    Info

    We use brown, red, orange, yellow segment. You can map the colors accordingly.

  2. Attach 3.3V (red), GND (brown), SDA (orange), and SCL (yellow) to motor driver as shown

  3. Route the 4 wire jumper cable segment through chassis
  4. Attach red, brown, orange and yellow wires to right angle header as depicted

    Warning

    Pay close attention! Reversing the red / brown wires could damage the system.

"},{"location":"hardware_setup.html#step-12-mount-camera","title":"Step 12 - Mount camera","text":"
  1. Attach the camera to the camera mount using 4x self tapping screws

  2. Attach the camera mount to chassis with 4x self tapping screws

  3. Insert the other end of ribbon cable into Jetson Nano developer kit
  4. (optional) Tuck the ribbon cable against heat sink to organize
"},{"location":"hardware_setup.html#step-13-attach-wide-angle-sensor","title":"Step 13 - Attach wide angle sensor","text":"
  1. Peel off the original camera sensor

  2. Remove any excess adhesive material

  3. Remove the adhesive film cover from wide angle replacement sensor
  4. Attach wide angle replacement sensor to camera module
  5. Ensure the sensor connector is fastened to camera module
"},{"location":"hardware_setup.html#step-14-mount-battery","title":"Step 14 - Mount battery","text":"
  1. Attach double sided adhesive tabs to each end of battery, leaving some tab exposed

  2. Holding robot upside down, slide battery into battery bay

  3. Holding the battery in place, flip the robot and secure battery to chassis
"},{"location":"hardware_setup.html#step-15-organize-wires","title":"Step 15 - Organize wires","text":"
  1. Route USB cables through chassis to organize and prevent dragging
"},{"location":"hardware_setup.html#finished-jetbot","title":"Finished JetBot","text":"

Once finished, your JetBot should look similar to this.

"},{"location":"third_party_kits.html","title":"Third Party Kits","text":"

In addition to the open-source DIY version, several third party JetBot kits using Jetson Nano have emerged. This page details the kits that we're aware of

Note

Please note, we do not officially maintain these kits in this GitHub project. Please refer to the vendor's documentation. Please refer to the vendor URL for cost and availability. Some kits may have additional vendors that we aren't aware of or haven't listed yet. If you think these would be helpful for other developers to know, please let us know.

"},{"location":"third_party_kits.html#waveshare-jetbot","title":"Waveshare JetBot","text":"Kit URL WaveShare JetBot Kit Amazon.com, Waveshare.com, Waveshare.net(\u4e2d\u6587) WaveShare JetBot Kit (includes Jetson Nano Dev Kit) Amazon.com, Waveshare.com, Waveshare.net(\u4e2d\u6587)"},{"location":"third_party_kits.html#links","title":"Links","text":"
  • JetBot AI Kit Assemble Manual
  • JetBot AI Kit
  • JetBot AI Kit (\u4e2d\u6587)
"},{"location":"third_party_kits.html#sparkfun-jetbot","title":"SparkFun JetBot","text":"Kit URL SparkFun JetBot AI Kit v2.1 SparkFun SparkFun JetBot AI Kit v2.1 (includes Jetson Nano Dev Kit) SparkFun"},{"location":"third_party_kits.html#links_1","title":"Links","text":"
  • Assembly Guide for SparkFun JetBot AI Kit V2.0
"},{"location":"third_party_kits.html#seeedstudio-jetbot","title":"Seeedstudio JetBot","text":"Kit URL Seeedstudio JetBot Smart Car Kit Seeedstudio Seeedstudio JetBot Smart Car Kit (includes Jetson Nano Dev Kit) Seeedstudio"},{"location":"third_party_kits.html#links_2","title":"Links","text":"
  • Seeedstudio JetBot Wiring Guide
  • Seeedstudio JetBot Setup Guide
"},{"location":"third_party_kits.html#silicon-highway-jetbot","title":"Silicon Highway JetBot","text":"Kit URL Silicon Highway JetBot Kit Silicon Highway (UK)"},{"location":"third_party_kits.html#fabo-jetbot","title":"FaBo JetBot","text":"Kit URL FaBo JetBot Kit (with Jetson Nano Dev Kit) FaBo store (Japan)"},{"location":"third_party_kits.html#links_3","title":"Links","text":"
  • JetBot Kit \u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb
"},{"location":"third_party_kits.html#gpus-jetbot","title":"GPUS JetBot","text":"Kit URL GPUS JetBot Kit (with Jetson Nano Dev Kit) Taobao"},{"location":"examples/basic_motion.html","title":"Basic Motion","text":"

In this notebook we'll control JetBot by programming from a web browser.

  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888

  2. Sign in with the default password jetbot

  3. Navigate to ~/Notebooks/basic_motion/
  4. Open and follow the basic_motion.ipynb notebook
Caution

JetBot will physically move in this notebook, make sure it has enough space to move around.

"},{"location":"examples/collision_avoidance.html","title":"Collision Avoidance","text":"

In this example we'll collect an image classification dataset that will be used to help keep JetBot safe! We'll teach JetBot to detect two scenarios free and blocked. We'll use this AI classifier to prevent JetBot from entering dangerous territory.

"},{"location":"examples/collision_avoidance.html#step-1-collect-data-on-jetbot","title":"Step 1 - Collect data on JetBot","text":"
  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888
  2. Sign in with the default password jetbot
  3. Shutdown all other running notebooks by selecting Kernel -> Shutdown All Kernels...
  4. Navigate to ~/Notebooks/collision_avoidance/
  5. Open and follow the data_collection.ipynb notebook
Tip

We provide a pre-trained model so you can skip to step 3 if desired. This model was trained on a limited dataset using the Raspberry Pi V2 Camera with wide angle attachment.

"},{"location":"examples/collision_avoidance.html#step-2-train-neural-network","title":"Step 2 - Train neural network","text":""},{"location":"examples/collision_avoidance.html#option-1-train-on-jetson-nano","title":"Option 1 - Train on Jetson Nano","text":"
  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888
  2. Sign in with the default password jetbot
  3. In the Jupyter Lab tab, navigate to ~/collision_avoidance
  4. Open and follow the train_model_resnet18.ipynb notebook
"},{"location":"examples/collision_avoidance.html#option-2-train-on-other-gpu-machine","title":"Option 2 - Train on other GPU machine","text":"
  1. Connect to a GPU machine with PyTorch installed and a Jupyter Lab server running
  2. Upload the collision avoidance training notebook to this machine
  3. Open and follow the train_model_resnet18.ipynb notebook
"},{"location":"examples/collision_avoidance.html#step-3-optimize-the-model-on-jetson-nano","title":"Step 3 - Optimize the model on Jetson Nano","text":"
  1. Connect to your robot by navigating to https://<jetbot_ip_address>:8888
  2. Sign in with the default password jetbot
  3. Shutdown all other running notebooks by selecting Kernel -> Shutdown All Kernels...
  4. Navigate to ~/Notebooks/road_following
  5. Open and follow the live_demo_resnet18_build_trt.ipynb notebook to optimize the model with TensorRT
"},{"location":"examples/collision_avoidance.html#step-4-run-live-demo-on-jetbot","title":"Step 4 - Run live demo on JetBot","text":"
  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888
  2. Sign in with the default password jetbot
  3. Shutdown all other running notebooks by selecting Kernel -> Shutdown All Kernels...
  4. Navigate to ~/Notebooks/collision_avoidance
  5. Open and follow the live_demo_resnet18_trt.ipynb notebook to run the optimized model
Caution

JetBot will physically move in this notebook, make sure it has enough space to move around.

"},{"location":"examples/community_examples.html","title":"Community Examples","text":"

Here you can find community examples and extensions of JetBot.

"},{"location":"examples/community_examples.html#combined-collision-avoidance-and-road-following","title":"Combined Collision Avoidance and Road Following","text":"

This example by @abuelgasimsaadeldin combines the JetBot road following and collision avoidance examples into a combined application. Watch your JetBot follow the road, while simulataneously avoiding traffic collisions.

  • GitHub
  • DevTalk
"},{"location":"examples/object_following.html","title":"Object Following","text":"Attention

Please note that example for now only works with the SD card image based software setup.

In this example we'll have JetBot follow an object using a pre-trained model capable of detecting common objects likePerson, Cup, and Dog. While doing this, JetBot will run the collision avoidance model from Example 3 to make sure it stays safe!

  1. Download the object detection model according to the table below

    JetBot SD Card Version Model v0.3 ssd_mobilenet_v2_coco.engine v0.4 (latest) ssd_mobilenet_v2_coco.engine
Attention

Please note, the latest object detection engine targets Jetson Nano running software bundled with JetPack 4.3. This engine not be compatible with other versions of JetPack. For this reason, we recommend starting from the JetPack 4.3 JetBot SD Card image, or using the JetPack 4.3 base SD card image if you want to run the object detection example.

  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888

  2. Shutdown all other running notebooks by selecting Kernel -> Shutdown All Kernels...

  3. Navigate to ~/Notebooks/object_following/
  4. Upload the pre-trained ssd_mobilenet_v2_coco.engine model to this folder

    Info

    This example also uses the collision avoidance model from example 3. We assume that it is already located at ~/Notebooks/collision_avoidance/best_model.pth

  5. Open and follow the live_demo.ipynb notebook

    Warning

    Start cautious and give JetBot enough space to move around.

"},{"location":"examples/road_following.html","title":"Road Following","text":"

In this example we'll collect an image regression dataset that will enable JetBot to follow a road! We'll teach JetBot to detect a target x, y image coordinate that the JetBot will chase. As JetBot gets closer to the point, it moves further along the track.

"},{"location":"examples/road_following.html#step-1-collect-data-on-jetbot","title":"Step 1 - Collect data on JetBot","text":"
  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888
  2. Sign in with the default password jetbot
  3. Shutdown all other running notebooks by selecting Kernel -> Shutdown All Kernels...
  4. Navigate to ~/Notebooks/road_following/
  5. Open and follow the data_collection.ipynb notebook
"},{"location":"examples/road_following.html#step-2-train-neural-network","title":"Step 2 - Train neural network","text":""},{"location":"examples/road_following.html#option-1-train-on-jetson-nano","title":"Option 1 - Train on Jetson Nano","text":"
  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888
  2. Sign in with the default password jetbot
  3. In the Jupyter Lab tab, navigate to ~/Notebooks/road_following
  4. Open and follow the train_model.ipynb notebook
"},{"location":"examples/road_following.html#option-2-train-on-other-gpu-machine","title":"Option 2 - Train on other GPU machine","text":"
  1. Connect to a GPU machine with PyTorch installed and a Jupyter Lab server running

  2. Upload the road following avoidance training notebook to this machine

  3. Open and follow the train_model.ipynb notebook
"},{"location":"examples/road_following.html#step-3-optimize-the-model-on-jetson-nano","title":"Step 3 - Optimize the model on Jetson Nano","text":"
  1. Connect to your robot by navigating to https://<jetbot_ip_address>:8888
  2. Sign in with the default password jetbot
  3. Shutdown all other running notebooks by selecting Kernel -> Shutdown All Kernels...
  4. Navigate to ~/Notebooks/road_following
  5. Open and follow the live_demo_build_trt.ipynb notebook to optimize the model with TensorRT
"},{"location":"examples/road_following.html#step-4-run-live-demo-on-jetbot","title":"Step 4 - Run live demo on JetBot","text":"
  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888
  2. Sign in with the default password jetbot
  3. Shutdown all other running notebooks by selecting Kernel -> Shutdown All Kernels...
  4. Navigate to ~/Notebooks/road_following
  5. Open and follow the live_demo_trt.ipynb notebook to run the optimized model
Warning

Start cautious and give JetBot enough space to move around.

"},{"location":"examples/teleoperation.html","title":"Teleoperation","text":"Info

This example requires a gamepad controller connected to your laptop/workstation.

In this example we'll drive JetBot remotely, view live streaming video, and save snapshots!

  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888

  2. Sign in with the default password jetbot

  3. Shutdown all other running notebooks by selecting Kernel -> Shutdown All Kernels...
  4. Navigate to ~/Notebooks/teleoperation/
  5. Open and follow the teleoperation.ipynb notebook
"},{"location":"reference/docker_tips.html","title":"Docker Tips","text":"

This page provides various information related to using docker with JetBot.

"},{"location":"reference/docker_tips.html#establishing-access-to-the-docker-host-terminal","title":"Establishing access to the Docker host terminal","text":"

The Jupyter Lab is running in the Docker container, thus the Terminal you open on Jupyter Lab only have access to the container environment. This means you cannot use commands like nvpmodel, tegrastats, journalctl, systemctl and others.

To get around this limitation, you can actually SSH in to the Docker host machine by;

ssh jetbot@0.0.0.0\n

"},{"location":"reference/docker_tips.html#using-nvidia-gpu-cloud-ngc","title":"Using Nvidia GPU Cloud (NGC)","text":"

The standard JetBot containers are hosted on docker hub, but for development or testing purposes, you may wish to use Nvidia GPU Cloud. To access containers on NGC, you need to sign into the NGC registry. To do this:

  1. Log into ngc.nvidia.com

  2. Generated your API Key

    1. Navigate to Setup > API Key
    2. Click on \"Generate API Key\" at the right upper corner of the page
    3. Copy the API key for future use
  3. On your Jetson, sign into the NGC registry using the generated key

    $ sudo docker login nvcr.io\n\nUsername: $oauthtoken\nPassword: <Your Generated Key>\n

For the username, enter $oauthtoken exactly as shown. It is a special authentication token for all users.

"},{"location":"reference/docker_tips.html#using-custom-jupyter-lab-workspace-directory","title":"Using custom Jupyter Lab workspace directory","text":"

The argument you provide to the enable.sh script is mounted as a volume inside the docker container. Inside the docker container, this volume is located at /workspace. Any changes that you make inside this directory will be saved outside of the docker container. To use a different directory as the workspace for the Jupyter contianer, just provide the path as an argument when calling enable.sh. For example, to set the workspace to your home directory, you would do

cd jetbot/docker\n./enable.sh $HOME\n
"},{"location":"reference/docker_tips.html#disabling-containers","title":"Disabling containers","text":"

Once you execute the enable.sh script, the containers are set to restart automatically. This means you can shut down your Jetson, and when you reboot the containers will run and you don't need to repeat this process.

To prevent the containers from starting automatically, just call the disable.sh script.

cd ~/jetbot/docker\n./disable.sh\n
"},{"location":"software_setup/docker.html","title":"Software Setup (Docker)","text":"

This page details how to set up JetBot using the pre-built JetBot docker containers. This is the best option if you want to use JetBot with an existing Jetson Nano SD card image.

Note

Please note, the JetBot containers described in this page currently target a Jetson Nano SD card image flashed with JetPack 4.4. These containers will not work with other version of JetPack.

"},{"location":"software_setup/docker.html#step-1-setup-jetson-nano","title":"Step 1 - Setup Jetson Nano","text":"

If you haven't already, go through the initial setup of Jetson Nano. You can use your existing Jetson Nano set up (microSD card), as long as you have enough storage space left.

Hint

For this, we'll assume you've set up your Jetson Nano using the online Getting Started guide.

  • Getting Started With Jetson Nano Developer Kit
  • Getting Started with Jetson Nano 2GB Developer Kit
"},{"location":"software_setup/docker.html#step-2-connect-to-wi-fi","title":"Step 2 - Connect to Wi-Fi","text":"

If you haven't already, connect your Jetson Nano to your Wi-Fi network.

Follow this Wi-Fi setup guide.

"},{"location":"software_setup/docker.html#step-3-clone-jetbot-repo","title":"Step 3 - Clone JetBot repo","text":"

Clone the official JetBot GitHub repo.

git clone http://github.com/NVIDIA-AI-IOT/jetbot.git\n
"},{"location":"software_setup/docker.html#step-4-configure-system","title":"Step 4 - Configure System","text":"

First, call the scripts/configure_jetson.sh script to configure the power mode and other parameters.

cd jetbot\n./scripts/configure_jetson.sh\n
Hint

configure_jetson.sh also disables the GUI for the interest of saving system memory (DRAM) consumption. If you want to re-enable the GUI, you can execute the following command.

sudo systemctl set-default graphical.target\n

Optionally, you can execute this script (./scripts/re_enable_gui.sh).

Then, call the scripts/enable_swap.sh script to enable swap memory if not set. Having extra 4GB swap memory is recommended even on Jetson Nano (4GB) Developer Kit.

./scripts/enable_swap.sh\n
"},{"location":"software_setup/docker.html#step-5-enable-all-containers","title":"Step 5 - Enable all containers","text":"

Call the following to enable the JetBot docker containers

cd docker\n./enable.sh $HOME   # we'll use home directory as working directory, set this as you please.\n

Now you can go to https://<jetbot_ip>:8888 from a web browser and start programming JetBot!

You can do this from any machine on your local network. The password to log in is jetbot.

The enable.sh script causes the docker containers to restart at boot. This means the next time you power on your JetBot, the containers will automatically start, and you should see the IP address displayed on the PiOLED display screen. All you need to do is type this into your web browser and start programming!

Tip

For more information on configuring and using docker with JetBot, check out the Docker Tips page.

Now that you've finished setting up you're JetBot, you're ready to run through the examples!

"},{"location":"software_setup/native_setup.html","title":"Native JetBot Setup (without Docker)","text":"

This page details how you can configure your Jetson system to use JetBot without Docker. This is handy when you want to prototype without worrying about docker semantics, or have other reasons to work outside of a docker environment

If you see any issues with these instructions or have any questions, please feel free to open an issue on github here.

"},{"location":"software_setup/native_setup.html#instructions","title":"Instructions","text":""},{"location":"software_setup/native_setup.html#step-1-install-dependencies","title":"Step 1 - Install dependencies","text":"
  1. Install NVIDIA JetPack, including NVIDIA TensorRT following these instructions.
  2. Install PyTorch following this guide provided on the NVIDIA devtalk forums.
  3. Install Node JS to support Jupyter Lab

    curl -sL https://deb.nodesource.com/setup_10.x | bash -\nsudo apt-get install -y nodejs libffi-dev\n
  4. Install Jupyter Lab to support web-programming JetBot

    sudo python3 -m pip install jupyter jupyterlab\njupyter labextension install @jupyter-widgets/jupyterlab-manager\n
  5. Install Jupyter Clickable Image widget (to support road following example).

    sudo apt-get install -y libssl1.0-dev && \\\ngit clone https://github.com/jaybdub/jupyter_clickable_image_widget && \\\ncd jupyter_clickable_image_widget && \\\ngit checkout tags/v0.1 && \\\nsudo pip3 install -e . && \\\njupyter labextension install js && \\\njupyter lab build\ncd ..\n
  6. Install other miscellaneous dependencies

    sudo apt-get update && apt-get install -y supervisor unzip\nsudo apt install -y python3-smbus && pip3 install pyzmq\n
  7. (optional) Install torch2trt to support TensorRT accelerated AI models

    git clone https://github.com/NVIDIA-AI-IOT/torch2trt\ncd torch2trt\npython3 setup.py install\ncd ..\n
  8. Install the JetBot Python package

    git clone https://github.com/NVIDIA-AI-IOT/jetbot\ncd jetbot\nsudo python3 setup.py install\n# if you plan to modify the jetbot python package, call this instead: sudo python3 setup.py develop\n
"},{"location":"software_setup/native_setup.html#step-2-set-the-jupyter-lab-password","title":"Step 2 - Set the Jupyter lab password","text":"

Call the following from a terminal

jupyter notebook password\n# enter password\n

You could now test the JetBot notebooks by running

cd jetbot\njupyter lab --ip=0.0.0.0 --no-browser --allow-root\n

and then navigating to https://<jetbot_ip>:8888 and signing in with the password you set.

However, it is convenient to have this server start automatically, which we will detail next.

"},{"location":"software_setup/native_setup.html#step-3-create-a-system-service-to-start-the-jupyter-lab-server-at-boot","title":"Step 3 - Create a system service to start the Jupyter Lab server at boot","text":"
  1. Create file named jetbot_jupyter.service and add the following content.

    [Unit]\nDescription=Jupyter Notebook [Service]\nType=simple\nUser=jetson\nExecStart=/bin/sh -c \"jupyter lab --ip=0.0.0.0 --no-browser --allow-root\"\nWorkingDirectory=/home/jetson\nRestart=Always\n\n[Install]\nWantedBy=multi-user.target\n

    Note: If you have a username other than \"jetson\" or want to launch Jupyter from a directory other than \"/home/jetson\", modify the file \"User\" and \"WorkingDirectory\" fields accordingly.

  2. Copy the file to the directory /etc/systemd/system so it can be discovered as a system service.

    sudo cp jetbot_jupyter.service /etc/systemd/system/jetbot_jupyter.service\n
  3. Enable the system service to run at boot

    sudo systemctl enable jetbot_jupyter\n

Now, when you re-boot your Jetson, the Jupyter lab server should start in the background.

That's great, but in order to connect to the server, you need to know it's IP address. The last step will be to enable a system service that displays the IP address on the JetBot's PiOLED display upon boot.

"},{"location":"software_setup/native_setup.html#step-4-create-system-service-to-show-the-ip-address-upon-boot","title":"Step 4 - Create system service to show the IP address upon boot","text":"

This is very similar to creating a service for the Jupyter Lab server, we're just changing the application that's launched

  1. Create a file named jetbot_display.service and add the following content.

    [Unit]\nDescription=Jupyter Notebook [Service]\nType=simple\nUser=jetson\nExecStart=/bin/sh -c \"python3 -m jetbot.apps.stats\"\nWorkingDirectory=/home/jetson\nRestart=Always\n\n[Install]\nWantedBy=multi-user.target\n
  2. Copy the file to the directory /etc/systemd/system so it can be discovered as a system service.

    sudo cp jetbot_display.service /etc/systemd/system/jetbot_display.service\n
  3. Enable the system service to run at boot

    sudo systemctl enable jetbot_display\n

That's it! Now you should be able to reboot the JetBot, and it's IP address should automatically show up on the PiOLED display.

We hope this helps you create a custom native system configuration for using JetBot. If you have any questions or see any issues with this guide, please create an issue on GitHub.

Happy hacking!

"},{"location":"software_setup/sd_card.html","title":"Software Setup (SD Card Image)","text":"

This page details how to set up JetBot using the pre-built JetBot SD card image. You may prefer this option if you are new to Jetson Nano, and do not have an existing SD card configured.

"},{"location":"software_setup/sd_card.html#step-1-download-the-pre-built-jetbot-sd-card-image","title":"Step 1 - Download the pre-built JetBot SD card image","text":"

Download the pre-built JetBot SD card image from the table below. Make sure to select the version that matches the Jetson you're using (for example Jetson Nano 2GB).

"},{"location":"software_setup/sd_card.html#latest-release","title":"Latest Release","text":"Platform JetPack Version JetBot Version Download MD5 Checksum Jetson Nano 2GB 4.5 0.4.3 jetbot-043_nano-2gb-jp45.zip e6dda4d13b1b1b31f648402b9b742152 Jetson Nano (4GB) 4.5 0.4.3 jetbot-043_nano-4gb-jp45.zip 760b1885646bfad8590633acca014289 Attention

To use one of the JetBot sdcard images based on JetPack 4.5, you first need to boot your Jetson Nano using a plain JetPack 4.5 SD card image and run through the operating system setup. This will perform a one-time configuration which enables you to use SD card images based on JetPack 4.5 on your device. You can find the original JetPack SD card images here: JetPack SD card image for Jetson Nano 2GB and JetPack SD card image for Jetson Nano (4GB). After doing this procedure once, you can then use the JetPack 4.5 based JetBot SD card images listed above on your device.

"},{"location":"software_setup/sd_card.html#old-releases","title":"Old releases","text":"Platform JetPack Version JetBot Version Download Jetson Nano 2GB 4.4.1 0.4.2 jetbot-042_nano-2gb-jp441.zip Jetson Nano (4GB) 4.4.1 0.4.2 jetbot-042_nano-4gb-jp441.zip Jetson Nano 2GB 4.4.1 0.4.1 jetbot-041_nano-2gb-jp441.zip Jetson Nano (4GB) 4.4.1 0.4.1 jetbot-041_nano-4gb-jp441.zip Jetson Nano (4GB) 4.3 0.4.0 jetbot_image_v0p4p0.zip Jetson Nano (4GB) 4.2 0.3.2 jetbot_image_v0p3p2.zip"},{"location":"software_setup/sd_card.html#step-2-flash-jetbot-image-onto-sd-card","title":"Step 2 - Flash JetBot image onto SD card","text":"
  1. Insert an SD card into your desktop machine

  2. Using Etcher, select the image you downloaded above and flash it onto the SD card.

  3. Remove the SD card from your desktop machine

"},{"location":"software_setup/sd_card.html#step-3-boot-jetson-nano","title":"Step 3 - Boot Jetson Nano","text":"
  1. Insert the SD card into your Jetson Nano (the micro SD card slot is located under the module)

  2. Connect the monitor, keyboard, and mouse to the Nano

  3. Power on the Jetson Nano by connecting the micro USB (for Jetson Nano (4GB)) or USB-C (for Jetson Nano 2GB) charger to the port

    Attention

    We recommend first booting the Jetson Nano once without the piOLED / motor driver connected.

    This way you can check to make sure the system boots properly from the SD card image without worrying about hardware issues. After you've verified that it boots, reconnect the piOLED, double check your wiring, and boot again.

"},{"location":"software_setup/sd_card.html#step-4-connect-jetbot-to-wifi","title":"Step 4 - Connect JetBot to WiFi","text":"

Next you'll need to connect to WiFi. To reduce memory consumption, we disable the Ubuntu GUI in the latest JetBot SD card image. For this reason, you'll need to use the command line to connect to WiFi.

  1. Log in using the user jetbot and password jetbot

  2. Connect to a WiFi network using the following command

    sudo nmcli device wifi connect <SSID> password <PASSWORD>\n

Your Jetson Nano should now automatically connect to the WiFi at boot and display it's IP address on the piOLED display.

Tip

If you're having trouble figuring out how to get connected to Wi-Fi, check out the Wi-Fi setup page for more detailed instructions

"},{"location":"software_setup/sd_card.html#step-5-connect-to-jetbot-from-web-browser","title":"Step 5 - Connect to JetBot from web browser","text":"

After your robot is connected to WiFi, you no longer need to have the robot connected by a monitor. You can connect to the robot from your laptop's web browser by performing the following steps

  1. Shutdown JetBot using the command line

    sudo shutdown now\n
  2. Unplug your HDMI monitor, USB keyboard, mouse and power supply from Jetson Nano

  3. Power the JetBot from the USB battery pack by plugging in the micro-USB cable

  4. Wait a bit for JetBot to boot
  5. Check the IP address of your robot on the piOLED display screen. Enter this in place of <jetbot_ip_address> in the next command
  6. Navigate to http://<jetbot_ip_address>:8888 from your desktop's web browser. You can do this from any machine on your local network.
  7. Sign in using the password jetbot.

That's it, you've now accessed JetBot's remote programming environment!

You will be presented with a view similar to the following.

Here you can easily access the JetBot examples! From this point on, when you power on the JetBot, it should automatically connect to WiFi and display it's IP address. So all you need to do is reconnect using your web browser to start programming!

Now that you're finished setting up your JetBot, you're ready to run the examples.

"},{"location":"software_setup/wifi_setup.html","title":"Wi-Fi connection setup","text":"Info

You can skip this page if you already have a wireless connection to your JetBot from your computer.

To go through the actual example applications on JetBot, you interact with JetBot from your (laptop) PC through Wi-Fi network.

This document explains how you can initially set up the Wi-Fi connection on your Jetson.

"},{"location":"software_setup/wifi_setup.html#monitor-attached-mode","title":"Monitor-attached Mode","text":"

The easiest way to set up the Wi-Fi connection on your Jetson, is to operate on the GUI desktop. For this you need to fisrt connect the following to the Jetson on your JetBot.

  • HDMI monitor
  • USB keyboard
  • USB mouse

With this setup, you can use Jetson like a standard Linux computer. We call this Monitor-attached Mode.

Hint

If you don't have above items handy, then you can also try the headless way of configuring Wi-Fi. Head down to the next section, Headless Mode.

"},{"location":"software_setup/wifi_setup.html#connect-to-wi-fi-ap","title":"Connect to Wi-Fi AP","text":"

If a Wi-Fi adaptor (either Intel 8265 M.2 card or a USB Wi-Fi dongle) is attached, you can configure the wireless network from the desktop.

"},{"location":"software_setup/wifi_setup.html#check-ip-address","title":"Check IP address","text":"

After the connection established, check the IP address.

Note this IP address.

"},{"location":"software_setup/wifi_setup.html#verify-the-ip-address","title":"Verify the IP address","text":"

To test the IP address is valid and your Jetson is accesible, try connecting to the IP address from your separate (laptop) PC.

SSH server is enabled by default on Jetson. Open your SSH client software (PuTTY, etc) on your PC, and try to connect the SSH server on the IP address.

This is how you connect to your JetBot using SSH client software. Once you confirm you can connect to your Jetson remotely from your PC via Wi-Fi, you can now remove the HDMI monitor, keyboard and mouse from Jetson, and let your JetBot free!

And at this point, you are now using Jetson effectively in the Headless Mode.

Hint

Alternatively, even on the GUI deskop, you can open the terminal by pressing Ctrl + Alt + T keys, and follow the command-line based setup described below for headless setup.

"},{"location":"software_setup/wifi_setup.html#headless-mode","title":"Headless Mode","text":"

When you put your Jetson in a deployed system, like a mobile robot, it is often difficult to attach an HDMI monitor. We can still control such Jetson remotely through network from a (laptop) PC, WHEN you already know the IP address. We call this operation mode Headless Mode.

However you face a chiken-or-egg dillemna here, because you want to remotely login to the console to set up a Wi-Fi connection, but to do that you first need the IP address of your Jetson that you get after establishing the Wi-Fi connecton.

"},{"location":"software_setup/wifi_setup.html#usb-device-mode","title":"USB Device Mode","text":"

What comes handy here is USB Device Mode.

You connect your (laptop) PC and Jetson using a Micro-USB cable. (Type-A end goes to your PC, Micro-B end goes to Jetson) Using this wired connection, you can access the terminal on Jetson from your (laptop) PC.

With USB Device Mode, Jetson presents 3 different USB Device Class end-points to the PC that it got connected to. They function as

  • USB mass storage device (you see L4T-README drive mounted on your PC, like a USB thumbdrive)
  • USB serial (like the common \"FTDI\" USB to serial adapter)
  • USB network interface card (like a virtual Ethernet adapter)

With the virtual Ethernet adapter functinality, Jetson forms a virutal local Ethernet network with Jetson being 192.168.55.1 and your PC being 192.168.55.100. So you can actually SSH login from your (laptop) PC by specifying 192.168.55.1, if you have already set up your acount (with username and password).

If you are using Jetson for the first time right after you flash your SD card, then you don't have this user account set up. In that case, you want to use the USB serial functinality, and use your serial terminal software on your PC to have accesss to the Jetson's serial terminal.

So either way, with a Micro USB cable, you can have an access to Jetson's terminal.

"},{"location":"software_setup/wifi_setup.html#connect-wi-fi-using-nmcli-command","title":"Connect Wi-Fi using nmcli command","text":"

If a Wi-Fi adaptor (either Intel 8265 M.2 card or a USB Wi-Fi dongle) is attached, you can configure the wireless network using nmcli command.

You can first check if you want a wireless adapter on your system. Look for wlan0.

$ nmcli device\nDEVICE  TYPE      STATE         CONNECTION\nl4tbr0  bridge    connected     l4tbr0\nwlan0   wifi      disconnected  --\neth0    ethernet  unavailable   --\ndummy0  dummy     unmanaged     --\nrndis0  ethernet  unmanaged     --\nusb0    ethernet  unmanaged     --\nlo      loopback  unmanaged     --\n

Then you can list all the wirelss networks (SSDI) in the area.

$ nmcli device wifi list\nIN-USE  SSID                           MODE   CHAN  RATE        SIGNAL  BARS  SE\n        --                             Infra  6     195 Mbit/s  82      \u2582\u2584\u2586\u2588  WP\n        --                             Infra  6     195 Mbit/s  82      \u2582\u2584\u2586\u2588  WP\n        --                             Infra  6     195 Mbit/s  75      \u2582\u2584\u2586_  WP\n        MY_WIFI_AP                     Infra  6     195 Mbit/s  70      \u2582\u2584\u2586_  WP\n        --                             Infra  6     195 Mbit/s  70      \u2582\u2584\u2586_  WP\n        *********                      Infra  1     405 Mbit/s  64      \u2582\u2584\u2586_  WP\n        ************                   Infra  153   405 Mbit/s  64      \u2582\u2584\u2586_  WP\n...\n

To connect to your wireless network (AP, access point), issue the commands below.

$ sudo nmcli device wifi connect <MY_WIFI_AP> password <MY_WIFI_PASSWORD>\nDevice 'wlan0' successfully activated with '2a26d5ca-****-****-****-**************'.\n
"},{"location":"software_setup/wifi_setup.html#check-ip-address_1","title":"Check IP address","text":"

To check your IP address, use ifconfig. Check the wlan0 part at the very bottom.

$ ifconfig\ndummy0: flags=195<UP,BROADCAST,RUNNING,NOARP>  mtu 1500\ninet6 fe80::d854:8ff:fe87:e631  prefixlen 64  scopeid 0x20<link>\n        ether da:54:08:87:e6:31  txqueuelen 1000  (Ethernet)\nRX packets 0  bytes 0 (0.0 B)\nRX errors 0  dropped 0  overruns 0  frame 0\nTX packets 24  bytes 3376 (3.3 KB)\nTX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n\nl4tbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500\ninet 192.168.55.1  netmask 255.255.255.0  broadcast 192.168.55.255\n        inet6 fe80::1  prefixlen 128  scopeid 0x20<link>\n        inet6 fe80::943c:9dff:fe90:eb89  prefixlen 64  scopeid 0x20<link>\n        ether 96:3c:9d:90:eb:89  txqueuelen 1000  (Ethernet)\nRX packets 15189  bytes 1343038 (1.3 MB)\nRX errors 0  dropped 0  overruns 0  frame 0\nTX packets 4344  bytes 411009 (411.0 KB)\nTX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n\nlo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536\ninet 127.0.0.1  netmask 255.0.0.0\n        inet6 ::1  prefixlen 128  scopeid 0x10<host>\n        loop  txqueuelen 1  (Local Loopback)\nRX packets 3954  bytes 287737 (287.7 KB)\nRX errors 0  dropped 0  overruns 0  frame 0\nTX packets 3954  bytes 287737 (287.7 KB)\nTX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n\nrndis0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500\ninet6 fe80::943c:9dff:fe90:eb89  prefixlen 64  scopeid 0x20<link>\n        ether 96:3c:9d:90:eb:89  txqueuelen 1000  (Ethernet)\nRX packets 15414  bytes 1360470 (1.3 MB)\nRX errors 0  dropped 7  overruns 0  frame 0\nTX packets 4378  bytes 667985 (667.9 KB)\nTX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n\nusb0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500\nether 96:3c:9d:90:eb:8b  txqueuelen 1000  (Ethernet)\nRX packets 0  bytes 0 (0.0 B)\nRX errors 0  dropped 0  overruns 0  frame 0\nTX packets 0  bytes 0 (0.0 B)\nTX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n\nwlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500\ninet 192.168.1.58  netmask 255.255.255.0  broadcast 192.168.1.255\n        inet6 fe80::b5a0:c2e3:50bc:29a4  prefixlen 64  scopeid 0x20<link>\n        ether b4:4b:d6:23:9a:12  txqueuelen 1000  (Ethernet)\nRX packets 26825  bytes 40675884 (40.6 MB)\nRX errors 0  dropped 32746  overruns 0  frame 0\nTX packets 16406  bytes 1673647 (1.6 MB)\nTX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n
"},{"location":"software_setup/wifi_setup.html#verify-the-ip-address_1","title":"Verify the IP address","text":"

To test the IP address is valid and your Jetson is accesible, try connecting to the IP address from your separate (laptop) PC under the same network.

Open your SSH client software (PuTTY, etc) on your PC, and try to connect the SSH server using the IP address you obtained on the wireless adapter.

This is how you connect to your JetBot over Wi-Fi. Once you confirm you can connect to your Jetson remotely from your PC via Wi-Fi, you can now remove the Micro USB cable and let your JetBot free!

Info

Next, you move on to either page below.

  • Software setup using Docker container
  • Software setup using SD card image

Once your JetBot software is configure, you should see JetBot's IP address on the small OLED display. You would only need to come back to this step to re-connect to the network or to find the IP address when your JetBot fails to get the IP address and show the current IP address on the OLED display.

"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"index.html","title":"JetBot","text":"Go to GitHub Get Started

JetBot is an open-source robot based on NVIDIA Jetson Nano. You'll like it because...

"},{"location":"index.html#its-affordable","title":"It's Affordable","text":"JetBot costs less than $250 in parts, including Jetson Nano. The DIY kit includes a bill of materials which you must purchase and a 3D printed chassis that you can print, or order. If you're looking to get up and running as quick as possible, there are also many third party kits available that come pre-bundled."},{"location":"index.html#its-educational","title":"It's Educational","text":"JetBot includes a set of Jupyter notebooks which cover basic robotics concepts like programatic motor control, to more advanced topics like training a custom AI for avoiding collisions. What you'll learn isn't limited to JetBot. You'll learn concepts related to neural network data collection and training that extend as far as your imagination."},{"location":"index.html#its-easy-to-setup","title":"It's Easy to Setup","text":"JetBot is programmed from your web browser. Just connect your JetBot to Wifi and launch the JetBot Docker container. This enables JetBot's web programming environment, which is available even after the JetBot reboots. Once your JetBot boots, just type it's IP address into your web browser and start programming."},{"location":"index.html#its-fun","title":"It's Fun!","text":"We built JetBot to make exploring ideas related to robotics as fun as possible. In effect, it's a portable, battery powered AI computer with a camera that's super easy to program. This makes it the perfect platform for trying new ideas related to AI, image processing and robotics. Our experiments have led us to new projects like JetRacer, and we're excited to see where your experiments take you."},{"location":"index.html#get-started","title":"Get Started","text":"

To get started with JetBot, follow the Getting Started instructions. If you run into any issues along the way, please let us know!

Go to GitHub Get Started"},{"location":"index.html#get-involved","title":"Get involved","text":"

We really appreciate any feedback related to JetBot, and also just enjoy seeing what you're working on! There is a growing community of Jetson Nano and JetBot users. It's easy to get involved involved...

  • Ask a question and discuss JetBot related topics on the JetBot GitHub Discussions
  • Report a bug by creating an issue
  • Share your project or ask a question on the Jetson Developer Forums
"},{"location":"3d_printing.html","title":"3D Printing","text":"

This page has useful information related to printing the JetBot chassis using a 3D printer. There are two methods for printing JetBot

  • Print by yourself
  • Use a printing service
"},{"location":"3d_printing.html#method-1-print-by-yourself","title":"Method 1 - Print by yourself","text":"

If you have a 3D printer, we recommend printing the JetBot components yourself!

"},{"location":"3d_printing.html#print-facts","title":"Print facts","text":"

Below are some facts related to printing a single JetBot.

  • Print time: 10-12 hours
  • Material used: < 100 grams
  • Material cost: ~ $2
"},{"location":"3d_printing.html#tested-printers","title":"Tested Printers","text":"

We've tested that the following printers are able to print JetBot successfully.

Model Cost URL Monoprice Voxel $320 Amazon Ultimaker 2+ $2500 Amazon"},{"location":"3d_printing.html#tested-filaments","title":"Tested Filaments","text":"

Based on our experience, we recommend using PLA filament when printing JetBot. Below is a collection of filaments that we have tested with the Monoprice Voxel 3D printer.

Brand Thickness Material Color URL Notes AmazonBasics 1.75mm PLA Silver Amazon Smooth, dark metallic finish AmazonBasics 1.75mm PLA Neon Green Amazon Smooth, pale finish AmazonBasics 1.75mm PLA Yellow Amazon Bold yellow, slightly translucent AmazonBasics 1.75mm PLA Purple Amazon Smooth, pale finish"},{"location":"3d_printing.html#printing-and-slicing-configuration","title":"Printing and slicing configuration","text":"
  • STL unit: mm

  • Print orientation

  • Slice configuration (Cura)

"},{"location":"3d_printing.html#method-2-use-a-printing-service","title":"Method 2 - Use a printing service","text":"

If you don't have a 3D printer on hand, and are not interested in purchasing one, there are external services that can print the chassis for you. Below are some quotes from popular 3D printing services

Please note, we have not tested these services yet ourselves, so please proceed with caution. If you find a print service that worked well for you, we'd love to hear! Please let us know by creating an issue on GitHub or mentioning it in the chat channel

Service Quote 3DHubs $36.66 Jinxbot $91.42 Sculpteo ~$100"},{"location":"CHANGELOG.html","title":"Changes","text":""},{"location":"CHANGELOG.html#master","title":"Master","text":""},{"location":"CHANGELOG.html#043","title":"[0.4.3]","text":""},{"location":"CHANGELOG.html#added","title":"Added","text":"
  • Added LocalController class which allows users to directly connect controller to JetBot
"},{"location":"CHANGELOG.html#042-11102020","title":"[0.4.2] - 11/10/2020","text":""},{"location":"CHANGELOG.html#fixed","title":"Fixed","text":"
  • Resolved software issue which affected certain motor driver variants
"},{"location":"CHANGELOG.html#041-10222020","title":"[0.4.1] - 10/22/2020","text":""},{"location":"CHANGELOG.html#added_1","title":"Added","text":"
  • ZMQ Camera publisher to improve stability of Camera and allow camera use in multiple notebooks
  • Docker containers for ML dependencies, PiOLED display, ZMQ Camera publisher, and Jupyter Lab server
  • Inline documentation using mkdocs-material and mike
"},{"location":"CHANGELOG.html#changed","title":"Changed","text":"
  • Default Camera class now uses ZMQ Camera. This means you must run the ZMQ camera publisher to access the camera as before. If you wish to use the old Camera class, do from jetbot.camera.opencv_gst_camera import OpenCvGstCamera and camera = OpenCvGstCamera()
"},{"location":"CHANGELOG.html#deprecated","title":"Deprecated","text":"
  • JetPack 4.3 SD card image
"},{"location":"CHANGELOG.html#fixed_1","title":"Fixed","text":"
  • Camera shutdown failures are avoided by addition of ZMQ Camera. No longer need for constant systemctl restart nvargus-daemon calls.
  • Camera queue buildup for heavier image processing workloads is fixed in ZMQ Camera by dropping old frames using conflate option.
"},{"location":"CHANGELOG.html#040-1152020","title":"0.4.0 - 1/15/2020","text":""},{"location":"CHANGELOG.html#added_2","title":"Added","text":"
  • Added support for JetPack 4.3 SD card image. Found here.
"},{"location":"CHANGELOG.html#changed_1","title":"Changed","text":"
  • Updated Object Detector SD card image. Found here
"},{"location":"CHANGELOG.html#030-392019","title":"0.3.0 - 3/9/2019","text":""},{"location":"CHANGELOG.html#added_3","title":"Added","text":"
  • Initial release with JetPack 4.2 SD card image. Found here
"},{"location":"CONTRIBUTING.html","title":"Contributing","text":""},{"location":"CONTRIBUTING.html#documenting","title":"Documenting","text":"

We use mkdocs-material to easily generate documentation from markdown.

"},{"location":"CONTRIBUTING.html#installing-dependencies","title":"Installing Dependencies","text":"
sudo apt-get update\nsudo apt-get -y install python3-pip\nsudo apt-get -y install mkdocs\npip3 install mkdocs-material mike\n
"},{"location":"CONTRIBUTING.html#testing","title":"Testing","text":"

To quickly test the version of the documentation you're using, without commiting anything to the gh-pages branch, run the following command.

mkdocs serve --dev-addr=0.0.0.0:8000\n
"},{"location":"CONTRIBUTING.html#deploying","title":"Deploying","text":"

We use mike to maintain multiple versions of the documentation. To build the documentation with mike, call

mike deploy <tag>\n

This will build the documentation, and add a static version of the site under the gh-pages branch. For example, to deploy the master documentation we do

mike deploy master\n

To set the default documentation version to master we would do.

mike set-default master\n

To push the documentation to Github Pages.

mike deploy master --push\n
"},{"location":"CONTRIBUTING.html#adding-a-new-page","title":"Adding a new page","text":"

Mkdocs looks for documentation under the docs folder. To add a new documentation page, you will need to first add the file either directly to the docs folder, or to a different folder with a symbolic link to the docs folder. For example, say we wanted to add a page named MAINTAINERS.md to the root of the project

First, we create the file at the root of the project

touch MAINTAINERS.md\n

Next, we add a symbolic link to the docs folder

cd docs/reference\nln -s ../../MAINTAINERS.md .\n

Finally, we add the file to our navigation in mkdocs.yml

- nav:\n    - Reference:\n        - 'Maintainers': reference/MAINTAINERS.md\n

Now, when you build the documentation you should see the page that we've added in the \"Reference\" section with the title \"Maintainers\".

"},{"location":"CONTRIBUTING.html#updating-the-changelog","title":"Updating the Changelog","text":"

We follow the guidance of Keep a Changelog for best practices in maintaining a chronological human-readable CHANGELOG.md file. If the change is worth developers and users knowing about, consider adding an entry to the change log.

"},{"location":"bill_of_materials.html","title":"Bill of Materials","text":"

This page lists everything you need to build JetBot, along with purchasing links from popular vendors.

Some of the parts are 3D printed. We provide the STL files needed to print these parts. Please see our 3d printing page for tips on printing.

"},{"location":"bill_of_materials.html#common-parts","title":"Common parts","text":"

You need these components for each JetBot.

Part Quantity Cost URL Notes Jetson Nano 1 $99.00 NVIDIA Micro SD card 1 $13.99 Amazon 64GB Power supply 1 $7.50 Adafruit Micro USB, 5V, 2.5A Motor 2 $5.90 Adafruit, Amazon(1), Amazon(2) \"TT\" form factor Motor Driver 1 $19.95 Adafruit, Amazon Caster ball 1 $6.30 Amazon 1-inch diameter Battery 1 $15.99 Amazon 2x 5V/3A output, 10,000mAh USB cable pack 1 $6.99 Amazon Type A to Micro, right angle PiOLED display 1 $14.95 Adafruit, Amazon PiOLED header 1 $5.95 Adafruit, Amazon, Sparkfun 2x(3+) right angle male Chassis 1 -- STL file see 3D printing Camera Mount 1 -- STL file see 3D printing"},{"location":"bill_of_materials.html#camera","title":"Camera","text":"

You need a camera with appropriate sensor and field of view for each JetBot. Select an option and get the parts specified.

"},{"location":"bill_of_materials.html#option-1-default-leopard-imaging-camera","title":"Option 1 (default) - Leopard Imaging Camera","text":"Part Quantity Cost URL Notes Camera 1 $29.00 Leopard Imaging LI-IMX219-MIPI-FF-NANO-H145"},{"location":"bill_of_materials.html#option-2-imx219-160-camera","title":"Option 2 - IMX219-160 Camera","text":"Part Quantity Cost URL Notes Camera 1 $29.90 Amazon IMX219-160 Camera"},{"location":"bill_of_materials.html#option-3-rpi-camera-v2-lens-attachment","title":"Option 3 - RPi Camera V2 + Lens Attachment","text":"Part Quantity Cost URL Notes Camera 1 $23.90 Amazon, Adafruit Raspberry Pi Camera V2 Camera lens attachment 1 $18.99 Amazon(1), Amazon(2), eBay 160-degree FoV"},{"location":"bill_of_materials.html#wifi","title":"WiFi","text":"

You need a WiFi solution for each JetBot. Select an option and get the parts specified.

"},{"location":"bill_of_materials.html#option-1-default-m2-card-antennas","title":"Option 1 (default) - M2 Card + Antennas","text":"

This option is a good choice if you're building JetBot with the original Jetson Nano 4GB. It has been widely tested and used for JetBot.

Attention

Jetson Nano 2GB does not have a M.2 connector, so this option will not work with it.

Part Quantity Cost URL Notes WiFi card 1 $18.95 Amazon, NewEgg M2, Intel Wireless-AC 8265 WiFi antenna 2 $5.06 Arrow U.FL connectors"},{"location":"bill_of_materials.html#option-2-usb-dongle","title":"Option 2 - USB Dongle","text":"

This option is compatible with both the original Jetson Nano (4GB) and Jetson Nano 2GB.

Part Quantity Cost URL Notes WiFi Dongle - TP-Link Archer T2U Nano 1 $17.99 Amazon RTL8811AU chipset WiFi Dongle - TP-Link Archer T2U Plus 1 $19.99 Amazon RTL8811AU chipset Info

For other possible USB Wi-fi dongles that you can use on Jetson Nano, please check the Suported Components List.

  • Jetson Nano 2GB Developer Kit User Guide - Supported Component List
"},{"location":"bill_of_materials.html#wheels","title":"Wheels","text":"

You need wheels with a \"TT\" motor shaft connector for each JetBot. Select an option and get the parts specified.

"},{"location":"bill_of_materials.html#option-1-60mm","title":"Option 1 - 60mm","text":"Part Quantity Cost URL Notes Wheel 2 $5.00 Adafruit 60mm diameter Caster base 1 -- STL file for 60mm wheel Caster shroud 1 -- STL file for 60mm wheel"},{"location":"bill_of_materials.html#option-2-65mm","title":"Option 2 - 65mm","text":"Part Quantity Cost URL Notes Wheel 2 $3.00 Adafruit 65mm diameter Caster base 1 -- STL file for 65mm wheel Caster shroud 1 -- STL file for 65mm wheel"},{"location":"bill_of_materials.html#assembly-hardware","title":"Assembly Hardware","text":"

You need the following parts to build JetBot. They come in packs, so order the quantity you need for the number of JetBots you are going to build.

Part Qty per JetBot Qty per pack Cost per JetBot URL Notes Adhesive pads 2 48 $0.14 Amazon M2 screw 20 100 $1.29 Amazon 8mm long, self tapping M3 screw 4 60 $0.47 Amazon 25mm long M3 nut 4 100 $0.24 Amazon Jumper wires 4 40 $0.13 Amazon Female-female, ~20cm"},{"location":"bill_of_materials_orin.html","title":"Bill of Materials - Jetson Orin Nano version","text":"

This page lists all the parts you need to build the open-source JetBot with the new Jetson Orin Nano 8GB Developer Kit, along with purchasing links from popular vendors.

Some of the parts are 3D printed. We provide the STL files needed to print these parts. Please see our 3d printing page for tips on printing.

"},{"location":"bill_of_materials_orin.html#common-parts","title":"Common parts","text":"

You need these components for each JetBot.

Part Quantity Cost URL Notes Jetson Orin Nano 8GB Developer Kit 1 $499.00 NVIDIA Micro SD card 1 $14.95 Amazon 128GB Battery 1 $12.99 Amazon PD 20W output, 10,000mAh USB-C PD cable 1 $10.99 Amazon USB-C to DC 5.5mm x 2.5mm, right angle Motor 2 $5.90 Adafruit, Amazon(1), Amazon(2) \"TT\" form factor Motor Driver 1 $19.95 Adafruit, Amazon Caster ball 1 $10.99 Amazon 1-inch diameter USB cable pack 1 $6.99 Amazon Type A to Micro, right angle PiOLED display 1 $13.45 Adafruit, Amazon PiOLED header 1 $7.99 Adafruit, Amazon, Sparkfun 2x(3+) right angle male Chassis 1 -- STL file see 3D printing Camera Mount 1 -- STL file see 3D printing"},{"location":"bill_of_materials_orin.html#camera","title":"Camera","text":"

You need a camera module with 22pin cable for interfacing to Jetson Orin Nano 8GB Developer Kit carrier board and the appropriate wide field of view for each JetBot.

Select an option and get the parts specified.

"},{"location":"bill_of_materials_orin.html#option-1-default-imx219-175-degree-fov-camera","title":"Option 1 (default) - IMX219 175-degree FoV camera","text":"Part Quantity Cost URL Notes Camera 1 $19.99 ArduCam, Amazon ArduCam B0392 - IMX219 175-degree"},{"location":"bill_of_materials_orin.html#wheels","title":"Wheels","text":"

You need wheels with a \"TT\" motor shaft connector for each JetBot. Select an option and get the parts specified.

"},{"location":"bill_of_materials_orin.html#option-1-60mm","title":"Option 1 - 60mm","text":"Part Quantity Cost URL Notes Wheel 2 $5.00 Adafruit 60mm diameter Caster base 1 -- STL file for 60mm wheel Caster shroud 1 -- STL file for 60mm wheel"},{"location":"bill_of_materials_orin.html#option-2-65mm","title":"Option 2 - 65mm","text":"Part Quantity Cost URL Notes Wheel 2 $3.00 Adafruit 65mm diameter Caster base 1 -- STL file for 65mm wheel Caster shroud 1 -- STL file for 65mm wheel"},{"location":"bill_of_materials_orin.html#assembly-hardware","title":"Assembly Hardware","text":"

You need the following parts to build JetBot. They come in packs, so order the quantity you need for the number of JetBots you are going to build.

Part Qty per JetBot Qty per pack Cost per JetBot URL Notes Adhesive Strips (Poster Strips) 2 60 $0.14 Amazon M2 screw 20 100 $1.40 Amazon 8mm long, self tapping M3 screw 4 60 $0.47 Amazon 25mm long M3 nut 4 150 $0.20 Amazon Jumper wires 4 40 $0.56 Amazon Female-female, ~20cm"},{"location":"getting_started.html","title":"Getting Started","text":""},{"location":"getting_started.html#step-1-pick-your-vehicle","title":"Step 1 - Pick your vehicle!","text":"

To get started with JetBot, first pick your vehicle (hardware) you want to make.

For details of NVIDIA-designed open-source JetBot hardware, check Bill of Materials page and Hardware Setup page.

To find kits available from third parties, check Third Party Kits page.

"},{"location":"getting_started.html#step-2-setup-your-jetbot","title":"Step 2 - Setup your JetBot","text":"

After you've decided which vehicle you want to build, you'll need to source the parts and follow the setup instructions. After that, you're ready to move on to the JetBot examples!

"},{"location":"getting_started.html#option-1-diy-jetbot-kit","title":"Option 1 - DIY JetBot Kit","text":"

To get started with the DIY open-source JetBot, follow these steps.

  1. Get the parts from the bill of materials.

  2. Follow the hardware setup

  3. Follow the software setup

"},{"location":"getting_started.html#option-2-third-party-jetbot-kit","title":"Option 2 - Third Party JetBot Kit","text":"

Third party JetBot kits may have different setup instructions from the DIY JetBot. To get started with a third party jetbot, we recommend referring to the third party kit's setup instructions for details on how to setup.

Check out the Third Party Kits page for links and information related to third party kits.

"},{"location":"getting_started.html#step-3-follow-the-examples","title":"Step 3 - Follow the examples","text":"

JetBot comes with many examples to teach robotics and AI basics. These give you the experience you need to begin exploring your own applications with JetBot.

"},{"location":"getting_started.html#example-1-basic-motion","title":"Example 1 - Basic Motion","text":"

The Basic Motion example teaches you how to program JetBot from your web browser with basic motor controls.

"},{"location":"getting_started.html#example-2-teleoperation","title":"Example 2 - Teleoperation","text":"

The Teleoperation example teaches you how to stream live images from JetBot and control JetBot with a gamepad attached to your laptop.

"},{"location":"getting_started.html#example-3-collision-avoidance","title":"Example 3 - Collision Avoidance","text":"

The Collision Avoidance example teaches you how to collect data and train a custom Image Classification model to enable JetBot to avoid collisions in a variety of scenarios. The method learned here can be extended to recognize arbitrary classes of image, which can be extended far beyond JetBot!

"},{"location":"getting_started.html#example-4-road-following","title":"Example 4 - Road Following","text":"

The Road Following example teaches you how to collect data and train a custom Image Regression model to enable JetBot to follow a road. The method learned here can be extended to detect an arbitrary x, y coordinate in an image, which extends far beyond JetBot!

"},{"location":"getting_started.html#example-5-object-following","title":"Example 5 - Object Following","text":"

The Object Following teaches you how to use a pre-trained object detection model for following an object, like a person, cup, or dog. The pre-trained network you'll learn to use here can be used for a variety of new AI projects.

"},{"location":"getting_started.html#and-more","title":"And more!","text":"

Take the examples, modify them, make JetBot do something new, or create an entirely new AI project of your own.

If you do something cool with JetBot, let us know!

Happy JetBotting :)

"},{"location":"hardware_setup.html","title":"Hardware Setup","text":"

This page details the hardware setup instructions for creating JetBot

"},{"location":"hardware_setup.html#tools-needed","title":"Tools needed","text":"

To build JetBot you'll need the following tools

  • Pliers

  • Wire flush cutters/wire stripper

  • Phillips screwdriver (+ Hex screwdriver for M2 hex socket screws )
  • Soldering iron and solder
  • (optional) Precision Electronics Tweezers
"},{"location":"hardware_setup.html#assembly","title":"Assembly","text":""},{"location":"hardware_setup.html#step-1-clean-3d-printed-parts","title":"Step 1 - Clean 3D printed parts","text":"
  1. Remove support material from motor sockets using pliers

  2. Remove support material from all surfaces, openings and screw holes using pliers, tweezers, and/or fingernails

  3. File material from openings if they are too tight
"},{"location":"hardware_setup.html#step-2-mount-motors","title":"Step 2 - Mount motors","text":"
  1. Cut and remove the zip tie from each motor

  2. Tuck the wires beneath transparent band to prevent stress on solder joints

  3. Insert each motor into the 3D printed chassis
  4. Secure each motor with 2x M3x25mm screws
"},{"location":"hardware_setup.html#step-3-solder-motor-driver","title":"Step 3 - Solder motor driver","text":"
  1. Break away 3-pin and 2-pin male headers from header link that comes with motor driver package

  2. Join two of the screw terminal blocks to create a 4-pin screw terminal

  3. Solder the 2-pin and 4-pin screw terminals to motor driver
  4. Solder the 2-pin and 3-pin male headers to motor driver

    Warning

    Pay careful attention to the position of the 3-pin header. It is offset by 1-pin from the corner.

"},{"location":"hardware_setup.html#step-4-strip-motor-driver-power-cable","title":"Step 4 - Strip motor driver power cable","text":"
  1. Select the depicted micro USB from the pack

    Warning

    Pay careful attention to the image. The cables are not identical. The other micro USB cable will be used to power the Jetson Nano. Using the wrong power cable for Nano will block it's Ethernet port.

  2. Cut the depicted cable roughly ~20cm from the type-A terminal

  3. Strip the rubber coating ~3cm from the cut
  4. Remove the green / white wires and metal shielding.
  5. Strip the red and black wires about ~5mm from cut
  6. (optional) Twist the exposed strand wire and coat with solder
"},{"location":"hardware_setup.html#step-5-mount-motor-driver","title":"Step 5 - Mount motor driver","text":"
  1. Route the spliced cable through chassis

  2. Secure exposed red (+) and black (-) wires to the power terminals on motor driver

    Warning

    Pay attention to the markings on the motor driver. Incorrect wiring could damage the driver.

  3. Route the spliced cable under the motor driver to organize and prevent stress on screw terminal

  4. Secure motor driver to chassis using self taping screws
  5. Secure left and right motor wires to motor screw terminals

    Info

    Notice (3/11/2019): We made a slight mistake: the red and black wires for the left and right motor are actually flipped in the image shown above. This will not cause damage, but the motors will spin backwards. Please flip them to the correct orientation.

"},{"location":"hardware_setup.html#step-6-mount-wifi-antennas","title":"Step 6 - Mount WiFi antennas","text":"

Skip this step if you are using a USB WiFi dongle instead of the M.2 WiFi module

  1. Secure one patch antenna to the underside of top plate

  2. Secure the other patch antenna at edge of battery bay

  3. Route connectors as shown
"},{"location":"hardware_setup.html#step-7-remove-jetson-nano-module-from-developer-kit","title":"Step 7 - Remove Jetson Nano module from developer kit","text":"

Skip this step if you are using a USB WiFi dongle instead of the M.2 WiFi module

  1. Remove standoff screws from Jetson Nano module

  2. Release the side latches of SODIMM connector using hands

  3. Slide Jetson Nano module out of SODIMM connector
"},{"location":"hardware_setup.html#step-8-attach-wifi-module-to-developer-kit","title":"Step 8 - Attach WiFi module to developer kit","text":"

Skip this step if you are using a USB WiFi dongle instead of the M.2 WiFi module

  1. Attach developer kit to chassis using self taping screws

  2. Snap antennae on to WiFi module using fingers

  3. Remove the screw from developer kit by the M.2 socket
  4. Insert WiFi module into M.2 slot on developer kit
  5. Fasten WiFi module to developer kit with screw removed in (3)
  6. Re-attach the Jetson Nano module to developer kit
"},{"location":"hardware_setup.html#step-9-mount-ball-caster","title":"Step 9 - Mount ball caster","text":"
  1. Place the caster ball inside of shroud

  2. Insert the caster base into shroud, securing the ball

    Tip

    Depending on how the print turns out, the ball socket enclosure may fit too tight. If this is the case, you can easily use a file to remove some excess material.

  3. Attach the assembled caster onto the chassis with self taping screws

"},{"location":"hardware_setup.html#step-10-solder-header-onto-pioled-display","title":"Step 10 - Solder header onto PiOLED display","text":"
  1. Secure the 6-pin right angle header to PiOLED display by some method

  2. Solder the pins depicted (3.3V, SDA, SCL, and GND solder seen when zoomed in on right image)

    Warning

    The pins are close to the display screen, be careful to avoid the screen with soldering iron tip.

"},{"location":"hardware_setup.html#step-11-wire-motor-driver-to-pioled-display","title":"Step 11 - Wire motor driver to PiOLED display","text":"
  1. Select 4 wire segment of female-female jumper cables.

    Info

    We use brown, red, orange, yellow segment. You can map the colors accordingly.

  2. Attach 3.3V (red), GND (brown), SDA (orange), and SCL (yellow) to motor driver as shown

  3. Route the 4 wire jumper cable segment through chassis
  4. Attach red, brown, orange and yellow wires to right angle header as depicted

    Warning

    Pay close attention! Reversing the red / brown wires could damage the system.

"},{"location":"hardware_setup.html#step-12-mount-camera","title":"Step 12 - Mount camera","text":"
  1. Attach the camera to the camera mount using 4x self tapping screws

  2. Attach the camera mount to chassis with 4x self tapping screws

  3. Insert the other end of ribbon cable into Jetson Nano developer kit
  4. (optional) Tuck the ribbon cable against heat sink to organize
"},{"location":"hardware_setup.html#step-13-attach-wide-angle-sensor","title":"Step 13 - Attach wide angle sensor","text":"
  1. Peel off the original camera sensor

  2. Remove any excess adhesive material

  3. Remove the adhesive film cover from wide angle replacement sensor
  4. Attach wide angle replacement sensor to camera module
  5. Ensure the sensor connector is fastened to camera module
"},{"location":"hardware_setup.html#step-14-mount-battery","title":"Step 14 - Mount battery","text":"
  1. Attach double sided adhesive tabs to each end of battery, leaving some tab exposed

  2. Holding robot upside down, slide battery into battery bay

  3. Holding the battery in place, flip the robot and secure battery to chassis
"},{"location":"hardware_setup.html#step-15-organize-wires","title":"Step 15 - Organize wires","text":"
  1. Route USB cables through chassis to organize and prevent dragging
"},{"location":"hardware_setup.html#finished-jetbot","title":"Finished JetBot","text":"

Once finished, your JetBot should look similar to this.

"},{"location":"third_party_kits.html","title":"Third Party Kits","text":"

In addition to the open-source DIY version, several third party JetBot kits using Jetson Nano have emerged. This page details the kits that we're aware of

Note

Please note, we do not officially maintain these kits in this GitHub project. Please refer to the vendor's documentation. Please refer to the vendor URL for cost and availability. Some kits may have additional vendors that we aren't aware of or haven't listed yet. If you think these would be helpful for other developers to know, please let us know.

"},{"location":"third_party_kits.html#waveshare-jetbot","title":"Waveshare JetBot","text":"Kit URL WaveShare JetBot Kit Amazon.com, Waveshare.com, Waveshare.net(\u4e2d\u6587) WaveShare JetBot Kit (includes Jetson Nano Dev Kit) Amazon.com, Waveshare.com, Waveshare.net(\u4e2d\u6587)"},{"location":"third_party_kits.html#links","title":"Links","text":"
  • JetBot AI Kit Assemble Manual
  • JetBot AI Kit
  • JetBot AI Kit (\u4e2d\u6587)
"},{"location":"third_party_kits.html#sparkfun-jetbot","title":"SparkFun JetBot","text":"Kit URL SparkFun JetBot AI Kit v2.1 SparkFun SparkFun JetBot AI Kit v2.1 (includes Jetson Nano Dev Kit) SparkFun"},{"location":"third_party_kits.html#links_1","title":"Links","text":"
  • Assembly Guide for SparkFun JetBot AI Kit V2.0
"},{"location":"third_party_kits.html#seeedstudio-jetbot","title":"Seeedstudio JetBot","text":"Kit URL Seeedstudio JetBot Smart Car Kit Seeedstudio Seeedstudio JetBot Smart Car Kit (includes Jetson Nano Dev Kit) Seeedstudio"},{"location":"third_party_kits.html#links_2","title":"Links","text":"
  • Seeedstudio JetBot Wiring Guide
  • Seeedstudio JetBot Setup Guide
"},{"location":"third_party_kits.html#silicon-highway-jetbot","title":"Silicon Highway JetBot","text":"Kit URL Silicon Highway JetBot Kit Silicon Highway (UK)"},{"location":"third_party_kits.html#fabo-jetbot","title":"FaBo JetBot","text":"Kit URL FaBo JetBot Kit (with Jetson Nano Dev Kit) FaBo store (Japan)"},{"location":"third_party_kits.html#links_3","title":"Links","text":"
  • JetBot Kit \u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb
"},{"location":"third_party_kits.html#gpus-jetbot","title":"GPUS JetBot","text":"Kit URL GPUS JetBot Kit (with Jetson Nano Dev Kit) Taobao"},{"location":"examples/basic_motion.html","title":"Basic Motion","text":"

In this notebook we'll control JetBot by programming from a web browser.

  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888

  2. Sign in with the default password jetbot

  3. Navigate to ~/Notebooks/basic_motion/
  4. Open and follow the basic_motion.ipynb notebook
Caution

JetBot will physically move in this notebook, make sure it has enough space to move around.

"},{"location":"examples/collision_avoidance.html","title":"Collision Avoidance","text":"

In this example we'll collect an image classification dataset that will be used to help keep JetBot safe! We'll teach JetBot to detect two scenarios free and blocked. We'll use this AI classifier to prevent JetBot from entering dangerous territory.

"},{"location":"examples/collision_avoidance.html#step-1-collect-data-on-jetbot","title":"Step 1 - Collect data on JetBot","text":"
  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888
  2. Sign in with the default password jetbot
  3. Shutdown all other running notebooks by selecting Kernel -> Shutdown All Kernels...
  4. Navigate to ~/Notebooks/collision_avoidance/
  5. Open and follow the data_collection.ipynb notebook
Tip

We provide a pre-trained model so you can skip to step 3 if desired. This model was trained on a limited dataset using the Raspberry Pi V2 Camera with wide angle attachment.

"},{"location":"examples/collision_avoidance.html#step-2-train-neural-network","title":"Step 2 - Train neural network","text":""},{"location":"examples/collision_avoidance.html#option-1-train-on-jetson-nano","title":"Option 1 - Train on Jetson Nano","text":"
  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888
  2. Sign in with the default password jetbot
  3. In the Jupyter Lab tab, navigate to ~/collision_avoidance
  4. Open and follow the train_model_resnet18.ipynb notebook
"},{"location":"examples/collision_avoidance.html#option-2-train-on-other-gpu-machine","title":"Option 2 - Train on other GPU machine","text":"
  1. Connect to a GPU machine with PyTorch installed and a Jupyter Lab server running
  2. Upload the collision avoidance training notebook to this machine
  3. Open and follow the train_model_resnet18.ipynb notebook
"},{"location":"examples/collision_avoidance.html#step-3-optimize-the-model-on-jetson-nano","title":"Step 3 - Optimize the model on Jetson Nano","text":"
  1. Connect to your robot by navigating to https://<jetbot_ip_address>:8888
  2. Sign in with the default password jetbot
  3. Shutdown all other running notebooks by selecting Kernel -> Shutdown All Kernels...
  4. Navigate to ~/Notebooks/road_following
  5. Open and follow the live_demo_resnet18_build_trt.ipynb notebook to optimize the model with TensorRT
"},{"location":"examples/collision_avoidance.html#step-4-run-live-demo-on-jetbot","title":"Step 4 - Run live demo on JetBot","text":"
  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888
  2. Sign in with the default password jetbot
  3. Shutdown all other running notebooks by selecting Kernel -> Shutdown All Kernels...
  4. Navigate to ~/Notebooks/collision_avoidance
  5. Open and follow the live_demo_resnet18_trt.ipynb notebook to run the optimized model
Caution

JetBot will physically move in this notebook, make sure it has enough space to move around.

"},{"location":"examples/community_examples.html","title":"Community Examples","text":"

Here you can find community examples and extensions of JetBot.

"},{"location":"examples/community_examples.html#combined-collision-avoidance-and-road-following","title":"Combined Collision Avoidance and Road Following","text":"

This example by @abuelgasimsaadeldin combines the JetBot road following and collision avoidance examples into a combined application. Watch your JetBot follow the road, while simulataneously avoiding traffic collisions.

  • GitHub
  • DevTalk
"},{"location":"examples/object_following.html","title":"Object Following","text":"Attention

Please note that example for now only works with the SD card image based software setup.

In this example we'll have JetBot follow an object using a pre-trained model capable of detecting common objects likePerson, Cup, and Dog. While doing this, JetBot will run the collision avoidance model from Example 3 to make sure it stays safe!

  1. Download the object detection model according to the table below

    JetBot SD Card Version Model v0.3 ssd_mobilenet_v2_coco.engine v0.4 (latest) ssd_mobilenet_v2_coco.engine
Attention

Please note, the latest object detection engine targets Jetson Nano running software bundled with JetPack 4.3. This engine not be compatible with other versions of JetPack. For this reason, we recommend starting from the JetPack 4.3 JetBot SD Card image, or using the JetPack 4.3 base SD card image if you want to run the object detection example.

  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888

  2. Shutdown all other running notebooks by selecting Kernel -> Shutdown All Kernels...

  3. Navigate to ~/Notebooks/object_following/
  4. Upload the pre-trained ssd_mobilenet_v2_coco.engine model to this folder

    Info

    This example also uses the collision avoidance model from example 3. We assume that it is already located at ~/Notebooks/collision_avoidance/best_model.pth

  5. Open and follow the live_demo.ipynb notebook

    Warning

    Start cautious and give JetBot enough space to move around.

"},{"location":"examples/road_following.html","title":"Road Following","text":"

In this example we'll collect an image regression dataset that will enable JetBot to follow a road! We'll teach JetBot to detect a target x, y image coordinate that the JetBot will chase. As JetBot gets closer to the point, it moves further along the track.

"},{"location":"examples/road_following.html#step-1-collect-data-on-jetbot","title":"Step 1 - Collect data on JetBot","text":"
  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888
  2. Sign in with the default password jetbot
  3. Shutdown all other running notebooks by selecting Kernel -> Shutdown All Kernels...
  4. Navigate to ~/Notebooks/road_following/
  5. Open and follow the data_collection.ipynb notebook
"},{"location":"examples/road_following.html#step-2-train-neural-network","title":"Step 2 - Train neural network","text":""},{"location":"examples/road_following.html#option-1-train-on-jetson-nano","title":"Option 1 - Train on Jetson Nano","text":"
  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888
  2. Sign in with the default password jetbot
  3. In the Jupyter Lab tab, navigate to ~/Notebooks/road_following
  4. Open and follow the train_model.ipynb notebook
"},{"location":"examples/road_following.html#option-2-train-on-other-gpu-machine","title":"Option 2 - Train on other GPU machine","text":"
  1. Connect to a GPU machine with PyTorch installed and a Jupyter Lab server running

  2. Upload the road following avoidance training notebook to this machine

  3. Open and follow the train_model.ipynb notebook
"},{"location":"examples/road_following.html#step-3-optimize-the-model-on-jetson-nano","title":"Step 3 - Optimize the model on Jetson Nano","text":"
  1. Connect to your robot by navigating to https://<jetbot_ip_address>:8888
  2. Sign in with the default password jetbot
  3. Shutdown all other running notebooks by selecting Kernel -> Shutdown All Kernels...
  4. Navigate to ~/Notebooks/road_following
  5. Open and follow the live_demo_build_trt.ipynb notebook to optimize the model with TensorRT
"},{"location":"examples/road_following.html#step-4-run-live-demo-on-jetbot","title":"Step 4 - Run live demo on JetBot","text":"
  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888
  2. Sign in with the default password jetbot
  3. Shutdown all other running notebooks by selecting Kernel -> Shutdown All Kernels...
  4. Navigate to ~/Notebooks/road_following
  5. Open and follow the live_demo_trt.ipynb notebook to run the optimized model
Warning

Start cautious and give JetBot enough space to move around.

"},{"location":"examples/teleoperation.html","title":"Teleoperation","text":"Info

This example requires a gamepad controller connected to your laptop/workstation.

In this example we'll drive JetBot remotely, view live streaming video, and save snapshots!

  1. Connect to your robot by navigating to http://<jetbot_ip_address>:8888

  2. Sign in with the default password jetbot

  3. Shutdown all other running notebooks by selecting Kernel -> Shutdown All Kernels...
  4. Navigate to ~/Notebooks/teleoperation/
  5. Open and follow the teleoperation.ipynb notebook
"},{"location":"reference/docker_tips.html","title":"Docker Tips","text":"

This page provides various information related to using docker with JetBot.

"},{"location":"reference/docker_tips.html#establishing-access-to-the-docker-host-terminal","title":"Establishing access to the Docker host terminal","text":"

The Jupyter Lab is running in the Docker container, thus the Terminal you open on Jupyter Lab only have access to the container environment. This means you cannot use commands like nvpmodel, tegrastats, journalctl, systemctl and others.

To get around this limitation, you can actually SSH in to the Docker host machine by;

ssh jetbot@0.0.0.0\n

"},{"location":"reference/docker_tips.html#using-nvidia-gpu-cloud-ngc","title":"Using Nvidia GPU Cloud (NGC)","text":"

The standard JetBot containers are hosted on docker hub, but for development or testing purposes, you may wish to use Nvidia GPU Cloud. To access containers on NGC, you need to sign into the NGC registry. To do this:

  1. Log into ngc.nvidia.com

  2. Generated your API Key

    1. Navigate to Setup > API Key
    2. Click on \"Generate API Key\" at the right upper corner of the page
    3. Copy the API key for future use
  3. On your Jetson, sign into the NGC registry using the generated key

    $ sudo docker login nvcr.io\n\nUsername: $oauthtoken\nPassword: <Your Generated Key>\n

For the username, enter $oauthtoken exactly as shown. It is a special authentication token for all users.

"},{"location":"reference/docker_tips.html#using-custom-jupyter-lab-workspace-directory","title":"Using custom Jupyter Lab workspace directory","text":"

The argument you provide to the enable.sh script is mounted as a volume inside the docker container. Inside the docker container, this volume is located at /workspace. Any changes that you make inside this directory will be saved outside of the docker container. To use a different directory as the workspace for the Jupyter contianer, just provide the path as an argument when calling enable.sh. For example, to set the workspace to your home directory, you would do

cd jetbot/docker\n./enable.sh $HOME\n
"},{"location":"reference/docker_tips.html#disabling-containers","title":"Disabling containers","text":"

Once you execute the enable.sh script, the containers are set to restart automatically. This means you can shut down your Jetson, and when you reboot the containers will run and you don't need to repeat this process.

To prevent the containers from starting automatically, just call the disable.sh script.

cd ~/jetbot/docker\n./disable.sh\n
"},{"location":"software_setup/docker.html","title":"Software Setup (Docker)","text":"

This page details how to set up JetBot using the pre-built JetBot docker containers. This is the best option if you want to use JetBot with an existing Jetson Nano SD card image.

Note

Please note, the JetBot containers described in this page currently target a Jetson Nano SD card image flashed with JetPack 4.4. These containers will not work with other version of JetPack.

"},{"location":"software_setup/docker.html#step-1-setup-jetson-nano","title":"Step 1 - Setup Jetson Nano","text":"

If you haven't already, go through the initial setup of Jetson Nano. You can use your existing Jetson Nano set up (microSD card), as long as you have enough storage space left.

Hint

For this, we'll assume you've set up your Jetson Nano using the online Getting Started guide.

  • Getting Started With Jetson Nano Developer Kit
  • Getting Started with Jetson Nano 2GB Developer Kit
"},{"location":"software_setup/docker.html#step-2-connect-to-wi-fi","title":"Step 2 - Connect to Wi-Fi","text":"

If you haven't already, connect your Jetson Nano to your Wi-Fi network.

Follow this Wi-Fi setup guide.

"},{"location":"software_setup/docker.html#step-3-clone-jetbot-repo","title":"Step 3 - Clone JetBot repo","text":"

Clone the official JetBot GitHub repo.

git clone http://github.com/NVIDIA-AI-IOT/jetbot.git\n
"},{"location":"software_setup/docker.html#step-4-configure-system","title":"Step 4 - Configure System","text":"

First, call the scripts/configure_jetson.sh script to configure the power mode and other parameters.

cd jetbot\n./scripts/configure_jetson.sh\n
Hint

configure_jetson.sh also disables the GUI for the interest of saving system memory (DRAM) consumption. If you want to re-enable the GUI, you can execute the following command.

sudo systemctl set-default graphical.target\n

Optionally, you can execute this script (./scripts/re_enable_gui.sh).

Then, call the scripts/enable_swap.sh script to enable swap memory if not set. Having extra 4GB swap memory is recommended even on Jetson Nano (4GB) Developer Kit.

./scripts/enable_swap.sh\n
"},{"location":"software_setup/docker.html#step-5-enable-all-containers","title":"Step 5 - Enable all containers","text":"

Call the following to enable the JetBot docker containers

cd docker\n./enable.sh $HOME   # we'll use home directory as working directory, set this as you please.\n

Now you can go to https://<jetbot_ip>:8888 from a web browser and start programming JetBot!

You can do this from any machine on your local network. The password to log in is jetbot.

The enable.sh script causes the docker containers to restart at boot. This means the next time you power on your JetBot, the containers will automatically start, and you should see the IP address displayed on the PiOLED display screen. All you need to do is type this into your web browser and start programming!

Tip

For more information on configuring and using docker with JetBot, check out the Docker Tips page.

Now that you've finished setting up you're JetBot, you're ready to run through the examples!

"},{"location":"software_setup/native_setup.html","title":"Native JetBot Setup (without Docker)","text":"

This page details how you can configure your Jetson system to use JetBot without Docker. This is handy when you want to prototype without worrying about docker semantics, or have other reasons to work outside of a docker environment

If you see any issues with these instructions or have any questions, please feel free to open an issue on github here.

"},{"location":"software_setup/native_setup.html#instructions","title":"Instructions","text":""},{"location":"software_setup/native_setup.html#step-1-install-dependencies","title":"Step 1 - Install dependencies","text":"
  1. Install NVIDIA JetPack, including NVIDIA TensorRT following these instructions.
  2. Install PyTorch following this guide provided on the NVIDIA devtalk forums.
  3. Install Node JS to support Jupyter Lab

    curl -sL https://deb.nodesource.com/setup_10.x | bash -\nsudo apt-get install -y nodejs libffi-dev\n
  4. Install Jupyter Lab to support web-programming JetBot

    sudo python3 -m pip install jupyter jupyterlab\njupyter labextension install @jupyter-widgets/jupyterlab-manager\n
  5. Install Jupyter Clickable Image widget (to support road following example).

    sudo apt-get install -y libssl1.0-dev && \\\ngit clone https://github.com/jaybdub/jupyter_clickable_image_widget && \\\ncd jupyter_clickable_image_widget && \\\ngit checkout tags/v0.1 && \\\nsudo pip3 install -e . && \\\njupyter labextension install js && \\\njupyter lab build\ncd ..\n
  6. Install other miscellaneous dependencies

    sudo apt-get update && apt-get install -y supervisor unzip\nsudo apt install -y python3-smbus && pip3 install pyzmq\n
  7. (optional) Install torch2trt to support TensorRT accelerated AI models

    git clone https://github.com/NVIDIA-AI-IOT/torch2trt\ncd torch2trt\npython3 setup.py install\ncd ..\n
  8. Install the JetBot Python package

    git clone https://github.com/NVIDIA-AI-IOT/jetbot\ncd jetbot\nsudo python3 setup.py install\n# if you plan to modify the jetbot python package, call this instead: sudo python3 setup.py develop\n
"},{"location":"software_setup/native_setup.html#step-2-set-the-jupyter-lab-password","title":"Step 2 - Set the Jupyter lab password","text":"

Call the following from a terminal

jupyter notebook password\n# enter password\n

You could now test the JetBot notebooks by running

cd jetbot\njupyter lab --ip=0.0.0.0 --no-browser --allow-root\n

and then navigating to https://<jetbot_ip>:8888 and signing in with the password you set.

However, it is convenient to have this server start automatically, which we will detail next.

"},{"location":"software_setup/native_setup.html#step-3-create-a-system-service-to-start-the-jupyter-lab-server-at-boot","title":"Step 3 - Create a system service to start the Jupyter Lab server at boot","text":"
  1. Create file named jetbot_jupyter.service and add the following content.

    [Unit]\nDescription=Jupyter Notebook \n\n[Service]\nType=simple\nUser=jetson\nExecStart=/bin/sh -c \"jupyter lab --ip=0.0.0.0 --no-browser --allow-root\"\nWorkingDirectory=/home/jetson\nRestart=Always\n\n[Install]\nWantedBy=multi-user.target\n

    Note: If you have a username other than \"jetson\" or want to launch Jupyter from a directory other than \"/home/jetson\", modify the file \"User\" and \"WorkingDirectory\" fields accordingly.

  2. Copy the file to the directory /etc/systemd/system so it can be discovered as a system service.

    sudo cp jetbot_jupyter.service /etc/systemd/system/jetbot_jupyter.service\n
  3. Enable the system service to run at boot

    sudo systemctl enable jetbot_jupyter\n

Now, when you re-boot your Jetson, the Jupyter lab server should start in the background.

That's great, but in order to connect to the server, you need to know it's IP address. The last step will be to enable a system service that displays the IP address on the JetBot's PiOLED display upon boot.

"},{"location":"software_setup/native_setup.html#step-4-create-system-service-to-show-the-ip-address-upon-boot","title":"Step 4 - Create system service to show the IP address upon boot","text":"

This is very similar to creating a service for the Jupyter Lab server, we're just changing the application that's launched

  1. Create a file named jetbot_display.service and add the following content.

    [Unit]\nDescription=Jupyter Notebook \n\n[Service]\nType=simple\nUser=jetson\nExecStart=/bin/sh -c \"python3 -m jetbot.apps.stats\"\nWorkingDirectory=/home/jetson\nRestart=Always\n\n[Install]\nWantedBy=multi-user.target\n
  2. Copy the file to the directory /etc/systemd/system so it can be discovered as a system service.

    sudo cp jetbot_display.service /etc/systemd/system/jetbot_display.service\n
  3. Enable the system service to run at boot

    sudo systemctl enable jetbot_display\n

That's it! Now you should be able to reboot the JetBot, and it's IP address should automatically show up on the PiOLED display.

We hope this helps you create a custom native system configuration for using JetBot. If you have any questions or see any issues with this guide, please create an issue on GitHub.

Happy hacking!

"},{"location":"software_setup/sd_card.html","title":"Software Setup (SD Card Image)","text":"

This page details how to set up JetBot using the pre-built JetBot SD card image. You may prefer this option if you are new to Jetson Nano, and do not have an existing SD card configured.

"},{"location":"software_setup/sd_card.html#step-1-download-the-pre-built-jetbot-sd-card-image","title":"Step 1 - Download the pre-built JetBot SD card image","text":"

Download the pre-built JetBot SD card image from the table below. Make sure to select the version that matches the Jetson you're using (for example Jetson Nano 2GB).

"},{"location":"software_setup/sd_card.html#latest-release","title":"Latest Release","text":"Platform JetPack Version JetBot Version Download MD5 Checksum Jetson Nano 2GB 4.5 0.4.3 jetbot-043_nano-2gb-jp45.zip e6dda4d13b1b1b31f648402b9b742152 Jetson Nano (4GB) 4.5 0.4.3 jetbot-043_nano-4gb-jp45.zip 760b1885646bfad8590633acca014289 Attention

To use one of the JetBot sdcard images based on JetPack 4.5, you first need to boot your Jetson Nano using a plain JetPack 4.5 SD card image and run through the operating system setup. This will perform a one-time configuration which enables you to use SD card images based on JetPack 4.5 on your device. You can find the original JetPack SD card images here: JetPack SD card image for Jetson Nano 2GB and JetPack SD card image for Jetson Nano (4GB). After doing this procedure once, you can then use the JetPack 4.5 based JetBot SD card images listed above on your device.

"},{"location":"software_setup/sd_card.html#old-releases","title":"Old releases","text":"Platform JetPack Version JetBot Version Download Jetson Nano 2GB 4.4.1 0.4.2 jetbot-042_nano-2gb-jp441.zip Jetson Nano (4GB) 4.4.1 0.4.2 jetbot-042_nano-4gb-jp441.zip Jetson Nano 2GB 4.4.1 0.4.1 jetbot-041_nano-2gb-jp441.zip Jetson Nano (4GB) 4.4.1 0.4.1 jetbot-041_nano-4gb-jp441.zip Jetson Nano (4GB) 4.3 0.4.0 jetbot_image_v0p4p0.zip Jetson Nano (4GB) 4.2 0.3.2 jetbot_image_v0p3p2.zip"},{"location":"software_setup/sd_card.html#step-2-flash-jetbot-image-onto-sd-card","title":"Step 2 - Flash JetBot image onto SD card","text":"
  1. Insert an SD card into your desktop machine

  2. Using Etcher, select the image you downloaded above and flash it onto the SD card.

  3. Remove the SD card from your desktop machine

"},{"location":"software_setup/sd_card.html#step-3-boot-jetson-nano","title":"Step 3 - Boot Jetson Nano","text":"
  1. Insert the SD card into your Jetson Nano (the micro SD card slot is located under the module)

  2. Connect the monitor, keyboard, and mouse to the Nano

  3. Power on the Jetson Nano by connecting the micro USB (for Jetson Nano (4GB)) or USB-C (for Jetson Nano 2GB) charger to the port

    Attention

    We recommend first booting the Jetson Nano once without the piOLED / motor driver connected.

    This way you can check to make sure the system boots properly from the SD card image without worrying about hardware issues. After you've verified that it boots, reconnect the piOLED, double check your wiring, and boot again.

"},{"location":"software_setup/sd_card.html#step-4-connect-jetbot-to-wifi","title":"Step 4 - Connect JetBot to WiFi","text":"

Next you'll need to connect to WiFi. To reduce memory consumption, we disable the Ubuntu GUI in the latest JetBot SD card image. For this reason, you'll need to use the command line to connect to WiFi.

  1. Log in using the user jetbot and password jetbot

  2. Connect to a WiFi network using the following command

    sudo nmcli device wifi connect <SSID> password <PASSWORD>\n

Your Jetson Nano should now automatically connect to the WiFi at boot and display it's IP address on the piOLED display.

Tip

If you're having trouble figuring out how to get connected to Wi-Fi, check out the Wi-Fi setup page for more detailed instructions

"},{"location":"software_setup/sd_card.html#step-5-connect-to-jetbot-from-web-browser","title":"Step 5 - Connect to JetBot from web browser","text":"

After your robot is connected to WiFi, you no longer need to have the robot connected by a monitor. You can connect to the robot from your laptop's web browser by performing the following steps

  1. Shutdown JetBot using the command line

    sudo shutdown now\n
  2. Unplug your HDMI monitor, USB keyboard, mouse and power supply from Jetson Nano

  3. Power the JetBot from the USB battery pack by plugging in the micro-USB cable

  4. Wait a bit for JetBot to boot
  5. Check the IP address of your robot on the piOLED display screen. Enter this in place of <jetbot_ip_address> in the next command
  6. Navigate to http://<jetbot_ip_address>:8888 from your desktop's web browser. You can do this from any machine on your local network.
  7. Sign in using the password jetbot.

That's it, you've now accessed JetBot's remote programming environment!

You will be presented with a view similar to the following.

Here you can easily access the JetBot examples! From this point on, when you power on the JetBot, it should automatically connect to WiFi and display it's IP address. So all you need to do is reconnect using your web browser to start programming!

Now that you're finished setting up your JetBot, you're ready to run the examples.

"},{"location":"software_setup/wifi_setup.html","title":"Wi-Fi connection setup","text":"Info

You can skip this page if you already have a wireless connection to your JetBot from your computer.

To go through the actual example applications on JetBot, you interact with JetBot from your (laptop) PC through Wi-Fi network.

This document explains how you can initially set up the Wi-Fi connection on your Jetson.

"},{"location":"software_setup/wifi_setup.html#monitor-attached-mode","title":"Monitor-attached Mode","text":"

The easiest way to set up the Wi-Fi connection on your Jetson, is to operate on the GUI desktop. For this you need to fisrt connect the following to the Jetson on your JetBot.

  • HDMI monitor
  • USB keyboard
  • USB mouse

With this setup, you can use Jetson like a standard Linux computer. We call this Monitor-attached Mode.

Hint

If you don't have above items handy, then you can also try the headless way of configuring Wi-Fi. Head down to the next section, Headless Mode.

"},{"location":"software_setup/wifi_setup.html#connect-to-wi-fi-ap","title":"Connect to Wi-Fi AP","text":"

If a Wi-Fi adaptor (either Intel 8265 M.2 card or a USB Wi-Fi dongle) is attached, you can configure the wireless network from the desktop.

"},{"location":"software_setup/wifi_setup.html#check-ip-address","title":"Check IP address","text":"

After the connection established, check the IP address.

Note this IP address.

"},{"location":"software_setup/wifi_setup.html#verify-the-ip-address","title":"Verify the IP address","text":"

To test the IP address is valid and your Jetson is accesible, try connecting to the IP address from your separate (laptop) PC.

SSH server is enabled by default on Jetson. Open your SSH client software (PuTTY, etc) on your PC, and try to connect the SSH server on the IP address.

This is how you connect to your JetBot using SSH client software. Once you confirm you can connect to your Jetson remotely from your PC via Wi-Fi, you can now remove the HDMI monitor, keyboard and mouse from Jetson, and let your JetBot free!

And at this point, you are now using Jetson effectively in the Headless Mode.

Hint

Alternatively, even on the GUI deskop, you can open the terminal by pressing Ctrl + Alt + T keys, and follow the command-line based setup described below for headless setup.

"},{"location":"software_setup/wifi_setup.html#headless-mode","title":"Headless Mode","text":"

When you put your Jetson in a deployed system, like a mobile robot, it is often difficult to attach an HDMI monitor. We can still control such Jetson remotely through network from a (laptop) PC, WHEN you already know the IP address. We call this operation mode Headless Mode.

However you face a chiken-or-egg dillemna here, because you want to remotely login to the console to set up a Wi-Fi connection, but to do that you first need the IP address of your Jetson that you get after establishing the Wi-Fi connecton.

"},{"location":"software_setup/wifi_setup.html#usb-device-mode","title":"USB Device Mode","text":"

What comes handy here is USB Device Mode.

You connect your (laptop) PC and Jetson using a Micro-USB cable. (Type-A end goes to your PC, Micro-B end goes to Jetson) Using this wired connection, you can access the terminal on Jetson from your (laptop) PC.

With USB Device Mode, Jetson presents 3 different USB Device Class end-points to the PC that it got connected to. They function as

  • USB mass storage device (you see L4T-README drive mounted on your PC, like a USB thumbdrive)
  • USB serial (like the common \"FTDI\" USB to serial adapter)
  • USB network interface card (like a virtual Ethernet adapter)

With the virtual Ethernet adapter functinality, Jetson forms a virutal local Ethernet network with Jetson being 192.168.55.1 and your PC being 192.168.55.100. So you can actually SSH login from your (laptop) PC by specifying 192.168.55.1, if you have already set up your acount (with username and password).

If you are using Jetson for the first time right after you flash your SD card, then you don't have this user account set up. In that case, you want to use the USB serial functinality, and use your serial terminal software on your PC to have accesss to the Jetson's serial terminal.

So either way, with a Micro USB cable, you can have an access to Jetson's terminal.

"},{"location":"software_setup/wifi_setup.html#connect-wi-fi-using-nmcli-command","title":"Connect Wi-Fi using nmcli command","text":"

If a Wi-Fi adaptor (either Intel 8265 M.2 card or a USB Wi-Fi dongle) is attached, you can configure the wireless network using nmcli command.

You can first check if you want a wireless adapter on your system. Look for wlan0.

$ nmcli device\nDEVICE  TYPE      STATE         CONNECTION\nl4tbr0  bridge    connected     l4tbr0\nwlan0   wifi      disconnected  --\neth0    ethernet  unavailable   --\ndummy0  dummy     unmanaged     --\nrndis0  ethernet  unmanaged     --\nusb0    ethernet  unmanaged     --\nlo      loopback  unmanaged     --\n

Then you can list all the wirelss networks (SSDI) in the area.

$ nmcli device wifi list\nIN-USE  SSID                           MODE   CHAN  RATE        SIGNAL  BARS  SE\n        --                             Infra  6     195 Mbit/s  82      \u2582\u2584\u2586\u2588  WP\n        --                             Infra  6     195 Mbit/s  82      \u2582\u2584\u2586\u2588  WP\n        --                             Infra  6     195 Mbit/s  75      \u2582\u2584\u2586_  WP\n        MY_WIFI_AP                     Infra  6     195 Mbit/s  70      \u2582\u2584\u2586_  WP\n        --                             Infra  6     195 Mbit/s  70      \u2582\u2584\u2586_  WP\n        *********                      Infra  1     405 Mbit/s  64      \u2582\u2584\u2586_  WP\n        ************                   Infra  153   405 Mbit/s  64      \u2582\u2584\u2586_  WP\n...\n

To connect to your wireless network (AP, access point), issue the commands below.

$ sudo nmcli device wifi connect <MY_WIFI_AP> password <MY_WIFI_PASSWORD>\nDevice 'wlan0' successfully activated with '2a26d5ca-****-****-****-**************'.\n
"},{"location":"software_setup/wifi_setup.html#check-ip-address_1","title":"Check IP address","text":"

To check your IP address, use ifconfig. Check the wlan0 part at the very bottom.

$ ifconfig\ndummy0: flags=195<UP,BROADCAST,RUNNING,NOARP>  mtu 1500\n        inet6 fe80::d854:8ff:fe87:e631  prefixlen 64  scopeid 0x20<link>\n        ether da:54:08:87:e6:31  txqueuelen 1000  (Ethernet)\n        RX packets 0  bytes 0 (0.0 B)\n        RX errors 0  dropped 0  overruns 0  frame 0\n        TX packets 24  bytes 3376 (3.3 KB)\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n\nl4tbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500\n        inet 192.168.55.1  netmask 255.255.255.0  broadcast 192.168.55.255\n        inet6 fe80::1  prefixlen 128  scopeid 0x20<link>\n        inet6 fe80::943c:9dff:fe90:eb89  prefixlen 64  scopeid 0x20<link>\n        ether 96:3c:9d:90:eb:89  txqueuelen 1000  (Ethernet)\n        RX packets 15189  bytes 1343038 (1.3 MB)\n        RX errors 0  dropped 0  overruns 0  frame 0\n        TX packets 4344  bytes 411009 (411.0 KB)\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n\nlo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536\n        inet 127.0.0.1  netmask 255.0.0.0\n        inet6 ::1  prefixlen 128  scopeid 0x10<host>\n        loop  txqueuelen 1  (Local Loopback)\n        RX packets 3954  bytes 287737 (287.7 KB)\n        RX errors 0  dropped 0  overruns 0  frame 0\n        TX packets 3954  bytes 287737 (287.7 KB)\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n\nrndis0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500\n        inet6 fe80::943c:9dff:fe90:eb89  prefixlen 64  scopeid 0x20<link>\n        ether 96:3c:9d:90:eb:89  txqueuelen 1000  (Ethernet)\n        RX packets 15414  bytes 1360470 (1.3 MB)\n        RX errors 0  dropped 7  overruns 0  frame 0\n        TX packets 4378  bytes 667985 (667.9 KB)\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n\nusb0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500\n        ether 96:3c:9d:90:eb:8b  txqueuelen 1000  (Ethernet)\n        RX packets 0  bytes 0 (0.0 B)\n        RX errors 0  dropped 0  overruns 0  frame 0\n        TX packets 0  bytes 0 (0.0 B)\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n\nwlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500\n        inet 192.168.1.58  netmask 255.255.255.0  broadcast 192.168.1.255\n        inet6 fe80::b5a0:c2e3:50bc:29a4  prefixlen 64  scopeid 0x20<link>\n        ether b4:4b:d6:23:9a:12  txqueuelen 1000  (Ethernet)\n        RX packets 26825  bytes 40675884 (40.6 MB)\n        RX errors 0  dropped 32746  overruns 0  frame 0\n        TX packets 16406  bytes 1673647 (1.6 MB)\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n
"},{"location":"software_setup/wifi_setup.html#verify-the-ip-address_1","title":"Verify the IP address","text":"

To test the IP address is valid and your Jetson is accesible, try connecting to the IP address from your separate (laptop) PC under the same network.

Open your SSH client software (PuTTY, etc) on your PC, and try to connect the SSH server using the IP address you obtained on the wireless adapter.

This is how you connect to your JetBot over Wi-Fi. Once you confirm you can connect to your Jetson remotely from your PC via Wi-Fi, you can now remove the Micro USB cable and let your JetBot free!

Info

Next, you move on to either page below.

  • Software setup using Docker container
  • Software setup using SD card image

Once your JetBot software is configure, you should see JetBot's IP address on the small OLED display. You would only need to come back to this step to re-connect to the network or to find the IP address when your JetBot fails to get the IP address and show the current IP address on the OLED display.

"}]} \ No newline at end of file diff --git a/master/sitemap.xml.gz b/master/sitemap.xml.gz index 64d8e785..dbfc0ddc 100644 Binary files a/master/sitemap.xml.gz and b/master/sitemap.xml.gz differ diff --git a/master/software_setup/docker.html b/master/software_setup/docker.html index 33686983..bf266fc5 100644 --- a/master/software_setup/docker.html +++ b/master/software_setup/docker.html @@ -14,8 +14,9 @@ + - + @@ -23,22 +24,25 @@ - + - + + + + - - + + @@ -55,9 +59,7 @@ - - - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/master/software_setup/native_setup.html b/master/software_setup/native_setup.html index 8ffcdfca..61d3ff0d 100644 --- a/master/software_setup/native_setup.html +++ b/master/software_setup/native_setup.html @@ -14,8 +14,9 @@ + - + @@ -23,22 +24,25 @@ - + - + + + + - - + + @@ -55,9 +59,7 @@ - - - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/master/software_setup/sd_card.html b/master/software_setup/sd_card.html index 60db02bd..29d7302b 100644 --- a/master/software_setup/sd_card.html +++ b/master/software_setup/sd_card.html @@ -14,8 +14,9 @@ + - + @@ -23,22 +24,25 @@ - + - + + + + - - + + @@ -55,9 +59,7 @@ - - - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/master/software_setup/wifi_setup.html b/master/software_setup/wifi_setup.html index bb7897a9..b31ec29c 100644 --- a/master/software_setup/wifi_setup.html +++ b/master/software_setup/wifi_setup.html @@ -14,8 +14,9 @@ + - + @@ -23,22 +24,25 @@ - + - + + + + - - + + @@ -55,9 +59,7 @@ - - - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/master/third_party_kits.html b/master/third_party_kits.html index 9b4a83ef..cc760066 100644 --- a/master/third_party_kits.html +++ b/master/third_party_kits.html @@ -14,8 +14,9 @@ + - + @@ -23,22 +24,25 @@ - + - + + + + - - + + @@ -55,9 +59,7 @@ - - - + @@ -76,7 +78,6 @@ - @@ -109,6 +110,7 @@
@@ -132,7 +134,9 @@ + - + + - + diff --git a/versions.json b/versions.json index 75fad447..38e14bd4 100644 --- a/versions.json +++ b/versions.json @@ -1 +1,17 @@ -[{"version": "wiki-based", "title": "wiki-based", "aliases": []}, {"version": "v0.4.3", "title": "v0.4.3", "aliases": []}, {"version": "master", "title": "master", "aliases": []}] \ No newline at end of file +[ + { + "version": "wiki-based", + "title": "wiki-based", + "aliases": [] + }, + { + "version": "master", + "title": "master", + "aliases": [] + }, + { + "version": "v0.4.3", + "title": "v0.4.3", + "aliases": [] + } +]