diff --git a/.github/workflows/linux-files/odr_config.xml b/.github/workflows/linux-files/odr_config.xml index a06e9901..2a7e4bb8 100644 --- a/.github/workflows/linux-files/odr_config.xml +++ b/.github/workflows/linux-files/odr_config.xml @@ -6,12 +6,29 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/workflows/linux-files/otx_config.xml b/.github/workflows/linux-files/otx_config.xml index 250106a7..8d6e252c 100644 --- a/.github/workflows/linux-files/otx_config.xml +++ b/.github/workflows/linux-files/otx_config.xml @@ -6,10 +6,26 @@ - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/.github/workflows/windows-files/odr_config.xml b/.github/workflows/windows-files/odr_config.xml index 7714aaa4..3454394c 100644 --- a/.github/workflows/windows-files/odr_config.xml +++ b/.github/workflows/windows-files/odr_config.xml @@ -6,12 +6,29 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/workflows/windows-files/otx_config.xml b/.github/workflows/windows-files/otx_config.xml index 264887cf..91076370 100644 --- a/.github/workflows/windows-files/otx_config.xml +++ b/.github/workflows/windows-files/otx_config.xml @@ -6,10 +6,26 @@ - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/INSTALL.md b/INSTALL.md index dc133f29..f15f3d54 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -164,7 +164,11 @@ Python modules can be installed using `pip`. pip install asam-qc-runtime@git+https://github.com/asam-ev/qc-framework@develop#subdirectory=runtime ``` -**Note:** The above command will install `asam-qc-runtime` from the `develop` branch. If you want to install `asam-qc-runtime` from another branch or tag, replace `@develop` with the desired branch or tag. +**Note:** The above command will install `asam-qc-runtime` from the `develop` branch. If you want to install `asam-qc-runtime` from another branch or tag, replace `@develop` with the desired branch or tag. It is also possible to install from a local directory. + +```bash +pip install /home/user/qc-framework/runtime +``` ## Install ASAM Checker Bundles @@ -176,7 +180,11 @@ Standard ASAM Checker Bundles are implemented in Python and can be installed usi pip install asam-qc-opendrive@git+https://github.com/asam-ev/qc-opendrive@develop ``` -**Note:** The above command will install `asam-qc-opendrive` from the `develop` branch. If you want to install `asam-qc-opendrive` from another branch or tag, replace `@develop` with the desired branch or tag. +**Note:** The above command will install `asam-qc-opendrive` from the `develop` branch. If you want to install `asam-qc-opendrive` from another branch or tag, replace `@develop` with the desired branch or tag. It is also possible to install from a local directory. + +```bash +pip install /home/user/qc-opendrive +``` To test the installation: @@ -190,7 +198,11 @@ qc_opendrive --help pip install asam-qc-openscenarioxml@git+https://github.com/asam-ev/qc-openscenarioxml@develop ``` -**Note:** The above command will install `asam-qc-openscenarioxml` from the `develop` branch. If you want to install `asam-qc-openscenarioxml` from another branch or tag, replace `@develop` with the desired branch or tag. +**Note:** The above command will install `asam-qc-openscenarioxml` from the `develop` branch. If you want to install `asam-qc-openscenarioxml` from another branch or tag, replace `@develop` with the desired branch or tag. It is also possible to install from a local directory. + +```bash +pip install /home/user/qc-openscenarioxml +``` To test the installation: @@ -204,7 +216,11 @@ qc_openscenario --help pip install asam-qc-otx@git+https://github.com/asam-ev/qc-otx@develop ``` -**Note:** The above command will install `asam-qc-otx` from the `develop` branch. If you want to install `asam-qc-otx` from another branch or tag, replace `@develop` with the desired branch or tag. +**Note:** The above command will install `asam-qc-otx` from the `develop` branch. If you want to install `asam-qc-otx` from another branch or tag, replace `@develop` with the desired branch or tag. It is also possible to install from a local directory. + +```bash +pip install /home/user/qc-otx +``` To test the installation: diff --git a/demo_pipeline/templates/otx_template.xml b/demo_pipeline/templates/otx_template.xml index a3100f27..86718c3a 100644 --- a/demo_pipeline/templates/otx_template.xml +++ b/demo_pipeline/templates/otx_template.xml @@ -5,10 +5,26 @@ - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/demo_pipeline/templates/xodr_template.xml b/demo_pipeline/templates/xodr_template.xml index cb6c6d1a..0e0e85a0 100644 --- a/demo_pipeline/templates/xodr_template.xml +++ b/demo_pipeline/templates/xodr_template.xml @@ -5,12 +5,29 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/changelog.txt b/doc/changelog.txt index e74eda08..bc38c89f 100644 --- a/doc/changelog.txt +++ b/doc/changelog.txt @@ -3,6 +3,40 @@ QC4OpenX QChecker for OpenX - Change Log File This file tracks the changes made within the QC4OpenX project. +v2.0.0-beta +========================================== +- The QC Framework is now standards agnostic +- Remove unnecessary dependencies +- Add Python Base Library +- Update C++ Base Library +- Add CI/CD +- Add a demo pipeline +- Simplify the architecture by splitting runtime module and configuration GUI +- Add a new runtime module in Python +- Support the manifest file mechanism to register checker bundles in any programming language with the framework. +- Update configuration file format and result file format to include necessary information +- Support the rule UID concept in the framework +- Add new features to result pooling + - Order the results + - Support severity level + - Support result filtering + - Resolve naming conflict +- Improve ReportGUI + - Support arbitrary ASCII-based input files + - Remove the 5MB file size limit + - Improve usability (drag and drop to open, refresh after loading a new result file) + - Support domain specific information + - Add Esmini Viewer plugin to visualize issues in OpenDrive files +- Improve Text Report + - Add more information to Text Report + - Support domain-specific information +- Add support for automatic documentation generation in the Python Base Library +- Improve documentation +- Add three checker bundles + - OpenDrive checker bundle: https://github.com/asam-ev/qc-opendrive + - OpenScenario XML checker bundle: https://github.com/asam-ev/qc-openscenarioxml + - OTX checker bundle: https://github.com/asam-ev/qc-otx + v1.0.0 First open source compliant version ========================================== - ConfigGUI executable for checker configuration diff --git a/doc/manual/esmini_viewer_plugin.md b/doc/manual/esmini_viewer_plugin.md index 45f3cf0f..381bce1b 100644 --- a/doc/manual/esmini_viewer_plugin.md +++ b/doc/manual/esmini_viewer_plugin.md @@ -42,6 +42,20 @@ So in order to use the plugin you can either: cp /home/user/Downloads/esmini-demo/bin/libesminiLib.so ~/qc-build/bin/ ``` + +## Remarks + +When the Esmini Viewer is started, it initially points to the inertial location at the coordinate `x=0, y=0, z=0`. Your view may be empty if your map is not at `x=0, y=0, z=0`. + +![example_esmini_viewer_map](images/esmini_at_00.png) + +The view will update when you click on an issue that contains `Inertial Location`, as in the screenshot below. The new view will point to the corresponding location in the issue. + +Note that not all issues contain a location. For example, issues related to XML Schema do not contain locations. + +![example_esmini_viewer_map](images/esmini_at_location.png) + + ## Additional information #### Which OpenDRIVE file to render diff --git a/doc/manual/images/esmini_at_00.png b/doc/manual/images/esmini_at_00.png new file mode 100644 index 00000000..a7a93223 Binary files /dev/null and b/doc/manual/images/esmini_at_00.png differ diff --git a/doc/manual/images/esmini_at_location.png b/doc/manual/images/esmini_at_location.png new file mode 100644 index 00000000..8bb6b643 Binary files /dev/null and b/doc/manual/images/esmini_at_location.png differ diff --git a/doc/manual/rule_uid_schema.md b/doc/manual/rule_uid_schema.md index d50eb1a0..c521d7c7 100644 --- a/doc/manual/rule_uid_schema.md +++ b/doc/manual/rule_uid_schema.md @@ -92,8 +92,8 @@ concepts defined by ASAM. Lets start with an example for a rule UID, and lets break down its concepts. The example references a rule listed in the subsection **Rules** of one of the ASAM Standards for OpenDRIVE. The Rules subsections were introduced for the first -time in revision 1.6 of the standard. **Please notice that the full name of the -rule may change in the future**. +time in revision 1.6 of the standard. Note that a rule can start being applied +to earlier versions of the standard. > [ASAM OpenDRIVE Standard 1.6.0, Chapter 7.2 - Road Reference > Line](https://releases.asam.net/OpenDRIVE/1.6.0/ASAM_OpenDRIVE_BS_V1-6-0.html#_road_reference_line), @@ -104,20 +104,19 @@ we can identify the following concepts: * **emanating entity**: ASAM `asam.net` * **standard**: OpenDRIVE `xodr` -* **definition settings**: the rule firstly appeared in `1.6.0`, the first - revision to introduce the subsections rules +* **definition settings**: the rule starts being applied to ASAM OpenDrive files from version `1.4.0` * **Full name**: - * **rule-set**: Road Planar Geometry definitions `road.planview.geometry` - * **name**: summarizes the content of the rule, e.g. `ref_line_exists`. It is + * **rule-set**: Road Geometry definitions `road.geometry` + * **name**: summarizes the content of the rule, e.g. `refline_exists`. It is always the last group in dot-notation strings. The complete UID would be something like: ```text -asam.net:xodr:1.6.0:road.planview.geometry.ref_line_exists --------- ---- ----- ---------------------- --------------- - | | | | | - entity | version | name +asam.net:xodr:1.4.0:road.geometry.refline_exists +-------- ---- ----- ------------- -------------- + | | | | | + entity | version | name standard rule-set ``` @@ -141,10 +140,10 @@ recommended to define all concepts, if this is reasonably possible. The proposed formalism allow to perform query on rules (or set of rules) using UNIX style wildcards notation (i.e., python `fnmatch` module). -Example: Query all the OpenDRIVE geometrical rules that were created in version 1.6.0 -1.6.1, or 1.7.0 of the standard: `asam.net:xodr:1.[67].[01]:*geometry.*` matches -`asam.net:xodr:1.6.0:road.planview.geometry.ref_line_exists` but does not -match `asam.net:xodr:1.8.0:road.planview.geometry.ref_line_exists`. +Example: Query all the OpenDRIVE geometrical rules that were created in version 1.4.0 +1.4.1, or 1.5.0 of the standard: `asam.net:xodr:1.[45].[01]:*geometry.*` matches +`asam.net:xodr:1.4.0:road.geometry.refline_exists` but does not +match `asam.net:xodr:1.8.0:road.geometry.refline_exists`. ## Remarks on Rule Full names diff --git a/doc/manual/runtime_module.md b/doc/manual/runtime_module.md index 589b2a87..5c1c4f62 100644 --- a/doc/manual/runtime_module.md +++ b/doc/manual/runtime_module.md @@ -19,7 +19,11 @@ The runtime module can be installed using pip. pip install asam-qc-runtime@git+https://github.com/asam-ev/qc-framework@develop#subdirectory=runtime ``` -**Note:** The above command will install `asam-qc-runtime` from the `develop` branch. If you want to install `asam-qc-runtime` from another branch or tag, replace `@develop` with the desired branch or tag. +**Note:** The above command will install `asam-qc-runtime` from the `develop` branch. If you want to install `asam-qc-runtime` from another branch or tag, replace `@develop` with the desired branch or tag. It is also possible to install from a local directory. + +```bash +pip install /home/user/qc-framework/runtime +``` Then, it can be executed as follows. diff --git a/doc/schema/xqar_result_format.xsd b/doc/schema/xqar_result_format.xsd index f3f29c39..5acb0c90 100644 --- a/doc/schema/xqar_result_format.xsd +++ b/doc/schema/xqar_result_format.xsd @@ -15,6 +15,7 @@ with this file, You can obtain one at https://mozilla.org/MPL/2.0/. + diff --git a/src/report_modules/report_module_gui/src/ui/c_checker_widget.cpp b/src/report_modules/report_module_gui/src/ui/c_checker_widget.cpp index 259d224c..a735ef73 100644 --- a/src/report_modules/report_module_gui/src/ui/c_checker_widget.cpp +++ b/src/report_modules/report_module_gui/src/ui/c_checker_widget.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -262,6 +263,25 @@ void cCheckerWidget::LoadIssues(std::list issues) const ShowIssue(firstIssue, nullptr); } + if (issues.size() == 0) + { + QTreeWidgetItem *newItem = new QTreeWidgetItem(_issueBox); + + newItem->setToolTip(0, "Identifier"); + newItem->setText(0, QString("-")); + newItem->setText(1, QString("-")); + newItem->setText(2, QString("-")); + newItem->setText(3, QString("No Issues Found")); + _issueBox->setItemSelected(newItem, true); + _issueDetailsTextWidget->setText(QString("No issues found in selected xqar file")); + _issueBox->addTopLevelItem(newItem); + QMessageBox msgBox; + msgBox.setWindowTitle("Result file info"); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setText("No issues found in selected xqar file"); + msgBox.exec(); + } + _issueBox->expandAll(); } @@ -650,15 +670,6 @@ void cCheckerWidget::ShowIssue(cIssue *const itemToShow, const cLocationsContain } } } - else - { - // This is the implementation of very simple reports. If a issue point to a - // xodr or xosc file, it should have a FileLocation - - // If issue referes to an OpenDRIVE, show it! - if (hasInputPath) - ShowInputIssue(itemToShow, -1); - } } } @@ -790,7 +801,8 @@ void cCheckerWidget::PrintExtendedInformationIntoStream(cExtendedInformation *it ssStream->setf(std::ios::fixed, std::ios::floatfield); *ssStream << std::endl - << " Location: x=" << std::setprecision(2) << initialLoc->GetX() << " y=" << std::setprecision(2) - << initialLoc->GetY() << " z=" << std::setprecision(2) << initialLoc->GetZ(); + << " Inertial Location: x=" << std::setprecision(2) << initialLoc->GetX() + << " y=" << std::setprecision(2) << initialLoc->GetY() << " z=" << std::setprecision(2) + << initialLoc->GetZ(); } } diff --git a/src/report_modules/report_module_text/src/report_format_text.cpp b/src/report_modules/report_module_text/src/report_format_text.cpp index e16b646c..298b9e06 100644 --- a/src/report_modules/report_module_text/src/report_format_text.cpp +++ b/src/report_modules/report_module_text/src/report_format_text.cpp @@ -260,7 +260,7 @@ void WriteResults(const char *file, cResultContainer *ptrResultContainer) std::list issues; std::list rules; std::list metadata; - std::set info_violated_rules; + std::set info_rules; std::set warning_violated_rules; std::set error_violated_rules; std::set addressed_rules; @@ -358,7 +358,7 @@ void WriteResults(const char *file, cResultContainer *ptrResultContainer) eIssueLevel current_issue_level = (*it_Issue)->GetIssueLevel(); if (current_issue_level == eIssueLevel::INFO_LVL) { - info_violated_rules.insert((*it_Issue)->GetRuleUID()); + info_rules.insert((*it_Issue)->GetRuleUID()); } if (current_issue_level == eIssueLevel::WARNING_LVL) { @@ -420,7 +420,7 @@ void WriteResults(const char *file, cResultContainer *ptrResultContainer) ss << "\n" << BASIC_SEPARATOR_LINE << "\n"; } - ss << "Addressed vs Violated rules report \n\n"; + ss << "Rules report \n\n"; ss << "\nTotal number of addressed rules: " << addressed_rules.size(); for (const auto &str : addressed_rules) @@ -428,24 +428,24 @@ void WriteResults(const char *file, cResultContainer *ptrResultContainer) ss << "\n\t-> Addressed RuleUID: " << str << "\n"; } - int total_number_of_violated_rules = - info_violated_rules.size() + warning_violated_rules.size() + error_violated_rules.size(); - ss << "\nTotal number of violated rules: " << total_number_of_violated_rules << "\n"; + int total_number_of_rules_with_issues = + info_rules.size() + warning_violated_rules.size() + error_violated_rules.size(); + ss << "\nTotal number of rules with found issues: " << total_number_of_rules_with_issues << "\n"; - ss << "\nInfo violated rules: " << info_violated_rules.size(); - for (const auto &str : info_violated_rules) + ss << "\nRules for information: " << info_rules.size(); + for (const auto &str : info_rules) { - ss << "\n\t-> Info violation RuleUID: " << str; + ss << "\n\t-> RuleUID with info: " << str; } - ss << "\nWarning violated rules: " << warning_violated_rules.size(); + ss << "\nRules with warning issues: " << warning_violated_rules.size(); for (const auto &str : warning_violated_rules) { - ss << "\n\t-> Warning violation RuleUID: " << str; + ss << "\n\t-> RuleUID with warning issue: " << str; } - ss << "\nError violated rules: " << error_violated_rules.size(); + ss << "\nRules with error issues: " << error_violated_rules.size(); for (const auto &str : error_violated_rules) { - ss << "\n\t-> Error violation RuleUID: " << str; + ss << "\n\t-> RuleUID with error issue: " << str; } ss << "\n" << BASIC_SEPARATOR_LINE << "\n";