# Configuração para FIRST Tech Challenge

Nesse Capítulo vamos aprender a configurar a Limelight 3A para a utilização na FIRST Tech Challenge.

# Configuração

---
<p class="callout info">Este documento foi desenvolvido em parceria com a equipe JUSTICE FTC TEAM #21036</p>

[![Captura de tela 2024-09-13 183914.png](https://docs.stemos.com.br/uploads/images/gallery/2024-09/scaled-1680-/captura-de-tela-2024-09-13-183914.png)](https://docs.stemos.com.br/uploads/images/gallery/2024-09/captura-de-tela-2024-09-13-183914.png)
<div style="text-align: center;">A Limelight 3A para FTC foi projetada para tornar o processamento de imagem mais fácil do que nunca. Aqui está uma rápida visão geral deste processo:</div>

- Conecte a Limelight ao laptop com um cabo USB
- Configure até 10 pipelines de visão com a interface da Web integrada da Limelight.
  - Cada pipeline tem um “tipo”. Por exemplo, você pode configurar a pipeline 0 para ser uma pipeline “AprilTag”
  - Você pode escrever suas próprias pipelines definindo o tipo de pipeline como “Python Snapscript”
  - Os tipos de pipeline incorporadas podem rastrear peças de jogo coloridas, executar redes neurais e localizar o robô em 3D com base em um mapa de campo carregado. Cada 3A vem com um mapa de campo INTO THE DEEP integrado
- Depois de testar as pipelines no laptop, você pode conectar a Limelight à Porta USB 3.0 do Hub de Controle.
- Confira os exemplos de programação da FTC para obter dados de resultados da sua LL no código do robô.

Aqui está um guia de introdução mais detalhado:

### **Montagem e CAD**
- Use pelo menos 2 parafusos M3 ou M4 para montar a LL3A nas Extrusões da REV ou GoBilda  usando os orifícios de montagem rosqueados.
- Você também pode usar fita VHB ou abraçadeiras para prender o Limelight
- CAD: Vá para a [página de downloads](https://docs.limelightvision.io/docs/resources/downloads).

[![LL3ADrawingSmall-8695da1c46886679b11e7795b839e3ee.png](https://docs.stemos.com.br/uploads/images/gallery/2024-09/scaled-1680-/ll3adrawingsmall-8695da1c46886679b11e7795b839e3ee.png)](https://docs.stemos.com.br/uploads/images/gallery/2024-09/ll3adrawingsmall-8695da1c46886679b11e7795b839e3ee.png)

### **Atualizando o LimelightOS**
**<p class="callout info">Informações:<br/>**
As Limelights são fornecidas com uma imagem pré-instalada. Você provavelmente pode pular esta etapa por enquanto.

</p>

####  **Instruções de atualização (Windows)**

  <div class="callout warning">AVISO!<br/>
Salve seus pipelines antes de atualizar o LimelightOS. Eles serão excluídos durante a atualização.
  </div>

- Faça o download dos drivers USB mais recentes, da imagem do Limelight OS e da ferramenta Balena Flash na página de downloads.
- Mantenha pressionado o botão azul de configuração no seu Limelight.
-Enquanto o mantém pressionado, passe um cabo USB->USB-C do laptop para o
 seu Limelight. Seu Limelight será ligado automaticamente.

-  Depois de ter ligado o seu LL ao seu laptop, pode soltar o botão azul de configuração
-  Seu Limelight está agora em modo flash, e seus LEDs não piscarão.


- Execute o “Balena Etcher” como administrador.
- Pode levar até 20 segundos para que o computador reconheça a câmera.
- Selecione a imagem .zip mais recente em sua pasta de downloads
- Selecione um dispositivo “Compute Module” no menu “Drives”.
- Clique em “Flash”.
- Quando a atualização estiver concluída, remova o cabo USB do limelight.  </div>



#### **Instruções de atualização (Avançadas) (macOS e Linux)**

  <div class="callout warning">AVISO!<br/>
  Salve seus pipelines antes de atualizar o LimelightOS. Eles serão excluídos durante a atualização.
  </div>

  </div>

  </div>
  
- Faça o download da imagem do Limelight OS e da ferramenta Balena Flash na página de downloads.
- Crie você mesmo o driver de inicialização USB

<code class="callout info">
brew install libusb
brew install pkg-config
git clone --recurse-submodules --shallow-submodules --depth=1 https://github.com/raspberrypi/usbboot
cd usbboot
make
cd mass-storage-gadget64
sudo ../rpiboot -d .
</div></code> </div>

- Enquanto o rpiboot estiver em execução, sua câmera será enumerada corretamente no macOS e no Linux
- Você precisa executar o rpiboot sempre que quiser fazer o flash.
- Mantenha pressionado o botão de configuração na Limelight e, enquanto o mantém pressionado, passe um cabo USB -> USB-C do laptop para a Limelight.
- Sua limelight será ligada automaticamente.
- Execute o “Balena Etcher”.
- Pode levar até 20 segundos para que o computador reconheça a câmera.
- Selecione a imagem .zip mais recente em sua pasta de downloads
- Selecione um dispositivo “Compute Module” no menu “Drives”.
- Clique em “Flash”.
- Após a conclusão do flash, remova o cabo USB da limelight.
</div></p>

### **Fiação do robô**
Quando estiver pronto para usar a LL no robô, passe um cabo USBC para USBA da LL3A para a porta USB 3.0 do Hub de Controle. A Limelight 3A não é compatível com o Google Coral. Ainda é possível usar pipelines de deteção e classificação neurais definindo o mecanismo de tempo de execução da rede neural como “cpu”

### **Configuração do hub de controle**
- Atualize o SO do Control Hub, o aplicativo DriverStation, o aplicativo RobotController e o SDK para as versões mais recentes.
- Conecte a Limelight ao ControlHub e aguarde até que a luz verde de status da Limelight comece a piscar
- Conecte o ControlHub à rede WiFi do robô
- No aplicativo FTC DriverStation, clique em “Configure Robot” (Configurar robô)
- Se você não tiver uma configuração ativa, talvez seja necessário criar uma nova.
- Clique no botão “scan”.
- Você deverá ver um “Dispositivo Ethernet” aparecer.
- Você pode editar o nome desse dispositivo para “limelight” para maior clareza.
- Agora você pode inicializar um objeto Limelight3A em seu código usando o mapa de hardware.

# Configuração do Pipeline da FIRST Tech Challenge

---

<p class="callout info">Este documento foi desenvolvido em parceria com a equipe JUSTICE FTC TEAM #21036</p>

O LimelightOS armazena até 10 pipelines de visão únicos. Um pipeline é como um pequeno programa que pega uma imagem, processa a imagem e fornece um objeto de resultados para ser usado no código do robô. Os pipelines funcionam entre 10 fps (Redes Neurais da CPU) e 90 fps (Rastreamento de Objetos Baseado em Cores).

Para começar a ajustar os pipelines, ligue a Limelight ao seu computador e acesse [http://limelight.local:5801](http://limelight.local:5801) no seu navegador Web. Também pode acessar diretamente em [http://172.28.0.1:5801](http://172.28.0.1:5801) no Windows e [http://172.29.0.1:5801](http://172.29.0.1:5801) no Mac/ChromeOS/Linux.

Se você for um utilizador avançado e tiver alterado o índice USB ou o nome do anfitrião da sua LL, pode acessar à interface web em http://172.28.(usb_index).1:5801, http://172.29.(usb_index).1:5801, ou http://(hostname).local:5801

Se tiver baixado o Limelight Hardware Manager, você pode utilizar o botão “scan” para encontrar o endereço IP da sua Limelight.


<p class="callout info">Informações: Para editar vários pipelines, é necessário primeiro marcar a caixa de seleção “Ignore NetworkTables Index” na interface da Web. Isto diz à câmera para ignorar qualquer código que lhe diga para alterar as pipelines
</p>

### **Aba de Entrada**
---
A Aba de Entrada aloja controles para alterar a imagem bruta da câmara antes de ser passada pelo pipeline de processamento.

#### **Tipo de pipeline**
Controla o tipo de pipeline desejado (AprilTags, Neural Networks, Python, etc.)

#### **Imagem de origem**
Controla a origem da imagem que é passada através do pipeline. Mude para “Snapshot” para testar os pipelines de visão em Snapshots armazenados.
<div align=center>
  
[![ezgif-6-7097f31428.gif](https://docs.stemos.com.br/uploads/images/gallery/2024-09/ezgif-6-7097f31428.gif)](https://docs.stemos.com.br/uploads/images/gallery/2024-09/ezgif-6-7097f31428.gif)
  
</div>


#### **Resolução + Zoom**
Controla a resolução da câmera e do pipeline de visão. Recomendamos a utilização do pipeline de 320x240, a menos que esteja a utilizar a funcionalidade 3D.

Os pipelines de 320x240 são executados a 90 fps, enquanto os pipelines de 960x720 são executados a 22 fps. Em 2020, as opções de zoom de hardware 2x e 3x foram adicionadas a este campo. As opções de zoom não são digitais e utilizam 100% dos pixels reais do sensor.

#### **Orientação**
Controla a orientação do fluxo após todo o processamento. Isto não afeta de forma alguma os dados dos resultados.

<div align=center>

[![ezgif-6-db3196b266.gif](https://docs.stemos.com.br/uploads/images/gallery/2024-09/ezgif-6-db3196b266.gif)](https://docs.stemos.com.br/uploads/images/gallery/2024-09/ezgif-6-db3196b266.gif)
  
</div>
            
#### **Exposição**
Controla a definição de exposição da câmara em intervalos de 0,01 milissegundos. O aumento da exposição aumentará o brilho efetivo da imagem. Também aumentará a desfocagem do movimento.

<div align=center>

[![ezgif-6-3a0c00091b.gif](https://docs.stemos.com.br/uploads/images/gallery/2024-09/ezgif-6-3a0c00091b.gif)](https://docs.stemos.com.br/uploads/images/gallery/2024-09/ezgif-6-3a0c00091b.gif)
  
</div>

#### **Regulagem de nível de preto**
A regulagem de nível de preto é um controle avançado que pode afetar o brilho sem afetar a desfocagem do movimento. Mantenha-o o mais baixo possível.

<div align=center>

[![ezgif-6-1f5744f576.gif](https://docs.stemos.com.br/uploads/images/gallery/2024-09/ezgif-6-1f5744f576.gif)](https://docs.stemos.com.br/uploads/images/gallery/2024-09/ezgif-6-1f5744f576.gif)
  
</div>

#### **Ganho do sensor**
Aumentar o ganho do sensor aumentará efetivamente o brilho da imagem, mas normalmente também adiciona ruído à imagem. Pode utilizar o Ganho do sensor e a regulagem do nível de preto para iluminar a imagem sem aumentar o tempo de exposição. Isso minimizará o desfoque de movimento para aplicações de rastreamento de alta velocidade.

<div align=center>

[![ezgif-6-3a0c00091b.gif](https://docs.stemos.com.br/uploads/images/gallery/2024-09/ezgif-6-3a0c00091b.gif)](https://docs.stemos.com.br/uploads/images/gallery/2024-09/ezgif-6-3a0c00091b.gif)
  
</div>


#### **Equilíbrio de vermelho, Equilíbrio de azul**
Controla a intensidade dos componentes de cor vermelha e azul na sua imagem. Estes controlam coletivamente o equilíbrio de brancos do Limelight. Recomendamos deixá-los intocados

<div align=center>

[![ezgif-7-6b3bf715a0.gif](https://docs.stemos.com.br/uploads/images/gallery/2024-09/ezgif-7-6b3bf715a0.gif)](https://docs.stemos.com.br/uploads/images/gallery/2024-09/ezgif-7-6b3bf715a0.gif)
  
</div>

#### **Configuração detalhada do pipeline**
[Verifique os tipos específicos de pipeline clicando aqui](https://docs.limelightvision.io/docs/docs-limelight/pipeline-apriltag/apriltags).

# Início rápido da programação da FIRST Tech Challenge

---
<p class="callout info">Este documento foi desenvolvido em parceria com a equipe JUSTICE FTC TEAM #21036</p>

Exemplo básico para FTC: [Exemplo FTC](https://github.com/FIRST-Tech-Challenge/FtcRobotController/blob/master/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/SensorLimelight3A.java)

Na FTC, pode-se utilizar o Android Studio, OnBot Java e Blockly para interagir com o seu Limelight.

A maioria das aplicações requer menos de 10 linhas de código. Aqui está uma rápida visão geral do processo.

### **Uso básico**
1. Inicialize sua Limelight3A usando o mesmo nome que você usou durante a etapa de configuração do Control Hub.
2. Chame *pipelineSwitch()* para selecionar um dos 10 pipelines que você configurou usando a interface da Web
3. Chame *start()* para iniciar a sondagem de resultados em segundo plano a 100 sondagens por segundo.

<code>

                                                                                         public class Teleop extends LinearOpMode {

    private Limelight3A limelight;

    @Override
    public void runOpMode() throws InterruptedException
    {
        limelight = hardwareMap.get(Limelight3A.class, "limelight");

        telemetry.setMsTransmissionInterval(11);

        limelight.pipelineSwitch(0);

        /*
         * Starts polling for data.
         */
        limelight.start();
        .
        .
</code>


4. Chame *getLatestResult()* nos seus loops autónomos e de teleoperação para obter o último objeto LLResult
5. Utilize as funções *getTx()*, *getTy()* e *getBotpose()* do *LLResult* para guiar o seu robô.
   
<code>
  
      while (opModeIsActive()) {
        LLResult result = limelight.getLatestResult();
        if (result != null) {
            if (result.isValid()) {
                Pose3D botpose = result.getBotpose();
                telemetry.addData("tx", result.getTx());
                telemetry.addData("ty", result.getTy());
                telemetry.addData("Botpose", botpose.toString());
                .
                .
</code>


### **Utilização avançada**
1. Em casos de uso avançados podem exigir o uso das funções do *LLResult’s getColorResults()*, *getFiducialResults()*, etc. 

<code>
  
       // print some data for each detected target
    if (result.isValid()) {
        // Access fiducial results
        List<LLResultTypes.FiducialResult> fiducialResults = result.getFiducialResults();
        for (LLResultTypes.FiducialResult fr : fiducialResults) {
            telemetry.addData("Fiducial", "ID: %d, Family: %s, X: %.2f, Y: %.2f", fr.getFiducialId(), fr.getFamily(),fr.getTargetXDegrees(), fr.getTargetYDegrees());
        }

        // Access color results
        List<LLResultTypes.ColorResult> colorResults = result.getColorResults();
        for (LLResultTypes.ColorResult cr : colorResults) {
            telemetry.addData("Color", "X: %.2f, Y: %.2f", cr.getTargetXDegrees(), cr.getTargetYDegrees());
        }
    }
</code>

2. Para obter a máxima precisão de localização 3D, chame *updateRobotOrientation()* e utilize *getBotPose_MT2().* O MegaTag2 é um localizador de robôs fundido com IMU que utiliza a imu para resolver o problema de ambiguidade que é fundamental para todos os alvos planares, como os AprilTags.


<code>
  
           while (opModeIsActive()) {
        YawPitchRollAngles orientation = imu.getRobotYawPitchRollAngles();

        telemetry.addData("Yaw (Z)", "%.2f Deg. (Heading)", orientation.getYaw(AngleUnit.DEGREES));

        limelight.updateRobotOrientation(orientation.getYaw(AngleUnit.DEGREES));
        LLResult result = limelight.getLatestResult();
        if (result != null) {
            if (result.isValid()) {
                Pose3D botpose = result.getBotpose_MT2();
                .
                .
</code>


Para mais informações, consultar a 
[página de programação FTC](http://docs.limelightvision.io/docs/docs-limelight/apis/ftc-programming)

# Melhores práticas da FIRST Tech Challenge

---
<p class="callout info">Este documento foi desenvolvido em parceria com a equipe JUSTICE FTC TEAM #21036</p>

### **Lista de verificação da preparação do evento FTC**
- Baixe e faça backup de todos os pipelines para o seu laptop de programação.
- Baixe uma cópia da imagem mais recente da Limelight para seu laptop de programação.
- Registre uma lista de seus pipelines e seus índices.
1. Alvo duplo baixo
2. Alvo duplo alto Carga
- Adicione alívios de tensão ao cabo USB da Limelight.
- Considere a possibilidade de colar todas as conexões com cola quente.

### **Lista de verificação antes da partida**
- Verifique o cabo USB da sua Limelight.
- Verifique se há parafusos soltos no robô. Você pode usar um marcador permanente para ver se há mudanças na rotação dos parafusos.