Skip to content

Instantly share code, notes, and snippets.

@WestsideRobotics
Last active April 28, 2024 16:41
Show Gist options
  • Save WestsideRobotics/3ecc0c75bc83f7071223d0048780c27b to your computer and use it in GitHub Desktop.
Save WestsideRobotics/3ecc0c75bc83f7071223d0048780c27b to your computer and use it in GitHub Desktop.
This FTC Blocks OpMode allows testing various levels of webcam Exposure, for AprilTag recognition and pose estimation.
<xml xmlns="https://developers.google.com/blockly/xml">
<variables>
<variable id="l)/,LjA`jR!1Nc@Z:`l!">myAprilTagDetections</variable>
<variable type="AprilTagProcessor.Builder" id="NYqOu)Ei(Q{C!f;y!a^O">myAprilTagProcessorBuilder</variable>
<variable id="*E2F6dugh`@+u^%kq9bF">exposureValue</variable>
<variable id="?.?jAjDXaP~!^(jq/Ls_">myAprilTagProcessor</variable>
<variable id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</variable>
<variable id="a|Cc6|)#ZmPpqBY#O{9=">myExposureControl</variable>
<variable id="2CV%1JkpcRmLU91EIz(5">EXPOSURE_INCREMENT</variable>
<variable type="VisionPortal.Builder" id="wx@xgbnS_]b0DQL.08Qg">myVisionPortalBuilder</variable>
<variable id="Xk!_{IPng0#/P|7dx?3N">myVisionPortal</variable>
<variable id="^~oaS%=j^!4m#2{DCX@8">MINIMUM_EXPOSURE</variable>
<variable id="lToY?l~y5f2MjxY0a8RG">MAXIMUM_EXPOSURE</variable>
</variables>
<block type="procedures_defnoreturn" id="WtpyD@tEu+EoY=P9iY,D" deletable="false" x="25" y="314">
<field name="NAME">runOpMode</field>
<comment pinned="true" h="549.9871215820312" w="769.4212646484375">This OpMode allows testing various levels of webcam Exposure, for AprilTag recognition and pose estimation.
Exposure varies with the amount of time that the webcam shutter is open, allowing light to enter. It's measured here in MILLISECONDS.
Starting with the FTC Sample OpMode called ConceptAprilTag, commands were added to manage Exposure with a gamepad (Dpad up and down).
These controls are available in INIT, using the DS Camera Stream for human viewing of the webcam image and any AprilTag annotation/overlay (colored rectangle indicating recognition and pose availability).
During INIT, before touching the START arrow, the user can enter and exit Camera Stream as usual, toggling between (a) viewing the image (tap to refresh) and (b) viewing pose Telemetry and adjusting the Exposure value using a gamepad (always disabled during Camera Stream).
After touching the START arrow, the gamepad control still works, but DS Camera Stream is not available. The DS screen shows only the changing Exposure value and its effect on AprilTag recognition (pose Telemetry). The RC preview (called LiveView) does show the webcam image; it can be displayed on an HDMI monitor plugged into the Control Hub, or on a Wi-Fi connected laptop via `scrcpy`.
This v01 can be used as a standalone test OpMode during a "lighting calibration" session on the competition field. Or these v01 controls can be placed in the INIT section of a team's existing Autonomous OpMode, adjusting the Exposure value to be used in that run of the full OpMode.
Questions and comments: westsiderobotics@verizon.net</comment>
<data>{"commentPositionLeft":-23,"commentPositionTop":-642}</data>
<statement name="STACK">
<block type="procedures_callnoreturn" id="f5VC4xOrYYZrGzpFY}@G">
<mutation name="initAprilTag"/>
<comment pinned="false" h="60" w="270">Initialize AprilTag before waitForStart.</comment>
<data>{"commentPositionLeft":-67,"commentPositionTop":-85}</data>
<next>
<block type="procedures_callnoreturn" id="O8X`v$s_sAB2@k,lnB{C">
<mutation name="intialize Exposure Control"/>
<next>
<block type="comment" id="/TX8,^RvHuP6X%R,Py^^">
<field name="COMMENT">Briefly show user how to view DS Camera Stream.</field>
<next>
<block type="telemetry_addTextData_All" id="Y/b(p3p_Ls7l_.)bQt%8">
<value name="KEY">
<shadow type="text" id="]K/@Q[7z:EBSoy.ggFCo">
<field name="TEXT">DS preview on/off</field>
</shadow>
</value>
<value name="TEXT">
<shadow type="text" id="eV-62@bA|1V9{)n7lim2">
<field name="TEXT">3 dots, Camera Stream</field>
</shadow>
</value>
<next>
<block type="telemetry_update" id="YNr,=Fep0,Mr=FE.pn}J">
<comment pinned="false" h="55" w="295">Push telemetry to the Driver Station.</comment>
<data>{"commentPositionLeft":-74,"commentPositionTop":-80}</data>
<next>
<block type="linearOpMode_sleep_Number" id="~wN^+^W1JvQ2)g,th$LV" inline="true">
<comment pinned="false" h="52" w="592">Display the message for a limited time. A longer pause here may crash the OpMode.</comment>
<data>{"commentPositionLeft":-48,"commentPositionTop":-71}</data>
<value name="MILLISECONDS">
<shadow type="math_number" id="1oHCk@v-U[6CG+6k`:cZ">
<field name="NUM">1500</field>
</shadow>
</value>
<next>
<block type="comment" id="8b1C)BE/#``+jF6f]gSH">
<field name="COMMENT">Before touching the START arrow, control Exposure &amp; show Telemetry</field>
<next>
<block type="controls_whileUntil" id="yxr6V;MY5OPb2PST$e@L">
<field name="MODE">WHILE</field>
<value name="BOOL">
<block type="linearOpMode_opModeInInit" id="kB[qeb#n?F#J]Xcp8B87"/>
</value>
<statement name="DO">
<block type="procedures_callnoreturn" id="fR{o#5c7W6|m*Fi3[)A.">
<mutation name="control Exposure"/>
<next>
<block type="procedures_callnoreturn" id="(+tOp{hSAabnz!-]JY=o">
<mutation name="telemetryAprilTag"/>
<next>
<block type="telemetry_update" id="m?G^P{(iCD^1#_u9t{Ag">
<comment pinned="false" h="55" w="295">Push telemetry to the Driver Station.</comment>
<data>{"commentPositionLeft":-74,"commentPositionTop":-80}</data>
<next>
<block type="linearOpMode_sleep_Number" id="b#Z4DTtat38}{t=?vw1x" inline="true">
<comment pinned="false" h="46" w="191">Share the CPU.</comment>
<data>{"commentPositionLeft":-48,"commentPositionTop":-71}</data>
<value name="MILLISECONDS">
<shadow type="math_number" id="c8}@Bnz%:0_G,6_,EgsR">
<field name="NUM">20</field>
</shadow>
</value>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</statement>
<next>
<block type="linearOpMode_waitForStart" id=":`$wN_ci`O;o6P0~.(+g">
<next>
<block type="controls_if" id="}Q?5mbxSO8Di;i!__6[y">
<value name="IF0">
<block type="linearOpMode_opModeIsActive" id=")o%YFX/#9kvv^sgXr4~5"/>
</value>
<statement name="DO0">
<block type="comment" id="(rU-p_T_/B|vExcs}liL">
<field name="COMMENT">After touching the START arrow, control Exposure &amp; show Telemetry</field>
<next>
<block type="controls_whileUntil" id="^0Kagy/e+Ea{rbZPv2G6">
<field name="MODE">WHILE</field>
<value name="BOOL">
<block type="linearOpMode_opModeIsActive" id="e)cr{!2VIET83s,JWC.="/>
</value>
<statement name="DO">
<block type="procedures_callnoreturn" id="9us30^D=BjCs8C9X:mg^">
<mutation name="control Exposure"/>
<next>
<block type="procedures_callnoreturn" id="L1~6q-w9m`2ahlT|b!@A">
<mutation name="telemetryAprilTag"/>
<next>
<block type="telemetry_update" id="exvivmft-pX$n!1,8Ea$">
<comment pinned="false" h="55" w="295">Push telemetry to the Driver Station.</comment>
<next>
<block type="linearOpMode_sleep_Number" id="jjoCwI:;J87CrtGs%}K7" inline="true">
<comment pinned="false" h="46" w="191">Share the CPU.</comment>
<data>{"commentPositionLeft":-48,"commentPositionTop":-71}</data>
<value name="MILLISECONDS">
<shadow type="math_number" id="w~.7$M*lJeh#@I/xsbHy">
<field name="NUM">20</field>
</shadow>
</value>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</statement>
</block>
</next>
</block>
</statement>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</statement>
</block>
<block type="procedures_defnoreturn" id="O-|)|IuNl7!Gm4Ne)goe" x="597" y="382">
<field name="NAME">intialize Exposure Control</field>
<comment pinned="true" h="46" w="320">Initialize Exposure Control for the webcam.</comment>
<data>{"commentPositionLeft":-45,"commentPositionTop":-78}</data>
<statement name="STACK">
<block type="comment" id="724^u$vv7lDaqkLLE;U,">
<field name="COMMENT">Allow time for the streaming to begin.</field>
<next>
<block type="linearOpMode_sleep_Number" id="6*_IPf}V21v%-IS7$|A+" inline="true">
<comment pinned="false" h="70" w="453">Allow time for streaming to begin, before using any Camera Controls. This wait can be less than 1000 milliseconds.</comment>
<data>{"commentPositionLeft":-48,"commentPositionTop":-71}</data>
<value name="MILLISECONDS">
<shadow type="math_number" id="^UXS:i{)h:`;+XFL_H.Q">
<field name="NUM">1000</field>
</shadow>
</value>
<next>
<block type="comment" id="D9vDeBDS-``@pZyuwgJO">
<field name="COMMENT">Create an ExposureControl object for this VisionPortal.</field>
<next>
<block type="variables_set" id="{_V9W/)CK}o5=3}y@w.U">
<field name="VAR" id="a|Cc6|)#ZmPpqBY#O{9=">myExposureControl</field>
<value name="VALUE">
<block type="visionPortal_getExposureControl" id="J]|Ldi0L=H|Kj+TLsFKO">
<comment pinned="false" h="150" w="325">Get the ExposureControl object, to allow adjusting the camera's exposure.</comment>
<value name="VISION_PORTAL">
<block type="variables_get" id=".:xq3C^CRf|/_tCC3y6+">
<field name="VAR" id="Xk!_{IPng0#/P|7dx?3N">myVisionPortal</field>
</block>
</value>
</block>
</value>
<next>
<block type="comment" id="`QDH?i=_h2e@K#c.T4F]">
<field name="COMMENT">Set to Manual Mode, to allow direct control of the Exposure value.</field>
<next>
<block type="exposureControl_setMode" id="qvRJd)CpltC^!3$5QvLw">
<mutation has_output="false"/>
<comment pinned="false" h="35" w="224">Set the exposure mode value.</comment>
<data>{"commentPositionLeft":277,"commentPositionTop":-37}</data>
<value name="EXPOSURE_CONTROL">
<block type="variables_get" id="/DEDA#7}w1f^|N2z59!q">
<field name="VAR" id="a|Cc6|)#ZmPpqBY#O{9=">myExposureControl</field>
</block>
</value>
<value name="MODE">
<shadow type="exposureControl_typedEnum_mode" id="5:g4KRW*Ff{oGZ{gZ/kR">
<field name="MODE">Manual</field>
</shadow>
</value>
<next>
<block type="comment" id="we5L%R~!H[ZW6Oh]lL0v">
<field name="COMMENT">Initialize the Exposure variable to the webcam's current value (may be factory default, or remembered from a previous run).</field>
<next>
<block type="variables_set" id="1m@lc=?Iz#.B{Pu]*PJ.">
<field name="VAR" id="*E2F6dugh`@+u^%kq9bF">exposureValue</field>
<comment pinned="false" h="159" w="433">Set the starting Exposure value to the webcam's current value (may be factory default, or remembered from a previous run).
As an alternate, could set the starting Exposure value to a certain number, to begin each run of this test OpMode. Namely, disregard any previous manual setting.</comment>
<data>{"commentPositionLeft":8,"commentPositionTop":-246}</data>
<value name="VALUE">
<block type="exposureControl_getExposure" id="1l#Bw;#n9AzwbD6*2p6W">
<field name="FUNC">getExposure</field>
<comment pinned="false" h="150" w="325">Get the current (or minimum or maximum) exposure.</comment>
<value name="EXPOSURE_CONTROL">
<block type="variables_get" id="Yf^D9,$y-7.YA]},c.t+">
<field name="VAR" id="a|Cc6|)#ZmPpqBY#O{9=">myExposureControl</field>
</block>
</value>
<value name="TIME_UNIT">
<shadow type="misc_typedEnum_TimeUnit" id="*ikUFwb%+A?AH/YX9.QG">
<field name="TIME_UNIT">MILLISECONDS</field>
</shadow>
</value>
</block>
</value>
<next>
<block type="comment" id="e?|z8tA{3LrSh,LD`K*K">
<field name="COMMENT">Record the minimum and maximum Exposure values supported by this webcam.</field>
<next>
<block type="variables_set" id="ueZ1X12+w_)c-~}iHpI4">
<field name="VAR" id="^~oaS%=j^!4m#2{DCX@8">MINIMUM_EXPOSURE</field>
<value name="VALUE">
<block type="exposureControl_getExposure" id="{O40_%IeENl{GfJwmzvT">
<field name="FUNC">getMinExposure</field>
<comment pinned="false" h="150" w="325">Get the current (or minimum or maximum) exposure.</comment>
<value name="EXPOSURE_CONTROL">
<block type="variables_get" id="%jV{QH#pLUOl[6XYk9VG">
<field name="VAR" id="a|Cc6|)#ZmPpqBY#O{9=">myExposureControl</field>
</block>
</value>
<value name="TIME_UNIT">
<shadow type="misc_typedEnum_TimeUnit" id="ghwG@g$/N,kc;V.I[NI*">
<field name="TIME_UNIT">MILLISECONDS</field>
</shadow>
</value>
</block>
</value>
<next>
<block type="variables_set" id="#W3WN2T?({Y!55ZlKmB4">
<field name="VAR" id="lToY?l~y5f2MjxY0a8RG">MAXIMUM_EXPOSURE</field>
<value name="VALUE">
<block type="exposureControl_getExposure" id="^6lt$4Q/Rk{A+JvuUxq-">
<field name="FUNC">getMaxExposure</field>
<comment pinned="false" h="150" w="325">Get the current (or minimum or maximum) exposure.</comment>
<value name="EXPOSURE_CONTROL">
<block type="variables_get" id="f3{KR:8/yHkb6,Do$K+%">
<field name="VAR" id="a|Cc6|)#ZmPpqBY#O{9=">myExposureControl</field>
</block>
</value>
<value name="TIME_UNIT">
<shadow type="misc_typedEnum_TimeUnit" id="kbCCAAo%g?DB32eYNTQ=">
<field name="TIME_UNIT">MILLISECONDS</field>
</shadow>
</value>
</block>
</value>
<next>
<block type="comment" id="yUXzp#k(*{XYbx,_q-OF">
<field name="COMMENT">Set the "speed" or increment of Exposure adjustment with each loop of the OpMode.</field>
<next>
<block type="variables_set" id="U$${6@sg?c,O(fhfO(QF">
<field name="VAR" id="2CV%1JkpcRmLU91EIz(5">EXPOSURE_INCREMENT</field>
<value name="VALUE">
<block type="math_number" id="y@k4gsS=mGFYwT1g$CEi">
<field name="NUM">5</field>
</block>
</value>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</statement>
</block>
<block type="procedures_defnoreturn" id="j(obQbP%/*u;Y!sl`#b:" x="1496" y="400">
<field name="NAME">control Exposure</field>
<comment pinned="true" h="46" w="268">Control Exposure with Gamepad 1.</comment>
<data>{"commentPositionLeft":-44,"commentPositionTop":-92}</data>
<statement name="STACK">
<block type="comment" id="TGP5L?KfUemC[9Xc=mG4">
<field name="COMMENT">Manually adjust the Exposure value.</field>
<next>
<block type="controls_if" id="I27~/Z1;8sZv6H3~j8}+">
<mutation elseif="1"/>
<value name="IF0">
<block type="gamepad_getProperty_Boolean" id="Xu_-xXifU#_yM[u`;sIp">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">DpadUp</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
<statement name="DO0">
<block type="math_change" id="zFcPGnJi?lKXmL,qbThc">
<field name="VAR" id="*E2F6dugh`@+u^%kq9bF">exposureValue</field>
<value name="DELTA">
<shadow type="math_number" id="9Wq{#^^96J][?z9};q7d">
<field name="NUM">1</field>
</shadow>
<block type="variables_get" id="7:D-o_d%d!;vZnY=qPVj">
<field name="VAR" id="2CV%1JkpcRmLU91EIz(5">EXPOSURE_INCREMENT</field>
</block>
</value>
</block>
</statement>
<value name="IF1">
<block type="gamepad_getProperty_Boolean" id="92+G1uD])*gN#,}(K8VL">
<field name="IDENTIFIER">gamepad1</field>
<field name="PROP">DpadDown</field>
<data>{"IDENTIFIER":"gamepad1"}</data>
</block>
</value>
<statement name="DO1">
<block type="math_change" id="q.K;TlKCUJ1L}0:j9]L5">
<field name="VAR" id="*E2F6dugh`@+u^%kq9bF">exposureValue</field>
<value name="DELTA">
<shadow type="math_number" id="?)2]+_Zw^0(x+#wM~(Ih">
<field name="NUM">-1</field>
</shadow>
<block type="math_single" id="[ygCZA],j/,D}/0*G*3H">
<field name="OP">NEG</field>
<value name="NUM">
<shadow type="math_number" id="Ahky%ic=8H-M})9T~ZMM">
<field name="NUM">9</field>
</shadow>
<block type="variables_get" id="=eB$J(sy*)@U(8FNR]uR">
<field name="VAR" id="2CV%1JkpcRmLU91EIz(5">EXPOSURE_INCREMENT</field>
</block>
</value>
</block>
</value>
</block>
</statement>
<next>
<block type="comment" id="p6Q0HdmZ;7G7YIgmLwD:">
<field name="COMMENT">Keep the Exposure value within the limits of this webcam.</field>
<next>
<block type="variables_set" id="1/|p+dAm;/P}WYOi!,z~">
<field name="VAR" id="*E2F6dugh`@+u^%kq9bF">exposureValue</field>
<value name="VALUE">
<block type="math_constrain" id="-]g95E9oEngj.*yi/`no" inline="false">
<value name="VALUE">
<shadow type="math_number" id="GB/6g$hRC:vfs$JqWHFF">
<field name="NUM">50</field>
</shadow>
<block type="variables_get" id="8v0b3UdpG~KMXOx8jgoG">
<field name="VAR" id="*E2F6dugh`@+u^%kq9bF">exposureValue</field>
</block>
</value>
<value name="LOW">
<shadow type="math_number" id="gCrrvIP=ry,!^SSB!XFC">
<field name="NUM">1</field>
</shadow>
<block type="variables_get" id="gLM$@Fnr;THW(n@-_q#V">
<field name="VAR" id="^~oaS%=j^!4m#2{DCX@8">MINIMUM_EXPOSURE</field>
</block>
</value>
<value name="HIGH">
<shadow type="math_number" id="K`PoDa-^;A8E{2MI#@P{">
<field name="NUM">100</field>
</shadow>
<block type="variables_get" id="Fn!M?``CgyULL4(#C-8q">
<field name="VAR" id="lToY?l~y5f2MjxY0a8RG">MAXIMUM_EXPOSURE</field>
</block>
</value>
</block>
</value>
<next>
<block type="comment" id="vWH,I3kxrE;18:sr@iPb">
<field name="COMMENT">Add DS Telemetry for the adjusted Exposure value.</field>
<next>
<block type="telemetry_addNumericData_Number" id="?89z`afP1;isGv0q7flH">
<value name="KEY">
<shadow type="text" id="qmB195w_pc*1Q0ikQ6^_">
<field name="TEXT">EXPOSURE VALUE</field>
</shadow>
</value>
<value name="NUMBER">
<shadow type="math_number" id="c9]?JZ%1in7uEzK=D560">
<field name="NUM">123</field>
</shadow>
<block type="variables_get" id="aI.H*uz_:GB7uGVw;H;L">
<field name="VAR" id="*E2F6dugh`@+u^%kq9bF">exposureValue</field>
</block>
</value>
<next>
<block type="telemetry_addLine" id="kzb}q#+0ubmB2O{~rF`W">
<value name="TEXT">
<shadow type="text" id="+wzhc1:a!rf(Nj9wT/~Z">
<field name="TEXT"/>
</shadow>
</value>
<next>
<block type="comment" id="p^+LIwn@M7#p_DQ4J1kw">
<field name="COMMENT">Set the webcam's Exposure using the adjusted variable.</field>
<next>
<block type="exposureControl_setExposure" id="2U.8|[HlWm^9]C:yY:CA">
<mutation has_output="false"/>
<comment pinned="false" h="150" w="325">Set the exposure.</comment>
<data>{"commentPositionLeft":-81,"commentPositionTop":-175}</data>
<value name="EXPOSURE_CONTROL">
<block type="variables_get" id="-#V5ueAZG2?gg_YxB2Ed">
<field name="VAR" id="a|Cc6|)#ZmPpqBY#O{9=">myExposureControl</field>
</block>
</value>
<value name="DURATION">
<shadow type="math_number" id="@3.u?hXRuxS83I0di,W@">
<field name="NUM">30</field>
</shadow>
<block type="variables_get" id="s;$i-JDPQkm-F=.R]Z@K">
<field name="VAR" id="*E2F6dugh`@+u^%kq9bF">exposureValue</field>
</block>
</value>
<value name="TIME_UNIT">
<shadow type="misc_typedEnum_TimeUnit" id="Ra7Ep$[N5Gz#D)~=STSH">
<field name="TIME_UNIT">MILLISECONDS</field>
</shadow>
</value>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</statement>
</block>
<block type="procedures_defnoreturn" id=":Un!nS!LS%^tq]:g4^?Z" x="26" y="1060">
<field name="NAME">initAprilTag</field>
<comment pinned="false" h="40" w="277">Initialize AprilTag Detection.</comment>
<data>{"commentPositionLeft":-48,"commentPositionTop":-62}</data>
<statement name="STACK">
<block type="comment" id="Z#tr,B$;l$RV0)j4q0n.">
<field name="COMMENT">First, create an AprilTagProcessor.Builder.</field>
<next>
<block type="aprilTagProcessorBuilder_create_assign" id="]gR@^J/H_v)OY6f[`3z5">
<field name="APRIL_TAG_PROCESSOR_BUILDER" id="NYqOu)Ei(Q{C!f;y!a^O" variabletype="AprilTagProcessor.Builder">myAprilTagProcessorBuilder</field>
<next>
<block type="comment" id="-dkxGvL2:a(h8n8Mok-i">
<field name="COMMENT">Create an AprilTagProcessor by calling build.</field>
<next>
<block type="variables_set" id="$.wt,WCD1s5fSqROQT*(">
<field name="VAR" id="?.?jAjDXaP~!^(jq/Ls_">myAprilTagProcessor</field>
<value name="VALUE">
<block type="aprilTagProcessorBuilder_build" id="3Vk~@]VGDELD;GHGgEgn">
<field name="APRIL_TAG_PROCESSOR_BUILDER" id="NYqOu)Ei(Q{C!f;y!a^O" variabletype="AprilTagProcessor.Builder">myAprilTagProcessorBuilder</field>
</block>
</value>
<next>
<block type="comment" id="w{nzs#L5ZbP.GKW2S`x_">
<field name="COMMENT">Next, create a VisionPortal.Builder and set attributes related to the camera.</field>
<next>
<block type="visionPortalBuilder_create_assign" id="s1^/ZS*LG[dC%CsYcl=%">
<field name="VISION_PORTAL_BUILDER" id="wx@xgbnS_]b0DQL.08Qg" variabletype="VisionPortal.Builder">myVisionPortalBuilder</field>
<next>
<block type="visionPortalBuilder_setCamera" id="h;`Yd}]R=F.Fw89p`1N/">
<field name="VISION_PORTAL_BUILDER" id="wx@xgbnS_]b0DQL.08Qg" variabletype="VisionPortal.Builder">myVisionPortalBuilder</field>
<comment pinned="false" h="68" w="247">Use a webcam.</comment>
<value name="CAMERA">
<shadow type="navigation_webcamName" id="b`AjugjMrzm855@U*q;W">
<field name="WEBCAM_NAME">Webcam 1</field>
</shadow>
</value>
<next>
<block type="comment" id="-QJd~|I/HUP84GR.F=0N">
<field name="COMMENT">Add myAprilTagProcessor to the VisionPortal.Builder.</field>
<next>
<block type="visionPortalBuilder_addProcessor" id="`A$k?7nl@kd=7y*v@/+-">
<field name="VISION_PORTAL_BUILDER" id="wx@xgbnS_]b0DQL.08Qg" variabletype="VisionPortal.Builder">myVisionPortalBuilder</field>
<value name="VISION_PROCESSOR">
<block type="variables_get" id="HoXmAtlB7{ai0YF!ZyTl">
<field name="VAR" id="?.?jAjDXaP~!^(jq/Ls_">myAprilTagProcessor</field>
</block>
</value>
<next>
<block type="comment" id="6Q2EYFS^A(u/rVLX*nI}">
<field name="COMMENT">Create a VisionPortal by calling build.</field>
<next>
<block type="variables_set" id="UggZXj@UuhBf97)(oA;m">
<field name="VAR" id="Xk!_{IPng0#/P|7dx?3N">myVisionPortal</field>
<value name="VALUE">
<block type="visionPortalBuilder_build" id="OBOV:tKH!^AaYsI{A$~x">
<field name="VISION_PORTAL_BUILDER" id="wx@xgbnS_]b0DQL.08Qg" variabletype="VisionPortal.Builder">myVisionPortalBuilder</field>
</block>
</value>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</statement>
</block>
<block type="procedures_defnoreturn" id="Eg%7GTPuhcoA]FCw9:]O" x="763" y="1067">
<field name="NAME">telemetryAprilTag</field>
<comment pinned="false" h="40" w="380">Display info (using telemetry) for a recognized AprilTag.</comment>
<data>{"commentPositionLeft":-47,"commentPositionTop":-60}</data>
<statement name="STACK">
<block type="variables_set" id="c8~R@@~J_)0dhTTP,GP@">
<field name="VAR" id="l)/,LjA`jR!1Nc@Z:`l!">myAprilTagDetections</field>
<comment pinned="false" h="80" w="160">Get a list of AprilTag detections.</comment>
<value name="VALUE">
<block type="aprilTagProcessor_getDetections" id="^Sth`xX=n79Q8`P*Z#qt">
<value name="APRIL_TAG_PROCESSOR">
<block type="variables_get" id="Icn).;@XjTI7SR.j$UY#">
<field name="VAR" id="?.?jAjDXaP~!^(jq/Ls_">myAprilTagProcessor</field>
</block>
</value>
</block>
</value>
<next>
<block type="telemetry_addTextData_All" id="3m5}jTks8BeMJ]|.h*Kp">
<value name="KEY">
<shadow type="text" id="MNA3Pe{~9.uc1dSMmO=j">
<field name="TEXT"># AprilTags Detected</field>
</shadow>
</value>
<value name="TEXT">
<shadow type="text" id="DRWu-r*O-0eJ4pG2n$_l">
<field name="TEXT"/>
</shadow>
<block type="lists_length" id="q{bEB[P*p2XiVOMj*ku#">
<value name="VALUE">
<block type="variables_get" id="/5v#48C2W5M+l:4)g!zX">
<field name="VAR" id="l)/,LjA`jR!1Nc@Z:`l!">myAprilTagDetections</field>
</block>
</value>
</block>
</value>
<next>
<block type="controls_forEach" id="|@Y$y8D~],V(MRQ+Cyv{">
<field name="VAR" id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</field>
<comment pinned="false" h="81" w="199">Iterate through list and call a function to display info for each recognized AprilTag.</comment>
<value name="LIST">
<block type="variables_get" id="W,d1s!eFWeDT0X}~eq,n">
<field name="VAR" id="l)/,LjA`jR!1Nc@Z:`l!">myAprilTagDetections</field>
</block>
</value>
<statement name="DO">
<block type="comment" id="U@Dkpel-LMa.00jJsqA-">
<field name="COMMENT">Display info about the detection.</field>
<next>
<block type="telemetry_addLine" id="qrKb?#/HMYJo.RhU8rW:">
<value name="TEXT">
<shadow type="text" id="3^Lv-r.jG6}7LV;(yIh.">
<field name="TEXT"/>
</shadow>
</value>
<next>
<block type="controls_if" id="1KHSCf_sX!Qd~BKfG}QD">
<mutation else="1"/>
<value name="IF0">
<block type="aprilTagDetection_getProperty_IsNotNull" id=":^$lP:Ut!p3Z)E+vy^]D">
<field name="PROP">metadata</field>
<value name="APRIL_TAG_DETECTION">
<block type="variables_get" id="9Lq*6VTlT$7uDRiB|mYe">
<field name="VAR" id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</field>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="telemetry_addLine" id="awB~K!HjEb=h6tM,%vLN">
<value name="TEXT">
<shadow type="text" id="?hM/$PX}4MN:|W`joKgn">
<field name="TEXT"/>
</shadow>
<block type="text_join" id="0C_x2#T#t7yl!%45k{$?">
<mutation items="4"/>
<value name="ADD0">
<block type="text" id="buEo7p[-2T4:49=`uwK1">
<field name="TEXT">==== (ID </field>
</block>
</value>
<value name="ADD1">
<block type="aprilTagDetection_getProperty_Number" id="lifbVBMNn+.1j?y6v54X">
<field name="PROP">id</field>
<value name="APRIL_TAG_DETECTION">
<block type="variables_get" id="w(63KWmGiZ83+qITBep;">
<field name="VAR" id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</field>
</block>
</value>
</block>
</value>
<value name="ADD2">
<block type="text" id="=n-]].djPxb,OFyxcOQF">
<field name="TEXT">) </field>
</block>
</value>
<value name="ADD3">
<block type="aprilTagDetection_getProperty_String" id="=AvXMAjUic3u3lbFtEt4">
<field name="PROP">metadata.name</field>
<value name="APRIL_TAG_DETECTION">
<block type="variables_get" id="zKHYs.Y87Qrl9%G~Oq^V">
<field name="VAR" id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</field>
</block>
</value>
</block>
</value>
</block>
</value>
<next>
<block type="telemetry_addLine" id=";grqK`+-g7;g50c=|L0l">
<value name="TEXT">
<shadow type="text" id="!y]i-sUsabeyV/)u=6D5">
<field name="TEXT"/>
</shadow>
<block type="text_join" id="4TtGi;Z(gbFaks}Eap^9">
<mutation items="7"/>
<value name="ADD0">
<block type="text" id="+]Cns+.i=%b0bFaT6;NI">
<field name="TEXT">XYZ </field>
</block>
</value>
<value name="ADD1">
<block type="misc_formatNumber_withWidth" id="df*#gw3iYx$kvL$9{Y?m">
<value name="NUMBER">
<shadow type="math_number" id="g`p?z|x@JeU%MJ4.tSFQ">
<field name="NUM">3.14159265</field>
</shadow>
<block type="aprilTagDetection_getProperty_Number" id="jUN`u.6t[:O8`9Ncql]!">
<field name="PROP">ftcPose.x</field>
<value name="APRIL_TAG_DETECTION">
<block type="variables_get" id="mb(6}~t}KLoi4`XT~d:H">
<field name="VAR" id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</field>
</block>
</value>
</block>
</value>
<value name="WIDTH">
<shadow type="math_number" id="k*}!VVn#l8HSq7E2i?#R">
<field name="NUM">6</field>
</shadow>
</value>
<value name="PRECISION">
<shadow type="math_number" id="mh4H+`GE$Em,(iS4ZjPR">
<field name="NUM">1</field>
</shadow>
</value>
</block>
</value>
<value name="ADD2">
<block type="text" id="y34}1aACqw@S]sESt=A#">
<field name="TEXT"> </field>
</block>
</value>
<value name="ADD3">
<block type="misc_formatNumber_withWidth" id="4Oj?ZaC$d#_1X}?b[T.|">
<value name="NUMBER">
<shadow type="math_number" id="2cGf/q9c-ZnJ}LB6C1i$">
<field name="NUM">3.14159265</field>
</shadow>
<block type="aprilTagDetection_getProperty_Number" id="^ZxENE!MDi;z:vW0d@XL">
<field name="PROP">ftcPose.y</field>
<value name="APRIL_TAG_DETECTION">
<block type="variables_get" id="bYyr?K,sa#Z.])=_ot.X">
<field name="VAR" id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</field>
</block>
</value>
</block>
</value>
<value name="WIDTH">
<shadow type="math_number" id="BQJxM*kkA=P:cx1$gjDj">
<field name="NUM">6</field>
</shadow>
</value>
<value name="PRECISION">
<shadow type="math_number" id="$REh~]PUb9LYTO;OfzqZ">
<field name="NUM">1</field>
</shadow>
</value>
</block>
</value>
<value name="ADD4">
<block type="text" id="D7A3=:fGOVPSdci(UQtX">
<field name="TEXT"> </field>
</block>
</value>
<value name="ADD5">
<block type="misc_formatNumber_withWidth" id="FCZL%yFs6[0x{rm0ps54">
<value name="NUMBER">
<shadow type="math_number" id="|j[Xf6X[,{Y~6k#Ow9ay">
<field name="NUM">3.14159265</field>
</shadow>
<block type="aprilTagDetection_getProperty_Number" id="@o/Xx/]f-CWGv|Tr)2Nk">
<field name="PROP">ftcPose.z</field>
<value name="APRIL_TAG_DETECTION">
<block type="variables_get" id="[9!-4|yF{X2|/{iSu:SC">
<field name="VAR" id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</field>
</block>
</value>
</block>
</value>
<value name="WIDTH">
<shadow type="math_number" id="ga,Viu`_|ozkv#5q3*@0">
<field name="NUM">6</field>
</shadow>
</value>
<value name="PRECISION">
<shadow type="math_number" id="(E3-dHVlUbl(~6A~LN[p">
<field name="NUM">1</field>
</shadow>
</value>
</block>
</value>
<value name="ADD6">
<block type="text" id=")9nfo^3]N$S,m~5}*3*=">
<field name="TEXT"> (inch)</field>
</block>
</value>
</block>
</value>
<next>
<block type="telemetry_addLine" id="6W%[*9{;}.5Jl{VBB=*t">
<value name="TEXT">
<shadow type="text" id=";t?`r+|~SzTLUUHO=;M9">
<field name="TEXT"/>
</shadow>
<block type="text_join" id="$$x)e|XJcO*g[Y8~M2/Q">
<mutation items="7"/>
<value name="ADD0">
<block type="text" id="CNSpY2iH=tR#]P,pi4u.">
<field name="TEXT">PRY </field>
</block>
</value>
<value name="ADD1">
<block type="misc_formatNumber_withWidth" id="sht8%%Nn`h2}jwZ`-{x)">
<value name="NUMBER">
<shadow type="math_number" id="?pMQrP+klggGPQ})NZWJ">
<field name="NUM">3.14159265</field>
</shadow>
<block type="aprilTagDetection_getProperty_Number" id="Iy|1o|tQ9/Xq~XhaEN$_">
<field name="PROP">ftcPose.pitch</field>
<value name="APRIL_TAG_DETECTION">
<block type="variables_get" id="rVJim4c8+/ys[,t:o!0a">
<field name="VAR" id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</field>
</block>
</value>
</block>
</value>
<value name="WIDTH">
<shadow type="math_number" id="mHP*I^3G3|9rAiui`;?f">
<field name="NUM">6</field>
</shadow>
</value>
<value name="PRECISION">
<shadow type="math_number" id="VxWPF,FgQz,lDodmj[WR">
<field name="NUM">1</field>
</shadow>
</value>
</block>
</value>
<value name="ADD2">
<block type="text" id="]dbZO?6z_PP)Na=ij|hW">
<field name="TEXT"> </field>
</block>
</value>
<value name="ADD3">
<block type="misc_formatNumber_withWidth" id="!i;Ow5b5|tm]^:f=af8O">
<value name="NUMBER">
<shadow type="math_number" id="xsH[9W8/eLks@vlm]1*g">
<field name="NUM">3.14159265</field>
</shadow>
<block type="aprilTagDetection_getProperty_Number" id="ShLjZCVXxN!~/4l*tkIW">
<field name="PROP">ftcPose.roll</field>
<value name="APRIL_TAG_DETECTION">
<block type="variables_get" id="OCoPF8gE#WFKctf6vd6f">
<field name="VAR" id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</field>
</block>
</value>
</block>
</value>
<value name="WIDTH">
<shadow type="math_number" id="DyJDDqNjyT?RD%Og91T/">
<field name="NUM">6</field>
</shadow>
</value>
<value name="PRECISION">
<shadow type="math_number" id="M?Svc5)[b)Apn186A8Em">
<field name="NUM">1</field>
</shadow>
</value>
</block>
</value>
<value name="ADD4">
<block type="text" id="7-XP1=zX3p(TS(}va$9`">
<field name="TEXT"> </field>
</block>
</value>
<value name="ADD5">
<block type="misc_formatNumber_withWidth" id=":tQhsy?3wU|KpZT;GEux">
<value name="NUMBER">
<shadow type="math_number" id="v%b/#{Uh]xNL*jCpZAlp">
<field name="NUM">3.14159265</field>
</shadow>
<block type="aprilTagDetection_getProperty_Number" id="rr^=wlJCB2_afebAXJ}Z">
<field name="PROP">ftcPose.yaw</field>
<value name="APRIL_TAG_DETECTION">
<block type="variables_get" id="vBZ8!}wPWKb}V3-g]Wle">
<field name="VAR" id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</field>
</block>
</value>
</block>
</value>
<value name="WIDTH">
<shadow type="math_number" id="mu5y,^`sp#UgVsrfnkbc">
<field name="NUM">6</field>
</shadow>
</value>
<value name="PRECISION">
<shadow type="math_number" id="1a@0e%XGstoBjtg)K@p]">
<field name="NUM">1</field>
</shadow>
</value>
</block>
</value>
<value name="ADD6">
<block type="text" id="I*Wn1Gf}j+e`]CP5J0Cp">
<field name="TEXT"> (deg)</field>
</block>
</value>
</block>
</value>
<next>
<block type="telemetry_addLine" id="p~aY/Ief^l:6#%yF5mBb">
<value name="TEXT">
<shadow type="text" id="[:Q^{:f(MSqR]$h@YO_G">
<field name="TEXT">text</field>
</shadow>
<block type="text_join" id="7AAW16ak[E;pRyJ50_pV">
<mutation items="7"/>
<value name="ADD0">
<block type="text" id="_D88fgJh36dZBe#kxQkh">
<field name="TEXT">RBE </field>
</block>
</value>
<value name="ADD1">
<block type="misc_formatNumber_withWidth" id="o=,mI,_W=C-(irqk:S^/">
<value name="NUMBER">
<shadow type="math_number" id="67$:0vchTm|ZAu?yf9Zs">
<field name="NUM">3.14159265</field>
</shadow>
<block type="aprilTagDetection_getProperty_Number" id="V_e8w[RX[YJ6%2RfwTK4">
<field name="PROP">ftcPose.range</field>
<value name="APRIL_TAG_DETECTION">
<block type="variables_get" id="5U:C0C|9gsGJwjwric-u">
<field name="VAR" id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</field>
</block>
</value>
</block>
</value>
<value name="WIDTH">
<shadow type="math_number" id="E}T84I!akJTmE1gb#KTc">
<field name="NUM">6</field>
</shadow>
</value>
<value name="PRECISION">
<shadow type="math_number" id="UKUfpg-DJ~rM||Pp1;?~">
<field name="NUM">1</field>
</shadow>
</value>
</block>
</value>
<value name="ADD2">
<block type="text" id="/)!A!j+m`c^.RSzJfnW8">
<field name="TEXT"> </field>
</block>
</value>
<value name="ADD3">
<block type="misc_formatNumber_withWidth" id="v,Ilg5bR5*;(#^l3B@-0">
<value name="NUMBER">
<shadow type="math_number" id="%)S}?+}8]#C5YOJMTtIz">
<field name="NUM">3.14159265</field>
</shadow>
<block type="aprilTagDetection_getProperty_Number" id="}bh%9Kz6)u_zYo7,L]Iq">
<field name="PROP">ftcPose.bearing</field>
<value name="APRIL_TAG_DETECTION">
<block type="variables_get" id="B6P^H@vWo+vyX@sYn_ik">
<field name="VAR" id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</field>
</block>
</value>
</block>
</value>
<value name="WIDTH">
<shadow type="math_number" id="5ti##om.fc`N4y~4C#;|">
<field name="NUM">6</field>
</shadow>
</value>
<value name="PRECISION">
<shadow type="math_number" id="22o;=,7*otM:5h`-4L|A">
<field name="NUM">1</field>
</shadow>
</value>
</block>
</value>
<value name="ADD4">
<block type="text" id="Q|e}m1um|X;(#X^F`wb(">
<field name="TEXT"> </field>
</block>
</value>
<value name="ADD5">
<block type="misc_formatNumber_withWidth" id="x-{*.Ghd4zinz}U9X3?V">
<value name="NUMBER">
<shadow type="math_number" id=".MdJRQ6rUBU)RFzD8T%o">
<field name="NUM">3.14159265</field>
</shadow>
<block type="aprilTagDetection_getProperty_Number" id="D(K1+O}E+Y7i_ek8}A?z">
<field name="PROP">ftcPose.elevation</field>
<value name="APRIL_TAG_DETECTION">
<block type="variables_get" id="sv;lYz!5q^E[A|N14(.X">
<field name="VAR" id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</field>
</block>
</value>
</block>
</value>
<value name="WIDTH">
<shadow type="math_number" id="GU73O^@;SXL))%*l[8Me">
<field name="NUM">6</field>
</shadow>
</value>
<value name="PRECISION">
<shadow type="math_number" id="4Nv)-M9MfCY%aAn:1SEF">
<field name="NUM">1</field>
</shadow>
</value>
</block>
</value>
<value name="ADD6">
<block type="text" id="x`,kpt}.uw,YSWON!D^j">
<field name="TEXT"> (inch, deg, deg)</field>
</block>
</value>
</block>
</value>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</statement>
<statement name="ELSE">
<block type="telemetry_addLine" id=".k7)ZU|.JU[vLM%.9oWH">
<value name="TEXT">
<shadow type="text" id="hqwM9[:8R6P;nJWo`z$@">
<field name="TEXT"/>
</shadow>
<block type="text_join" id="Q$XL59m.y(HLLD=Lb6bM">
<mutation items="3"/>
<value name="ADD0">
<block type="text" id="GO{s|1|cjZX5wm!s}6^U">
<field name="TEXT">==== (ID </field>
</block>
</value>
<value name="ADD1">
<block type="aprilTagDetection_getProperty_Number" id="YbKMT]1!N/1orH}f.`^%">
<field name="PROP">id</field>
<value name="APRIL_TAG_DETECTION">
<block type="variables_get" id="*DZMa]u.xVDWo54-+9Xp">
<field name="VAR" id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</field>
</block>
</value>
</block>
</value>
<value name="ADD2">
<block type="text" id="Ej2sUV*ZReT^:zwt~{Ar">
<field name="TEXT">) Unknown</field>
</block>
</value>
</block>
</value>
<next>
<block type="telemetry_addLine" id="*wewMc^H[$Rs0;EK}Ow]">
<value name="TEXT">
<shadow type="text" id="2oq;P##KvH:(,WjrIe3!">
<field name="TEXT"/>
</shadow>
<block type="text_join" id="DS^4mx0$o}XW[*EAx9g+">
<mutation items="5"/>
<value name="ADD0">
<block type="text" id="~aS!V+hMdY{-*4G3Ow%3">
<field name="TEXT">Center </field>
</block>
</value>
<value name="ADD1">
<block type="misc_formatNumber_withWidth" id="NWWJ-BvdUXyMBZ|RD`m}">
<value name="NUMBER">
<shadow type="math_number" id="WWZ1rIy[E-^rf4i5ES.w">
<field name="NUM">3.14159265</field>
</shadow>
<block type="aprilTagDetection_getProperty_Number" id="Kns6PW?m}A;SO?@NVb#)">
<field name="PROP">center.x</field>
<value name="APRIL_TAG_DETECTION">
<block type="variables_get" id="Ar)`$(G]w1~mg?c!0{v;">
<field name="VAR" id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</field>
</block>
</value>
</block>
</value>
<value name="WIDTH">
<shadow type="math_number" id="ZZ080[{./+Y}t=(P1DCR">
<field name="NUM">6</field>
</shadow>
</value>
<value name="PRECISION">
<shadow type="math_number" id="sPPkrRLvHyLpl?+E}RhL">
<field name="NUM">0</field>
</shadow>
</value>
</block>
</value>
<value name="ADD2">
<block type="text" id="M[jW(z}Tg(pfF5o6v96v">
<field name="TEXT"/>
</block>
</value>
<value name="ADD3">
<block type="misc_formatNumber_withWidth" id="IGswFrO!Q%aCF}3x,SPE">
<value name="NUMBER">
<shadow type="math_number" id="iQ6P;:;Igrei}.mq2:.{">
<field name="NUM">3.14159265</field>
</shadow>
<block type="aprilTagDetection_getProperty_Number" id="P2eT2TYX6nNBSYz7e^E)">
<field name="PROP">center.y</field>
<value name="APRIL_TAG_DETECTION">
<block type="variables_get" id="ZmOVtYIkx|@b66VSAfd]">
<field name="VAR" id="vP~n9zf$lW%hYD/C.j_-">myAprilTagDetection</field>
</block>
</value>
</block>
</value>
<value name="WIDTH">
<shadow type="math_number" id="MQkYmiA}ms4pA[Ifr2gb">
<field name="NUM">6</field>
</shadow>
</value>
<value name="PRECISION">
<shadow type="math_number" id="*L=(!sY,[nz~xV=Ke@]u">
<field name="NUM">0</field>
</shadow>
</value>
</block>
</value>
<value name="ADD4">
<block type="text" id="lH92feGire@JDBfwGTlN">
<field name="TEXT"> (pixels)</field>
</block>
</value>
</block>
</value>
</block>
</next>
</block>
</statement>
</block>
</next>
</block>
</next>
</block>
</statement>
<next>
<block type="telemetry_addLine" id="3N{F`jhy%rx/{Xex;5zu">
<value name="TEXT">
<shadow type="text" id="ds{Hr}!u1tUZ{*]D~==j">
<field name="TEXT"/>
</shadow>
</value>
<next>
<block type="telemetry_addLine" id="[:W.s1Ok!]MP)3.3IU{#">
<value name="TEXT">
<shadow type="text" id="Pzz,~#oj]g6(p8-kE+HJ">
<field name="TEXT">key:</field>
</shadow>
</value>
<next>
<block type="telemetry_addLine" id="(z3|~vT*DZX[fOyQ2%S[">
<value name="TEXT">
<shadow type="text" id="M=~-,X%t3PZW:?]x+FCV">
<field name="TEXT">XYZ = X (Right), Y (Forward), Z (Up) dist.</field>
</shadow>
</value>
<next>
<block type="telemetry_addLine" id="M,AbdMv6W{1dFQc)zQt~">
<value name="TEXT">
<shadow type="text" id="`KTr5c!E2VUU.9*_77qL">
<field name="TEXT">PRY = Pitch, Roll &amp; Yaw (XYZ Rotation)</field>
</shadow>
</value>
<next>
<block type="telemetry_addLine" id="uuC6(PL0R.pO7.AFo]db">
<value name="TEXT">
<shadow type="text" id="^GlP*DEB!=^Mvq=zsRKv">
<field name="TEXT">RBE = Range, Bearing &amp; Elevation</field>
</shadow>
</value>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</statement>
</block>
</xml>
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<Extra>
<OpModeMeta flavor="TELEOP" group="" autoTransition="" />
<Enabled value="true" />
</Extra>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment