From 5070567b40f0051bba9d5de0aed2a67443409df0 Mon Sep 17 00:00:00 2001 From: Alagris Date: Sat, 9 Jan 2021 10:44:49 +0100 Subject: [PATCH 1/7] MealyCompiler (Solomonoff) imporved documentation --- Przybylski/kompilator/Wizja.md | 114 +++++----- Przybylski/kompilator/wymagania projektowe.md | 212 ++++++++++++++---- 2 files changed, 219 insertions(+), 107 deletions(-) diff --git a/Przybylski/kompilator/Wizja.md b/Przybylski/kompilator/Wizja.md index 09d8413..3fad376 100644 --- a/Przybylski/kompilator/Wizja.md +++ b/Przybylski/kompilator/Wizja.md @@ -1,14 +1,14 @@ -# Dokument wizji projektu +# Project Vision Document -#### Nazwa projektu: Solomonoff +#### Project name: MealyCompiler (Solomonoff) -#### Autorzy: Aleksander Mendoza, Bogdan Bondar, Marcin Jabłoński +#### Authors: Aleksander Mendoza, Bogdan Bondar, Marcin Jabłoński -#### Data: 13.12.2020 +#### Date: 13.12.2020 ### 1\. Executive summary -This project focuses on research in the field of automata theory and inductive inference. While many existing libraries already provide support for general purpose automata and implement various related algorithms, this project takes a slightly different approach. The primary tool for working with the library, is through doman specific language of regular expressions. Most of the things can be done without writing even a single line of Java code. +This project focuses on research in the field of automata theory and inductive inference. While many existing libraries already provide support for general purpose automata and implement various related algorithms, this project takes a slightly different approach. The primary tool for working with the library, is through domain specific language of regular expressions. Most of the things can be done without writing even a single line of Java code. We provide commandline as well as web interface and integrated build system. The main applications concern formal methods, natural language processing, state-based system modeling, pattern recognition, inductive inference and machine learning. It can be of great help for researchers as well as can be used on industrial scale. @@ -16,51 +16,42 @@ The greatest competitor for Solomonoff is Google's OpenFST project. Solomonoff i ### 2\. Goal and target audience -The goal is provide an better alternative for OpenFST. Solomonoff strives to provide improvement in the following domains: +The goal is to provide a better alternative for OpenFST. -- OpenFst has Matcher that was meant to compactify ranges. In Solomonoff all transitions are ranged and follow the theory of symbolic automata. They are well integrated with regular expressions and Glushkov's construction. They allow for more efficient squaring and subset construction. Instead of being an ad-hoc feature, they are well integrated everywhere. +OpenFst was a niche project with sparse documentation and neglected user interface. Everything is done primarily in C++ with templates, while commandline interface is basic, regular expression language has many fundamental flaws, their build system consists of tool for generating Makefiles that only call the compiler. Solomonoff strives to bring improvement with the following features: -- OpenFst has no built-in support for regular expression and it was added only later in form of Thrax grammars, that aren't much more than another API for calling library functions. In Solomonoff the regular expressions are the library. Instead of having separate procedures for union, concatenation and Kleene closure, there is only one procedure that takes arbitrary regular expression and compiles it in batch. This way everything works much faster, doesn't lead to introduction of any ε-transitions (in Solomonoff, ε-transitions aren't even implemented, because they were never needed thanks to Glushkov's construction). This leads to significant differences in performance. You can see benchmarks below. +- We have online REPL with examples and guides where everything works out of the box. Everything can be done with our rich and carefully designed regular expression language, so there is no need to write code. -- Many operations are implemented in "better" way. For example +- We provide extensive documentation in form of 3 scientific papers, detailed technical documentation of compiler implementation, extensive GitHub page and interactive REPL tutorial. - - Solomonoff has no need for ArcSort because all arcs are always sorted +- We ship with integrated build system that supports parallelism and interacts with compiler directly for optimum performance. It can be configured in TOML build files. - - Solomonoff has no Optimise because compiler decides much better when to optimise things +- Everything can be done in regular expressions and there is no need to interact with compiler's API (althought we do provide as an addition). - - Solomonoff has no RmEpsilon, because it has no epsilons in the first place +- There are plentiful of technical improvements, performance optimisations and innovative algorithms. All of them are described in detail in our documentation. We also provide performance benchamrks on our GitHub - - Solomonoff has no CDRewrite because the same effect can be achieved much more efficeintly with lexicographic weights and Kleene closure. +- Unlike any other existing automata tool, we ship with out-of-the functions for box inductive inference. - - In OpenFST if you perform `("a":"b"):"c"` you get as a result `"b":"c"`. OpenFST treats : as a binary operation. Solomonoff on the other hand treats : as unary operation. `("a":"b"):"c"` results in `"a":"bc"`. In fact `:'b'` is treated as `'':'b'` and `'a':'b'` is merely a syntactic sugar for 'a' '':'b'. You can write for example :'b' 'a'. The strings prefixed with : are the output strings, whereas strings without : are the input strings. You can very easily perform inversion of automaton by turning input strings into output strings and vice-versa. For example in Thrax you have `Inverse["a":"b"]` which results in `"b":"a"`. In Solomonoff the inverse of `'a':'b'` becomes `:'a' 'b'`. Very stright-forward. The semantics of `:` in OpenFST strip the output of the left-hand side. In fact, `X:Y` in OpenFST translates more literally to `stripOutput[X]:Y` in Solomonoff. - - Thrax supports so called "temporary"/"outside of alphabet" symbols. Any time you write `"[NEW_SYMBOL]"` it will take some large UNICODE codepoint hoping that it's not used anywhere else. In Solomonoff this is not necessary, because using type system is much better suited for this task. You can just write +The project found approval among members of Samsung's R&D team for Bixby developement and inductive inference researchers from Dortmund Technical University, Germany. Our system will be deployed in Samsung, our website can aid linguists with easily learning Solomonoff and our build system should make commandline usage more accessible. - - x = 'abcd' // some regex - x <: [a-z]* //ensure that it uses specific alphabet - z = x <404> x // use codepoint 404 as some "external symbol" - z <: ([a-z]|<404>)* - - Opis celu powstania projektu powinien w szczególności odpowiadać na następujące pytania: +The main products are: -- Solomonoff is much fater. Results of benchmarks on a large linguistic dictionary are as follows. Thrax compiles in 19 minutes, while Solomonoff in just 4 seconds. OpenFST executes in 250 milliseconds, while Solomonoff in 5 milliseconds. FAR file takes up 27M while Solomonoff's archive only 552K. OpenFST takes up 6336K in RAM, whole Solomonoff only 738K. OpenFST is written in C++, while Solomonoff in Java, so our implementation performs better despite being disadvantaged. +- compiler backend - the core of the project +- commandline interface with build system - allows more technical users to automate Solomonoff with shell scripts +- website and REPl - allows less technical users to experiene Solomonoff without much friction. -The project found approval among members of Samsung's R&D team for Bixby developement and inductive inference researchers from Dortmund Technical University, Germany. +Our project brings performance, which was measured with benchmarks (available on GitGub). We provide innovation, which can be easily noticed by the sheer amount of features Solomonoff implements, which are not available in any other existing tool (more information in scientific papers). We are user-friendly and we assesed it during usability tests and by collecting feedback from end users. ### 3\. Market -Currently there exists only one serious alternative, which is openfst library with their Thrax extension for writing regex-like grammars. Their solution has numerous problems. It's focus on probabilistic approach to modeling nondeterminism, made the library quite slow. It also became a double-edged sword, by making rule-based system difficult to maintain (compiler doesn't warn programmer when nondeterminism causes some rules to overshadow others). Compilation of grammars is lacking in many aspects. The grammar expression language is very basic and obscure. Compiler is not parallized and highly inefficient. On top of that, the probabilistic approach. +Currently there exists only one serious alternative, which is `OpenFST` library with their Thrax extension for writing regex-like grammars. Their solution has numerous problems. It's focus on probabilistic approach to modeling nondeterminism, made the library quite slow. It also became a double-edged sword, by making rule-based system difficult to maintain (compiler doesn't warn programmer when nondeterminism causes some rules to overshadow others). Compilation of grammars is lacking in many aspects. The grammar expression language is very basic and obscure. Compiler is not parallized and highly inefficient. On top of that, the probabilistic approach. -Our solution completely gets rid of nondeterminism. We will not attempt to model any probabilistic models. We will focus more heavily on making the expression language user-friendly and helpful in detecting potential non-determinism. The compiler should be able to process multiple rules in parallel to make compilation time faster. We could also take advantage of guarantees of determinism. There are many optimisations to be made thanks to this. The end goal is to make the whole system work in linear time and linear space. +- Our solution completely gets rid of nondeterminism. We will not attempt to model any probabilistic models. We will focus more heavily on making the expression language user-friendly and helpful in detecting potential non-determinism. The compiler should be able to process multiple rules in parallel to make compilation time faster. We implement Glushkov's construction and take advantage of special properties of functional transducers. For better user experience and easier management of code, we provide integrated build system and online REPL with extensive documentation. -For better user experience and easier management of code, we add build system and basic package manager (although, we don't provide centralised package repository) -Our project has been noticed by other researchers. We will work together with Dortmund University and make Solomonoff publicly available. - - -There used to be another similar project, developed by AT&T but it's been long discontinued and replaced by OpenFST. Aside from that, the market is extremely niche. There do not exist any other tools (or at least, they are not available publicly). The closest other competitors might include general-purpose automata libraries like Google's RE2 or Anders Møller's BRICS library. However, those projects are fundamentally different as they implement classical automata instead of tranasducers. +There used to be another similar project, developed by AT&T but it's been long discontinued and replaced by OpenFST. Aside from those two competitors, the market is very niche. There do not exist any other tools (or at least, they are not available publicly) strictly for compiling transducer. The closest other competitors might include general-purpose automata libraries like Google's `RE2` or Anders Møller's `BRICS` library. However, those projects are fundamentally different as they implement classical automata instead of tranasducers. As a result, Solomonoff is strictly more powerful and superior to those solutions. There is no other automata compiler with support for inductive inference. There is no ther symbolic transducer library (although there exist general-purpose libraries for symbolic automata, like `symbolicautomata`, `Microsoft Automata Library`, `Rex`, `Bex`, `Fast`, `Mona`). @@ -68,20 +59,12 @@ There used to be another similar project, developed by AT&T but it's been long d A simple and efficient library written in C will be the main and primary component of our product. On top of that, it will have command-line interface equipped with compiler. For easy and quick access, we should support online repl for all curious people who want to give our library a try. The compiler should support parallelism, warn user about non-determinism and allow for possibly some extent of generic programming (by defining functions working on regular expressions or bulk-generation of rules according to some regularities). We should ,however pay extra attention, to not making this language turing complete/undecidable by accident (otherwise compilation might never end). -- simple and efficient library written in Java - - essential functions for operations of - - concatenation - - Kleene closure - - union - - composition - - projection - - additional less important operations - - inverse - - composition - - algorithms of inference +- simple and efficient compiler-backend written in Java + - regular expression (concatenation, Kleene closure, union, composition, projection, inverse, composition, difference) + - algorithms of inductive inference - type system - integration with LearnLib - - is optimised for functional ranged transducers (so called symbolic automata) + - is optimised for functional ranged transducers (symbolic automata) - REPL and build system - support for parallelism @@ -90,24 +73,27 @@ A simple and efficient library written in C will be the main and primary compone - dependency resolver - supports everything that compiler does - additional directives + - TOML configurations -- online repl +- online repl and interactive tutorial - can write regular expressions on-the-fly - - can test for determinism without constructing automata (it's more efficient) - - user can download effects of their work for their local computer + - has all functions of the compiler + - saves work of user (cookies and session) + - syntax highlighting + - user can download the effects of their work for their local computer + - visualizes graphs of automata + - provides technical documentation -Proposed architecture (one of possible ways we could implement it): +Project architecture and key components: - there is all theoretical work and background written in our PDF - theoretical paper serves as basis for formal specification of library functions - - Java compiler - everything can be done from regualr expressions. User does not need to write a single Java line to use the compiler. - - REPL is extensions of compiler itself and shares codebase - - build system is developed and shipped independently from compiler -package manager is intergrated with build system and shares common codebase - - online REPL is built by compiling Java compiler with JWebAssembly - - backend in Spring - - website with basic info, documentation, examples and tutorials -YouTube channel and blog contain additional resources. They help us to promote the library and attract users. + - Java compiler uses as few libraries as possible: ANTLR for parsing, LearnLib for inductive inference + - REPL is developed on top of compiler backend and is not included in the compiler itself (although compiler provides certain facilities necessary for implementing REPL) + - build system is developed and shipped independently from compiler backend + - online REPL with backend in Spring, uses compiler's Java API. + - the REPL used by build system and web brwoser has overlaping features but due to inherent differences between the two enviroments their implementations differ a little. + - website contains documentation, examples and tutorials Our target audiences include: @@ -126,8 +112,6 @@ who might use it as one of their tools. (Especially if their employees are any o ### 5\. Scope and limitations -Time is our most valuable resource. If we start running out of it, we might drop support for formal specification and/or transducers. By the end of semester we should have working library, although there is no guarantee that it will be optimised. Optimisations should be ready by the end of second semester, though. There should also be a working basic version of expression language and compiler for it by the end of first semester. We should also have more-or-less working prototype of online repl, although the extent of what "working" means depends heavily on state of library. - Work schedule: - first semester @@ -141,17 +125,29 @@ Work schedule: - online repl integrated with compiler - machine learning algorithms - build system - - packaging system Team: - Aleksander Mendoza - formal specification and theoretical foundations - compiler implementation (Java) + - unit tests (JUnit) - Bogdan Bondar - web design (Bootstrap) - backend development (Spring) + - integration tests (Selenium) - Marcin Jabłoński - build system (Java) - REPL (ANTLR) - - assisting with compiler implementation + - assisting with compiler implementation (initial but discontinued C version) + +Limitations: + +- no official support for mobile devices. Website is responsive but no mobile-optimised version was added. End users should not code on their smartphones, which is not a common practice either way. +- no/limited compiler backend for embedded devices. While JavaME does exist, the compiler was not meant to be deployed in embedded systems. +- no (centralised) package manager for build-system. Developing package manager infrastructure is a prohibitively expensive operation. + + + + + diff --git a/Przybylski/kompilator/wymagania projektowe.md b/Przybylski/kompilator/wymagania projektowe.md index d8a1fe0..292da6f 100644 --- a/Przybylski/kompilator/wymagania projektowe.md +++ b/Przybylski/kompilator/wymagania projektowe.md @@ -1,57 +1,117 @@ -# Project Vision Document +# Project Requirements Document -### Project name: Solomonoff +### Project name: MealyCompiler (Solomonoff) ### Authors: Aleksander Mendoza, Bogdan Bondar, Marcin Jabłoński -### Date: 13.12.2020 +### Date: 8.01.2021 #### 0\. Document version - 13.12.2020 - initial version +- 8.01.2021 - minor improvements and final touch #### 1\. Project's components (project's products) -- simple and efficient library written in Java - - essential functions for operations of - - concatenation - - Kleene closure - - union - - composition - - projection - - additional less important operations - - inverse - - composition - - algorithms of inference + +Done in first semester: + +- C compiler backend (discontinued, because requirements shifted more towards Java) + - regular expression (concatenation, Kleene closure, union, output) + +- Java prototype + - regular expression (concatenation, Kleene closure, union + - type system + +- Online REPL prototype + - runs C backend in WebAssembly + - Ace editor with syntax highlighting + +Second semester: + + +- simple and efficient compiler-backend written in Java + - regular expression (concatenation, Kleene closure, union, output, composition, projection, inverse, composition, difference) + - algorithms of inductive inference - type system - integration with LearnLib - - is optimised for functional ranged transducers (so called symbolic automata) + - is optimised for functional ranged transducers (symbolic automata) + - parser in ANTLR + + - REPL and build system - support for parallelism - non-determinism warnings - packaging system - dependency resolver - supports everything that compiler does - - additional directives -- online repl - - has all features of the compiler itself - - user can download effects of their work for their local computer - - syntax highlighting - - documentation and code samples + - additional directives + - TOML configurations + +- online repl and interactive tutorial + - can write regular expressions on-the-fly and has all functions of the compiler (REST calls to Spring backend, which calls compiler Java API) + - saves work of user (cookies and session) + - syntax highlighting (Ace editr) + - user can download the effects of their work for their local computer + - visualizes graphs of automata (uses viz.js) + - provides technical documentation (formulas with MathJax) +- tests + - integration tests in Python with Selenium (Firefox + Chrome) + - all invariants, precodnitions, postconditions of specification expressed in form of assertions. Runtime analysis of specification with JUnit. + - automatically generated tests for random automata + - performance benchmarks + - usability tests - theory and specification - scientific papers explaining the theory with appropriate mathematical rigour - papers with proofs of correctness of essential algorithms - - specification of algorithms expressed with assertions, deeply checked with runtime analysis #### 2\. Project limitations -There are not many limitations in our project. It does not require keeping track of userbase, by using Java we do not impose any restrictions on operating systems and most importantly, we support most of the required features. Some users might feel restricted by not being able to define nondeterministic transducers but in reality it's for the better. Solomonoff has certain restrictions, that are there by design and in practice, they should not be a major issue. We do not support probabilistic transducers, but it's because probabilities do not play well with manually crafted regular expressions and they may lead to unstable solutions in the long term. Solomonoff also hides most of its API from user. Only very minimalist Java methods are exposed and transducers should not be manipulated programmatically. This also is by design, because Solomonoff puts heavy emphasis on the language of regular expressions. It embeds regexes in a special vernacular language that more than compensates lack of programmatic API. It also makes the system more user friendly as a whole. +- The minimal required Java version 1.8 . Oracle has dropped support for older versions long ago +- Website makes minimal use of CSS3, but older browsers should still be able to use the website. +- Internet explorer is not supported, because Microsoft stopped developing it. +- We did not test website for Safari and Edge, but they should work as well. +- build system and commandline interface works on all systems that can run Java. Embedded devices are not supported, as such a use case is unlikely. In the future we might add lightweight runtime that can execute automata on embedded envronments. + +Justifications: + +- initially we started writing compiler in C for best performance. Over the course of development it turned out that performance gains were minimal compared to Java, while the speed writing C code was much slower compared to ease of higher level development in Java. Moreover, the Samsung infrastructure heavily relies on Java and we found out that Java libraries are always preferred over C. Later we also established cooperation with LearnLib from Dortmund university and their entire library is written purely in Java. Hence we decided to switch to Java for better compatibility. +- we decided to make a website, because this technology is universaly accessible to everyone. A mobile app would require installation (and touch screen would be uncomfortable for writing regexes), command-line interface is only accessible to advanced users and desktop GUI apps require downloading, installation and setup. An online REPL would make Solomonoff easily accessible to masses. +- The build system was implemented in Java for compatibility with compiler backend. It is primarly targeted at more advanced users and large projects. Build system allows for working with multiple files, which extends the compiler backend that is only capable of working with monolithic streams of code. +- We considered using user authorization but we decided to keep it simple. Cookies and downloads are out only mean of permanent storage. Hiding our REPL behind "login wall" could potentially turn away some impatient users. There are many demo websites similar to ours that follow similar strategy and don't retain any user data. +- There are plenty of compiler features that we purposely did not implement. We do not support probabilistic automata, because their semantics tend to be unpredictable and difficult to control by regexes. We don't allow epsilon transitions and it allows for many optimisations. More such examples and technical details can be found in our documentation. +- Build system does not support namespaces. Instead we took approach similar to C, where "modules" are not a first-class language feature and are instead based on naming convention. When it comes to language features we are strong believers that simplicity and follow the mantra of "less means more". + #### 3\. List of functional requirements -- basic usage via regular expressions: union, concatenation, kleene closure, composition, inversion -- advanced usage via extensibility and native functions: Glushkovs construction supports calls to extenal functions -- ease of setup and efficient compilation: easy to use build system -- user firendly REPL from web browser without any required setup: compiler integrated in form of a library used by Spring backend + +- Java API: + - load/save transducer from/to file + - compile reguler expression + - run transducer + - create multiple independent instances of compiler that can work in parallel +- Build system + - load one or more files + - use transducers defined in other files + - compile files in project in parallel + - define list of source files in build configuration + - store many independent configuration files, even in the same directory + - run REPL after building project +- Online REPL + - open website and follow tutorial (shows additional tips for first time) + - compile a larger piece of code and then experiment with it in REPL + - compile code line by line in REPL + - read the technical documentation + - reopen website and continue where you left off (depending on time limit some things might be lost. The server should not store compiler instances indefinitely) + - download work progress locally + - go to GitHub page/download compiler and build system JAR +- Language functionalities: + - union, concatenation, kleene closure, output, composition, difference, inversion, identity, clear output + - inference: RPNI, RPNI-EDSM, RPNI-MEALY, OSTIA + - weights, reflections, functional nondeterminism + - ambiguous nondeterminism detection, typechecking + - lazy composition, linear programs, hoare-triples + - external native functions, optional user extensions #### 4\. List of non-functional requirements @@ -61,6 +121,7 @@ There are not many limitations in our project. It does not require keeping track - integration in Samsung - integration with LearnLib - performance benchmarks +- accessible and easy tutorials even for less technical users like linguists #### 5\. Measurable indicators @@ -70,26 +131,67 @@ There are not many limitations in our project. It does not require keeping track - disk usage - execution speed - compilation speed -- parallel compilation -- prepackaged executable avaiable for download +- list of features +- contributions to LearnLib +- deployment on http://solomonoff.projektstudencki.pl/ - unit tests +- integration tests - user experience feedback #### 6\. Acceptation criteria for first semester -- basic regular expressions: union, concatenation, kleene closure -- basic online playground with syntax highlighter and WebAssembly -- prototype of type system and weighted automata +- required: + - C compiler implementation: + - union, + - concatenation, + - kleene closure + - output + - execution + - Java prototype, theory and specification + - Glushkov's construction with variables + - type system + - nondeterminism detection + - binary search execution + - online compiler + - WebAssembly bindings + - Ace editor and syntax highlighting + - website design +- expected: + - usable precompiled delivery + - optimised algorithms + - additional operations (composition, inverse, subtraction) +- planned: + - support for formal verification + - inductive inference + - optimisations + - fully developed compiler + - tutorials, examples, how-tos + - extensive testing #### 7\. Acceptation criteria for second semester -- extended regular expressions -- optimised compiler -- inductive inference algorithms -- build system -- REPL -- online playground with backend, docs, samples and tutorials +- required: + - fully usable optimised compiler with all additional features + - working with multiple source files + - inductive inference + - tutorials, examples how-tos + - compatibility with client's existing Java infrastructure + - compatibility with LearnLib +- expected: + - secondary compiler features (graph visualisation, export/import, external utility functions) + - parallel compilation + - configurable build system + - inductive inference artifacts as build dependencies + - scripts for automated integration tests + - great performance benchmarks + - detailed technical documentation +- planned: + - partial inductive inference (OSTIA-C) for LearnLib + - Thrax-Solomonoff converter for backward-compatibility with legacy systems + - Video tutorials + - advanced online code editor/full online IDE + - extensible build system with plugins and repositories #### 8\. Project work organization @@ -98,34 +200,48 @@ There are not many limitations in our project. It does not require keeping track - weighted transducers - inductive inference - nondeterministic minimization + - - Bogdan Bondar (implementation) - - backend + - Spring backend - frontend - compiler integration + - testing (Selenium, unittest, JUnit) - Marcin Jabłoński (implementation) - - build system - - repl - - dependency resolver + - build system (Java) + - repl + - dependency resolver + - compiler developemnt (assistance and C implementation) + - compiler extension for handling multi-file projects Aleksander Mendoza is responsible for finding clients and communicating with them. -Initially our team attempted to use Scrum, but later we switched to incremental methodology, because workflow relied heavily on specification and long-term planning. Scrum's main advantage lies in its flexibility, which wasn't the key for this project. It also imposed unrealistic and unnatural team dynamics, which only made work more complicated than it had to be. Scrum gives all team memebrs high degree of independence and autonomy. In scrumchat, implementators describe the progress they made. On the other hand, in our project the specification is more rigid and work progresses according to it. Hence, it's always well understood who does what at what moment. The future tasks are generally known ahead of time. +Initially our team attempted to use Scrum, but later we switched to incremental methodology, because workflow relied heavily on specification and long-term planning. Scrum's main advantage lies in its flexibility, which wasn't the key for this project. It also imposed unrealistic and unnatural team dynamics, which only made work more complicated than it had to be. Scrum gives all team memebrs high degree of independence and autonomy. In scrumchat, implementators describe the progress they made. On the other hand, in our project the specification is more rigid and work progresses according to it. Hence, it's always well understood who does what at which moment. The future tasks are generally known ahead of time. Tools: - JIRA - git & GitHub +- CircleCI +- Selenium for integration tests +- MS Teams for video chats, Messanger for daily quick chat -We do not use continous integration, as the project is not meant to be continuously integrated at all. Compiler and library is released in versions. -REPL and website are meant to follow this versioning as well. +We created a full detailed list of planned tasks at the beginning of semester and tried to follow it, but we also added more unforseen tasks on the rolling basis according to necessity. +Every task corresponded to some palpable feature and its implementation allowed for closing the task. #### 9\. Project risks -The most important risk of our project was its heavy reliance on advanced theoretical concepts. It required plenty of rigour to make sure our foundations are correct and well defined. Should anything in our understanding of automata be wrong, the whole project would at risk of becoming irrelevant. +- The most important risk of our project was its heavy reliance on advanced theoretical concepts. It required plenty of rigour to make sure our foundations are correct and well defined. Should anything in our understanding of automata be wrong, the whole project would at risk of becoming irrelevant. -The second most critical concern was time. There was plenty to do and very little time. It was haard to estimate how much time any of the tasks would take. While missing initial deadlines due to unforseen complications is typical for software engineering projects, our project was exposed to a such risks at a much larger scale. Should anything be wrong in the formal specification, it could require months of additional research. In the worst case, if there was a mistake, some goals might turn out to be mathematically impossible. For this reason our team had to be rigorous about their promises. +- The second most critical concern was time. There was plenty to do and very little time. It was haard to estimate how much any of the tasks would take. While missing initial deadlines due to unforseen complications is typical for software engineering projects, our project was exposed to a such risks at a much larger scale. Should anything be wrong in the formal specification, it could require months of additional research. In the worst case, if there was a mistake, some goals might turn out to be mathematically impossible. For this reason our team had to be rigorous about their promises. -There was little risk with respect to technologies, although the most significant one was chosing the appropriate infrastructure for an open-source non-profit project. We can't bear large costs of maintenance, therefore we used open-source and free resources as much as possible. While in the end the project had to switch from WebAssembly to using backend, we hope that in the long-trem we will find hosting sponsored by some research institution. In the worst case, should we not get any sponsorship, the most of the project is resilient and can still remain relevant even without backend. The web interface could be then treated as an optional addition, that user can download and run locally as an alternative to terminal-based interface. +- The organization of work was a challenge. Project requirements often required us to learn new technologies and solve nontrivial problems. Our team often got stuck on challenging problems and sometimes we had to change plans as some of our plans turned out to be technically impossible: + - we struggled with JWebAssembly and in the end switched to Spring + - the low-level C implementation was going too slow and we faced the risk of not delivering on time + - after the first semester we gained plenty of experience developing Java prototype and we noticed a galore of details that could be done better than we initially planned. We took a drastic decision to rewrite the compiler in Java, which was seen as risky. + + Due to these and many other difficulties, our team could have failed on multiple occations. + +- Our project is very niche and finding clients is not easy. If any of our clients lost interest in our solution, finding a new one might become impossible. #### 10\. Milestones From 57277742dd56b3194f399dfc9ecbd7ed176b0b27 Mon Sep 17 00:00:00 2001 From: WSebo Date: Thu, 14 Jan 2021 21:34:35 +0100 Subject: [PATCH 2/7] Update dokumentacji --- Przybylski/awionika/wizja_projektu.md | 100 ++++++++-------- Przybylski/awionika/wymagania_projektowe.md | 119 +++++++++++--------- 2 files changed, 114 insertions(+), 105 deletions(-) diff --git a/Przybylski/awionika/wizja_projektu.md b/Przybylski/awionika/wizja_projektu.md index 78e7bc4..9f6cd7e 100644 --- a/Przybylski/awionika/wizja_projektu.md +++ b/Przybylski/awionika/wizja_projektu.md @@ -1,35 +1,24 @@ --- author: -- Wojciech Kubiak -- Piotr Józefowicz -- Sebastian Wawrzyn -title: -- Dokument wizji dla projektu Awionika do rakiet +- Wojciech Kubiak, Piotr Józefowicz, Sebastian Wawrzyn +title: "**Dokument wizji dla projektu Awionika do rakiet**" --- - # Executive summary Dokument dotyczy projektu realizowanego w ramach przedmiotu projekt inżynierski. Niniejszy dokument służy przedstawieniu przeznaczenia -tworzonego systemu, jego głównych cech i przyjętych założeń. Grupa -docelowa dla projektu jest koło naukowe na politechnice poznańskiej PUT -RocketLab, zajmujące się budowa rakiet i silników rakietowych. Potrzebny -jest komputer pokładowy do rakiety oraz aplikacje ułatwiające obsługę -testów rakiet i silników. Nasz projekt ma dostarczyć:Dokument dotyczy -projektu realizowanego w ramach przedmiotu projekt inżynierski. -Niniejszy dokument służy przedstawieniu przeznaczenia tworzonego -systemu, jego głównych cech i przyjętych założeń. Grupa docelowa dla -projektu jest koło naukowe na politechnice poznańskiej PUT RocketLab, -zajmujące się budowa rakiet i silników rakietowych. Potrzebny jest -komputer pokładowy do rakiety oraz aplikacje ułatwiające obsługę testów -rakiet i silników. Nasz projekt ma dostarczyć: +tworzonego systemu, jego głównych cech i przyjętych założeń. Grupą +docelową dla projektu jest koło naukowe na politechnice poznańskiej PUT +RocketLab, zajmujące się budową rakiet i silników rakietowych. Potrzebny +jest komputer pokładowy do rakiety oraz aplikacje umożliwiające obsługę +testów rakiet i silników. Nasz projekt ma dostarczyć: - Aplikację desktopową pozwalająca wyświetlać dane na żywo z testów, konfigurować ustawienia modułów komputera pokładowego oraz zapisywać/usuwać dane z pamięci podręcznej modułów. -- Komputer pokładowy posiadający układ wyzwolenie separacji oraz +- Komputer pokładowy posiadający układ wyzwalający separację oraz zbierający dane telemetryczne o locie, które będą mogły być przekazywane na żywo do aplikacji poprzez nadajnik i odbiornik. @@ -47,7 +36,7 @@ rakiety po jej wylądowaniu. Potrzebna jest również aplikacja, która będzie pełniła funkcję kontrolera lotów/testów. Takie testy generują dużą liczbę danych, które ciężko uporządkować więc potrzebne jest też miejsce, w którym będzie można je porządkować i wyświetlać w przejrzysty -sposób. Koło nie posiada też strony internetowej-tak zwanej wizytówki, +sposób. Koło nie posiada też strony internetowej - tak zwanej wizytówki, która ma budować rozpoznawalność w internecie i pomóc w kontakcie przyszłym kandydatom na członków koła.\ Projekt oprócz komputera pokładowego będzie się składał z dwóch @@ -71,12 +60,12 @@ komputera pokładowego rakiety oraz odczytywania i zapisywania z nich danych. Pobrane dane będą od razu przekazywane do chmury tak jak w przypadku testu na żywo. Będzie również możliwa zmiana konfiguracji tych modułów-zmiany ustawień parametrów programu na danym module (np. ilość -bitów na sekundę podczas wysyła danych, częstotliwość, moc anteny), są -to parametry, które muszą być zmieniane podczas czasu życia modułu. Ta -funkcjonalność ma na celu zapewnić większe bezpieczeństwo podczas zmiany -tych parametrów. Parametry nie będą zmieniane poprzez wgranie nowego -kodu tylko przez aplikacje, dzięki temu na samym urządzeniu nie trzeba -będzie zmieniać kodu źródłowego.\ +bitów na sekundę podczas wysyłania danych, częstotliwość, moc anteny), +są to parametry, które muszą być zmieniane podczas czasu życia modułu. +Ta funkcjonalność ma na celu zapewnić większe bezpieczeństwo podczas +zmiany tych parametrów. Parametry nie będą zmieniane poprzez wgranie +nowego kodu tylko przez aplikacje, dzięki temu na samym urządzeniu nie +trzeba będzie zmieniać kodu źródłowego.\ Klientowi zależy na tym, aby pozyskać z rakiety dane, które pozwolą sprawdzić, czy rakieta osiągnęła oczekiwane parametry lotu zgodne z wcześniejszą symulacją takie jak apogeum, prędkość, liczba macha czy @@ -86,10 +75,9 @@ czy żyroskop, a następnie zapisać te dane i wyświetlić je w czytelnej formie w celu ich analizy. Komputer pokładowy będzie umożliwiał zebranie powyższych danych, a także wyzwolenie separacji/spadochronu w dwóch różnych konfiguracjach: poprzez automatyczne wykrycie spadku swobodnego -oraz poprzez użycie timera (ustawienie odpowiedniego opóźnienia, po -którym zostanie wyzwolona separacja/spadochron). Rakieta będzie też -wyposażona w lokalizator, który będzie umożliwiał odnalezienie rakiety -po lokalizacji GPS wysłanej za pomocą komunikacji bezprzewodowej LORA. +(apogeum). Rakieta będzie też wyposażona w lokalizator, który będzie +umożliwiał odnalezienie rakiety po lokalizacji GPS wysłanej za pomocą +komunikacji bezprzewodowej LORA. # Rynek @@ -100,7 +88,7 @@ oferuje, aplikacji do zbierania danych, przez co robi się z nimi bałagan i trzeba dbać samemu o to, by te dane katalogować. Gotowe lokalizatory, mimo że zaawansowane również są bardzo drogie. -## Przykłady produktów na rynku:  +## Przykłady produktów na rynku - Dużym zainteresowaniem na świecie cieszą się amerykańskie [EggTimery](http://eggtimerrocketry.com/home/altimeters-av-bay/). @@ -139,16 +127,14 @@ mimo że zaawansowane również są bardzo drogie. # Opis produkt -## Aplikacja webowa: +## Aplikacja webowa - wizytówka koła -- możliwością wgrania avatara - - dane z testów będzie można zapisywać na serwerze w celu stworzenia historii testów -- eksport danych GPS w formacie NMEA +- eksport danych GPS w formacie KML (trajektoria lotu) - eksport danych telemetrycznych do Excel'a @@ -156,12 +142,14 @@ mimo że zaawansowane również są bardzo drogie. - wyświetlenie danych historycznych (z testów) +- wyświetlenie danych historycznych w formie live (z testów) + - wyszukiwanie testu po nazwie i dacie - kategoryzacja danych telemetrycznych (historia testów) przypisana do testu -## Aplikacja desktopowa: +## Aplikacja desktopowa - pomiary z rakiety obrazowane na żywo: @@ -187,7 +175,7 @@ mimo że zaawansowane również są bardzo drogie. - zmiana konfiguracji modułów elektronicznych -## Elektronika: +## Elektronika - dokonywanie pomiarów podczas lotu (prędkość, przyspieszenie, wysokość, wychylenia w osiach XYZ)  @@ -198,8 +186,6 @@ mimo że zaawansowane również są bardzo drogie. - wykrycie apogeum (spadku swobodnego) pozwalające wyzwolić separacje/spadochron -- timer pozwalający wyzwolić separacje/spadochron - - wyzwolenie separacji, spadochronu poprzez odpalenie zapalnika elektrycznego  @@ -207,6 +193,8 @@ mimo że zaawansowane również są bardzo drogie. - odbieranie danych przez odbiornik +- odpalenie drugie spadochronu na określonej wysokości + - przekazywanie danych do aplikacji desktopowej - zapisywania danych do pamięci modułu @@ -217,16 +205,15 @@ mimo że zaawansowane również są bardzo drogie. # Zakres i ograniczenia -## Skład zespołu: +## Skład zespołu -- Wojciech Kubiak - systemy wbudowane - arduino, c++, python +- Wojciech Kubiak - systemy wbudowane - arduino, c++, FreeRTOS, python -- Sebastian Wawrzyn - backend - .NET Core, C#, Docker, baza - danych +- Sebastian Wawrzyn - backend - .NET Core, C-.05em , Docker, NoSql - Piotr Józefowicz - frontend - Vue.js, typescript -## Kamienie milowe: +## Kamienie milowe - I faza, I semestr (02.2020 - 07.2020): @@ -245,14 +232,15 @@ mimo że zaawansowane również są bardzo drogie. - Poddanie MVP testom funkcjonalnym -- II faza, II semestr(10.2020 - 12.2020): +- II faza, II semestr(10.2020 - 01.2021): - - Uaktualnienie dekumentacji i Trello + - Uaktualnienie dokumentacji i Trello - - Rozpoczęcie prac programistycznych nad aplikacjami + - Kontynuacja prac programistycznych nad aplikacjami - Kontynuacje prac programistycznych nad komputerem pokładowym - oraz rozpoczęcie prac nad nadajnikiem i odbiornikiem + + - Rozpoczęcie prac nad nadajnikiem i odbiornikiem - Testowanie komputera pokładowego oraz elektroniki naziemnej @@ -265,7 +253,7 @@ mimo że zaawansowane również są bardzo drogie. - Wdrożenie aplikacji na publiczną domenę -## Harmonogram: +## Harmonogram MVP produktu zostanie wypracowane i przedstawione do końca czerwca 2020 roku, zawierać będzie funkcjonalności takie jak: @@ -301,7 +289,7 @@ roku, zawierać będzie funkcjonalności takie jak: - Wdrożenie aplikacji na środowisko testowe -Pierwsza wersja produktu wypracowana i oddana do grudnia 2020 roku, +Druga wersja produktu wypracowana i oddana do stycznia 2021 roku, obejmować będzie: - Wszystkie funkcjonalności zdefiniowane w MVP @@ -314,6 +302,8 @@ obejmować będzie: - Konfiguracja modułu + - Zapis danych na pamięć flash + - Nadajnik/Lokalizator: - Lokalizacja GPS oraz redundantny system prędkości wysokości @@ -325,18 +315,24 @@ obejmować będzie: - Elektronika naziemna/Odbiornik: + - Konfiguracja modułu + - Odbieranie danych od komputera pokładowego (LORA) - Przekazywanie danych do serwera za pomocą REST API - Przekazywanie danych do kolejnych urządzeń za pomocą Seriala - - Przekazywanie danych do kolejnych urządzeń za pomocą Bluetooth - - Aplikacja internetowa (frontend): - Wyświetlanie i gromadzenie danych historycznych testów + - Wyświetlanie testów historycznych w postaci live + + - Eksport testów do plików + + - Widok podsumowania testu + - Profil użytkownika - Aplikacja desktopowa: diff --git a/Przybylski/awionika/wymagania_projektowe.md b/Przybylski/awionika/wymagania_projektowe.md index e883083..bdf0ea9 100644 --- a/Przybylski/awionika/wymagania_projektowe.md +++ b/Przybylski/awionika/wymagania_projektowe.md @@ -1,10 +1,7 @@ --- author: -- Wojciech Kubiak -- Piotr Józefowicz -- Sebastian Wawrzyn -title: -- Dokument wymagań projektowych +- Wojciech Kubiak, Piotr Józefowicz, Sebastian Wawrzyn +title: "**Dokument wymagań projektowych**" --- # Elementy składowe projektu (produkty projektu) @@ -43,10 +40,6 @@ title: - Baza danych NoSql -- Repozytorium git zawierające kod aplikacji, API, elektroniki - -- Tablica projektowa -- Trello - # Granice projektu - Produkty zawarte: @@ -63,18 +56,18 @@ title: # Lista wymagań funkcjonalnych -## Komputer pokładowy: +## Komputer pokładowy - Dokonywanie pomiarów telemetrycznych (barometr, żyroskop, akcelerometr) - Zapis danych na flash (format tekstowy) -- Wyzwolenie separacji za pomocą timera - - Odpalenie zapalnika elektrycznego -- Automatyczne wyzwolenie separacji za pomocą barometru +- Automatyczne wyzwolenie separacji za pomocą barometru w apogeum + +- Wyzwolenie separacji na żądanej wysokości - Konfiguracja/kontrola modułu: @@ -82,6 +75,8 @@ title: - odczyt danych z flash + - czyszczenie pamięci flash + ## Nadajnik/Lokalizator - Lokalizacja GPS oraz redundantny system prędkości wysokości @@ -95,6 +90,8 @@ title: - odczyt danych z flash + - czyszczenie pamięci flash + ## Aplikacja internetowa - Logowanie za pomocą Auth0 @@ -121,19 +118,23 @@ title: - Przegląd danych historycznych +- Wyświetlanie testów historycznych w postaci live + - Zintegrowania aplikacji webowej z REST API -- Profil użytkownika, możliwość zmiany nazwy użytkownika, imienia, - nazwiska, emaila, hasła +- Eksport testów do plików (json, excel) -## Aplikacja desktopowa: +- Eksport trajektorii lotu rakiety do pliku KML (Google earth) + +- Profil użytkownika, możliwość zmiany nazwy użytkownika, imienia, + nazwiska, e-maila, hasła + +## Aplikacja desktopowa - Wyświetlanie danych z testów live (wykresy) - Wyświetlanie lokalizacji za pośrednictwem Google Maps -- Wyświetlenie informacji tekstowych z komputera pokładowego - - Konfigurowanie modułów elektronicznych - Odczyt/Zapis danych z modułów elektronicznych @@ -142,7 +143,7 @@ title: - Zapis pomiarów w plikach json -## Aplikacja serwerowa, REST API: +## Aplikacja serwerowa, REST API - Dodanie serwisów REST pozwalających na operacje wymienione w punkcie "Aplikacja internetowa" @@ -150,13 +151,13 @@ title: - Dodanie serwisów REST pozwalających na operacje wymienione w punkcie "Aplikacja desktopowa" -- Zintegrowania API z bazą danych +- Zintegrowanie API z bazą danych - Wdrożenie aplikacji na środowisko testowe - Wdrożenie aplikacji na środowisko produkcyjne -## Elektronika naziemna (odbiornik): +## Elektronika naziemna (odbiornik) - Odbieranie danych od komputera pokładowego (LORA) @@ -164,15 +165,13 @@ title: - Przekazywanie danych do kolejnych urządzeń za pomocą Seriala -- Przekazywanie danych do kolejnych urządzeń za pomocą Bluetooth - - Konfiguracja/kontrola modułu: - zmiana parametrów uruchomieniowych # Lista wymagań niefunkcjonalnych -## Komputer pokładowy: +## Komputer pokładowy - Bezpieczny w użyciu @@ -212,7 +211,7 @@ title: - FreeRTOS -## Elektronika naziemna (odbiornik): +## Elektronika naziemna (odbiornik) - Bezpieczna w użyciu @@ -224,15 +223,13 @@ title: - Z czytelnym, przejrzystym kodem -- Zintegrowana z REST API - wysyła dane telemetryczne - - Technologie: - Arduino - C++ -## Aplikacja internetowa (frontend): +## Aplikacja internetowa (frontend) - Wytworzona z użyciem nowoczesnych standardów @@ -248,7 +245,7 @@ title: - Typescript -## Aplikacja desktopowa: +## Aplikacja desktopowa - Wytworzona z użyciem nowoczesnych standardów @@ -278,11 +275,9 @@ title: - .NET Core - - C# + - C-.05em -## Aplikacja serwerowa - REST API: - -- Używa bazy danych NoSql +## Aplikacja serwerowa - REST API - Zaprojektowana według najnowszych standardów .NET @@ -298,19 +293,25 @@ title: - Docker -## Baza danych: +## Baza danych + +- Szybka obsługa zapytań + +- Rozszerzalna + +- Niezawodna - Technologie: - NoSql -## Prototyp aplikacji internetowej przetestowany przez użytkowników: +## Prototyp aplikacji internetowej przetestowany przez użytkowników - Technologie: - Adobe XD -## Tablica projektowa - Trello: +## Tablica projektowa - Trello - Historia wymagań funkcjonalnych (User stories) @@ -320,7 +321,13 @@ title: - Lista zadań zaplanowanych na przyszłość -## Repozytorium zawierające kod aplikacji, API oraz elektroniki +## Repozytorium zawierające kod aplikacji, API oraz elektroniki + +- Czytelne + +- Uporządkowane + +- Tworzone i utrzymywane ze sztuką - Technologie: @@ -343,23 +350,20 @@ title: - Wizytówka koła będzie oglądana przez ludzi chcących się dowiedzieć czegoś o kole. -- System zostanie zasilony danymi z testów silników oraz rakiet. - - Przekazanie plików instalacyjnych do aplikacji desktopowej -- Na koniec drugiego semestru klient otrzyma system w wersji testowej - beta. +- Na koniec drugiego semestru klient otrzyma system w wersji beta. # Kryteria akceptacji projektu dla I semestru prac ## Wymagane - Ukończenie zdefiniowanych funkcjonalności z listy wymagań - funkcjonalnych na drugi semestr + funkcjonalnych na pierwszy semestr - Brak błędów utrudniających korzystanie z aplikacji -- Czy produkt został oddany w czasie +- Produkt został oddany w czasie ## Oczekiwane @@ -376,12 +380,18 @@ title: ## Wymagane - Ukończenie zdefiniowanych funkcjonalności z listy wymagań - funkcjonalnych na drugi semestr, przetestowanie aplikacji pod kątem - użytkowym przez testerów (klientów końcowych) + funkcjonalnych na drugi semestr + +- Przetestowanie aplikacji pod kątem użytkowym przez testerów + (klientów końcowych) - Brak błędów utrudniających korzystanie z aplikacji -- Czy produkt został oddany w czasie +- Produkt został oddany w czasie + +- Produkt został wdrożony na domenę publiczną + +- Produkt został przekazany klientowi ## Oczekiwane @@ -411,19 +421,21 @@ Strona zespołu projektowego: - Projektowanie prototypu interfejsu użytkownika -- Sebastian Wawrzyn +- Sebastian Wawrzyn - DevOps - Implementacja backendu aplikacji - Stworzenie bazy danych na potrzeby aplikacji API + - Wdrożenie i dockeryzacja aplikacji + Praca jest wykonywana w metodyce SCRUM w tygodniowych sprintach. Kod źródłowy trzymany jest na repozytorium na Githubie. Do podziału pracy i śledzenia progresu używamy aplikacji Trello # Ryzyka projektowe -## Ryzyka ze względu na zasoby: +## Ryzyka ze względu na zasoby - Odejście członka implementującego stronę serwerową - trudności w ukończeniu aplikacji serwerowej @@ -436,7 +448,7 @@ Praca jest wykonywana w metodyce SCRUM w tygodniowych sprintach. Kod - Określone ramy czasowe (semestry) na stworzenie produktu -## Inne: +## Inne - Nieporozumienia na linii zespół a klient wynikające z nieznajomości pojęć domenowych lub nieporozumienia dotyczące funkcjonalności czy @@ -478,14 +490,15 @@ Praca jest wykonywana w metodyce SCRUM w tygodniowych sprintach. Kod - Poddanie MVP testom funkcjonalnym -- II faza, II semestr(10.2020 - 02.2021): +- II faza, II semestr(10.2020 - 01.2021): - - Uaktualnienie dekumentacji i Trello + - Uaktualnienie dokumentacji i Trello - - Rozpoczęcie prac programistycznych nad aplikacjami + - Kontynuacja prac programistycznych nad aplikacjami - Kontynuacje prac programistycznych nad komputerem pokładowym - oraz rozpoczecie prac nad nadajnikiem i odbiornikiem + + - Rozpoczęcie prac nad nadajnikiem i odbiornikiem - Testowanie komputera pokładowego oraz elektroniki naziemnej From 0e0fd95081ba19f31f8e5c653aaab5a3d9d533f0 Mon Sep 17 00:00:00 2001 From: Sebastian Wawrzyn Date: Thu, 14 Jan 2021 21:38:31 +0100 Subject: [PATCH 3/7] Update 'Przybylski/awionika/wizja_projektu.md' --- Przybylski/awionika/wizja_projektu.md | 725 +++++++++++++------------- 1 file changed, 364 insertions(+), 361 deletions(-) diff --git a/Przybylski/awionika/wizja_projektu.md b/Przybylski/awionika/wizja_projektu.md index 9f6cd7e..7e10962 100644 --- a/Przybylski/awionika/wizja_projektu.md +++ b/Przybylski/awionika/wizja_projektu.md @@ -1,361 +1,364 @@ ---- -author: -- Wojciech Kubiak, Piotr Józefowicz, Sebastian Wawrzyn -title: "**Dokument wizji dla projektu Awionika do rakiet**" ---- - -# Executive summary - -Dokument dotyczy projektu realizowanego w ramach przedmiotu projekt -inżynierski. Niniejszy dokument służy przedstawieniu przeznaczenia -tworzonego systemu, jego głównych cech i przyjętych założeń. Grupą -docelową dla projektu jest koło naukowe na politechnice poznańskiej PUT -RocketLab, zajmujące się budową rakiet i silników rakietowych. Potrzebny -jest komputer pokładowy do rakiety oraz aplikacje umożliwiające obsługę -testów rakiet i silników. Nasz projekt ma dostarczyć: - -- Aplikację desktopową pozwalająca wyświetlać dane na żywo z testów, - konfigurować ustawienia modułów komputera pokładowego oraz - zapisywać/usuwać dane z pamięci podręcznej modułów. - -- Komputer pokładowy posiadający układ wyzwalający separację oraz - zbierający dane telemetryczne o locie, które będą mogły być - przekazywane na żywo do aplikacji poprzez nadajnik i odbiornik. - -- Aplikację webową służącą jako baza danych testów oraz odgrywającą - rolę wizytówki koła - -# Cel i grupa docelowa - -Grupą docelową dla projektu jest koło naukowe na Politechnice -Poznańskiej PUT RocketLab. Koło zajmuje się budową rakiet i silników -rakietowych oraz rozwija systemy awioniczne i naziemne do ich -testowania. Potrzebny jest komputer pokładowy do rakiety, który będzie -odpowiadał za jej lot, zapisywanie danych z tego lotu, oraz lokalizację -rakiety po jej wylądowaniu. Potrzebna jest również aplikacja, która -będzie pełniła funkcję kontrolera lotów/testów. Takie testy generują -dużą liczbę danych, które ciężko uporządkować więc potrzebne jest też -miejsce, w którym będzie można je porządkować i wyświetlać w przejrzysty -sposób. Koło nie posiada też strony internetowej - tak zwanej wizytówki, -która ma budować rozpoznawalność w internecie i pomóc w kontakcie -przyszłym kandydatom na członków koła.\ -Projekt oprócz komputera pokładowego będzie się składał z dwóch -aplikacji -- aplikacji webowej oraz aplikacji desktopowej. Aplikacja -desktopowa ma odgrywać rolę kontrolera testów. To, że aplikacja jest -desktopowa, wynika z faktu, że testy zazwyczaj wykonywane są w miejscach -bez dostępu do internetu. Aplikacja webowa będzie pełniła funkcję -wizytówki oraz bazy danych testów. Członkowie koła będą posiadali login -i hasło do aplikacji, gdzie będą katalogowane dane historyczne z testów. -Dane będzie można eksportować w wygodnym formacie, a także wyświetlać w -formie wykresów i tabelek z danymi. Strona będzie miała możliwość -wprowadzenia danych ręcznie, jednak preferowaną opcją będzie dodawanie -danych przez aplikację desktopowa, która to zrobi w sposób -zautomatyzowany. Aplikacja desktopowa będzie umożliwiała wyświetlanie -danych z testów rakiet oraz silników na żywo. Po teście dane będą -przekazywane do aplikacji webowej, jeśli będzie dostęp do internetu. -Jeśli nie będzie dostępu, to dane zostaną zapisane w pamięci komputera i -przekazane od razu po podłączeniu komputera do Internetu. Aplikacja -desktopowa ma również dać możliwość konfiguracji modułów elektroniki -komputera pokładowego rakiety oraz odczytywania i zapisywania z nich -danych. Pobrane dane będą od razu przekazywane do chmury tak jak w -przypadku testu na żywo. Będzie również możliwa zmiana konfiguracji tych -modułów-zmiany ustawień parametrów programu na danym module (np. ilość -bitów na sekundę podczas wysyłania danych, częstotliwość, moc anteny), -są to parametry, które muszą być zmieniane podczas czasu życia modułu. -Ta funkcjonalność ma na celu zapewnić większe bezpieczeństwo podczas -zmiany tych parametrów. Parametry nie będą zmieniane poprzez wgranie -nowego kodu tylko przez aplikacje, dzięki temu na samym urządzeniu nie -trzeba będzie zmieniać kodu źródłowego.\ -Klientowi zależy na tym, aby pozyskać z rakiety dane, które pozwolą -sprawdzić, czy rakieta osiągnęła oczekiwane parametry lotu zgodne z -wcześniejszą symulacją takie jak apogeum, prędkość, liczba macha czy -przyspieszenie. W tym celu muszą dokonać pomiarów fizycznych za pomocą -odpowiednich czujników takich jak akcelerometr, barometr, magnetometr -czy żyroskop, a następnie zapisać te dane i wyświetlić je w czytelnej -formie w celu ich analizy. Komputer pokładowy będzie umożliwiał zebranie -powyższych danych, a także wyzwolenie separacji/spadochronu w dwóch -różnych konfiguracjach: poprzez automatyczne wykrycie spadku swobodnego -(apogeum). Rakieta będzie też wyposażona w lokalizator, który będzie -umożliwiał odnalezienie rakiety po lokalizacji GPS wysłanej za pomocą -komunikacji bezprzewodowej LORA. - -# Rynek - -Wyposażenie pokładowe rakiety (awionika) składa się głównie z dwóch -części: komputera pokładowego i lokalizatora. Komputery pokładowe -znajdujące się na rynku mają wysoką cenę i większość z nich, nie -oferuje, aplikacji do zbierania danych, przez co robi się z nimi bałagan -i trzeba dbać samemu o to, by te dane katalogować. Gotowe lokalizatory, -mimo że zaawansowane również są bardzo drogie. - -## Przykłady produktów na rynku - -- Dużym zainteresowaniem na świecie cieszą się amerykańskie - [EggTimery](http://eggtimerrocketry.com/home/altimeters-av-bay/). - Posiadają one wiele różnych konfiguracji komputerów oraz - lokalizatorów. Mają jednak one dość wysokie ceny modułów i nie - oferują zintegrowanej aplikacji, która umożliwiałaby analizę danych, - musimy korzystać z osobnych programów. - -- Dostępne są [niemieckie komputery - pokładowe](https://www.rocketronics.de/shop/de/altimax-g3-standard.html?fbclid=IwAR2Btg-xkFvGJoPM6sU9-zkdCB5SZMVawdttTxnr6m8iG2iS46GtkmWs8Fc) - firmy Rocketronics oferujące wysoką jakość danych oraz dokładną - separację. Ich aplikacja nie umożliwia podglądu danych na żywo. Nie - ma w nich lokalizatorów i mają wysoką cenę. - -- [Lokalizator - Featherweight](https://www.featherweightaltimeters.com/featherweight-gps-tracker.html) - (koszt to 610-2000 zł) - wysoka cena, zawiera aplikację, ale do tego - potrzebny jest jeszcze komputer pokładowy.  - -- Jeden z najtańszych i najpopularniejszych sposobów (przynajmniej w - Polsce) na lokalizację rakiety polega na używaniu taniego - [lokalizatora](https://abc-rc.pl/product-pol-7625-Lokalizator-GPS-TK102B-Tracker-GPS-Sledzenie-w-WWW.html), - który wysyła podstawowe dane telemetryczne dzięki modułowi GPS i - GSM. Nie są to jednak produkty przeznaczone konkretnie do rakiet i - nie mogą zostać zintegrowane z komputerem pokładowym.  - -- Nowością jest komputer pokładowy - [Signal-R2](https://bps.space/shop/signal-r2) z aplikacją na telefon - (koszt to ok 1400 zł). Aplikacja dostępna na platformy android oraz - iOS jest zintegrowana z komputerem pokładowym. Cały system - komunikacji jest oparty na Bluetooth, co daje zasięg 10 metrów, - dlatego nie można używać aplikacji do odczytów danych na żywo - podczas lotu. Aby uzyskać szerszy dostęp do dokumentacji, kodów - źródłowych i informacji na temat projektu trzeba dodatkowo - miesięczne płacić za subskrypcje na specjalnej platformie Patronite. - -# Opis produkt - -## Aplikacja webowa - -- wizytówka koła - -- dane z testów będzie można zapisywać na serwerze w celu stworzenia - historii testów - -- eksport danych GPS w formacie KML (trajektoria lotu) - -- eksport danych telemetrycznych do Excel'a - -- import danych pomiarowych z pliku - -- wyświetlenie danych historycznych (z testów) - -- wyświetlenie danych historycznych w formie live (z testów) - -- wyszukiwanie testu po nazwie i dacie - -- kategoryzacja danych telemetrycznych (historia testów) przypisana do - testu - -## Aplikacja desktopowa - -- pomiary z rakiety obrazowane na żywo: - - - wykres prędkości od czasu, - - - wykres przyspieszenia od czasu, - - - wykresy orientacji XYZ, - - - wykres wysokości i wychylenia w osiach XYZ od czasu, - - - wyświetlenie lokalizacji GPS na mapie (Google Maps) - -- obrazowane danych z hamowni na żywo - - - wykres ciągu do czasu - - - wykres ciśnienia do czasu - -- dane po teście rakiety czy silnika będą zapisywane na serwerze - -- zgrywania/usuwanie danych z modułów elektronicznych - -- zmiana konfiguracji modułów elektronicznych - -## Elektronika - -- dokonywanie pomiarów podczas lotu (prędkość, przyspieszenie, - wysokość, wychylenia w osiach XYZ)  - -- lokalizacja GPS oraz pomiary wysyłane do stacji naziemnej za - pośrednictwem komunikacji bezprzewodowej LORA  - -- wykrycie apogeum (spadku swobodnego) pozwalające wyzwolić - separacje/spadochron - -- wyzwolenie separacji, spadochronu poprzez odpalenie zapalnika - elektrycznego  - -- przesyłanie danych do stacji naziemnej przez moduł komunikacyjny  - -- odbieranie danych przez odbiornik - -- odpalenie drugie spadochronu na określonej wysokości - -- przekazywanie danych do aplikacji desktopowej - -- zapisywania danych do pamięci modułu - -- odczytywanie danych z pamięci modułu - -- zmiana konfiguracji modułu - -# Zakres i ograniczenia - -## Skład zespołu - -- Wojciech Kubiak - systemy wbudowane - arduino, c++, FreeRTOS, python - -- Sebastian Wawrzyn - backend - .NET Core, C-.05em , Docker, NoSql - -- Piotr Józefowicz - frontend - Vue.js, typescript - -## Kamienie milowe - -- I faza, I semestr (02.2020 - 07.2020): - - - Przygotowanie prototypu aplikacji - - - Przygotowanie backlogu dla projektu w systemie Trello, - opracowanie funkcjonalności, user stories - - - Rozpoczęcie prac programistycznych nad aplikacją - - - Rozpoczęcie prac programistycznych nad komputerem pokładowym 1.0 - - - Testowanie komputera pokładowego - - - Ukończenie MVP aplikacji i komputera pokładowego - - - Poddanie MVP testom funkcjonalnym - -- II faza, II semestr(10.2020 - 01.2021): - - - Uaktualnienie dokumentacji i Trello - - - Kontynuacja prac programistycznych nad aplikacjami - - - Kontynuacje prac programistycznych nad komputerem pokładowym - - - Rozpoczęcie prac nad nadajnikiem i odbiornikiem - - - Testowanie komputera pokładowego oraz elektroniki naziemnej - - - Ukończenie aplikacji wraz ze wszystkimi zdefiniowanymi - funkcjonalnościami - - - Integracja aplikacji z elektroniką - - - Testy integracyjne - - - Wdrożenie aplikacji na publiczną domenę - -## Harmonogram - -MVP produktu zostanie wypracowane i przedstawione do końca czerwca 2020 -roku, zawierać będzie funkcjonalności takie jak: - -- Komputer pokładowy 1.0: - - - Dokonywanie pomiarów telemetrycznych - - - Zapis danych na kartę SD - - - Wyzwolenie separacji za pomocą timera - - - Odpalenie zapalnika elektrycznego - -- Aplikacja internetowa (frontend): - - - Stworzenie konta użytkownika, logowanie - - - Dodawanie testów z pliku - - - Wyświetlanie danych z testów - - - Przegląd danych historycznych - - - Zintegrowania aplikacji webowej z REST API - -- Aplikacja serwerowa, REST API: - - - Dodanie serwisów REST pozwalających na operacje wymienione w - punkcie "Aplikacja internetowa" - - - Zintegrowania API z bazą danych - - - Wdrożenie aplikacji na środowisko testowe - -Druga wersja produktu wypracowana i oddana do stycznia 2021 roku, -obejmować będzie: - -- Wszystkie funkcjonalności zdefiniowane w MVP - -- Komputer pokładowy 2.0: - - - Układ wyzwolenia separacji - - - Komunikacja z nadajnikiem - - - Konfiguracja modułu - - - Zapis danych na pamięć flash - -- Nadajnik/Lokalizator: - - - Lokalizacja GPS oraz redundantny system prędkości wysokości - przyspieszenia - - - Komunikacja bezprzewodowa LORA - - - Konfiguracja modułu - -- Elektronika naziemna/Odbiornik: - - - Konfiguracja modułu - - - Odbieranie danych od komputera pokładowego (LORA) - - - Przekazywanie danych do serwera za pomocą REST API - - - Przekazywanie danych do kolejnych urządzeń za pomocą Seriala - -- Aplikacja internetowa (frontend): - - - Wyświetlanie i gromadzenie danych historycznych testów - - - Wyświetlanie testów historycznych w postaci live - - - Eksport testów do plików - - - Widok podsumowania testu - - - Profil użytkownika - -- Aplikacja desktopowa: - - - Wyświetlanie danych z testów live (wykresy) - - - Wyświetlanie lokalizacji za pośrednictwem Google Maps - - - Konfigurowanie płytki - - - Odczyt danych z płytki - - - Usuwanie danych z płytki - -- Aplikacja serwerowa, REST API: - - - Dodanie serwisów REST pozwalających na operacje wymienione w - punkcie "Aplikacja internetowa" - - - Dodanie serwisów REST pozwalających na operacje wymienione w - punkcie "Aplikacja desktopowa" - - - Wdrożenie aplikacji na środowisko produkcyjne - -Ograniczeniem projektu jest hosting, nie wiadomo czy politechnika -udostępni nam domenę oraz otworzy porty na zewnątrz. +--- +author: +- Wojciech Kubiak +- Piotr Józefowicz +- Sebastian Wawrzyn +title: +- Dokument wizji dla projektu Awionika do rakiet sondażowych +--- + +# Executive summary + +Dokument dotyczy projektu realizowanego w ramach przedmiotu projekt +inżynierski. Niniejszy dokument służy przedstawieniu przeznaczenia +tworzonego systemu, jego głównych cech i przyjętych założeń. Grupą +docelową dla projektu jest koło naukowe na politechnice poznańskiej PUT +RocketLab, zajmujące się budową rakiet i silników rakietowych. Potrzebny +jest komputer pokładowy do rakiety oraz aplikacje umożliwiające obsługę +testów rakiet i silników. Nasz projekt ma dostarczyć: + +- Aplikację desktopową pozwalająca wyświetlać dane na żywo z testów, + konfigurować ustawienia modułów komputera pokładowego oraz + zapisywać/usuwać dane z pamięci podręcznej modułów. + +- Komputer pokładowy posiadający układ wyzwalający separację oraz + zbierający dane telemetryczne o locie, które będą mogły być + przekazywane na żywo do aplikacji poprzez nadajnik i odbiornik. + +- Aplikację webową służącą jako baza danych testów oraz odgrywającą + rolę wizytówki koła + +# Cel i grupa docelowa + +Grupą docelową dla projektu jest koło naukowe na Politechnice +Poznańskiej PUT RocketLab. Koło zajmuje się budową rakiet i silników +rakietowych oraz rozwija systemy awioniczne i naziemne do ich +testowania. Potrzebny jest komputer pokładowy do rakiety, który będzie +odpowiadał za jej lot, zapisywanie danych z tego lotu, oraz lokalizację +rakiety po jej wylądowaniu. Potrzebna jest również aplikacja, która +będzie pełniła funkcję kontrolera lotów/testów. Takie testy generują +dużą liczbę danych, które ciężko uporządkować więc potrzebne jest też +miejsce, w którym będzie można je porządkować i wyświetlać w przejrzysty +sposób. Koło nie posiada też strony internetowej - tak zwanej wizytówki, +która ma budować rozpoznawalność w internecie i pomóc w kontakcie +przyszłym kandydatom na członków koła.\ +Projekt oprócz komputera pokładowego będzie się składał z dwóch +aplikacji -- aplikacji webowej oraz aplikacji desktopowej. Aplikacja +desktopowa ma odgrywać rolę kontrolera testów. To, że aplikacja jest +desktopowa, wynika z faktu, że testy zazwyczaj wykonywane są w miejscach +bez dostępu do internetu. Aplikacja webowa będzie pełniła funkcję +wizytówki oraz bazy danych testów. Członkowie koła będą posiadali login +i hasło do aplikacji, gdzie będą katalogowane dane historyczne z testów. +Dane będzie można eksportować w wygodnym formacie, a także wyświetlać w +formie wykresów i tabelek z danymi. Strona będzie miała możliwość +wprowadzenia danych ręcznie, jednak preferowaną opcją będzie dodawanie +danych przez aplikację desktopowa, która to zrobi w sposób +zautomatyzowany. Aplikacja desktopowa będzie umożliwiała wyświetlanie +danych z testów rakiet oraz silników na żywo. Po teście dane będą +przekazywane do aplikacji webowej, jeśli będzie dostęp do internetu. +Jeśli nie będzie dostępu, to dane zostaną zapisane w pamięci komputera i +przekazane od razu po podłączeniu komputera do Internetu. Aplikacja +desktopowa ma również dać możliwość konfiguracji modułów elektroniki +komputera pokładowego rakiety oraz odczytywania i zapisywania z nich +danych. Pobrane dane będą od razu przekazywane do chmury tak jak w +przypadku testu na żywo. Będzie również możliwa zmiana konfiguracji tych +modułów-zmiany ustawień parametrów programu na danym module (np. ilość +bitów na sekundę podczas wysyłania danych, częstotliwość, moc anteny), +są to parametry, które muszą być zmieniane podczas czasu życia modułu. +Ta funkcjonalność ma na celu zapewnić większe bezpieczeństwo podczas +zmiany tych parametrów. Parametry nie będą zmieniane poprzez wgranie +nowego kodu tylko przez aplikacje, dzięki temu na samym urządzeniu nie +trzeba będzie zmieniać kodu źródłowego.\ +Klientowi zależy na tym, aby pozyskać z rakiety dane, które pozwolą +sprawdzić, czy rakieta osiągnęła oczekiwane parametry lotu zgodne z +wcześniejszą symulacją takie jak apogeum, prędkość, liczba macha czy +przyspieszenie. W tym celu muszą dokonać pomiarów fizycznych za pomocą +odpowiednich czujników takich jak akcelerometr, barometr, magnetometr +czy żyroskop, a następnie zapisać te dane i wyświetlić je w czytelnej +formie w celu ich analizy. Komputer pokładowy będzie umożliwiał zebranie +powyższych danych, a także wyzwolenie separacji/spadochronu w dwóch +różnych konfiguracjach: poprzez automatyczne wykrycie spadku swobodnego +(apogeum). Rakieta będzie też wyposażona w lokalizator, który będzie +umożliwiał odnalezienie rakiety po lokalizacji GPS wysłanej za pomocą +komunikacji bezprzewodowej LORA. + +# Rynek + +Wyposażenie pokładowe rakiety (awionika) składa się głównie z dwóch +części: komputera pokładowego i lokalizatora. Komputery pokładowe +znajdujące się na rynku mają wysoką cenę i większość z nich, nie +oferuje, aplikacji do zbierania danych, przez co robi się z nimi bałagan +i trzeba dbać samemu o to, by te dane katalogować. Gotowe lokalizatory, +mimo że zaawansowane również są bardzo drogie. + +## Przykłady produktów na rynku + +- Dużym zainteresowaniem na świecie cieszą się amerykańskie + [EggTimery](http://eggtimerrocketry.com/home/altimeters-av-bay/). + Posiadają one wiele różnych konfiguracji komputerów oraz + lokalizatorów. Mają jednak one dość wysokie ceny modułów i nie + oferują zintegrowanej aplikacji, która umożliwiałaby analizę danych, + musimy korzystać z osobnych programów. + +- Dostępne są [niemieckie komputery + pokładowe](https://www.rocketronics.de/shop/de/altimax-g3-standard.html?fbclid=IwAR2Btg-xkFvGJoPM6sU9-zkdCB5SZMVawdttTxnr6m8iG2iS46GtkmWs8Fc) + firmy Rocketronics oferujące wysoką jakość danych oraz dokładną + separację. Ich aplikacja nie umożliwia podglądu danych na żywo. Nie + ma w nich lokalizatorów i mają wysoką cenę. + +- [Lokalizator + Featherweight](https://www.featherweightaltimeters.com/featherweight-gps-tracker.html) + (koszt to 610-2000 zł) - wysoka cena, zawiera aplikację, ale do tego + potrzebny jest jeszcze komputer pokładowy.  + +- Jeden z najtańszych i najpopularniejszych sposobów (przynajmniej w + Polsce) na lokalizację rakiety polega na używaniu taniego + [lokalizatora](https://abc-rc.pl/product-pol-7625-Lokalizator-GPS-TK102B-Tracker-GPS-Sledzenie-w-WWW.html), + który wysyła podstawowe dane telemetryczne dzięki modułowi GPS i + GSM. Nie są to jednak produkty przeznaczone konkretnie do rakiet i + nie mogą zostać zintegrowane z komputerem pokładowym.  + +- Nowością jest komputer pokładowy + [Signal-R2](https://bps.space/shop/signal-r2) z aplikacją na telefon + (koszt to ok 1400 zł). Aplikacja dostępna na platformy android oraz + iOS jest zintegrowana z komputerem pokładowym. Cały system + komunikacji jest oparty na Bluetooth, co daje zasięg 10 metrów, + dlatego nie można używać aplikacji do odczytów danych na żywo + podczas lotu. Aby uzyskać szerszy dostęp do dokumentacji, kodów + źródłowych i informacji na temat projektu trzeba dodatkowo + miesięczne płacić za subskrypcje na specjalnej platformie Patronite. + +# Opis produkt + +## Aplikacja webowa + +- wizytówka koła + +- dane z testów będzie można zapisywać na serwerze w celu stworzenia + historii testów + +- eksport danych GPS w formacie KML (trajektoria lotu) + +- eksport danych telemetrycznych do Excel'a + +- import danych pomiarowych z pliku + +- wyświetlenie danych historycznych (z testów) + +- wyświetlenie danych historycznych w formie live (z testów) + +- wyszukiwanie testu po nazwie i dacie + +- kategoryzacja danych telemetrycznych (historia testów) przypisana do + testu + +## Aplikacja desktopowa + +- pomiary z rakiety obrazowane na żywo: + + - wykres prędkości od czasu, + + - wykres przyspieszenia od czasu, + + - wykresy orientacji XYZ, + + - wykres wysokości i wychylenia w osiach XYZ od czasu, + + - wyświetlenie lokalizacji GPS na mapie (Google Maps) + +- obrazowane danych z hamowni na żywo + + - wykres ciągu do czasu + + - wykres ciśnienia do czasu + +- dane po teście rakiety czy silnika będą zapisywane na serwerze + +- zgrywania/usuwanie danych z modułów elektronicznych + +- zmiana konfiguracji modułów elektronicznych + +## Elektronika + +- dokonywanie pomiarów podczas lotu (prędkość, przyspieszenie, + wysokość, wychylenia w osiach XYZ)  + +- lokalizacja GPS oraz pomiary wysyłane do stacji naziemnej za + pośrednictwem komunikacji bezprzewodowej LORA  + +- wykrycie apogeum (spadku swobodnego) pozwalające wyzwolić + separacje/spadochron + +- wyzwolenie separacji, spadochronu poprzez odpalenie zapalnika + elektrycznego  + +- przesyłanie danych do stacji naziemnej przez moduł komunikacyjny  + +- odbieranie danych przez odbiornik + +- odpalenie drugie spadochronu na określonej wysokości + +- przekazywanie danych do aplikacji desktopowej + +- zapisywania danych do pamięci modułu + +- odczytywanie danych z pamięci modułu + +- zmiana konfiguracji modułu + +# Zakres i ograniczenia + +## Skład zespołu + +- Wojciech Kubiak - systemy wbudowane - arduino, c++, FreeRTOS, python + +- Sebastian Wawrzyn - backend - .NET Core, C-.05em , Docker, NoSql + +- Piotr Józefowicz - frontend - Vue.js, typescript + +## Kamienie milowe + +- I faza, I semestr (02.2020 - 07.2020): + + - Przygotowanie prototypu aplikacji + + - Przygotowanie backlogu dla projektu w systemie Trello, + opracowanie funkcjonalności, user stories + + - Rozpoczęcie prac programistycznych nad aplikacją + + - Rozpoczęcie prac programistycznych nad komputerem pokładowym 1.0 + + - Testowanie komputera pokładowego + + - Ukończenie MVP aplikacji i komputera pokładowego + + - Poddanie MVP testom funkcjonalnym + +- II faza, II semestr(10.2020 - 01.2021): + + - Uaktualnienie dokumentacji i Trello + + - Kontynuacja prac programistycznych nad aplikacjami + + - Kontynuacje prac programistycznych nad komputerem pokładowym + + - Rozpoczęcie prac nad nadajnikiem i odbiornikiem + + - Testowanie komputera pokładowego oraz elektroniki naziemnej + + - Ukończenie aplikacji wraz ze wszystkimi zdefiniowanymi + funkcjonalnościami + + - Integracja aplikacji z elektroniką + + - Testy integracyjne + + - Wdrożenie aplikacji na publiczną domenę + +## Harmonogram + +MVP produktu zostanie wypracowane i przedstawione do końca czerwca 2020 +roku, zawierać będzie funkcjonalności takie jak: + +- Komputer pokładowy 1.0: + + - Dokonywanie pomiarów telemetrycznych + + - Zapis danych na kartę SD + + - Wyzwolenie separacji za pomocą timera + + - Odpalenie zapalnika elektrycznego + +- Aplikacja internetowa (frontend): + + - Stworzenie konta użytkownika, logowanie + + - Dodawanie testów z pliku + + - Wyświetlanie danych z testów + + - Przegląd danych historycznych + + - Zintegrowania aplikacji webowej z REST API + +- Aplikacja serwerowa, REST API: + + - Dodanie serwisów REST pozwalających na operacje wymienione w + punkcie "Aplikacja internetowa" + + - Zintegrowania API z bazą danych + + - Wdrożenie aplikacji na środowisko testowe + +Druga wersja produktu wypracowana i oddana do stycznia 2021 roku, +obejmować będzie: + +- Wszystkie funkcjonalności zdefiniowane w MVP + +- Komputer pokładowy 2.0: + + - Układ wyzwolenia separacji + + - Komunikacja z nadajnikiem + + - Konfiguracja modułu + + - Zapis danych na pamięć flash + +- Nadajnik/Lokalizator: + + - Lokalizacja GPS oraz redundantny system prędkości wysokości + przyspieszenia + + - Komunikacja bezprzewodowa LORA + + - Konfiguracja modułu + +- Elektronika naziemna/Odbiornik: + + - Konfiguracja modułu + + - Odbieranie danych od komputera pokładowego (LORA) + + - Przekazywanie danych do serwera za pomocą REST API + + - Przekazywanie danych do kolejnych urządzeń za pomocą Seriala + +- Aplikacja internetowa (frontend): + + - Wyświetlanie i gromadzenie danych historycznych testów + + - Wyświetlanie testów historycznych w postaci live + + - Eksport testów do plików + + - Widok podsumowania testu + + - Profil użytkownika + +- Aplikacja desktopowa: + + - Wyświetlanie danych z testów live (wykresy) + + - Wyświetlanie lokalizacji za pośrednictwem Google Maps + + - Konfigurowanie płytki + + - Odczyt danych z płytki + + - Usuwanie danych z płytki + +- Aplikacja serwerowa, REST API: + + - Dodanie serwisów REST pozwalających na operacje wymienione w + punkcie "Aplikacja internetowa" + + - Dodanie serwisów REST pozwalających na operacje wymienione w + punkcie "Aplikacja desktopowa" + + - Wdrożenie aplikacji na środowisko produkcyjne + +Ograniczeniem projektu jest hosting, nie wiadomo czy politechnika +udostępni nam domenę oraz otworzy porty na zewnątrz. From 489100232a69d58e11377f9499f237d9559c0127 Mon Sep 17 00:00:00 2001 From: Sebastian Wawrzyn Date: Thu, 14 Jan 2021 21:38:59 +0100 Subject: [PATCH 4/7] Update 'Przybylski/awionika/wymagania_projektowe.md' --- Przybylski/awionika/wymagania_projektowe.md | 1027 ++++++++++--------- 1 file changed, 515 insertions(+), 512 deletions(-) diff --git a/Przybylski/awionika/wymagania_projektowe.md b/Przybylski/awionika/wymagania_projektowe.md index bdf0ea9..67b91a5 100644 --- a/Przybylski/awionika/wymagania_projektowe.md +++ b/Przybylski/awionika/wymagania_projektowe.md @@ -1,512 +1,515 @@ ---- -author: -- Wojciech Kubiak, Piotr Józefowicz, Sebastian Wawrzyn -title: "**Dokument wymagań projektowych**" ---- - -# Elementy składowe projektu (produkty projektu) - -## Semestr I - -- Aplikacja webowa - -- Komputer pokładowy (MVP) - -- Aplikacja serwerowa - REST API (WEB) - -- Relacyjna baza danych - -- Prototyp interfejsu użytkownika aplikacji webowej - -- Repozytorium git zawierające kod aplikacji, API, elektroniki - -- Tablica projektowa -- Trello - -## Semestr II - -- Komputer pokładowy - -- Nadajnik - -- Odbiornik - -- Wizytówka - -- Aplikacja webowa - -- Aplikacja desktopowa - -- Aplikacja serwerowa lokalna - -- Baza danych NoSql - -# Granice projektu - -- Produkty zawarte: - - - 1\. Wyszczególnione produkty projektu - -- Funkcjonalności nie zawarte: - - - Integracja z systemem APRS, wiele urządzeń lokalizacyjnych ma tę - funkcję, jednak zaimplementowanie jej jest zbyt czasochłonne. - - - Integracja z innymi komputerami pokładowymi, format danych różni - się w zależności od komputera. - -# Lista wymagań funkcjonalnych - -## Komputer pokładowy - -- Dokonywanie pomiarów telemetrycznych (barometr, żyroskop, - akcelerometr) - -- Zapis danych na flash (format tekstowy) - -- Odpalenie zapalnika elektrycznego - -- Automatyczne wyzwolenie separacji za pomocą barometru w apogeum - -- Wyzwolenie separacji na żądanej wysokości - -- Konfiguracja/kontrola modułu: - - - zmiana parametrów uruchomieniowych - - - odczyt danych z flash - - - czyszczenie pamięci flash - -## Nadajnik/Lokalizator - -- Lokalizacja GPS oraz redundantny system prędkości wysokości - przyspieszenia - -- Komunikacja bezprzewodowa LORA (połączenie jednokierunkowe) - -- Konfiguracja/kontrola modułu: - - - zmiana parametrów uruchomieniowych - - - odczyt danych z flash - - - czyszczenie pamięci flash - -## Aplikacja internetowa - -- Logowanie za pomocą Auth0 - -- Wizytówka koła: - - - informacje o kole - - - formularz kontaktowy - - - prezentacja projektów koła - -- Zarządzanie użytkownikami na koncie administratora: - - - dodawanie i usuwanie użytkowników - - - zmiana danych użytkownika - - - nadawanie i odbieranie uprawnień użytkownikom - -- Dodawanie pomiarów z pliku (json, csv) - -- Wyświetlanie danych z testów (wykresy) - -- Przegląd danych historycznych - -- Wyświetlanie testów historycznych w postaci live - -- Zintegrowania aplikacji webowej z REST API - -- Eksport testów do plików (json, excel) - -- Eksport trajektorii lotu rakiety do pliku KML (Google earth) - -- Profil użytkownika, możliwość zmiany nazwy użytkownika, imienia, - nazwiska, e-maila, hasła - -## Aplikacja desktopowa - -- Wyświetlanie danych z testów live (wykresy) - -- Wyświetlanie lokalizacji za pośrednictwem Google Maps - -- Konfigurowanie modułów elektronicznych - -- Odczyt/Zapis danych z modułów elektronicznych - -- Wysyłanie testów na serwer - -- Zapis pomiarów w plikach json - -## Aplikacja serwerowa, REST API - -- Dodanie serwisów REST pozwalających na operacje wymienione w punkcie - "Aplikacja internetowa" - -- Dodanie serwisów REST pozwalających na operacje wymienione w punkcie - "Aplikacja desktopowa" - -- Zintegrowanie API z bazą danych - -- Wdrożenie aplikacji na środowisko testowe - -- Wdrożenie aplikacji na środowisko produkcyjne - -## Elektronika naziemna (odbiornik) - -- Odbieranie danych od komputera pokładowego (LORA) - -- Przekazywanie danych do serwera za pomocą REST API - -- Przekazywanie danych do kolejnych urządzeń za pomocą Seriala - -- Konfiguracja/kontrola modułu: - - - zmiana parametrów uruchomieniowych - -# Lista wymagań niefunkcjonalnych - -## Komputer pokładowy - -- Bezpieczny w użyciu - -- Prosty w użyciu - -- Niezawodny - -- Dokładny - -- Z czytelnym, przejrzystym kodem - -- Technologie: - - - Arduino - - - C++ - - - FreeRTOS - -## Nadajnik/Lokalizator - -- Bezpieczna w użyciu - -- Prosta w użyciu - -- Niezawodny - -- Dokładny - -- Z czytelnym, przejrzystym kodem - -- Technologie: - - - Arduino - - - C++ - - - FreeRTOS - -## Elektronika naziemna (odbiornik) - -- Bezpieczna w użyciu - -- Prosta w użyciu - -- Niezawodny - -- Ładnie obudowana - -- Z czytelnym, przejrzystym kodem - -- Technologie: - - - Arduino - - - C++ - -## Aplikacja internetowa (frontend) - -- Wytworzona z użyciem nowoczesnych standardów - -- Single Page Application - -- Responsywna - -- Intuicyjna w obsłudze - -- Technologie: - - - Vue.js - - - Typescript - -## Aplikacja desktopowa - -- Wytworzona z użyciem nowoczesnych standardów - -- Single Page Application - -- Responsywna - -- Intuicyjna w obsłudze - -- Zaprojektowana według najnowszych standardów .NET - -- Używa nowych technologii i podejść programistycznych - -- Z czytelnym i przejrzystym kodem - -- Szybka obsługa zapytań - -- Zintegrowana z elektroniką naziemną oraz pozostałymi modułami - -- Technologie: - - - Vue.js - - - Electron - - - Typescript - - - .NET Core - - - C-.05em - -## Aplikacja serwerowa - REST API - -- Zaprojektowana według najnowszych standardów .NET - -- Używa nowych technologii i podejść programistycznych - -- Z czytelnym i przejrzystym kodem - -- Szybka obsługa zapytań - -- Technologie: - - - .Net Core - - - Docker - -## Baza danych - -- Szybka obsługa zapytań - -- Rozszerzalna - -- Niezawodna - -- Technologie: - - - NoSql - -## Prototyp aplikacji internetowej przetestowany przez użytkowników - -- Technologie: - - - Adobe XD - -## Tablica projektowa - Trello - -- Historia wymagań funkcjonalnych (User stories) - -- Historia prac zdefiniowana zadaniami - -- Lista wymagań funkcjonalnych zaplanowanych na przyszłość - -- Lista zadań zaplanowanych na przyszłość - -## Repozytorium zawierające kod aplikacji, API oraz elektroniki - -- Czytelne - -- Uporządkowane - -- Tworzone i utrzymywane ze sztuką - -- Technologie: - - - GitHub - -# Mierzalne wskaźniki wdrożeniowe - -## Semestr I - -- System zostanie przekazany w wersji testowej alpha. - -- System zostanie zasilony danymi z symulacji lotu rakiet oraz danymi - historycznymi testów silników - -## Semestr II - -- System zostanie udostępniony w domenie internetowej i będą z niego - korzystać członkowie koła (około 20 osób) - -- Wizytówka koła będzie oglądana przez ludzi chcących się dowiedzieć - czegoś o kole. - -- Przekazanie plików instalacyjnych do aplikacji desktopowej - -- Na koniec drugiego semestru klient otrzyma system w wersji beta. - -# Kryteria akceptacji projektu dla I semestru prac - -## Wymagane - -- Ukończenie zdefiniowanych funkcjonalności z listy wymagań - funkcjonalnych na pierwszy semestr - -- Brak błędów utrudniających korzystanie z aplikacji - -- Produkt został oddany w czasie - -## Oczekiwane - -- Wykonanie produktu zgodnie z ustalonymi wymaganiami odnośnie - technologii - -## Planowane - -- Zawieranie testów jednostkowych, integracyjnych, oraz czy spełniają - swoje zadanie - -# Kryteria akceptacji projektu dla II semestru prac - -## Wymagane - -- Ukończenie zdefiniowanych funkcjonalności z listy wymagań - funkcjonalnych na drugi semestr - -- Przetestowanie aplikacji pod kątem użytkowym przez testerów - (klientów końcowych) - -- Brak błędów utrudniających korzystanie z aplikacji - -- Produkt został oddany w czasie - -- Produkt został wdrożony na domenę publiczną - -- Produkt został przekazany klientowi - -## Oczekiwane - -- Wykonanie produktu zgodnie z ustalonymi wymaganiami odnośnie - technologii - -## Planowane - -- Zawieranie testów jednostkowych, integracyjnych, oraz czy spełniają - swoje zadanie - -# Organizacja pracy zespołu - -Strona zespołu projektowego: - -- Wojciech Kubiak - Product Owner - - - Implementacja systemów wbudowanych - - - Zarządzanie dokumentacją - - - Komunikacja z klientem - czynny udział w kole - -- Piotr Józefowicz - Scrum Master - - - Implementacja frontendu - - - Projektowanie prototypu interfejsu użytkownika - -- Sebastian Wawrzyn - DevOps - - - Implementacja backendu aplikacji - - - Stworzenie bazy danych na potrzeby aplikacji API - - - Wdrożenie i dockeryzacja aplikacji - -Praca jest wykonywana w metodyce SCRUM w tygodniowych sprintach. Kod -źródłowy trzymany jest na repozytorium na Githubie. Do podziału pracy i -śledzenia progresu używamy aplikacji Trello - -# Ryzyka projektowe - -## Ryzyka ze względu na zasoby - -- Odejście członka implementującego stronę serwerową - trudności w - ukończeniu aplikacji serwerowej - -- Odejście członka implementującego stronę frontendową - trudności w - ukończeniu aplikacji - -- Odejście członka implementującego systemy wbudowane - trudności w - ukończeniu aplikacji - -- Określone ramy czasowe (semestry) na stworzenie produktu - -## Inne - -- Nieporozumienia na linii zespół a klient wynikające z nieznajomości - pojęć domenowych lub nieporozumienia dotyczące funkcjonalności czy - innych rzeczy - -- Nieporozumienia w zespole dotyczące rozwiązań implementacyjnych, - architektury, funkcjonalności lub używanych technologii - -- Brak odpowiedniego zaangażowania w projekt ze strony zespołu, - wybranych członków zespołu - -- Nagły brak wsparcia dla lub przerwanie rozwijania wykorzystywanej - technologii lub narzędzia - konieczność implementacji od nowa, lub - kontynuowanie implementacji w nieużywanym/źle zaprojektowanym - narzędziu, bibliotece - -- Napięty termin, nakład obowiązków związanych z uczelnią oraz sprawy - prywatne, mogą negatywnie wpłynąć na pracę nad aplikacją - -- Niestandardowy temat projektu, mogą pojawić się nieoczekiwane - trudności (rocket science) - -# Kamienie milowe - -- I faza, I semestr (02.2020 - 07.2020): - - - Przygotowanie prototypu aplikacji - - - Przygotowanie backlogu dla projektu w systemie Trello, - opracowanie funkcjonalności, user stories - - - Rozpoczęcie prac programistycznych nad aplikacją - - - Rozpoczęcie prac programistycznych nad komputerem pokładowym 1.0 - - - Testowanie komputera pokładowego - - - Ukończenie MVP aplikacji i komputera pokładowego - - - Poddanie MVP testom funkcjonalnym - -- II faza, II semestr(10.2020 - 01.2021): - - - Uaktualnienie dokumentacji i Trello - - - Kontynuacja prac programistycznych nad aplikacjami - - - Kontynuacje prac programistycznych nad komputerem pokładowym - - - Rozpoczęcie prac nad nadajnikiem i odbiornikiem - - - Testowanie komputera pokładowego oraz elektroniki naziemnej - - - Ukończenie aplikacji wraz ze wszystkimi zdefiniowanymi - funkcjonalnościami - - - Integracja aplikacji z elektroniką - - - Testy integracyjne - - - Wdrożenie aplikacji na publiczną domenę +--- +author: +- Wojciech Kubiak +- Piotr Józefowicz +- Sebastian Wawrzyn +title: +- Dokument wymagań projektowych +--- + +# Elementy składowe projektu (produkty projektu) + +## Semestr I + +- Aplikacja webowa + +- Komputer pokładowy (MVP) + +- Aplikacja serwerowa - REST API (WEB) + +- Relacyjna baza danych + +- Prototyp interfejsu użytkownika aplikacji webowej + +- Repozytorium git zawierające kod aplikacji, API, elektroniki + +- Tablica projektowa -- Trello + +## Semestr II + +- Komputer pokładowy + +- Nadajnik + +- Odbiornik + +- Wizytówka + +- Aplikacja webowa + +- Aplikacja desktopowa + +- Aplikacja serwerowa lokalna + +- Baza danych NoSql + +# Granice projektu + +- Produkty zawarte: + + - 1\. Wyszczególnione produkty projektu + +- Funkcjonalności nie zawarte: + + - Integracja z systemem APRS, wiele urządzeń lokalizacyjnych ma tę + funkcję, jednak zaimplementowanie jej jest zbyt czasochłonne. + + - Integracja z innymi komputerami pokładowymi, format danych różni + się w zależności od komputera. + +# Lista wymagań funkcjonalnych + +## Komputer pokładowy + +- Dokonywanie pomiarów telemetrycznych (barometr, żyroskop, + akcelerometr) + +- Zapis danych na flash (format tekstowy) + +- Odpalenie zapalnika elektrycznego + +- Automatyczne wyzwolenie separacji za pomocą barometru w apogeum + +- Wyzwolenie separacji na żądanej wysokości + +- Konfiguracja/kontrola modułu: + + - zmiana parametrów uruchomieniowych + + - odczyt danych z flash + + - czyszczenie pamięci flash + +## Nadajnik/Lokalizator + +- Lokalizacja GPS oraz redundantny system prędkości wysokości + przyspieszenia + +- Komunikacja bezprzewodowa LORA (połączenie jednokierunkowe) + +- Konfiguracja/kontrola modułu: + + - zmiana parametrów uruchomieniowych + + - odczyt danych z flash + + - czyszczenie pamięci flash + +## Aplikacja internetowa + +- Logowanie za pomocą Auth0 + +- Wizytówka koła: + + - informacje o kole + + - formularz kontaktowy + + - prezentacja projektów koła + +- Zarządzanie użytkownikami na koncie administratora: + + - dodawanie i usuwanie użytkowników + + - zmiana danych użytkownika + + - nadawanie i odbieranie uprawnień użytkownikom + +- Dodawanie pomiarów z pliku (json, csv) + +- Wyświetlanie danych z testów (wykresy) + +- Przegląd danych historycznych + +- Wyświetlanie testów historycznych w postaci live + +- Zintegrowania aplikacji webowej z REST API + +- Eksport testów do plików (json, excel) + +- Eksport trajektorii lotu rakiety do pliku KML (Google earth) + +- Profil użytkownika, możliwość zmiany nazwy użytkownika, imienia, + nazwiska, e-maila, hasła + +## Aplikacja desktopowa + +- Wyświetlanie danych z testów live (wykresy) + +- Wyświetlanie lokalizacji za pośrednictwem Google Maps + +- Konfigurowanie modułów elektronicznych + +- Odczyt/Zapis danych z modułów elektronicznych + +- Wysyłanie testów na serwer + +- Zapis pomiarów w plikach json + +## Aplikacja serwerowa, REST API + +- Dodanie serwisów REST pozwalających na operacje wymienione w punkcie + "Aplikacja internetowa" + +- Dodanie serwisów REST pozwalających na operacje wymienione w punkcie + "Aplikacja desktopowa" + +- Zintegrowanie API z bazą danych + +- Wdrożenie aplikacji na środowisko testowe + +- Wdrożenie aplikacji na środowisko produkcyjne + +## Elektronika naziemna (odbiornik) + +- Odbieranie danych od komputera pokładowego (LORA) + +- Przekazywanie danych do serwera za pomocą REST API + +- Przekazywanie danych do kolejnych urządzeń za pomocą Seriala + +- Konfiguracja/kontrola modułu: + + - zmiana parametrów uruchomieniowych + +# Lista wymagań niefunkcjonalnych + +## Komputer pokładowy + +- Bezpieczny w użyciu + +- Prosty w użyciu + +- Niezawodny + +- Dokładny + +- Z czytelnym, przejrzystym kodem + +- Technologie: + + - Arduino + + - C++ + + - FreeRTOS + +## Nadajnik/Lokalizator + +- Bezpieczna w użyciu + +- Prosta w użyciu + +- Niezawodny + +- Dokładny + +- Z czytelnym, przejrzystym kodem + +- Technologie: + + - Arduino + + - C++ + + - FreeRTOS + +## Elektronika naziemna (odbiornik) + +- Bezpieczna w użyciu + +- Prosta w użyciu + +- Niezawodny + +- Ładnie obudowana + +- Z czytelnym, przejrzystym kodem + +- Technologie: + + - Arduino + + - C++ + +## Aplikacja internetowa (frontend) + +- Wytworzona z użyciem nowoczesnych standardów + +- Single Page Application + +- Responsywna + +- Intuicyjna w obsłudze + +- Technologie: + + - Vue.js + + - Typescript + +## Aplikacja desktopowa + +- Wytworzona z użyciem nowoczesnych standardów + +- Single Page Application + +- Responsywna + +- Intuicyjna w obsłudze + +- Zaprojektowana według najnowszych standardów .NET + +- Używa nowych technologii i podejść programistycznych + +- Z czytelnym i przejrzystym kodem + +- Szybka obsługa zapytań + +- Zintegrowana z elektroniką naziemną oraz pozostałymi modułami + +- Technologie: + + - Vue.js + + - Electron + + - Typescript + + - .NET Core + + - C-.05em + +## Aplikacja serwerowa - REST API + +- Zaprojektowana według najnowszych standardów .NET + +- Używa nowych technologii i podejść programistycznych + +- Z czytelnym i przejrzystym kodem + +- Szybka obsługa zapytań + +- Technologie: + + - .Net Core + + - Docker + +## Baza danych + +- Szybka obsługa zapytań + +- Rozszerzalna + +- Niezawodna + +- Technologie: + + - NoSql + +## Prototyp aplikacji internetowej przetestowany przez użytkowników + +- Technologie: + + - Adobe XD + +## Tablica projektowa - Trello + +- Historia wymagań funkcjonalnych (User stories) + +- Historia prac zdefiniowana zadaniami + +- Lista wymagań funkcjonalnych zaplanowanych na przyszłość + +- Lista zadań zaplanowanych na przyszłość + +## Repozytorium zawierające kod aplikacji, API oraz elektroniki + +- Czytelne + +- Uporządkowane + +- Tworzone i utrzymywane ze sztuką + +- Technologie: + + - GitHub + +# Mierzalne wskaźniki wdrożeniowe + +## Semestr I + +- System zostanie przekazany w wersji testowej alpha. + +- System zostanie zasilony danymi z symulacji lotu rakiet oraz danymi + historycznymi testów silników + +## Semestr II + +- System zostanie udostępniony w domenie internetowej i będą z niego + korzystać członkowie koła (około 20 osób) + +- Wizytówka koła będzie oglądana przez ludzi chcących się dowiedzieć + czegoś o kole. + +- Przekazanie plików instalacyjnych do aplikacji desktopowej + +- Na koniec drugiego semestru klient otrzyma system w wersji beta. + +# Kryteria akceptacji projektu dla I semestru prac + +## Wymagane + +- Ukończenie zdefiniowanych funkcjonalności z listy wymagań + funkcjonalnych na pierwszy semestr + +- Brak błędów utrudniających korzystanie z aplikacji + +- Produkt został oddany w czasie + +## Oczekiwane + +- Wykonanie produktu zgodnie z ustalonymi wymaganiami odnośnie + technologii + +## Planowane + +- Zawieranie testów jednostkowych, integracyjnych, oraz czy spełniają + swoje zadanie + +# Kryteria akceptacji projektu dla II semestru prac + +## Wymagane + +- Ukończenie zdefiniowanych funkcjonalności z listy wymagań + funkcjonalnych na drugi semestr + +- Przetestowanie aplikacji pod kątem użytkowym przez testerów + (klientów końcowych) + +- Brak błędów utrudniających korzystanie z aplikacji + +- Produkt został oddany w czasie + +- Produkt został wdrożony na domenę publiczną + +- Produkt został przekazany klientowi + +## Oczekiwane + +- Wykonanie produktu zgodnie z ustalonymi wymaganiami odnośnie + technologii + +## Planowane + +- Zawieranie testów jednostkowych, integracyjnych, oraz czy spełniają + swoje zadanie + +# Organizacja pracy zespołu + +Strona zespołu projektowego: + +- Wojciech Kubiak - Product Owner + + - Implementacja systemów wbudowanych + + - Zarządzanie dokumentacją + + - Komunikacja z klientem - czynny udział w kole + +- Piotr Józefowicz - Scrum Master + + - Implementacja frontendu + + - Projektowanie prototypu interfejsu użytkownika + +- Sebastian Wawrzyn - DevOps + + - Implementacja backendu aplikacji + + - Stworzenie bazy danych na potrzeby aplikacji API + + - Wdrożenie i dockeryzacja aplikacji + +Praca jest wykonywana w metodyce SCRUM w tygodniowych sprintach. Kod +źródłowy trzymany jest na repozytorium na Githubie. Do podziału pracy i +śledzenia progresu używamy aplikacji Trello + +# Ryzyka projektowe + +## Ryzyka ze względu na zasoby + +- Odejście członka implementującego stronę serwerową - trudności w + ukończeniu aplikacji serwerowej + +- Odejście członka implementującego stronę frontendową - trudności w + ukończeniu aplikacji + +- Odejście członka implementującego systemy wbudowane - trudności w + ukończeniu aplikacji + +- Określone ramy czasowe (semestry) na stworzenie produktu + +## Inne + +- Nieporozumienia na linii zespół a klient wynikające z nieznajomości + pojęć domenowych lub nieporozumienia dotyczące funkcjonalności czy + innych rzeczy + +- Nieporozumienia w zespole dotyczące rozwiązań implementacyjnych, + architektury, funkcjonalności lub używanych technologii + +- Brak odpowiedniego zaangażowania w projekt ze strony zespołu, + wybranych członków zespołu + +- Nagły brak wsparcia dla lub przerwanie rozwijania wykorzystywanej + technologii lub narzędzia - konieczność implementacji od nowa, lub + kontynuowanie implementacji w nieużywanym/źle zaprojektowanym + narzędziu, bibliotece + +- Napięty termin, nakład obowiązków związanych z uczelnią oraz sprawy + prywatne, mogą negatywnie wpłynąć na pracę nad aplikacją + +- Niestandardowy temat projektu, mogą pojawić się nieoczekiwane + trudności (rocket science) + +# Kamienie milowe + +- I faza, I semestr (02.2020 - 07.2020): + + - Przygotowanie prototypu aplikacji + + - Przygotowanie backlogu dla projektu w systemie Trello, + opracowanie funkcjonalności, user stories + + - Rozpoczęcie prac programistycznych nad aplikacją + + - Rozpoczęcie prac programistycznych nad komputerem pokładowym 1.0 + + - Testowanie komputera pokładowego + + - Ukończenie MVP aplikacji i komputera pokładowego + + - Poddanie MVP testom funkcjonalnym + +- II faza, II semestr(10.2020 - 01.2021): + + - Uaktualnienie dokumentacji i Trello + + - Kontynuacja prac programistycznych nad aplikacjami + + - Kontynuacje prac programistycznych nad komputerem pokładowym + + - Rozpoczęcie prac nad nadajnikiem i odbiornikiem + + - Testowanie komputera pokładowego oraz elektroniki naziemnej + + - Ukończenie aplikacji wraz ze wszystkimi zdefiniowanymi + funkcjonalnościami + + - Integracja aplikacji z elektroniką + + - Testy integracyjne + + - Wdrożenie aplikacji na publiczną domenę From 993ea717ef4bf65641c021c3a6025efc2246aaa8 Mon Sep 17 00:00:00 2001 From: Sebastian Wawrzyn Date: Thu, 14 Jan 2021 21:39:58 +0100 Subject: [PATCH 5/7] Update 'Przybylski/awionika/wymagania_projektowe.md' --- Przybylski/awionika/wymagania_projektowe.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Przybylski/awionika/wymagania_projektowe.md b/Przybylski/awionika/wymagania_projektowe.md index 67b91a5..cd0610d 100644 --- a/Przybylski/awionika/wymagania_projektowe.md +++ b/Przybylski/awionika/wymagania_projektowe.md @@ -278,7 +278,7 @@ title: - .NET Core - - C-.05em + - C# ## Aplikacja serwerowa - REST API From 528257bfc96e2405269d32bcbaec889eb53501e0 Mon Sep 17 00:00:00 2001 From: Sebastian Wawrzyn Date: Thu, 14 Jan 2021 21:40:16 +0100 Subject: [PATCH 6/7] Update 'Przybylski/awionika/wizja_projektu.md' --- Przybylski/awionika/wizja_projektu.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Przybylski/awionika/wizja_projektu.md b/Przybylski/awionika/wizja_projektu.md index 7e10962..7683104 100644 --- a/Przybylski/awionika/wizja_projektu.md +++ b/Przybylski/awionika/wizja_projektu.md @@ -212,7 +212,7 @@ mimo że zaawansowane również są bardzo drogie. - Wojciech Kubiak - systemy wbudowane - arduino, c++, FreeRTOS, python -- Sebastian Wawrzyn - backend - .NET Core, C-.05em , Docker, NoSql +- Sebastian Wawrzyn - backend - .NET Core, C# , Docker, NoSql - Piotr Józefowicz - frontend - Vue.js, typescript From d03e590ce1e390289e19cf96ad3c84e7f36a2238 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marta=20G=C5=82uszkowska?= Date: Fri, 15 Jan 2021 18:42:10 +0100 Subject: [PATCH 7/7] Wizja i zakres projektu WhisperPress --- .../WhisperPress - wizja projektu.docx | Bin 0 -> 10593 bytes .../WhisperPress - zakres projektu.doc | Bin 0 -> 94208 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Pilka/monitorowanie-tresci/WhisperPress - wizja projektu.docx create mode 100644 Pilka/monitorowanie-tresci/WhisperPress - zakres projektu.doc diff --git a/Pilka/monitorowanie-tresci/WhisperPress - wizja projektu.docx b/Pilka/monitorowanie-tresci/WhisperPress - wizja projektu.docx new file mode 100644 index 0000000000000000000000000000000000000000..5624756ea0d67ffe1be6f81d814880b52fc915db GIT binary patch literal 10593 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