Git Product home page Git Product logo

robot-scouter's Introduction

Logo

Robot Scouter

Easy, efficient, and collaborative FIRST robot scouting

Get it on Google Play

Robot Scouter is an open-source Android app with three core goals: to make FIRST competition robot scouting easy, efficient, and collaborative.

Demo

Table of Contents

Features

Highlights ✨

  • Full offline support πŸ“‘
  • No setup required (i.e. no databases)
  • Customizable scouting templates
  • Advanced export capabilities
  • Integration with The Blue Alliance

Scouting πŸ“ƒ

  • Simple yet powerful collaboration both within and between teams πŸ”—
  • Multiple people can scout the same team, different teams, or go solo on Android N and use split screen mode to scout several teams at once 😎
  • Numerous metrics to choose from:
    • Header (title) πŸ”–
    • Checkbox (true/false) βœ…
    • Stopwatch (for keeping track of cycle time) ⏱️
    • Counter (numerical) πŸ”’
    • Item selector (list) πŸ“
    • Notes (textual) πŸ“œ

Templates πŸ“‹

  • Fully customizable and independent from each year's game
  • Defaults are provided for the current year's game

Exporting πŸ“Š

  • Advanced spreadsheet exporting:
    • Statistics and charts are automatically generated for each team
    • A global average sheet is included to compare teams against each other
    • Fancy formatting on devices with Android Lollipop (API 21) and above
  • PSA: Excel spreadsheets can easily be converted to Google Sheets
  • JSON exports are also supported for custom analysis (e.g. in Tableau)

Contributing πŸ’—

Want to add features, fix bugs, or just poke around the code? No problem! Just make sure to read the contribution guidelines before getting in too deep.

If you know another language, please help translate Robot Scouter!

Updating templates ⬆️

Anyone can do it! Simply follow the instructions throughout the file and send a pull request with your changes.

Learning πŸ“š

Environment setup πŸ’»

  1. Run ./gradlew setup
  2. If you are working with Firestore or need access to other Firebase technologies, create your own Firebase project and replace the dummy google-services.json with the one created in your Firebase project
  3. Run ./gradlew presubmit to make sure the CI build will pass
  4. That's it! πŸš€

Psst... 🀐

If you want to get the latest build from master, you can join the alpha testers group and the beta.

robot-scouter's People

Contributors

andrewda avatar supercilex avatar will-hou avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

robot-scouter's Issues

TODO random stuff for 1.0.0

Add Firebase database security rules

https://firebase.google.com/docs/database/security/

Rules in prod:

{
  "rules": {
    ".read": "auth != null",
    ".write": false,
    "v1": {
      "scout-indices": {
        "$key": {
          ".write": "auth != null && data.parent().parent().child('team-indices').child(auth.uid).child($key).exists()"
        }
      },
      "scout-templates": {
        ".write": "auth != null"
      },
      "scouts": {
        "$key": {
          ".write": "auth != null",
          "views": {
            "$metricKey": {
              "value": {
                ".validate": "(newData.parent().child('type').val() === 0 && newData.isBoolean()) || (newData.parent().child('type').val() === 1 && newData.isNumber()) || (newData.parent().child('type').val() === 2) || (newData.parent().child('type').val() === 3 && newData.isString())"
              }
            }
          }
        }
      },
      "team-indices": {
        "$uid": {
          "$key": {
            ".write": "auth != null && $uid === auth.uid",
            ".validate": "newData.isNumber()"
          }
        }
      },
      "teams": {
        "$key": {
          ".write": "auth != null && data.parent().parent().child('team-indices').child(auth.uid).child($key).exists()"
        }
      },
      "users": {
        "$uid": {
          ".write": "auth != null && $uid === auth.uid"
        }
      }
    },
    // START DEBUG RULES //
    "debug": {
      "scout-indices": {
        "$key": {
          ".write": "auth != null && data.parent().parent().child('team-indices').child(auth.uid).child($key).exists()"
        }
      },
      "scout-templates": {
        ".write": "auth != null"
      },
      "scouts": {
        "$key": {
          ".write": "auth != null",
          "views": {
            "$metricKey": {
              "value": {
                ".validate": "(newData.parent().child('type').val() === 0 && newData.isBoolean()) || (newData.parent().child('type').val() === 1 && newData.isNumber()) || (newData.parent().child('type').val() === 2) || (newData.parent().child('type').val() === 3 && newData.isString())"
              }
            }
          }
        }
      },
      "team-indices": {
        "$uid": {
          "$key": {
            ".write": "auth != null && $uid === auth.uid",
            ".validate": "newData.isNumber()"
          }
        }
      },
      "teams": {
        "$key": {
          ".write": "auth != null && data.parent().parent().child('team-indices').child(auth.uid).child($key).exists()"
        }
      },
      "users": {
        "$uid": {
          ".write": "auth != null && $uid === auth.uid"
        }
      }
    }
  }
}

Auto Scoutℒ️

Table of contents

