diff --git a/Main/pom.xml b/Main/pom.xml index 075cefe38..8512fd210 100644 --- a/Main/pom.xml +++ b/Main/pom.xml @@ -5,7 +5,7 @@ 4.0.0 org.chameleon-vision.main chameleon-vision - 1.0-SNAPSHOT + 1.0.2 diff --git a/Main/src/main/java/com/chameleonvision/Main.java b/Main/src/main/java/com/chameleonvision/Main.java index b35cf8eb5..5f1ba3330 100644 --- a/Main/src/main/java/com/chameleonvision/Main.java +++ b/Main/src/main/java/com/chameleonvision/Main.java @@ -13,9 +13,8 @@ public class Main { for (var camSet : CameraManager.getAllCamerasByName().entrySet()) { new Thread(new VisionProcess(camSet.getValue())).start(); } - NetworkTableInstance.getDefault().startClient("localhost"); - - // NetworkTableInstance.getDefault().startClientTeam(SettingsManager.GeneralSettings.team_number); + NetworkTableInstance.getDefault().startClientTeam(SettingsManager.GeneralSettings.team_number); +// NetworkTableInstance.getDefault().startClient("localhost"); Server.main(8888); } else { System.err.println("No cameras connected!"); diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java b/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java index 27c44b884..6e2af5d8f 100644 --- a/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java +++ b/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java @@ -140,7 +140,7 @@ public class Camera { return currentPipelineIndex; } - void setCurrentPipelineIndex(int pipelineNumber) { + public void setCurrentPipelineIndex(int pipelineNumber) { if (pipelineNumber - 1 > pipelines.size()) return; currentPipelineIndex = pipelineNumber; } diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java b/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java index 3b1c3929c..1ea46c803 100644 --- a/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java +++ b/Main/src/main/java/com/chameleonvision/vision/camera/CameraManager.java @@ -70,7 +70,9 @@ public class CameraManager { private static boolean addCamera(Camera camera, String cameraName) { if (AllCamerasByName.containsKey(cameraName)) return false; - camera.addPipeline(); + for (int i = 0; i < 10;i++){ + camera.addPipeline(); // simple fix to create more pipelines for now + } AllCamerasByName.put(cameraName, camera); return true; } diff --git a/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java b/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java index ec09f6afd..0d1ef3ec8 100644 --- a/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java +++ b/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java @@ -3,7 +3,9 @@ package com.chameleonvision.vision.process; import com.chameleonvision.settings.SettingsManager; import com.chameleonvision.vision.Pipeline; import com.chameleonvision.vision.camera.Camera; +import com.chameleonvision.web.Server; import com.chameleonvision.web.ServerHandler; +import edu.wpi.cscore.VideoException; import edu.wpi.first.networktables.*; import org.opencv.core.*; import org.opencv.imgproc.Imgproc; @@ -77,12 +79,18 @@ public class VisionProcess implements Runnable { if (camera.getPipelines().containsKey(ntPipelineIndex)) { // camera.setEntryNotification.value.getString()); var pipeline = camera.getCurrentPipeline(); - - camera.setExposure(pipeline.exposure); + camera.setCurrentPipelineIndex(ntPipelineIndex); + try{ + camera.setExposure(pipeline.exposure); + } + catch (VideoException e){ + System.err.println(e.toString()); + } camera.setBrightness(pipeline.brightness); HashMap pipeChange = new HashMap<>(); pipeChange.put("curr_pipeline", ntPipelineIndex); ServerHandler.broadcastMessage(pipeChange); + ServerHandler.sendFullSettings(); } else { ntPipelineEntry.setString("pipeline" + camera.getCurrentPipelineIndex()); diff --git a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java index 2516cde7d..453d6d6c7 100644 --- a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java +++ b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java @@ -99,12 +99,13 @@ public class ServerHandler { sendFullSettings(); break; case "curr_pipeline": - String newPipeline = (String) value; + String newPipeline = value.toString(); var pipelineNumber = Integer.parseInt(newPipeline.replace("pipeline", "")); System.out.printf("Changing pipeline to %s\n", newPipeline); CameraManager.setCurrentPipeline(pipelineNumber); // broadcastMessage(allFieldsToMap(CameraManager.getCurrentPipeline())); broadcastMessage(allFieldsToMap(CameraManager.getCurrentPipeline())); + break; case "resolution": int newVideoMode = (int) value; diff --git a/README.md b/README.md index 0196a9abe..9c3e57522 100644 --- a/README.md +++ b/README.md @@ -1,163 +1,78 @@ # Chameleon-Vision -a free software for FRC teams to use for vision proccesing on their robots +Chameleon Vision is free open-source software for FRC teams to use for vision proccesing on their robots. -## getting started +## Getting started -These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system. +See Deployment for notes on how to deploy the project on a live system. - +These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. +(Coming soon!) ### Prerequisites +--- +#### For the co-processor - +- Java 12 Runtime (See Deployment - Software) +- Avahi Daemon -so in order to run this project we will need to install python in order to run the backend and node.js with vue.js in order to run the fronted +#### For the driver station -#### backend +- Bonjour -- python 3.7 and above -- opencv 3.4.5 +## Deployment +Deploying is as simple as uploading the chameleon-vision-1.xx.jar file to your target device. +Run the program with `java -jar chameleon-vision-1.xx.jar` -- tornado web framework +## Software -- robotpy-cscore +### Java 12 +Follow the correct instructions for your platform from [BellSoft](https://bell-sw.com/pages/liberica_install_guide-12.0.2/) -- pynetworktables +### Avahi Daemon (Linux systems) +`sudo apt-get install avahi-daemon avahi-discover avahi-utils libnss-mdns mdns-scan` -- pymq - - - -#### frontend - -- vue.js - -- vuex - -- vue-router - -- less and less-loader - -- iView - -- vue-native-websocket - - - -### installing - -#### for the backend - -1. sudo apt-get update - -2. apt-get dist-upgrade - -3. sudo apt-get upgrade - -4. sudo apt-get install python3-pip python3-dev cmake zip unzip build-essential git libnss-mdns --fix-missing - -5. sudo pip3 install numpy (if on raspberry pi do "sudo apt-get install python3-numpy") -6. sudo apt-get install python3-opencv -7. pip3 install robotpy-cscore -8. pip3 install pyzmq -9. pip3 install tornado - - - -to run the backend: - -``` - -sudo python3 Main.py - -``` - -if backed gets suck or no camera are recognized after a crash do: - -``` - -sudo pkill -9 python3 - -``` - -#### compiling: - -in order to compile the program for runtime run: (still needs to install dependencies) - -``` - -python3 -m nuitka --follow-imports Main.py - -``` - -#### for the frontend - -1. sudo apt-get install nodejs npm - -2. cd chameleon-client - -3. sudo npm install - -4. sudo npm install @vue/cli - - - -to run the front end you can open the cli ui by: - -``` - -vue ui - -``` - -of you can auto serve the ui by - -``` - -npm run serve - -``` +### Bonjour (Windows Systems) +Download and install Bonjour [from here](https://support.apple.com/kb/DL999?locale=en_US) ## Hardware -this is important when choosing your sbc it is more important to have a good usb controller that a good cpu +### ARM Co-processors +Currently only Raspberry Pi 3 or 4 models with at least 1GB of RAM are tested and supported. +Additional ARM-based single board computers (Odroid, Nvidia Jetson, etc.) will be supported in the near future. -on the odroid xu4 which is very fast i have got many bottlenecks from the usb controller and many times making the program crach -#### networking - -it is very important to install Bonjour - - - - -## docs - -main docs can be found at [google docs](https://docs.google.com/document/d/1qDuwHtpIPJfyXGIL8PJG89LZwRWbn2J9f-5g19lWL9U/edit?usp=sharing) - - +### x86 Computers +Currently any 64-Bit devices (Windows, Linux and Mac OS) are supported. +32 Bit devices are not supported. ## Authors * **Sagi Frimer** - *initial work* - websocket, settings manager, UI -* **Ori Agranat** - *main coder* - vision loop , UI, websocket, networktables +* **Ori Agranat** - *main coder* - vision loop, UI, websocket, networktables + +* **Omer Zipory** - *developer* - vision loop, websocket, networking + +* **Banks Troutman** - *developer* - vision loop, websocket, networking + +* **Matt Morley** - *developer* - documentation - ## Acknowledgments -* the [robotpy project](https://github.com/robotpy) and mainly the cscore libs +* [WPILib](https://github.com/wpilibsuite) - Specifically [cscore](https://github.com/wpilibsuite/allwpilib/tree/master/cscore), [CameraServer](https://github.com/wpilibsuite/allwpilib/tree/master/cameraserver), [NTCore](https://github.com/wpilibsuite/allwpilib/tree/master/ntcore), and [OpenCV](https://github.com/wpilibsuite/thirdparty-opencv). -* basically all of stackoverflow +* [Apache Commons](https://commons.apache.org/) - Specifically [Commons Math](https://commons.apache.org/proper/commons-math/), and [Commons Lang](https://commons.apache.org/proper/commons-lang/) -##License -Copyright (C) 2019 Ori Agranat oriagranat9@gmail.com +* [Javalin](https://javalin.io/) +* [Spring Framework](https://spring.io/) -* This file is part of Chameleon Vision. +* [JSON](https://json.org) -Chameleon Vision can not be copied without the express permission of Ori Agranat -Chameleon Vision binaries may be distributed under [Creative Commons Attribution 4.0](https://creativecommons.org/licenses/by/4.0/) +* [Google](https://github.com/google) - Specifically [Gson](https://github.com/google/gson) + +## License +Usage of Chameleon Vision must fall under all terms of [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode)