[
    {
        "id": "27129f80a96ce509",
        "type": "ros2-websocket-server",
        "url": "${ROS2_WEBSOCKET_URL}"
    },
    {
        "id": "5788a4cce510d440",
        "type": "ui_base",
        "theme": {
            "name": "theme-light",
            "lightTheme": {
                "default": "#0094CE",
                "baseColor": "#0094CE",
                "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif",
                "edited": true,
                "reset": false
            },
            "darkTheme": {
                "default": "#097479",
                "baseColor": "#097479",
                "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif",
                "edited": false
            },
            "customTheme": {
                "name": "Untitled Theme 1",
                "default": "#4B7930",
                "baseColor": "#4B7930",
                "baseFont": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"
            },
            "themeState": {
                "base-color": {
                    "default": "#0094CE",
                    "value": "#0094CE",
                    "edited": false
                },
                "page-titlebar-backgroundColor": {
                    "value": "#0094CE",
                    "edited": false
                },
                "page-backgroundColor": {
                    "value": "#fafafa",
                    "edited": false
                },
                "page-sidebar-backgroundColor": {
                    "value": "#ffffff",
                    "edited": false
                },
                "group-textColor": {
                    "value": "#1bbfff",
                    "edited": false
                },
                "group-borderColor": {
                    "value": "#ffffff",
                    "edited": false
                },
                "group-backgroundColor": {
                    "value": "#ffffff",
                    "edited": false
                },
                "widget-textColor": {
                    "value": "#111111",
                    "edited": false
                },
                "widget-backgroundColor": {
                    "value": "#0094ce",
                    "edited": false
                },
                "widget-borderColor": {
                    "value": "#ffffff",
                    "edited": false
                },
                "base-font": {
                    "value": "-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"
                }
            },
            "angularTheme": {
                "primary": "indigo",
                "accents": "blue",
                "warn": "red",
                "background": "grey",
                "palette": "light"
            }
        },
        "site": {
            "name": "Node-RED Dashboard",
            "hideToolbar": "false",
            "allowSwipe": "false",
            "lockMenu": "false",
            "allowTempTheme": "true",
            "dateFormat": "DD/MM/YYYY",
            "sizes": {
                "sx": 48,
                "sy": 48,
                "gx": 6,
                "gy": 6,
                "cx": 6,
                "cy": 6,
                "px": 0,
                "py": 0
            }
        }
    },
    {
        "id": "7d60b4a56db9b8f8",
        "type": "ui_tab",
        "name": "PX4 Telemetry",
        "icon": "dashboard",
        "order": 1,
        "disabled": true,
        "hidden": false
    },
    {
        "id": "6a7e8942e68a5c2e",
        "type": "ui_tab",
        "name": "Compute Kit",
        "icon": "dashboard",
        "order": 4,
        "disabled": true,
        "hidden": false
    },
    {
        "id": "tagnav_ui_tab",
        "type": "ui_tab",
        "name": "DEXI April Tag Navigation",
        "icon": "dashboard",
        "disabled": true,
        "hidden": false
    },
    {
        "id": "c38375f8835ceadf",
        "type": "ui_group",
        "name": "Main",
        "tab": "7d60b4a56db9b8f8",
        "order": 1,
        "disp": true,
        "width": 6,
        "collapse": false,
        "className": ""
    },
    {
        "id": "6cd34e23cb4df593",
        "type": "ui_group",
        "name": "Health",
        "tab": "7d60b4a56db9b8f8",
        "order": 2,
        "disp": true,
        "width": 6,
        "collapse": false,
        "className": ""
    },
    {
        "id": "c6e2654e4bd7b809",
        "type": "ui_group",
        "name": "Main",
        "tab": "6a7e8942e68a5c2e",
        "order": 1,
        "disp": true,
        "width": 6,
        "collapse": false,
        "className": ""
    },
    {
        "id": "tagnav_ui_cam",
        "type": "ui_group",
        "name": "Downward camera",
        "tab": "tagnav_ui_tab",
        "order": 1,
        "disp": true,
        "width": "12",
        "collapse": false,
        "className": ""
    },
    {
        "id": "tagnav_ui_grp",
        "type": "ui_group",
        "name": "Mission",
        "tab": "tagnav_ui_tab",
        "order": 2,
        "disp": true,
        "width": "12",
        "collapse": false,
        "className": ""
    },
    {
        "id": "start_here",
        "type": "tab",
        "label": "1 \u00b7 Start Here",
        "disabled": true,
        "info": "Telemetry from PX4 and the LED ring. Runs on the sim and on the aircraft.\n\nDashboard: PX4 Telemetry at /ui.",
        "env": []
    },
    {
        "id": "note_start_here_1",
        "type": "comment",
        "z": "start_here",
        "name": "Start here",
        "info": "Two groups: flight telemetry on the dashboard (/dexi/telemetry, a 2 Hz summary from the drone; subscribing to /fmu/out topics directly costs a full core through rosbridge), and the LED ring (color, effects). Both work on the sim and on the aircraft.",
        "x": 60,
        "y": 20,
        "wires": []
    },
    {
        "id": "grp_start_here_1",
        "type": "group",
        "z": "start_here",
        "name": "PX4 telemetry (sim and drone)",
        "style": {
            "label": true,
            "fill": "#bfdbfe",
            "fill-opacity": "0.15",
            "stroke": "#999999"
        },
        "nodes": [
            "20e24e9a9250368a",
            "e0ce675c6e15fafb",
            "48d2fb203d115b77",
            "20e24e9a9250prse",
            "starthere_tmpl_main",
            "starthere_tmpl_hlth"
        ],
        "x": 120,
        "y": 80,
        "w": 820,
        "h": 200
    },
    {
        "id": "20e24e9a9250368a",
        "type": "ros2-subscribe",
        "z": "start_here",
        "server": "27129f80a96ce509",
        "topicname": "/dexi/telemetry",
        "messagetype": "std_msgs/msg/String",
        "x": 230,
        "y": 150,
        "wires": [
            [
                "20e24e9a9250prse"
            ]
        ],
        "g": "grp_start_here_1"
    },
    {
        "id": "20e24e9a9250prse",
        "type": "function",
        "z": "start_here",
        "g": "grp_start_here_1",
        "name": "parse telemetry",
        "func": "// /dexi/telemetry is a JSON string from the drone's telemetry node, 2 messages a second.\nmsg.payload = JSON.parse(msg.payload.data);\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 420,
        "y": 150,
        "wires": [
            [
                "48d2fb203d115b77"
            ]
        ]
    },
    {
        "id": "e0ce675c6e15fafb",
        "type": "debug",
        "z": "start_here",
        "name": "print telemetry",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 820,
        "y": 240,
        "wires": [],
        "g": "grp_start_here_1"
    },
    {
        "id": "48d2fb203d115b77",
        "type": "delay",
        "z": "start_here",
        "name": "",
        "pauseType": "rate",
        "timeout": "5",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": true,
        "allowrate": false,
        "outputs": 1,
        "x": 600,
        "y": 150,
        "wires": [
            [
                "starthere_tmpl_main",
                "starthere_tmpl_hlth",
                "e0ce675c6e15fafb"
            ]
        ],
        "g": "grp_start_here_1"
    },
    {
        "id": "starthere_tmpl_main",
        "type": "ui_template",
        "z": "start_here",
        "g": "grp_start_here_1",
        "group": "c38375f8835ceadf",
        "name": "Main panel",
        "order": 1,
        "width": 0,
        "height": 0,
        "format": "<table style=\"width:100%;font-size:16px;line-height:1.9\">\n<tr><td>flight mode</td><td style=\"text-align:right;font-weight:600\">{{msg.payload.mode}}</td></tr>\n<tr><td>armed</td><td style=\"text-align:right;font-weight:600\">{{msg.payload.armed ? 'ARMED' : 'disarmed'}}</td></tr>\n<tr><td>on the ground</td><td style=\"text-align:right;font-weight:600\">{{msg.payload.landed ? 'yes' : 'flying'}}</td></tr>\n<tr><td>battery</td><td style=\"text-align:right;font-weight:600\">{{msg.payload.battery_pct}} % \u00b7 {{msg.payload.voltage}} V</td></tr>\n<tr><td>position (x, y, z)</td><td style=\"text-align:right;font-weight:600\">{{msg.payload.x}}, {{msg.payload.y}}, {{msg.payload.z}} m</td></tr>\n<tr><td>heading</td><td style=\"text-align:right;font-weight:600\">{{msg.payload.heading}}\u00b0</td></tr>\n<tr><td>speed</td><td style=\"text-align:right;font-weight:600\">{{msg.payload.speed}} m/s</td></tr>\n</table>",
        "storeOutMessages": false,
        "fwdInMessages": false,
        "resendOnRefresh": true,
        "templateScope": "local",
        "className": "",
        "x": 800,
        "y": 120,
        "wires": [
            []
        ]
    },
    {
        "id": "starthere_tmpl_hlth",
        "type": "ui_template",
        "z": "start_here",
        "g": "grp_start_here_1",
        "group": "6cd34e23cb4df593",
        "name": "Health panel",
        "order": 1,
        "width": 0,
        "height": 0,
        "format": "<table style=\"width:100%;font-size:16px;line-height:1.9\">\n<tr><td>position estimate</td><td style=\"text-align:right;font-weight:600\">{{msg.payload.pos_valid ? 'valid' : 'NOT valid'}} \u00b7 \u00b1{{msg.payload.eph}} m</td></tr>\n<tr><td>rangefinder</td><td style=\"text-align:right;font-weight:600\">{{msg.payload.range_m}} m \u00b7 {{msg.payload.range_valid ? 'valid' : 'NOT valid'}}</td></tr>\n<tr><td>optical flow</td><td style=\"text-align:right;font-weight:600\">{{msg.payload.flow_fused ? 'fused' : 'not fused'}}{{msg.payload.flow_rejected ? ' \u00b7 REJECTED' : ''}}</td></tr>\n<tr><td>RC link</td><td style=\"text-align:right;font-weight:600\">{{msg.payload.rc_lost ? 'LOST' : 'ok'}}</td></tr>\n<tr><td>pre-flight checks</td><td style=\"text-align:right;font-weight:600\">{{msg.payload.preflight_ok ? 'pass' : 'FAIL'}}</td></tr>\n<tr><td>failsafe</td><td style=\"text-align:right;font-weight:600\">{{msg.payload.failsafe ? 'ACTIVE' : 'none'}}</td></tr>\n<tr><td>low battery</td><td style=\"text-align:right;font-weight:600\">{{msg.payload.low_battery ? 'YES' : 'no'}}</td></tr>\n<tr><td>companion CPU</td><td style=\"text-align:right;font-weight:600\">{{msg.payload.cpu_temp}} \u00b0C \u00b7 load {{msg.payload.cpu_load}}{{msg.payload.throttled ? ' \u00b7 THROTTLED' : ''}}</td></tr>\n</table>",
        "storeOutMessages": false,
        "fwdInMessages": false,
        "resendOnRefresh": true,
        "templateScope": "local",
        "className": "",
        "x": 800,
        "y": 180,
        "wires": [
            []
        ]
    },
    {
        "id": "grp_start_here_2",
        "type": "group",
        "z": "start_here",
        "name": "LED ring (sim and drone)",
        "style": {
            "label": true,
            "fill": "#fde68a",
            "fill-opacity": "0.15",
            "stroke": "#999999"
        },
        "nodes": [
            "dc3e05c5e05fe586",
            "329048764cfff535",
            "b93cf972cb4fac2a",
            "2676b0a6ec1bc521",
            "878a64b7619b4c65",
            "23b179f206f63d65",
            "dc5cfe2f7275f0b9",
            "36da6b302e1cc73a",
            "8c98d11de37b7cf0",
            "193cc1b7828666b2",
            "39478a268e042548"
        ],
        "x": 20,
        "y": 300,
        "w": 800,
        "h": 510
    },
    {
        "id": "dc3e05c5e05fe586",
        "type": "inject",
        "z": "start_here",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 140,
        "y": 345,
        "wires": [
            [
                "dc5cfe2f7275f0b9"
            ]
        ],
        "g": "grp_start_here_2"
    },
    {
        "id": "329048764cfff535",
        "type": "ros2-service-call",
        "z": "start_here",
        "server": "27129f80a96ce509",
        "x": 660,
        "y": 545,
        "wires": [
            []
        ],
        "g": "grp_start_here_2"
    },
    {
        "id": "b93cf972cb4fac2a",
        "type": "inject",
        "z": "start_here",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 140,
        "y": 445,
        "wires": [
            [
                "2676b0a6ec1bc521"
            ]
        ],
        "g": "grp_start_here_2"
    },
    {
        "id": "2676b0a6ec1bc521",
        "type": "led",
        "z": "start_here",
        "name": "Teal LED",
        "color": "teal",
        "x": 340,
        "y": 445,
        "wires": [
            [
                "329048764cfff535"
            ]
        ],
        "g": "grp_start_here_2"
    },
    {
        "id": "878a64b7619b4c65",
        "type": "inject",
        "z": "start_here",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 140,
        "y": 545,
        "wires": [
            [
                "23b179f206f63d65"
            ]
        ],
        "g": "grp_start_here_2"
    },
    {
        "id": "23b179f206f63d65",
        "type": "led",
        "z": "start_here",
        "name": "LED Off",
        "color": "black",
        "x": 340,
        "y": 545,
        "wires": [
            [
                "329048764cfff535"
            ]
        ],
        "g": "grp_start_here_2"
    },
    {
        "id": "dc5cfe2f7275f0b9",
        "type": "led",
        "z": "start_here",
        "name": "Pink LED",
        "color": "pink",
        "x": 340,
        "y": 345,
        "wires": [
            [
                "329048764cfff535"
            ]
        ],
        "g": "grp_start_here_2"
    },
    {
        "id": "36da6b302e1cc73a",
        "type": "led-effect",
        "z": "start_here",
        "name": "Rainbow Effect",
        "effect": "rainbow",
        "x": 360,
        "y": 645,
        "wires": [
            [
                "329048764cfff535"
            ]
        ],
        "g": "grp_start_here_2"
    },
    {
        "id": "8c98d11de37b7cf0",
        "type": "led-effect",
        "z": "start_here",
        "name": "Galaxy Effect",
        "effect": "galaxy",
        "x": 350,
        "y": 745,
        "wires": [
            [
                "329048764cfff535"
            ]
        ],
        "g": "grp_start_here_2"
    },
    {
        "id": "193cc1b7828666b2",
        "type": "inject",
        "z": "start_here",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 140,
        "y": 645,
        "wires": [
            [
                "36da6b302e1cc73a"
            ]
        ],
        "g": "grp_start_here_2"
    },
    {
        "id": "39478a268e042548",
        "type": "inject",
        "z": "start_here",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 140,
        "y": 745,
        "wires": [
            [
                "8c98d11de37b7cf0"
            ]
        ],
        "g": "grp_start_here_2"
    },
    {
        "id": "fly_manager",
        "type": "tab",
        "label": "2 \u00b7 Fly with the Offboard Manager",
        "disabled": true,
        "info": "Arm, take off, move and land through the on-board offboard manager (/dexi/offboard_manager). Uses the same commands as the DroneBlocks blocks. Runs on the sim and on the aircraft.",
        "env": []
    },
    {
        "id": "note_fly_manager_2",
        "type": "comment",
        "z": "fly_manager",
        "name": "Fly",
        "info": "Inject nodes send commands to the offboard manager: arm, offboard takeoff, moves, land. Works on the sim and on the aircraft; on the aircraft keep a hand on the RC.",
        "x": 60,
        "y": 20,
        "wires": []
    },
    {
        "id": "1c1de41bb485044a",
        "type": "ros2-publish",
        "z": "fly_manager",
        "server": "27129f80a96ce509",
        "topicname": "/dexi/offboard_manager",
        "messagetype": "",
        "stampheader": false,
        "x": 850,
        "y": 240,
        "wires": [
            []
        ]
    },
    {
        "id": "dc4e893b18c42a9a",
        "type": "inject",
        "z": "fly_manager",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 300,
        "y": 160,
        "wires": [
            [
                "28d8858874b2ed8c"
            ]
        ]
    },
    {
        "id": "82d80e96b9655371",
        "type": "inject",
        "z": "fly_manager",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 300,
        "y": 100,
        "wires": [
            [
                "87a2f2cf05c31f87"
            ]
        ]
    },
    {
        "id": "87a2f2cf05c31f87",
        "type": "arm",
        "z": "fly_manager",
        "name": "",
        "x": 470,
        "y": 100,
        "wires": [
            [
                "1c1de41bb485044a"
            ]
        ]
    },
    {
        "id": "30912c788cfaadb3",
        "type": "inject",
        "z": "fly_manager",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 300,
        "y": 340,
        "wires": [
            [
                "ffa7c5b61d8bd568"
            ]
        ]
    },
    {
        "id": "ffa7c5b61d8bd568",
        "type": "land",
        "z": "fly_manager",
        "name": "",
        "x": 470,
        "y": 340,
        "wires": [
            [
                "1c1de41bb485044a"
            ]
        ]
    },
    {
        "id": "28d8858874b2ed8c",
        "type": "takeoff",
        "z": "fly_manager",
        "name": "",
        "altitude": "2",
        "x": 490,
        "y": 160,
        "wires": [
            [
                "1c1de41bb485044a"
            ]
        ]
    },
    {
        "id": "882cab4293f9e0c0",
        "type": "forward",
        "z": "fly_manager",
        "name": "",
        "distance": "1",
        "x": 1290,
        "y": 60,
        "wires": [
            [
                "1c1de41bb485044a"
            ]
        ]
    },
    {
        "id": "866d2678c8d00a8d",
        "type": "inject",
        "z": "fly_manager",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 1100,
        "y": 60,
        "wires": [
            [
                "882cab4293f9e0c0"
            ]
        ]
    },
    {
        "id": "3cdaa5bb28be592a",
        "type": "offboard",
        "z": "fly_manager",
        "action": "stop",
        "x": 530,
        "y": 280,
        "wires": [
            [
                "1c1de41bb485044a"
            ]
        ]
    },
    {
        "id": "5053bb6941fd0593",
        "type": "inject",
        "z": "fly_manager",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 300,
        "y": 280,
        "wires": [
            [
                "3cdaa5bb28be592a"
            ]
        ]
    },
    {
        "id": "cf1c03f44806b4bc",
        "type": "offboard",
        "z": "fly_manager",
        "action": "start",
        "x": 530,
        "y": 220,
        "wires": [
            [
                "1c1de41bb485044a"
            ]
        ]
    },
    {
        "id": "335e4963eba951b4",
        "type": "inject",
        "z": "fly_manager",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 300,
        "y": 220,
        "wires": [
            [
                "cf1c03f44806b4bc"
            ]
        ]
    },
    {
        "id": "85e5a558b3c3d3b3",
        "type": "backward",
        "z": "fly_manager",
        "name": "",
        "distance": 1,
        "x": 1300,
        "y": 120,
        "wires": [
            [
                "1c1de41bb485044a"
            ]
        ]
    },
    {
        "id": "c0bb30e20f02a00f",
        "type": "inject",
        "z": "fly_manager",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 1100,
        "y": 120,
        "wires": [
            [
                "85e5a558b3c3d3b3"
            ]
        ]
    },
    {
        "id": "071b471fc96293c3",
        "type": "right",
        "z": "fly_manager",
        "name": "",
        "distance": 1,
        "x": 1280,
        "y": 180,
        "wires": [
            [
                "1c1de41bb485044a"
            ]
        ]
    },
    {
        "id": "112a8f0e486c38e3",
        "type": "left",
        "z": "fly_manager",
        "name": "",
        "distance": 1,
        "x": 1280,
        "y": 240,
        "wires": [
            [
                "1c1de41bb485044a"
            ]
        ]
    },
    {
        "id": "062188e9ec7c2b4f",
        "type": "inject",
        "z": "fly_manager",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 1100,
        "y": 180,
        "wires": [
            [
                "071b471fc96293c3"
            ]
        ]
    },
    {
        "id": "4dbdb3dd00a3fe2d",
        "type": "inject",
        "z": "fly_manager",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 1100,
        "y": 240,
        "wires": [
            [
                "112a8f0e486c38e3"
            ]
        ]
    },
    {
        "id": "193c8e27fb0ff0f1",
        "type": "inject",
        "z": "fly_manager",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 1100,
        "y": 300,
        "wires": [
            [
                "a00e840f868007b4"
            ]
        ]
    },
    {
        "id": "4cb076ca91be6dde",
        "type": "inject",
        "z": "fly_manager",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 1100,
        "y": 360,
        "wires": [
            [
                "436149194175c0e1"
            ]
        ]
    },
    {
        "id": "a00e840f868007b4",
        "type": "up",
        "z": "fly_manager",
        "name": "",
        "distance": 1,
        "x": 1280,
        "y": 300,
        "wires": [
            [
                "1c1de41bb485044a"
            ]
        ]
    },
    {
        "id": "436149194175c0e1",
        "type": "down",
        "z": "fly_manager",
        "name": "",
        "distance": 1,
        "x": 1280,
        "y": 360,
        "wires": [
            [
                "1c1de41bb485044a"
            ]
        ]
    },
    {
        "id": "2dd0241a95457a3b",
        "type": "yaw_right",
        "z": "fly_manager",
        "name": "",
        "degrees": 90,
        "x": 1280,
        "y": 420,
        "wires": [
            [
                "1c1de41bb485044a"
            ]
        ]
    },
    {
        "id": "0ca95155b5909df5",
        "type": "inject",
        "z": "fly_manager",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 1100,
        "y": 420,
        "wires": [
            [
                "2dd0241a95457a3b"
            ]
        ]
    },
    {
        "id": "93d521f9dbdd5393",
        "type": "yaw_left",
        "z": "fly_manager",
        "name": "",
        "degrees": 90,
        "x": 1280,
        "y": 480,
        "wires": [
            [
                "1c1de41bb485044a"
            ]
        ]
    },
    {
        "id": "414abc3c5802df7d",
        "type": "inject",
        "z": "fly_manager",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 1100,
        "y": 480,
        "wires": [
            [
                "93d521f9dbdd5393"
            ]
        ]
    },
    {
        "id": "see_detect",
        "type": "tab",
        "label": "3 \u00b7 AprilTags and YOLO",
        "disabled": true,
        "info": "Detections driving the LED ring. AprilTags work on the sim and the aircraft; YOLO runs on the aircraft only.",
        "env": []
    },
    {
        "id": "note_see_detect_3",
        "type": "comment",
        "z": "see_detect",
        "name": "AprilTags and YOLO",
        "info": "AprilTag detections (sim and drone) and YOLO detections (drone only) each light the LED ring.",
        "x": 60,
        "y": 20,
        "wires": []
    },
    {
        "id": "grp_see_detect_3",
        "type": "group",
        "z": "see_detect",
        "name": "AprilTags (sim and drone)",
        "style": {
            "label": true,
            "fill": "#bbf7d0",
            "fill-opacity": "0.15",
            "stroke": "#999999"
        },
        "nodes": [
            "8959b55e6e6c8655",
            "1f03e92abd538e9c",
            "190cde7db99adc9b",
            "74ea221272d0d9e0",
            "974e2fc73e070d55",
            "082b66548ec84e5c",
            "a9206bf8899fb0f0"
        ],
        "x": 30,
        "y": 175,
        "w": 1110,
        "h": 230
    },
    {
        "id": "8959b55e6e6c8655",
        "type": "function",
        "z": "see_detect",
        "name": "get april tag id",
        "func": "if (msg.payload.detections.length > 0) {\n    msg.payload = msg.payload.detections[0].id\n} else {\n    msg.payload = \"None\"\n}\n\nreturn msg",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 360,
        "y": 280,
        "wires": [
            [
                "190cde7db99adc9b"
            ]
        ],
        "g": "grp_see_detect_3"
    },
    {
        "id": "1f03e92abd538e9c",
        "type": "ros2-subscribe",
        "z": "see_detect",
        "server": "27129f80a96ce509",
        "topicname": "/apriltag_detections",
        "messagetype": "apriltag_msgs/msg/AprilTagDetectionArray",
        "x": 150,
        "y": 280,
        "wires": [
            [
                "8959b55e6e6c8655"
            ]
        ],
        "g": "grp_see_detect_3"
    },
    {
        "id": "190cde7db99adc9b",
        "type": "switch",
        "z": "see_detect",
        "name": "set led color",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "1",
                "vt": "num"
            },
            {
                "t": "eq",
                "v": "2",
                "vt": "num"
            },
            {
                "t": "eq",
                "v": "3",
                "vt": "num"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 3,
        "x": 550,
        "y": 280,
        "wires": [
            [
                "a9206bf8899fb0f0"
            ],
            [
                "74ea221272d0d9e0"
            ],
            [
                "974e2fc73e070d55"
            ]
        ],
        "g": "grp_see_detect_3"
    },
    {
        "id": "74ea221272d0d9e0",
        "type": "led",
        "z": "see_detect",
        "name": "Blue LED",
        "color": "blue",
        "x": 740,
        "y": 280,
        "wires": [
            [
                "082b66548ec84e5c"
            ]
        ],
        "g": "grp_see_detect_3"
    },
    {
        "id": "974e2fc73e070d55",
        "type": "led",
        "z": "see_detect",
        "name": "Yellow LED",
        "color": "yellow",
        "x": 750,
        "y": 340,
        "wires": [
            [
                "082b66548ec84e5c"
            ]
        ],
        "g": "grp_see_detect_3"
    },
    {
        "id": "082b66548ec84e5c",
        "type": "ros2-service-call",
        "z": "see_detect",
        "server": "27129f80a96ce509",
        "x": 980,
        "y": 280,
        "wires": [
            []
        ],
        "g": "grp_see_detect_3"
    },
    {
        "id": "a9206bf8899fb0f0",
        "type": "led",
        "z": "see_detect",
        "name": "Red LED",
        "color": "red",
        "x": 740,
        "y": 220,
        "wires": [
            [
                "082b66548ec84e5c"
            ]
        ],
        "g": "grp_see_detect_3"
    },
    {
        "id": "grp_see_detect_4",
        "type": "group",
        "z": "see_detect",
        "name": "YOLO (drone only)",
        "style": {
            "label": true,
            "fill": "#fecaca",
            "fill-opacity": "0.15",
            "stroke": "#999999"
        },
        "nodes": [
            "65b1b7513e2bcc35",
            "5f2a63e2191be928",
            "413cc6735c1b44b2",
            "864ed565c0238fcf",
            "d58ca6c79218e4af",
            "f3517bf771100bf2",
            "42b2e7ce027aeb19",
            "5e3a7b461cdb2ce7"
        ],
        "x": 0,
        "y": 455,
        "w": 1120,
        "h": 250
    },
    {
        "id": "65b1b7513e2bcc35",
        "type": "function",
        "z": "see_detect",
        "name": "get object",
        "func": "if (msg.payload.detections.length > 0) {\n    msg.payload = msg.payload.detections[0].class_name\n} else {\n    msg.payload = \"None\"\n}\n\nreturn msg",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 320,
        "y": 560,
        "wires": [
            [
                "413cc6735c1b44b2",
                "5e3a7b461cdb2ce7"
            ]
        ],
        "g": "grp_see_detect_4"
    },
    {
        "id": "5f2a63e2191be928",
        "type": "ros2-subscribe",
        "z": "see_detect",
        "server": "27129f80a96ce509",
        "topicname": "/yolo_detections",
        "messagetype": "apriltag_msgs/msg/AprilTagDetectionArray",
        "x": 120,
        "y": 560,
        "wires": [
            [
                "65b1b7513e2bcc35"
            ]
        ],
        "g": "grp_see_detect_4"
    },
    {
        "id": "413cc6735c1b44b2",
        "type": "switch",
        "z": "see_detect",
        "name": "set led color",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "dog",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "cat",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "truck",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 3,
        "x": 530,
        "y": 560,
        "wires": [
            [
                "864ed565c0238fcf"
            ],
            [
                "d58ca6c79218e4af"
            ],
            [
                "f3517bf771100bf2"
            ]
        ],
        "g": "grp_see_detect_4"
    },
    {
        "id": "864ed565c0238fcf",
        "type": "led",
        "z": "see_detect",
        "name": "Red LED",
        "color": "red",
        "x": 720,
        "y": 500,
        "wires": [
            [
                "42b2e7ce027aeb19"
            ]
        ],
        "g": "grp_see_detect_4"
    },
    {
        "id": "d58ca6c79218e4af",
        "type": "led",
        "z": "see_detect",
        "name": "Blue LED",
        "color": "blue",
        "x": 720,
        "y": 560,
        "wires": [
            [
                "42b2e7ce027aeb19"
            ]
        ],
        "g": "grp_see_detect_4"
    },
    {
        "id": "f3517bf771100bf2",
        "type": "led",
        "z": "see_detect",
        "name": "Yellow LED",
        "color": "yellow",
        "x": 730,
        "y": 620,
        "wires": [
            [
                "42b2e7ce027aeb19"
            ]
        ],
        "g": "grp_see_detect_4"
    },
    {
        "id": "42b2e7ce027aeb19",
        "type": "ros2-service-call",
        "z": "see_detect",
        "server": "27129f80a96ce509",
        "x": 960,
        "y": 560,
        "wires": [
            []
        ],
        "g": "grp_see_detect_4"
    },
    {
        "id": "5e3a7b461cdb2ce7",
        "type": "debug",
        "z": "see_detect",
        "name": "print class name",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 540,
        "y": 640,
        "wires": [],
        "g": "grp_see_detect_4"
    },
    {
        "id": "tagnav_tab",
        "type": "tab",
        "label": "4 \u00b7 Tag Navigation",
        "disabled": true,
        "info": "Tag navigation, one node per step, like the AprilTag blocks in DroneBlocks.\n\nEvery row starts with its button on the left. Everything here works in the simulator and on an aircraft; on an aircraft the pilot keeps the radio and can take over at any time by leaving Offboard.\n\n'Forward' is relative to the drone's nose: start with the nose pointing at the next tag."
    },
    {
        "id": "6e4a0164616edf26",
        "type": "group",
        "z": "tagnav_tab",
        "name": "Tag hop: tag 0 \u2192 tag 1, and back (sim and drone)",
        "style": {
            "label": true
        },
        "nodes": [
            "1b3c57ebf8d84c1c",
            "5e0f96fea49ba20c",
            "1d6f827f328115fb",
            "01cb00de5460afa6",
            "6fdb6cd4b38e6d50",
            "016a8f1e032d2da8",
            "fec40d6c2f58a58d",
            "af9b19dafa30d6d8",
            "2e3a7a88ec0f6c65",
            "a38af6c0250b4f73",
            "5b740dce2327d31a",
            "d59dad5559fdd7e1"
        ],
        "x": 40,
        "y": 55,
        "w": 1060.0,
        "h": 205,
        "info": "Start on the ground over tag 0, nose toward tag 1. TAG HOP takes off, centers on tag 0, flies forward until tag 1 and lands on it. HOP BACK does the reverse from tag 1. Alternate them for repeat testing."
    },
    {
        "id": "94f8dcdd29911dfe",
        "type": "group",
        "z": "tagnav_tab",
        "name": "Corridor: tags 0 \u2192 4 (sim and drone)",
        "style": {
            "label": true
        },
        "nodes": [
            "65e02f822fcb2e54",
            "88bac1b2f984e7b2",
            "cd81e6883ce4becf",
            "643e231186bb03cc",
            "b6106add2a6a76c3",
            "8701a2ead21b8743",
            "7fd006c6dd2d1860",
            "2db5091066244cdf",
            "e52be66db7f24d36",
            "efdaa722d3b9eacd",
            "7e795e89a6067e2d",
            "8fedbb888c34936f",
            "1b691fbfe6b97cf0",
            "34da863c36a4167a",
            "2bf1532cf3050cff",
            "2e2d7bd5d6374c85",
            "dc2ba05ffd9b40c3",
            "9c326faf509da86e"
        ],
        "x": 40,
        "y": 315,
        "w": 1480.0,
        "h": 305,
        "info": "START takes off by itself. PILOT HAND-OFF waits for the pilot: take off by hand, hover over tag 0, flip the Offboard switch. Both join the same chain at 'center on tag 0'. Change the route by editing the tag numbers."
    },
    {
        "id": "5e7abc3962b62956",
        "type": "group",
        "z": "tagnav_tab",
        "name": "Safety",
        "style": {
            "label": true
        },
        "nodes": [
            "56e5c1c1dd4bf9c8",
            "e4a052996e0bdf38",
            "c3c9095f92a4351d",
            "d4704e20220cbe18",
            "1cc054b48d3a3bd7"
        ],
        "x": 40,
        "y": 655,
        "w": 500.0,
        "h": 175,
        "info": "Any step that fails lands the aircraft where it is, but only while the mission still has it (Offboard): a step also fails when the pilot takes over, and landing then would take the aircraft from the pilot. LAND now always lands."
    },
    {
        "id": "3c4e44ef53859aae",
        "type": "group",
        "z": "tagnav_tab",
        "name": "Dashboard: status, speak, camera",
        "style": {
            "label": true
        },
        "nodes": [
            "d58a400dc9068001",
            "2fd5fe512f9c6f9d",
            "3430367cdad7d4d9",
            "64a64eeb1541bab2",
            "aa3527873a73f8a1",
            "c48ad43380c6b820",
            "tagnav_ui_camera"
        ],
        "x": 40,
        "y": 855,
        "w": 660.0,
        "h": 175,
        "info": "Shows the last step and the downward camera on the DEXI April Tag Navigation page, and speaks each new tag the camera sees (the dashboard must be open, and clicked once)."
    },
    {
        "id": "1b3c57ebf8d84c1c",
        "type": "inject",
        "z": "tagnav_tab",
        "g": "6e4a0164616edf26",
        "x": 120.0,
        "y": 180,
        "wires": [
            [
                "5e0f96fea49ba20c"
            ]
        ],
        "name": "TAG HOP",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date"
    },
    {
        "id": "5e0f96fea49ba20c",
        "type": "dexi-flight-takeoff",
        "z": "tagnav_tab",
        "g": "6e4a0164616edf26",
        "x": 300.0,
        "y": 180,
        "wires": [
            [
                "1d6f827f328115fb"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "altitude": 1.5
    },
    {
        "id": "1d6f827f328115fb",
        "type": "dexi-tag-center",
        "z": "tagnav_tab",
        "g": "6e4a0164616edf26",
        "x": 520.0,
        "y": 180,
        "wires": [
            [
                "01cb00de5460afa6"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "tag": 0,
        "timeout": 25,
        "hold": 1
    },
    {
        "id": "01cb00de5460afa6",
        "type": "dexi-tag-fly-until",
        "z": "tagnav_tab",
        "g": "6e4a0164616edf26",
        "x": 760.0,
        "y": 180,
        "wires": [
            [
                "6fdb6cd4b38e6d50"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "direction": "forward",
        "speed": 0.25,
        "tag": 1,
        "timeout": 20
    },
    {
        "id": "6fdb6cd4b38e6d50",
        "type": "dexi-tag-land",
        "z": "tagnav_tab",
        "g": "6e4a0164616edf26",
        "x": 970.0,
        "y": 180,
        "wires": [
            []
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "tag": 1,
        "center": true,
        "onlyOffboard": false
    },
    {
        "id": "016a8f1e032d2da8",
        "type": "inject",
        "z": "tagnav_tab",
        "g": "6e4a0164616edf26",
        "x": 130.0,
        "y": 230,
        "wires": [
            [
                "fec40d6c2f58a58d"
            ]
        ],
        "name": "HOP BACK",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date"
    },
    {
        "id": "fec40d6c2f58a58d",
        "type": "dexi-flight-takeoff",
        "z": "tagnav_tab",
        "g": "6e4a0164616edf26",
        "x": 320.0,
        "y": 230,
        "wires": [
            [
                "af9b19dafa30d6d8"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "altitude": 1.5
    },
    {
        "id": "af9b19dafa30d6d8",
        "type": "dexi-tag-center",
        "z": "tagnav_tab",
        "g": "6e4a0164616edf26",
        "x": 540.0,
        "y": 230,
        "wires": [
            [
                "2e3a7a88ec0f6c65"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "tag": 1,
        "timeout": 25,
        "hold": 1
    },
    {
        "id": "2e3a7a88ec0f6c65",
        "type": "dexi-tag-fly-until",
        "z": "tagnav_tab",
        "g": "6e4a0164616edf26",
        "x": 790.0,
        "y": 230,
        "wires": [
            [
                "a38af6c0250b4f73"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "direction": "backward",
        "speed": 0.25,
        "tag": 0,
        "timeout": 20
    },
    {
        "id": "a38af6c0250b4f73",
        "type": "dexi-tag-land",
        "z": "tagnav_tab",
        "g": "6e4a0164616edf26",
        "x": 1010.0,
        "y": 230,
        "wires": [
            []
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "tag": 0,
        "center": true,
        "onlyOffboard": false
    },
    {
        "id": "65e02f822fcb2e54",
        "type": "inject",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "x": 110.0,
        "y": 440,
        "wires": [
            [
                "88bac1b2f984e7b2"
            ]
        ],
        "name": "START",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date"
    },
    {
        "id": "88bac1b2f984e7b2",
        "type": "dexi-flight-takeoff",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "x": 280.0,
        "y": 440,
        "wires": [
            [
                "8701a2ead21b8743"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "altitude": 1.5
    },
    {
        "id": "cd81e6883ce4becf",
        "type": "inject",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "x": 150.0,
        "y": 490,
        "wires": [
            [
                "b6106add2a6a76c3"
            ]
        ],
        "name": "PILOT HAND-OFF",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date"
    },
    {
        "id": "643e231186bb03cc",
        "type": "ui_button",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "x": 150.0,
        "y": 530,
        "wires": [
            [
                "b6106add2a6a76c3"
            ]
        ],
        "group": "tagnav_ui_grp",
        "order": 1,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "PILOT HAND-OFF",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "className": "",
        "icon": "",
        "payload": "",
        "payloadType": "str",
        "topic": "",
        "topicType": "str",
        "name": ""
    },
    {
        "id": "b6106add2a6a76c3",
        "type": "dexi-tag-handoff",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "x": 360.0,
        "y": 510,
        "wires": [
            [
                "8701a2ead21b8743"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "pilot hand-off",
        "timeout": 900
    },
    {
        "id": "8701a2ead21b8743",
        "type": "dexi-tag-center",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "x": 500.0,
        "y": 440,
        "wires": [
            [
                "7fd006c6dd2d1860"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "tag": 0,
        "timeout": 25,
        "hold": 1
    },
    {
        "id": "7fd006c6dd2d1860",
        "type": "dexi-tag-fly-until",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "x": 740.0,
        "y": 440,
        "wires": [
            [
                "2db5091066244cdf"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "direction": "forward",
        "speed": 0.25,
        "tag": 1,
        "timeout": 20
    },
    {
        "id": "2db5091066244cdf",
        "type": "dexi-tag-center",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "x": 980.0,
        "y": 440,
        "wires": [
            [
                "e52be66db7f24d36"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "tag": 1,
        "timeout": 25,
        "hold": 1
    },
    {
        "id": "e52be66db7f24d36",
        "type": "dexi-tag-fly-until",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "x": 1220.0,
        "y": 440,
        "wires": [
            [
                "efdaa722d3b9eacd"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "direction": "forward",
        "speed": 0.25,
        "tag": 2,
        "timeout": 20
    },
    {
        "id": "efdaa722d3b9eacd",
        "type": "link out",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "x": 1375.0,
        "y": 440,
        "wires": [],
        "name": "to row 2",
        "mode": "link",
        "links": [
            "7e795e89a6067e2d"
        ]
    },
    {
        "id": "7e795e89a6067e2d",
        "type": "link in",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "x": 345.0,
        "y": 590,
        "wires": [
            [
                "8fedbb888c34936f"
            ]
        ],
        "name": "from row 1",
        "links": [
            "efdaa722d3b9eacd"
        ]
    },
    {
        "id": "8fedbb888c34936f",
        "type": "dexi-tag-center",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "x": 500.0,
        "y": 590,
        "wires": [
            [
                "1b691fbfe6b97cf0"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "tag": 2,
        "timeout": 25,
        "hold": 1
    },
    {
        "id": "1b691fbfe6b97cf0",
        "type": "dexi-tag-fly-until",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "x": 740.0,
        "y": 590,
        "wires": [
            [
                "34da863c36a4167a"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "direction": "forward",
        "speed": 0.25,
        "tag": 3,
        "timeout": 20
    },
    {
        "id": "34da863c36a4167a",
        "type": "dexi-tag-center",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "x": 980.0,
        "y": 590,
        "wires": [
            [
                "2bf1532cf3050cff"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "tag": 3,
        "timeout": 25,
        "hold": 1
    },
    {
        "id": "2bf1532cf3050cff",
        "type": "dexi-tag-fly-until",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "x": 1220.0,
        "y": 590,
        "wires": [
            [
                "2e2d7bd5d6374c85"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "direction": "forward",
        "speed": 0.25,
        "tag": 4,
        "timeout": 20
    },
    {
        "id": "2e2d7bd5d6374c85",
        "type": "dexi-tag-land",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "x": 1430.0,
        "y": 590,
        "wires": [
            []
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "tag": 4,
        "center": true,
        "onlyOffboard": false
    },
    {
        "id": "56e5c1c1dd4bf9c8",
        "type": "catch",
        "z": "tagnav_tab",
        "g": "5e7abc3962b62956",
        "x": 140.0,
        "y": 700,
        "wires": [
            [
                "e4a052996e0bdf38"
            ]
        ],
        "name": "any step failed",
        "scope": [
            "5e0f96fea49ba20c",
            "1d6f827f328115fb",
            "01cb00de5460afa6",
            "6fdb6cd4b38e6d50",
            "fec40d6c2f58a58d",
            "af9b19dafa30d6d8",
            "2e3a7a88ec0f6c65",
            "a38af6c0250b4f73",
            "88bac1b2f984e7b2",
            "b6106add2a6a76c3",
            "8701a2ead21b8743",
            "7fd006c6dd2d1860",
            "2db5091066244cdf",
            "e52be66db7f24d36",
            "8fedbb888c34936f",
            "1b691fbfe6b97cf0",
            "34da863c36a4167a",
            "2bf1532cf3050cff",
            "2e2d7bd5d6374c85"
        ],
        "uncaught": false
    },
    {
        "id": "e4a052996e0bdf38",
        "type": "dexi-tag-land",
        "z": "tagnav_tab",
        "g": "5e7abc3962b62956",
        "x": 390.0,
        "y": 700,
        "wires": [
            []
        ],
        "server": "27129f80a96ce509",
        "name": "land here (if the mission has it)",
        "tag": 0,
        "center": false,
        "onlyOffboard": true
    },
    {
        "id": "c3c9095f92a4351d",
        "type": "ui_button",
        "z": "tagnav_tab",
        "g": "5e7abc3962b62956",
        "x": 130.0,
        "y": 750,
        "wires": [
            [
                "1cc054b48d3a3bd7"
            ]
        ],
        "group": "tagnav_ui_grp",
        "order": 3,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "LAND now",
        "tooltip": "",
        "color": "",
        "bgcolor": "red",
        "className": "",
        "icon": "",
        "payload": "",
        "payloadType": "str",
        "topic": "",
        "topicType": "str",
        "name": ""
    },
    {
        "id": "d4704e20220cbe18",
        "type": "inject",
        "z": "tagnav_tab",
        "g": "5e7abc3962b62956",
        "x": 120.0,
        "y": 800,
        "wires": [
            [
                "1cc054b48d3a3bd7"
            ]
        ],
        "name": "LAND now",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date"
    },
    {
        "id": "1cc054b48d3a3bd7",
        "type": "dexi-tag-land",
        "z": "tagnav_tab",
        "g": "5e7abc3962b62956",
        "x": 300.0,
        "y": 775,
        "wires": [
            []
        ],
        "server": "27129f80a96ce509",
        "name": "land now",
        "tag": 0,
        "center": false,
        "onlyOffboard": false
    },
    {
        "id": "d58a400dc9068001",
        "type": "status",
        "z": "tagnav_tab",
        "g": "3c4e44ef53859aae",
        "x": 100.0,
        "y": 900,
        "wires": [
            [
                "2fd5fe512f9c6f9d"
            ]
        ],
        "name": "step status",
        "scope": [
            "5e0f96fea49ba20c",
            "1d6f827f328115fb",
            "01cb00de5460afa6",
            "6fdb6cd4b38e6d50",
            "fec40d6c2f58a58d",
            "af9b19dafa30d6d8",
            "2e3a7a88ec0f6c65",
            "a38af6c0250b4f73",
            "88bac1b2f984e7b2",
            "b6106add2a6a76c3",
            "8701a2ead21b8743",
            "7fd006c6dd2d1860",
            "2db5091066244cdf",
            "e52be66db7f24d36",
            "8fedbb888c34936f",
            "1b691fbfe6b97cf0",
            "34da863c36a4167a",
            "2bf1532cf3050cff",
            "2e2d7bd5d6374c85",
            "e4a052996e0bdf38",
            "1cc054b48d3a3bd7"
        ]
    },
    {
        "id": "2fd5fe512f9c6f9d",
        "type": "ui_text",
        "z": "tagnav_tab",
        "g": "3c4e44ef53859aae",
        "x": 260.0,
        "y": 900,
        "wires": [],
        "group": "tagnav_ui_grp",
        "order": 2,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "last step:",
        "format": "{{msg.status.text}}",
        "layout": "row-spread",
        "className": "",
        "style": false,
        "font": "",
        "fontSize": 16,
        "color": "#000000"
    },
    {
        "id": "3430367cdad7d4d9",
        "type": "dexi-tag-seen",
        "z": "tagnav_tab",
        "g": "3c4e44ef53859aae",
        "x": 100.0,
        "y": 950,
        "wires": [
            [
                "64a64eeb1541bab2",
                "c48ad43380c6b820"
            ]
        ],
        "server": "27129f80a96ce509",
        "name": "",
        "forget": 2
    },
    {
        "id": "64a64eeb1541bab2",
        "type": "function",
        "z": "tagnav_tab",
        "g": "3c4e44ef53859aae",
        "x": 290.0,
        "y": 950,
        "wires": [
            [
                "aa3527873a73f8a1"
            ]
        ],
        "name": "hovering over tag N",
        "func": "msg.payload = 'hovering over tag ' + msg.payload;\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": []
    },
    {
        "id": "aa3527873a73f8a1",
        "type": "ui_audio",
        "z": "tagnav_tab",
        "g": "3c4e44ef53859aae",
        "x": 470.0,
        "y": 950,
        "wires": [],
        "name": "speak",
        "group": "tagnav_ui_grp",
        "voice": "",
        "always": true
    },
    {
        "id": "c48ad43380c6b820",
        "type": "ui_text",
        "z": "tagnav_tab",
        "g": "3c4e44ef53859aae",
        "x": 500.0,
        "y": 1000,
        "wires": [],
        "group": "tagnav_ui_grp",
        "order": 4,
        "width": 0,
        "height": 0,
        "name": "",
        "label": "last tag seen:",
        "format": "{{msg.payload}}",
        "layout": "row-spread",
        "className": "",
        "style": false,
        "font": "",
        "fontSize": 16,
        "color": "#000000"
    },
    {
        "id": "tagnav_ui_camera",
        "type": "ui_template",
        "z": "tagnav_tab",
        "group": "tagnav_ui_cam",
        "name": "camera",
        "order": 1,
        "width": "12",
        "height": "9",
        "format": "<div style=\"margin:-6px;position:relative\"><img id=\"tagnav-cam\" style=\"width:100%;display:block;background:#000;aspect-ratio:4/3;border-radius:6px\" alt=\"\">\n<div id=\"tagnav-cam-note\" style=\"position:absolute;right:8px;bottom:8px;font:12px/1.4 sans-serif;color:#fff;background:rgba(0,0,0,.45);padding:2px 8px;border-radius:10px\">connecting\u2026</div></div>\n<script>\n(function () {\n  var img = document.getElementById('tagnav-cam'), note = document.getElementById('tagnav-cam-note');\n  var url = 'ws://' + location.hostname + ':9090', n = 0, t0 = Date.now(), ws;\n  function connect() {\n    ws = new WebSocket(url);\n    ws.onopen = function () {\n      note.textContent = 'live';\n      ws.send(JSON.stringify({ op: 'subscribe', id: 'tagnav-cam', topic: '/cam0/image_raw/compressed',\n        type: 'sensor_msgs/msg/CompressedImage', throttle_rate: 200, queue_length: 1 }));\n    };\n    ws.onmessage = function (ev) {\n      var m = JSON.parse(ev.data); if (m.op !== 'publish' || !m.msg || !m.msg.data) return;\n      img.src = 'data:image/jpeg;base64,' + m.msg.data; n++;\n      if (Date.now() - t0 > 1000) { note.textContent = 'live \u00b7 ' + n + ' fps'; n = 0; t0 = Date.now(); }\n    };\n    ws.onclose = function () { note.textContent = 'reconnecting\u2026'; setTimeout(connect, 2000); };\n    ws.onerror = function () { ws.close(); };\n  }\n  connect();\n})();\n</script>",
        "storeOutMessages": false,
        "fwdInMessages": false,
        "resendOnRefresh": true,
        "templateScope": "local",
        "className": "",
        "x": 620.0,
        "y": 950,
        "wires": [
            []
        ],
        "g": "3c4e44ef53859aae"
    },
    {
        "id": "avr26ex_tab",
        "type": "tab",
        "label": "5 \u00b7 AVR 2026",
        "disabled": true,
        "info": "The drone runs a YOLO model trained on the AVR 2026 field artwork and\npublishes what it sees on `/yolo_detections`. Turn those detections into the\nright LED color.\n\nThe subscribe and service-call nodes are wired. `gasoline` is done as an\nexample. The other nine are yours.\n\n1. Point the camera at a printed card and watch the `raw detections` debug\n   node to see the data.\n2. Read the `pick a class` function node. It works but it is basic.\n3. Add rules to the `class -> color` switch node."
    },
    {
        "id": "avr26ex_sub",
        "type": "ros2-subscribe",
        "z": "avr26ex_tab",
        "name": "/yolo_detections",
        "server": "27129f80a96ce509",
        "topicname": "/yolo_detections",
        "x": 180,
        "y": 240,
        "wires": [
            [
                "avr26ex_dbg",
                "avr26ex_fn",
                "avr26ex_clear"
            ]
        ]
    },
    {
        "id": "avr26ex_dbg",
        "type": "debug",
        "z": "avr26ex_tab",
        "name": "raw detections",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 430,
        "y": 140,
        "wires": []
    },
    {
        "id": "avr26ex_note_labels",
        "type": "comment",
        "z": "avr26ex_tab",
        "name": "Class labels",
        "info": "The ten strings the model can emit. Copy and paste them, a typo will not\nraise an error.\n\n```\nwheat_barrel\nwater_barrel\ngasoline\ntoxic_fluid\nwheat_barn\nwater_barn\nbridge_1line\nbridge_2line\nbridge_3line\nblackout\n```\n\nThe color for each one is in the AVR 2026 game manual.",
        "x": 210,
        "y": 60,
        "wires": []
    },
    {
        "id": "avr26ex_fn",
        "type": "function",
        "z": "avr26ex_tab",
        "name": "pick a class",
        "func": "// msg.payload.detections is an array. Each entry:\n//   { class_name: \"gasoline\", confidence: 0.83, bbox: [x1, y1, x2, y2] }\n//\n// This takes the first detection and passes its label through.\n\nvar detections = msg.payload.detections || [];\n\nif (detections.length === 0) {\n    return null;\n}\n\nmsg.payload = detections[0].class_name;\nreturn msg;\n\n// TODO\n//\n// 1. The array can hold more than one detection. Point the camera at two\n//    cards and check the debug node. Decide which one to use.\n//\n// 2. Each detection has a confidence between 0 and 1. This uses all of them.\n//    Aim at a blank wall and watch the ring.\n//\n// 3. Hold one card still and watch the ring. Decide how many frames in a row\n//    you need before acting.\n//\n// 4. This sends a message on every frame, including when the class has not\n//    changed.\n//\n// context.get() and context.set() let a function node remember values\n// between messages.\n",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 440,
        "y": 240,
        "wires": [
            [
                "avr26ex_switch"
            ]
        ]
    },
    {
        "id": "avr26ex_switch",
        "type": "switch",
        "z": "avr26ex_tab",
        "name": "class -> color",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "gasoline",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 660,
        "y": 240,
        "wires": [
            [
                "avr26ex_led_red"
            ]
        ]
    },
    {
        "id": "avr26ex_note_switch",
        "type": "comment",
        "z": "avr26ex_tab",
        "name": "Add the other classes",
        "info": "`gasoline` goes out of output 1 to a red `led` node.\n\nAdd a rule per class, set the switch to that many outputs, and wire each one\nto an `led` node with the right color. Check the manual for how many colors\nyou need.",
        "x": 690,
        "y": 180,
        "wires": []
    },
    {
        "id": "avr26ex_led_red",
        "type": "led",
        "z": "avr26ex_tab",
        "name": "gasoline -> red",
        "color": "red",
        "x": 900,
        "y": 240,
        "wires": [
            [
                "avr26ex_call"
            ]
        ]
    },
    {
        "id": "avr26ex_call",
        "type": "ros2-service-call",
        "z": "avr26ex_tab",
        "name": "set LED ring",
        "server": "27129f80a96ce509",
        "x": 1120,
        "y": 240,
        "wires": [
            []
        ]
    },
    {
        "id": "avr26ex_note_done",
        "type": "comment",
        "z": "avr26ex_tab",
        "name": "Already wired",
        "info": "`led` turns a color name into a service request and `ros2-service-call`\nsends it. Every `led` node wires into this same service call node.\n\nColors: red green blue yellow purple cyan white orange teal magenta gold\npink aqua jade amber old_lace black. black turns the ring off.",
        "x": 1130,
        "y": 180,
        "wires": []
    },
    {
        "id": "avr26ex_cmt_clear",
        "type": "comment",
        "z": "avr26ex_tab",
        "name": "Turning the ring off when detection stops",
        "info": "The detector publishes only when it sees something, so nothing arrives on\nan empty frame and the ring would hold its last color indefinitely.\n\nEvery detection restarts the timer below. When 5 seconds pass with no\ndetection the timer fires and the ring goes off.\n\nThe ring is shared with the flight mode indicator, which sets a color only\nwhen the mode changes. After this clears the ring, the flight mode color\nreturns on the next mode change.",
        "x": 420,
        "y": 300,
        "wires": []
    },
    {
        "id": "avr26ex_clear",
        "type": "trigger",
        "z": "avr26ex_tab",
        "name": "no detection for 5s",
        "op1": "",
        "op1type": "nul",
        "op2": "clear",
        "op2type": "str",
        "duration": "5",
        "extend": true,
        "overrideDelay": false,
        "units": "s",
        "reset": "",
        "bytopic": "all",
        "topic": "topic",
        "outputs": 1,
        "x": 420,
        "y": 340,
        "wires": [
            [
                "avr26ex_led_off"
            ]
        ]
    },
    {
        "id": "avr26ex_led_off",
        "type": "led",
        "z": "avr26ex_tab",
        "name": "nothing seen -> off",
        "color": "black",
        "x": 900,
        "y": 340,
        "wires": [
            [
                "avr26ex_call"
            ]
        ]
    },
    {
        "id": "compute_kit",
        "type": "tab",
        "label": "6 \u00b7 Compute Kit (drone only)",
        "disabled": true,
        "info": "Servo, GPIO and the open-collector laser pulse on the DEXI Compute Kit. Hardware only: enable this tab on the aircraft.",
        "env": []
    },
    {
        "id": "note_compute_kit_4",
        "type": "comment",
        "z": "compute_kit",
        "name": "Compute Kit",
        "info": "Hardware only. Enable this tab on the aircraft (double-click the tab and turn on Enabled).",
        "x": 60,
        "y": 20,
        "wires": []
    },
    {
        "id": "grp_compute_kit_5",
        "type": "group",
        "z": "compute_kit",
        "name": "Servo",
        "style": {
            "label": true,
            "fill": "#e9d5ff",
            "fill-opacity": "0.15",
            "stroke": "#999999"
        },
        "nodes": [
            "9c4db8541a85f472",
            "587a4e5953b42928",
            "24ceaa76f5bab1b7",
            "70964a0e08a70969",
            "d0a830d2a97d63fa",
            "0273ae2d0a88cf4a",
            "5b2bdcec3ceb2183",
            "e3bbbded576d22b0"
        ],
        "x": 40,
        "y": 55,
        "w": 800,
        "h": 310
    },
    {
        "id": "9c4db8541a85f472",
        "type": "servo",
        "z": "compute_kit",
        "name": "servo 0 (0 degrees)",
        "servoId": "0",
        "angle": "0",
        "x": 350,
        "y": 180,
        "wires": [
            [
                "587a4e5953b42928"
            ]
        ],
        "g": "grp_compute_kit_5"
    },
    {
        "id": "587a4e5953b42928",
        "type": "ros2-service-call",
        "z": "compute_kit",
        "server": "27129f80a96ce509",
        "x": 680,
        "y": 240,
        "wires": [
            []
        ],
        "g": "grp_compute_kit_5"
    },
    {
        "id": "24ceaa76f5bab1b7",
        "type": "ui_button",
        "z": "compute_kit",
        "name": "",
        "group": "c6e2654e4bd7b809",
        "order": 1,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "Servo 0 Open",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "className": "",
        "icon": "",
        "payload": "",
        "payloadType": "str",
        "topic": "topic",
        "topicType": "msg",
        "x": 160,
        "y": 180,
        "wires": [
            [
                "9c4db8541a85f472"
            ]
        ],
        "g": "grp_compute_kit_5"
    },
    {
        "id": "70964a0e08a70969",
        "type": "servo",
        "z": "compute_kit",
        "name": "servo 0 (180 degrees)",
        "servoId": "0",
        "angle": "180",
        "x": 360,
        "y": 240,
        "wires": [
            [
                "587a4e5953b42928"
            ]
        ],
        "g": "grp_compute_kit_5"
    },
    {
        "id": "d0a830d2a97d63fa",
        "type": "ui_button",
        "z": "compute_kit",
        "name": "",
        "group": "c6e2654e4bd7b809",
        "order": 2,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "Servo 0 Close",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "className": "",
        "icon": "",
        "payload": "",
        "payloadType": "str",
        "topic": "topic",
        "topicType": "msg",
        "x": 160,
        "y": 240,
        "wires": [
            [
                "70964a0e08a70969"
            ]
        ],
        "g": "grp_compute_kit_5"
    },
    {
        "id": "0273ae2d0a88cf4a",
        "type": "servo",
        "z": "compute_kit",
        "name": "servo 1",
        "servoId": "1",
        "angle": "90",
        "x": 320,
        "y": 300,
        "wires": [
            [
                "587a4e5953b42928"
            ]
        ],
        "g": "grp_compute_kit_5"
    },
    {
        "id": "5b2bdcec3ceb2183",
        "type": "ui_slider",
        "z": "compute_kit",
        "name": "",
        "label": "Servo 1 Slider",
        "tooltip": "",
        "group": "c6e2654e4bd7b809",
        "order": 3,
        "width": 0,
        "height": 0,
        "passthru": true,
        "outs": "all",
        "topic": "topic",
        "topicType": "msg",
        "min": 0,
        "max": "180",
        "step": 1,
        "className": "",
        "x": 160,
        "y": 300,
        "wires": [
            [
                "0273ae2d0a88cf4a"
            ]
        ],
        "g": "grp_compute_kit_5"
    },
    {
        "id": "e3bbbded576d22b0",
        "type": "comment",
        "z": "compute_kit",
        "name": "Attach two servos to compute kit ports 0 and 1",
        "info": "",
        "x": 260,
        "y": 100,
        "wires": [],
        "g": "grp_compute_kit_5"
    },
    {
        "id": "grp_compute_kit_6",
        "type": "group",
        "z": "compute_kit",
        "name": "GPIO",
        "style": {
            "label": true,
            "fill": "#e9d5ff",
            "fill-opacity": "0.15",
            "stroke": "#999999"
        },
        "nodes": [
            "45b05d4941beab87",
            "d709c92d023be2d0",
            "90ae78b5e6f667f4",
            "69867ae2360210c3",
            "9be6d9f1768a2010",
            "144fb41742ad6623",
            "f61df10b0d51e8d6",
            "36364799fa60f92b",
            "c29980b232b731fc"
        ],
        "x": 0,
        "y": 415,
        "w": 680,
        "h": 350
    },
    {
        "id": "45b05d4941beab87",
        "type": "ui_spacer",
        "z": "compute_kit",
        "name": "spacer",
        "group": "c6e2654e4bd7b809",
        "order": 4,
        "width": 1,
        "height": 1,
        "g": "grp_compute_kit_6"
    },
    {
        "id": "d709c92d023be2d0",
        "type": "write-gpio",
        "z": "compute_kit",
        "name": "Pin 0 high",
        "boardtype": "computekit",
        "pinnumber": "0",
        "pinstate": "true",
        "stampheader": false,
        "x": 320,
        "y": 580,
        "wires": [
            [
                "69867ae2360210c3"
            ]
        ],
        "g": "grp_compute_kit_6"
    },
    {
        "id": "90ae78b5e6f667f4",
        "type": "inject",
        "z": "compute_kit",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 120,
        "y": 580,
        "wires": [
            [
                "d709c92d023be2d0"
            ]
        ],
        "g": "grp_compute_kit_6"
    },
    {
        "id": "69867ae2360210c3",
        "type": "ros2-service-call",
        "z": "compute_kit",
        "server": "27129f80a96ce509",
        "x": 520,
        "y": 600,
        "wires": [
            []
        ],
        "g": "grp_compute_kit_6"
    },
    {
        "id": "9be6d9f1768a2010",
        "type": "write-gpio",
        "z": "compute_kit",
        "name": "Pin 0 low",
        "boardtype": "computekit",
        "pinnumber": "0",
        "pinstate": "false",
        "stampheader": false,
        "x": 320,
        "y": 640,
        "wires": [
            [
                "69867ae2360210c3"
            ]
        ],
        "g": "grp_compute_kit_6"
    },
    {
        "id": "144fb41742ad6623",
        "type": "inject",
        "z": "compute_kit",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 120,
        "y": 640,
        "wires": [
            [
                "9be6d9f1768a2010"
            ]
        ],
        "g": "grp_compute_kit_6"
    },
    {
        "id": "f61df10b0d51e8d6",
        "type": "ui_button",
        "z": "compute_kit",
        "name": "",
        "group": "c6e2654e4bd7b809",
        "order": 4,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "GPIO 0 High",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "className": "",
        "icon": "",
        "payload": "",
        "payloadType": "str",
        "topic": "topic",
        "topicType": "msg",
        "x": 130,
        "y": 520,
        "wires": [
            [
                "d709c92d023be2d0"
            ]
        ],
        "g": "grp_compute_kit_6"
    },
    {
        "id": "36364799fa60f92b",
        "type": "ui_button",
        "z": "compute_kit",
        "name": "",
        "group": "c6e2654e4bd7b809",
        "order": 5,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "GPIO 0 Low",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "className": "",
        "icon": "",
        "payload": "",
        "payloadType": "str",
        "topic": "topic",
        "topicType": "msg",
        "x": 130,
        "y": 700,
        "wires": [
            [
                "9be6d9f1768a2010"
            ]
        ],
        "g": "grp_compute_kit_6"
    },
    {
        "id": "c29980b232b731fc",
        "type": "comment",
        "z": "compute_kit",
        "name": "Attach LED circuit to GPIO port 0",
        "info": "",
        "x": 170,
        "y": 460,
        "wires": [],
        "g": "grp_compute_kit_6"
    },
    {
        "id": "grp_compute_kit_7",
        "type": "group",
        "z": "compute_kit",
        "name": "Open collector (laser pulse)",
        "style": {
            "label": true,
            "fill": "#e9d5ff",
            "fill-opacity": "0.15",
            "stroke": "#999999"
        },
        "nodes": [
            "3e8c68b2c73ac60c",
            "88ba407c025fb4ec",
            "1d2bbddafb31dbc5",
            "bbe56520b9ed6ec8",
            "6d54454c7d0bd609",
            "37899b58d7c98705",
            "4e5e0aa1f410873f",
            "e9a77ec95437c2a1",
            "ef4a4581ceb96f02"
        ],
        "x": 80,
        "y": 815,
        "w": 650,
        "h": 390
    },
    {
        "id": "3e8c68b2c73ac60c",
        "type": "write-gpio",
        "z": "compute_kit",
        "name": "Laser On",
        "boardtype": "computekit",
        "pinnumber": "15",
        "pinstate": "true",
        "stampheader": false,
        "x": 200,
        "y": 1040,
        "wires": [
            [
                "1d2bbddafb31dbc5"
            ]
        ],
        "g": "grp_compute_kit_7"
    },
    {
        "id": "88ba407c025fb4ec",
        "type": "inject",
        "z": "compute_kit",
        "name": "Start Laser Loop",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 200,
        "y": 960,
        "wires": [
            [
                "3e8c68b2c73ac60c"
            ]
        ],
        "g": "grp_compute_kit_7"
    },
    {
        "id": "1d2bbddafb31dbc5",
        "type": "ros2-service-call",
        "z": "compute_kit",
        "server": "27129f80a96ce509",
        "x": 380,
        "y": 1040,
        "wires": [
            [
                "bbe56520b9ed6ec8"
            ]
        ],
        "g": "grp_compute_kit_7"
    },
    {
        "id": "bbe56520b9ed6ec8",
        "type": "delay",
        "z": "compute_kit",
        "name": "",
        "pauseType": "delay",
        "timeout": "250",
        "timeoutUnits": "milliseconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 570,
        "y": 1040,
        "wires": [
            [
                "6d54454c7d0bd609"
            ]
        ],
        "g": "grp_compute_kit_7"
    },
    {
        "id": "6d54454c7d0bd609",
        "type": "write-gpio",
        "z": "compute_kit",
        "name": "Laser Off",
        "boardtype": "computekit",
        "pinnumber": "15",
        "pinstate": "false",
        "stampheader": false,
        "x": 200,
        "y": 1140,
        "wires": [
            [
                "37899b58d7c98705"
            ]
        ],
        "g": "grp_compute_kit_7"
    },
    {
        "id": "37899b58d7c98705",
        "type": "ros2-service-call",
        "z": "compute_kit",
        "server": "27129f80a96ce509",
        "x": 380,
        "y": 1140,
        "wires": [
            [
                "4e5e0aa1f410873f"
            ]
        ],
        "g": "grp_compute_kit_7"
    },
    {
        "id": "4e5e0aa1f410873f",
        "type": "delay",
        "z": "compute_kit",
        "name": "",
        "pauseType": "delay",
        "timeout": "250",
        "timeoutUnits": "milliseconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 570,
        "y": 1140,
        "wires": [
            [
                "3e8c68b2c73ac60c"
            ]
        ],
        "g": "grp_compute_kit_7"
    },
    {
        "id": "e9a77ec95437c2a1",
        "type": "comment",
        "z": "compute_kit",
        "name": "This assumes a KY-008 laser wired to the compute kit pin 15",
        "info": "",
        "x": 320,
        "y": 860,
        "wires": [],
        "g": "grp_compute_kit_7"
    },
    {
        "id": "ef4a4581ceb96f02",
        "type": "comment",
        "z": "compute_kit",
        "name": "KY-008 signal pin to 5V on compute kit, KY-008 negative pin to OC on compute kit",
        "info": "",
        "x": 390,
        "y": 900,
        "wires": [],
        "g": "grp_compute_kit_7"
    },
    {
        "id": "5b740dce2327d31a",
        "type": "comment",
        "z": "tagnav_tab",
        "g": "6e4a0164616edf26",
        "name": "Shortest mission: 2 tags. Starts on the ground and takes off by itself.",
        "info": "",
        "x": 300.0,
        "y": 100,
        "wires": []
    },
    {
        "id": "d59dad5559fdd7e1",
        "type": "comment",
        "z": "tagnav_tab",
        "g": "6e4a0164616edf26",
        "name": "Use it to learn the steps and for repeat testing: TAG HOP, then HOP BACK, then TAG HOP...",
        "info": "",
        "x": 380.0,
        "y": 130,
        "wires": []
    },
    {
        "id": "dc2ba05ffd9b40c3",
        "type": "comment",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "name": "Full route: 5 tags in a row. Two ways to start, both join at 'center on tag 0':",
        "info": "",
        "x": 320.0,
        "y": 360,
        "wires": []
    },
    {
        "id": "9c326faf509da86e",
        "type": "comment",
        "z": "tagnav_tab",
        "g": "94f8dcdd29911dfe",
        "name": "START takes off by itself.  PILOT HAND-OFF: the pilot takes off by hand, hovers over tag 0 and flips the Offboard switch.",
        "info": "",
        "x": 460.0,
        "y": 390,
        "wires": []
    }
]