Intro

Robot Scouter's laser focus on empowering teams to easily and efficiently scout has helped us realize that we can significantly improve the on-site scouting experience. The two core ideas behind Auto Scoutβ„’ are minimizing friction between the lead scout and his/her scouters; and making the end-to-end scouting experience effortless.

Auto Scout provides a completely guided and self-managed scouting solution from getting devices setup all the way to the final export. Some key features include:

  • Pre-loading and caching scouting templates and teams that will be attending a given event such that they are fully available offline
  • Managing a set of "slave" devices from one "master" device
  • Monitoring scouting activity
  • Tracking scouting progress and stats for the # of teams scouted, etc.
  • Display alerts about key information during scouting session
  • Full offline data retrieval and automated exporting

U[I/X]

The main UI for Auto Scout will be the second destination in home. It'll be like Google Photos or YouTube: there will be bottom navigation to switch between the main team list and Auto Scout.

In general, the UI is card-based and provides actionable information. Wherever possible, animations are used to enhance clarity.

Cards

Cards are the user's primary mode of interaction with Auto Scout. They should be tasteful and specific to a given action.

Cards are grouped in stages, each of which is applicable to a unique period of time in the build season. Each stage will have an intro card to help the user understand how the cards are tied together. To further enhance flow clarity, the stage name will become the toolbar title when Auto Scout is focused.

The order in which cards appear is determined by the order in which they are presented in this document. Card order is not user customizable.

Completing the final action of a card is marked with a "Done" button at the bottom. Should the card include nested navigation, it will be achieved through onboarding style panels with dots at the bottom to indicate flow progress. The button at the bottom will say "Next" instead of "Done." Swiping left returns to the previous state and swiping right only proceeds if inputs are valid.

Loading states should use Facebook style fake placeholder content whenever possible. Should that not be applicable, a centered indeterminate ProgressBar will do.

Card and stage states will be saved across devices and should be real-time like everything else in Robot Scouter.

Completed cards will be can't be restored, but their actions may be found in settings.

Intro

Intro cards explain what Auto Scout is all about and teach the user how to progress through the different stages.

Sign in

If the user ventured into Auto Scout and hasn't signed in yet, the first card should be this one with the following text:

Signing in lets you sync your team's scouting data across devices and enables Auto Scout.

Mock

image1

What is Auto Scout?

This card explains the what and how of Auto Scout:

Auto Scout strives to be our vision of a perfect scouting system. It aims to guide you through the baby steps of initially setting up Robot Scouter all the way through that final data export before alliance selection.

You are currently in the intro stage. To move on to the next stage, mark every card as completed by pressing β€œDone.” Some cards are required and cannot be marked as done without first completing their action.

Try it with this one! Press β€œDone.”

Mock

image4

Setup

Setup cards help prepare the user for the competition and can be completed early in the season.

Intro card:

Setup cards help you help usβ€”you'll be guided through device and account configuration.

Events

This card will use The Blue Alliance API to gather a whole bunch of event info. There will be 3 steps:

  1. Get the user's team
  2. Get the events that team is going to
  3. Get all the teams going at each event

To get the user's team, we'll have to check for connectivity and verify that the downloaded team data is correct. We'll display an explanation:

Help Auto Scout tailor the experience to your team and the events you will be attending. To get started, enter your team number:

Once the team is verified, we'll display the team's events with their display name, type, and city. If none are found, we'll show a message saying No events found for ${team}, enter your event keys manually. A link to TBA events will be provided. Even if the event fetch succeeds, we'll show the link and provide a text box to add events since TBA data may not be perfectly accurate. We'll also add trash icons to the right of each event like in the spinner metric editor.

Getting all the teams should be a piece of cake, it's just displaying progress that will be unpleasant. We should show a determinate linear ProgressBar along with which team is being downloaded.

Offline and error icons. The offline error will say Your results will be ready once you're back online.

Mock

image2

Devices

This card lists all the devices the user has registered (simply by signing in on said device) with the option to edit each device's name. In addition, it will have the following text under the list of devices:

To add a device, simply install Robot Scouter. If you aren't automatically signed in, be sure to use your [EMAIL OR PHONE] account.

Mock

img_20180503_220112

Google Sheets

This card will have a link to download the GSheets app if it isn't installed. Text:

Exported Excel spreadsheets can be easily imported into Google Sheets and uploaded to Google Drive via the Sheets app.

Mock

image3

Checklist

Checklist cards have tips and tooling to get the most out of Robot Scouter. As opposed to setup cards, checklist cards should be most relevant immediately before leaving for a competition.

Intro card:

Checklist cards ensure you're ready to do your best at competition. These should preferably be completed right before leaving home base while you still have a reliable internet connection.

Templates

This card ensures match and pit templates are assigned. If no template is assigned to a type, it will have a red X. Otherwise, a green check.

The template type will need to be stored with the template such that both the match and pit scout templates are shown in the card. The template editor will need to add an option to change the template type via a bottom sheet. This same bottom sheet will be available with a settings icon besides each item in the card. Setting a template to a type which already has one will unassign the pre-existing template.

Mock

img_20180727_151914_626

Ready? Set. Go!

This card ensures that everything is wrapped up. Completing the action on it indicates that this is the master device as explained with the following text:

By continuing on this device, you are indicating that you are the head scout and plan on monitoring scouting progress with it. This device will then become the "master," allowing you to manage "slave" devices throughout the competition. If that is not the case, please inform the head scout that they must finish setting up Auto Scout on their device and bring it to competition.

The "Prepare devices" button will hide the aforementioned text and show each device's status. Prep includes:

  • Caching
    • Teams (including media)
    • Templates
    • Shared settings, especially the template lock status
  • Lock templates for "slave" devices
  • Geofencing event locations to start Auto Scout in competition mode
  • Ensuring Robot Scouter is up-to-date

If a device doesn't respond within 30 seconds, it will be marked as failed. Failed devices will include an info button to get details about the failure and troubleshooting steps. Until all devices pass inspection, this card cannot be marked as done.

Mock

TODO

Event

Event cards primarily provide an overview of scouting status. They contain information and management tools to effectively coordinate active devices.

While cards' order shouldn't change dynamically, some information may be more relevant than other at different times. For example, the device status card becomes more relevant if it notices that a device lost comms or the battery is getting dangerously low. Therefore, cards may be reordered programmatically should an action or status become more important.

In a similar change, most cards won't have a primary action and therefore cannot be marked as done. The event stage should resemble a sci-fi dashboard (without the holograms πŸ˜‰).

Intro card:

Event cards help you monitor scouting status throughout the competition. They provide information about your current progress and device management tools to help you get the most high quality data possible with your available devices.

TODO

  • Pit scout tracker card, which teams have been scouted
    • Pretty progress circle with percentage in center
    • Offer to export pit data?
    • Look into uploading it directly to Google Drive
  • Person tracker to see if they're really scouting
  • Add card with a bunch of TBA links: rankings, schedule, livestream
  • Assign team to device
  • Add card with upcoming match and the teams that will be scouted with options to change them
    • Match #
    • Teams competing in the match
      • The team a given device should be scouting will be highlighted or otherwise marked to stand out from the crowd.
    • Expected match starting time
  • Card with current devices and their statuses and which teams are being scouted with options to send teams to be scouted
    • # of connected devices
    • Which teams they are scouting
      • If the device is "active" i.e. a ScoutActivity is past its onStart stage
    • Battery level
    • If we lose comms with a device, use a playful message like:

      Man down! Lost comms with [DEVICE NAME].

  • A card with a list of teams who still need pictures for the current year, ordered by who's going to be scouted first.
  • A stats card with the number of teams scouted and a progress bar, maybe a bar graph of the most scouted teams, the number of scouts collected, man hours per device (person), and collective man hours. Also a button to export data.
  • A way to automatically export data after every match that includes all the latest data from every team we're play against/with.
  • A games card that lets scouters bet on what the alliance score will be with a leaderboard. See also #248.
  • If templates are updated at competition, some way to sync them across devices
  • Add a tips card
  • Add simple ranking support to be able to swipe away teams as they go. Ideally two Robot Scouters could bump devices and get a ranking merge.

Epilogue

TODO

  • Suggestion to export data at the end of the day without WiFi
  • Share stats card with link to install Robot Scouter for word-of-mouth growth
  • Look into supporting BPR

Endgame

Endgame cards provide tools to help teams competing in eliminations.

TODO

  • Some way to take notes about the teams competing in a match and send it to the driveteam.

Notifications

TODO

  • Send notification to link devices when geofenced into competition
    • Hive mind icon with 🐝 or something?
    • Add buttons to start pit or match scouting
    • Tapping the notification starts a pit scout if the day is the same as the first day of competition and a match scout otherwise.
  • Notification has field drawing and devices can be assigned to position on field
  • It should have a picture of the field and which booth the team is at.

Miscellaneous

TODO

  • Button to change current match
  • A way to star teams and mark them as important
  • Option to send custom text in notification
  • Name the exports folder after the competition
  • Also add a TBA formatted match number field for JSON exporting
  • Support grouping/exporting the teams in chunks grouped by competition instead of having to delete them each time.
  • Add ability to add teams to pick and plague lists
  • Add ability to export spreadsheet for specific match
  • Automatically queue all on-demand modules for download in the background if the device is a Master
  • Look into the possibility of adding an local, realtime mesh DB. It'd be incredibly cool and powerful to have a live instance of the mesh's collective data.
  • Share feedback card with feature and bug reporter links
  • Some sort of schedule builder

Settings

Auto Scout will have its own dedicated section with options to:

Each item will go one level deeper and use the same infrastructure as the cards.

Phases

Idea for collecting logs

Make a github robot that can write issues to this repo and a report bug button in app that creates an exception in Firebase and creates the issue in github.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.