*%0Ld7s7wzpQx3^b0F`G+DE`(c^7aeLdmw@}eGN$I{ zJs@1(JU;E3{RjkZS3Kd8X^f>yo1|6x!w;w{if?C zCOp4?|BmmnFopcy*_gbGdsN~j^vP-X)Sqpu>*h>7cP*-AukKAnH7J`$a;Uwrr2F(- zjafUC*{wV3jy6q?S++|_)q`3{D8eA|=94PBI6o*%05bEJqQ59b#rNVx;dBhdBy7C1 z>2I#0?S8?#01&@6U^64^V=C8!{P8^5(R@qb{Q2`(wOn^EFKd MIf&BnrOR+wT z?vZhIb-g_I_DK8|uV8p|l= ovq&W4tzqsY<5BbH3w$zQuM1_0! zV3%;mmb|+HIeIAp`sqUA@>9Qmbo7pn$_iM>ygDzX6QshI(L2);x1qB**^&M8XS8mQ z_42cuLNaEW4TzaWj(IoNJMqk?qdNWgi@q7Y*RLP(j$alGn`k{fstP{i6TM|QJU;$% zVXRrn_TA$Tn3%MCkd~H~wEq4x<1G>XF7wMOt@H;Yp|LBbFR6DVKo8v9>g(%$*SFHx zzB16Fel-UN2QVK%$50y{UMI*&iavpXf;1ZK0WmuWOd={yFf}z5PdIQFE5NPwz8dQx z74%r!2O({RkbWTCt2$sP_R3FENJwaSa?+;W{pI+$9NA=0`S>LX`D$?)QRv0d2;mlz z_ltO80^u$z0RO}Vb)dz8E{87X1cfy!>r_sJJ#c=an9D*t!AnX?Dn>%h+7Z2luM^O< z-PE>@j_l-Qe)yf!!9~{Io@hQfWTrL0y1F_ZzGu~AS6XoM82rVb3Ls0kTX*T#&v_l5 zY>LIFMi9y0p2y~V#BaW};*- ^N^Yayem!uc(idOSM z^K$Wfcvu7C!9eiT+FBHoR_diecI!OHTk)XN=T8o4!5{%1JxnIV@}9)X)^mRCGH|@0 zQ#T_rGmuVf>meyhbZ&2>q@|@5*$q`eFRtJLp_lYN!PYw>^zmTB+wO=IA6;0F%( Yype!PNU)4G7f~=Nl6-;D$a=GlF{A$eHl#h) zqpx}O%0KA fawCo z4;s#{UW?3+i;cxK5)1SReE&O3Kk{&VBq$`o4}2jqe}dy8Q0GRqYb1tG1q0XoN6gsm zSjKi)oFO|}C`<6)YT{|995yc$93|)w7>mriz!g` QPJ!wP_;@iMqNva#NELu_NKgeT`9b11oMc zSSIpts$fdRK1*R2zCHjlAehq|ALGOu5LQm`fJTqi_p-fnt6jRHAT+or kMu8E0_Qj}zt;eA01G{|3y5_<_t zCDwA=yx8IL4!A4oS((%E<_apdOpu^eY?BadY}KGf0o(JIkej}^lIF-s)7C>>)w4dj zU|d8AguRemJjb0kI%7Z`4>gv|w6 BUVsx&6c zAyu2t9Wx+qyZt>=q LOtm5(m z4>cf;QgNQ{dvl#v;06YK0&iuxY&IJPP5wNTQ$0HpSP6OkwJM-Zt1vYu59RqL0JyP> zTQsr@GnBosY>6wAzhF#8H&d=rOE`0&V@&Wf8Kgy=!Ig;-CD9dEXIj0fZ}$9-SQs^O zZm?=mBg=J6PM&3b=rOVxG%P7AD>`ZAyfPc%3EW_77M3#~^fVc?=#x7ODN^YeZ`IY@ zm=6n{4`*4QMgdX`HMCUK+nQx)Cx4tSuDE2)8VH8}c=0=|fP%cIb*%v;h0c+aPzGg- zF*`Uo_=2EsMDM*51V$~KxEjeyHl!E#s}WfK%(Hy6YtAI&;?p&*^CK;ESDK4zwy+~q z;!EvpLSukDb8G9G^9pP!6u3dtEOcYlxZcS_K~P7~Sp?R$tCEe4jiFr`0Pp-$XH4H3 zx}2j`n1_;sckbInFwU}eWVzcRuX_{W%&vRD`jkHIL-fQ`(4qia3YNuh$@jmmu>A2S z0p@mUs@`HEQ-Yg235a9IO2 tXe#Zuh9)b7s)j?fxPdKg$KUbfB@xv>~TdN{c49u$?>?-(I?r*@|Ta=?zYbAd%s z88Mf9Ps0PX*jf*Lw}uHsA(Ja6co_yNABNVJvTF0#B_Y=n6L`P|sHMz({w%RCb$R;L zU*}b&=I#MmF#2rsWWpFKk*Ux#;h`!O1mf(2X3jamK>)n7-iM%HOUcg4!m>{8)mIv2 z3o$~ESP0Z0`&TyNK7!?5r@*Rl 2VO8||j2J}@s@k`c;>~}oHOTot2EZ}`7ZC)*HLy`=*GYX2 zYLpZ_MI|zlR?tEMqCIVli(f4->w(J0sL$wHl7s4e>prKok8Ug4;X{|2$4t%4n5%P~ zuk1C6%c{qZAMgILfov~HH+b*0Y X03Bvh1cF)Cqo)5uNxrF`~w`d$7u} zzOC&J?vZ}Ak)*sOu+-uEkvwm57po|r9k-IG7h!~PLdlttw}q)0dMf*cU;62ZDCtQY z6;@pOto09@2LQ`4as$D6mRREJ*I-S6_VF4R!Ul5tiaDgCFr>9KdJ1t9)YBuO(x7m; zfd(ilg*(SWT%}yWb=UZ0uFaR8st=BglqxPR9v&X pv2lWu<5jWFpv(J^Rs9 zPX{|dDjpglJf+j$wXdZ`hF-dqd7SJj<1Zn=m!bDg*O&BXcSl_+!nbXr@@P8dV2$fv z8BthM;oQKHuSOE`DaVc-JFzE{>p+32B?{~HQApTSQn4k)9=U1bTb}Sslfrs9IIoBj zX}kX0*!<6SWNWheCm5p8ewtSMg4wH(Xn$1SZ#oTBq;E@+dz=UtiCO=C$S5;Cy$dAF z>1ERwzZa3)YlDuPQ_13}Yo;lep^`C?CRN2I;nU#sn+SHy+84>)?N!G-c3>6PrbTYm zu3Y0bD6=;|r7GlLRhBlF{XylACJ@XnV=~0b2O{8;{}qPE)wfUWZt}Oawe7u8zfg2# z3spU&73H}xE}Y=E7QfnW;uxReJKhv$@n8V`$hqt5S51*y5ZO#9*rGhkXU&8QD6D|I aKm3Dy8L*yO=R)w;46r@zfT3IZB>f*%!GJ*k literal 0 HcmV?d00001 diff --git a/backend/images/D-pad_up.png b/backend/images/D-pad_up.png new file mode 100644 index 0000000000000000000000000000000000000000..a78b4a3b4417b567fa367d20f6c384ed60012165 GIT binary patch literal 3633 zcmds4i9b|r`yUdrWNAVgLyRp7&yckld91w}M1)W%=^;z9g^5bfjI8r0ljUT|5T2Aq zCLymq#*n3~lYKWa4OwQ+@AUo|zt8!c>;9bkzRq=D_xD `ptIS2Ci%6kQn;K2P3`?=|N4dr~OzoUTS}Q$}JFp6qS2W~N#m z+foL;F_|{S{fi4O4@G~(Hsll(w9j=v+vqiAeJ@VO{5LnGkwBvvM>kB~207^FS4Kyz znzy#jB>b8Zieu9af9)&)VWFY0cDda_!zl}ab1+!zOqjNgj$d%Fctu4;UG#>s88W>e zza!SepKASp`*Xlyb!%-bC^GWtp`=f+zH=RS6l-c~e$TD)xO?_bud9qqtZMegHuSEK z(^_ti*ERDe-e2<}rfnGSCty9jysk&Bk6+`&Heka(zwK$ 8 zSrj^cde2NqQN-^{z17a;%AfnF`&Qd8K3?H<6VD{83w7H2qcBW2?t;nLvuz}Ghfvn! z+11t6CqFF?MZK-5d2nxgeG2-&Wobzhb|egmKzwh0AoPpPz}mznKCItadENBmd-DMV z0s+&NRQD5mWWk5u-w-M|d+*GqC~CaBxtT8k V7`)d- ncK8C6qe9b1hJ3?4!7f7}}V%LN%O^-Ra7eJrFY^`^c_ z23y=J@0ORgG@-9-Nx8JN^f#6?8Z9v| v$e5VoBON zVP`JUY*gqpF1_OcnS9LN!J!_Pw-$LEGGh~OSE~RMPmHV&-d0V8pOeh6Md_l^4+sQ; zEQa}sIeZo=@!u(3i^9Ga4s?SjdjE7^4+;u;;c~LD|E7|hnD31n?U(Q+g^t2gq0vgr z7>$=GC-@1wFS F0y)?S&z z`oN_Z?)2TFRyQ=H2A#Rr9uPURxF}4vPu>qu%rM$}sFw_dX353!-shNIAeZhvF*c?G zjtI>f@0EB|Dd*#Id-FG98=xo(U2iJVfWQ!b+%k(jWv&vSIJk1xzs7x*9n&&N(;(WS zq;mkkMq36QG-Z%`At*RF6MP3F3@EQf*3Y2R)6*H;E0O{aTduYG>e=IP%E ;TQ2oVF;*kY( zECnFY8Zy6frY;8<#2Y4?Q4VFFf9cH7U(Vf&!$8M*Xi-=orKiOs?XngMGY4SqPv20f z*GCOm^JuywcVTewpF+?DOWI$+XBgeR$tHJnbSyj!Yzufk#fiPZr6>tQd2m_V-ke8j zjS;M3=#R}?`!H68&Phs&30~l;|L_4PDhrm?I`7=-+oIFsN*fDCbSC!I@1r>mO-$A; z&`xCmbXp->V@P_#8)Ro^XB{(jPakkFEn{?_GR9RW90_1Us{=C|O40-+nUv-Qw)iZ% z!8?Q^5uz_rQCyeHrL44-zedX!?%Jb)UuKs%z*590b @ _+Z Uq@gU6Lf&Ft0?UVe zI~3dq&Kz>XCYfOAyNDSO)8aW-oqkdeMx+{1G3=3=fT#0(BZ &Cnqm& zGreYvhhofIR&ymps47ER;4y+FgnvgZZ;6=c?4{*gb@Z?@U>sCAi>(={ERRA8wR`8e zZjzVd*a>WMOX=9Yis3A_!y~U@*nq#UrYTt60}PyhaBt_PdP@g7$ac|22Dwb;7I6Sm zQ`3d%xMk8c#2zbdGL!GBDo{QQkJ%vKxXA`~|58}kVfks|IKgLf=|!#;$L7(OfIzpi zH9oO){8u-X_QW?wD2<123NZeM*1+d|bxQL#d)2s4ExKozF*_0PypRLb*VivB1Gjk2 zYfYvTc$1a&pPxQ|u*N}qT&CmG9)O7BVXrVXo|u8a|G{$yu?hH{z{OAYSB9+X1A)m$ zL0Wx%3KSk5%)9)(akWc*>TUU#8LP5u`zk7+@nMcb2UBwmNtzfo2!G4a|1+zk7opBo z%pb)^h4Tjbrw8ZJ^*cS$X6w^j&?8mP~sAE$bN`p^AXF5r?;*m8WSJBA%I z%!n{~1?qR>m)-hj6l@3sMEsXwbX8D}3GQ+i{?;Dr;{sNJ)3frF;r}Ge0NSfv6I{wM zE%QNp>DUJ|Mo#@kZ^vP%hP{qeIPtqv@qP0R4H)-wdJ_8Ax32kz{H%ZULwI|7@LwSC zDPy&kQQ|2jP`HAzbKP=(dwd ^MUoW`Q$yC1V{bGqaw(By8w0R>*8yO3Y_uSih1$@`LfxHrJT`}2 z;h4M~(dO+eD7F}E+K9VFxpBx)2xl=OJnw}|{^BN}qz~m46cl+>6^y<34;`OuaRNoM z^91b2|8^cTbc-)-6rJV7N(l?R&>&7tzkX-{w@PHPI-qJrle)NqebB4~HCMqO&Zo7y zR}5v)Z(LxLm)~kZy+NCAe`y5*?*h`G0%MCxGFQ6qsNvsD4V^Nk?%2COT?z|Ek8-f| zt()=(Yg3$AXuF*Kt5M*DYnaDKR93Yt74$B5vF44`5^G#5PLR4HmdOJ6GLA!yf^9M( zSjTd=(fH`VjwKyGA8u@^EcJ1Bxk4qE=bLL}< y8i-xG^uX08sd2rTYj<&`jrvn!or_ZA7SpJ@N3C|Dq6E@+8EN(AQz%@L zr){3V`wXK)w@-vg|36_+Mk0}z0p0`cZm3e$#d1#iyRYv(gc5m|zcfU%P~xi=hXSBp u5xOi)#;#N?d`V}rY?L!UK}KH(VUMfIr~Cd;eFxnEVRlwH%YQAdCjB2}h&~Sh literal 0 HcmV?d00001 diff --git a/backend/js/custom_nodes.js b/backend/js/custom_nodes.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/backend/js/custom_nodes.js @@ -0,0 +1 @@ + diff --git a/backend/js/custom_topics.js b/backend/js/custom_topics.js new file mode 100644 index 0000000..f1eb1cc --- /dev/null +++ b/backend/js/custom_topics.js @@ -0,0 +1,55 @@ +function Topic(name, type) +{ + this.name = name; + this.type = type; + + this.includeInBag = false; + + this.equals = function (otherTopic) + { + if( this.name == otherTopic.name && this.type == otherTopic.type) + { + return true; + } + return false; + }; + +}; + +function containsTopic(obj, list) { + var x; + for (x in list) { + if (obj.equals(list[x])) { + return true; + } + } + + return false; +} + +function testToics() +{ + var topics = [new Topic("a","a_t"), new Topic("b","b_t"), new Topic("c","c_t")]; + + console.log("Testing Topic"); + + if (containsTopic(new Topic("a","a_t"),topics) == true) + { + console.log("pass") + } + else + { + console.log(" contains true fail") + } + + if (containsTopic(new Topic("d","d_t"),topics) == false) + { + console.log("pass") + } + else + { + console.log(" contains d fail") + } +} + +testToics(); \ No newline at end of file diff --git a/backend/js/ros_scripts.js b/backend/js/ros_scripts.js new file mode 100644 index 0000000..93b818c --- /dev/null +++ b/backend/js/ros_scripts.js @@ -0,0 +1,124 @@ +var ros = new ROSLIB.Ros(); + +ros.recording = false; + +// ros.connectionName = 'ws://192.168.1.105:9090'; +ros.connectionName = 'ws://localhost:9090'; + +// If there is an error on the backend, an 'error' emit will be emitted. +ros.on('error', function(error) { + document.getElementById("ConnectionIPForm").className = "form-group has-warning has-feedback"; + document.getElementById("ConnectionIPInput").value = ros.connectionName; + document.getElementById("ConnectionIPLabel").innerHTML = 'No connection'; + document.getElementById("ConnectionButton").className = "btn btn-warning" + document.getElementById("rosbridgeconnection_badge").innerHTML = 'No connection'; + document.getElementById("ROSNodes").innerHTML = "No Nodes Detected"; + + rosbridgeconnection_badge + console.log(error);192 +}); +// Find out exactly when we made a connection. +ros.on('connection', function() { + console.log('Connection made!'); + document.getElementById("ConnectionIPForm").className = "form-group has-success has-feedback"; + document.getElementById("ConnectionIPInput").value = ros.connectionName; + document.getElementById("ConnectionIPLabel").innerHTML = 'Connection made at:'; + document.getElementById("rosbridgeconnection_badge").innerHTML = 'Connected'; + document.getElementById("ConnectionButton").className = "btn btn-success" + + ros.nodes = []; + ros.topics = []; + +}); + +ros.on('close', function() { + console.log('Connection closed.'); + + document.getElementById("ConnectionIPForm").className = "form-group has-warning has-feedback"; + document.getElementById("ConnectionIPLabel").innerHTML = 'Connection closed'; + document.getElementById("ConnectionButton").className = "btn btn-warning" + document.getElementById("rosbridgeconnection_badge").innerHTML = 'Connection closed'; + ros.nodes = []; + ros.topics = []; +}); +// Create a connection to the rosbridge WebSocket server. +ros.connect(ros.connectionName); + + +/////////////////////////////////////////////////////////////////////////////////// +// Publishers +/////////////////////////////////////////////////////////////////////////////////// + +function publishBagMessage(bagFilename) +{ + var bagMessage = new ROSLIB.Message({ + data : bagFilename + }) + bagPublisher.publish(bagMessage) +} + +//////////////////////////////////////////////////////////////// +// Topics +//////////////////////////////////////////////////////////////// + +var bagPublisher = new ROSLIB.Topic({ + ros : ros, + name : 'bag_publisher', + messageType : 'std_msgs/String' +}); + +var bagNotifier = new ROSLIB.Topic({ + ros : ros, + name : 'bag_notifier', + messageType : 'std_msgs/String' +}); + +//////////////////////////////////////////////////////////////// +// Subscribers +//////////////////////////////////////////////////////////////// + + +bagNotifier.subscribe(function(message) { + if (message.data === "STARTED") { + document.getElementById("recordButtonText").innerHTML = "Stop" + document.getElementById("recordButton").className = "btn btn-danger" + } else { + document.getElementById("recordButtonText").innerHTML = "Start" + document.getElementById("recordButton").className = "btn btn-primary" + } +}); + + +/////////////////////////////////////////////////////////////////////////////////// +// Functions +/////////////////////////////////////////////////////////////////////////////////// + + + +// attept to connect to the ros master from the IP given orgrab it from the form +ros.attemptConnection = function(ipAddress) +{ + if( typeof ipAddress !== "undefined") + { + ros.connectionName = ipAddress; + } + else + { + ros.connectionName = document.getElementById("ConnectionIPInput").value + } + console.log('Connection = ' + ros.connectionName); + ros.connect(ros.connectionName); +} + +function toggleRecording() +{ + document.getElementById("recordButtonText").innerHTML = "Wait" + document.getElementById("recordButton").className = "btn btn-warning" + if (!ros.recording) { + ros.recording = true + publishBagMessage(document.getElementById("recordText").value) + } else { + ros.recording = false + publishBagMessage("STOP") + } +} diff --git a/backend/js/update_guis.js b/backend/js/update_guis.js new file mode 100644 index 0000000..5a60a11 --- /dev/null +++ b/backend/js/update_guis.js @@ -0,0 +1,161 @@ + +ros.topics = []; +ros.nodes = []; + +$("#myImage").click ( function (evt) { + + var jThis = $(this); + var offsetFromParent = jThis.position (); + var topThickness = (jThis.outerHeight(true) - jThis.height() ) / 2; + var leftThickness = (jThis.outerWidth (true) - jThis.width () ) / 2; + + //--- (x,y) coordinates of the mouse click relative to the image. + var x = evt.pageX - offsetFromParent.left - leftThickness; + var y = evt.pageY - offsetFromParent.top - topThickness; + + ReportDims (); + $('#rez').append (' User clicked at: ' + x + ', ' + y + ' (x,y).
') +} ); + + +function ReportDims () { + w = $("#myImage").width (); + h = $("#myImage").height (); + $('#rez').text ('The image is ' + w + ' by ' + h + ' (w by h).'); +} + +ReportDims (); + +function updateVoltage(voltage) +{ + + var voltage_min = 9.5; + var voltage_max = 12.5; + var voltage_range = voltage_max - voltage_min; + + var voltage_percentage = (voltage - voltage_min) / voltage_range * 100; + + var voltage_string = ""; + voltage_string = voltage_string.concat(voltage_percentage); + voltage_string = voltage_string.substring(0,4); + voltage_string = voltage_string.concat('%'); + + document.getElementById("VoltageDisplay").style.width = voltage_string; + document.getElementById("VoltageDisplay").innerHTML = voltage_string; + + if (voltage_percentage < 50 && voltage_percentage > 25 ) { + document.getElementById("VoltageDisplay").className = "progress-bar progress-bar-warning" + } + else if ( voltage_percentage <= 25) + { + document.getElementById("VoltageDisplay").className = "progress-bar progress-bar-danger" + var sound = document.getElementById("audio"); + sound.play() + console.log("Pay Sound") + } + else + { + document.getElementById("VoltageDisplay").className = "progress-bar progress-bar-success" + } +}; + +function updateTopicsGUI() +{ + + ros.getTopics(function(result) + { + ros.topics = result; + } + ); + + var topics = ros.topics; + + topics.sort(); + if(topics != null){ + var innerHTML = ""; + for (var i = 0; i < topics.length; i++ ) + { + innerHTML = innerHTML.concat(generateCheckbox(topics[i])); + } + document.getElementById("ROSTopics").innerHTML = innerHTML; + } + +}; + +function generateCheckbox(name) +{ + var str = ""); + return str; +}; + +function updateNodesGUI() +{ + + ros.getNodes(function(result) + { + ros.nodes = result; + }); + + var nodes = ros.nodes; + nodes.sort() + + if(nodes != null){ + var innerHTML = ""; + for (var i = 0; i < nodes.length; i++ ) + { + innerHTML = innerHTML.concat(nodes[i]); + innerHTML = innerHTML.concat("
"); + + } + document.getElementById("ROSNodes").innerHTML = innerHTML; + } + +}; + +window.setInterval(function(){ + updateTopicsGUI() + updateNodesGUI() +}, 500); + +function validateForm() +{ + ros.attemptConnection(); + return false; +}; + +function addInputsForConnection() +{ + + var innerHTML = ""; + + for (var i = 0; i < ros.connectioninfo.length; i ++) + { + + console.log(ros.connectioninfo[i]) + el = document.getElementById("ConnectionInformation") + + innerHTML = innerHTML.concat(""); + innerHTML = innerHTML.concat("") + innerHTML = innerHTML.concat("") + if(i >0 && i < 4) + { + innerHTML = innerHTML.concat(".") + } + + + } + el.innerHTML = innerHTML; + + console.log(innerHTML) + + +} + + + + + diff --git a/index.html b/index.html index c8898ed..feec01f 100644 --- a/index.html +++ b/index.html @@ -19,10 +19,12 @@ Tutorials can be found here: http://www.w3schools.com/bootstrap/default.asp - + - - + + + + @@ -88,9 +90,9 @@ Tutorials can be found here: http://www.w3schools.com/bootstrap/default.asp - + - + @@ -114,7 +116,7 @@ Tutorials can be found here: http://www.w3schools.com/bootstrap/default.asp- +-+diff --git a/robot_display.html b/robot_display.html index 984088c..8967f9d 100644 --- a/robot_display.html +++ b/robot_display.html @@ -1,3 +1,14 @@ + + + +N/AClick in the actual image. Relative coordinates will be displayed.
+ +++ + + +
@@ -43,11 +54,6 @@ Camera Image---- -
![]()