├── haros
├── __init__.py
├── schema
│ ├── service.yaml
│ ├── topic.yaml
│ ├── project.yaml
│ ├── repository.yaml
│ ├── source_file.yaml
│ ├── configuration.yaml
│ ├── parameter.yaml
│ ├── package.yaml
│ ├── node.yaml
│ └── node_instance.yaml
├── __main__.py
├── models
│ ├── tf.yaml
│ ├── lms1xx.yaml
│ ├── template.yaml
│ ├── interactive_marker_twist_server.yaml
│ ├── joy.yaml
│ ├── prosilica_camera.yaml
│ ├── nodelet.yaml
│ ├── controller_manager.yaml
│ ├── map_server.yaml
│ ├── teleop_twist_joy.yaml
│ ├── husky_base.yaml
│ └── robot_localization.yaml
├── util.py
├── pyflwor_monkey_patch.py
└── visualiser.py
├── docs
├── data
│ ├── Fictibot
│ │ ├── compliance
│ │ │ ├── unknown.json
│ │ │ ├── runtime
│ │ │ │ ├── minimal.json
│ │ │ │ ├── dual_bots.json
│ │ │ │ ├── multiplex.json
│ │ │ │ ├── type_check.json
│ │ │ │ ├── safe_random_walker.json
│ │ │ │ ├── fictibot_safety_controller_fictibot_safety_controller.json
│ │ │ │ └── fictibot_random_controller_fictibot_random_controller.json
│ │ │ └── source
│ │ │ │ ├── fictibot_msgs.json
│ │ │ │ ├── fictibot_launch.json
│ │ │ │ ├── fictibot_multiplex.json
│ │ │ │ ├── fictibot_safety_controller.json
│ │ │ │ ├── fictibot_drivers.json
│ │ │ │ └── fictibot_random_controller.json
│ │ ├── metrics
│ │ │ ├── fictibot_msgs.json
│ │ │ └── fictibot_launch.json
│ │ ├── summary.json
│ │ ├── packages.json
│ │ └── metrics.json
│ ├── haros_tutorials
│ │ ├── compliance
│ │ │ ├── unknown.json
│ │ │ └── runtime
│ │ │ │ ├── name_collision.json
│ │ │ │ ├── params.json
│ │ │ │ ├── barebones.json
│ │ │ │ ├── minimal.json
│ │ │ │ ├── rosparam.json
│ │ │ │ ├── missing_node.json
│ │ │ │ ├── double_remap.json
│ │ │ │ ├── dual_bots.json
│ │ │ │ ├── type_check.json
│ │ │ │ ├── missing_remap.json
│ │ │ │ └── multiplex.json
│ │ └── summary.json
│ ├── Kobuki Code Quality Analysis
│ │ ├── configurations.json
│ │ ├── compliance
│ │ │ └── unknown.json
│ │ └── summary.json
│ ├── AgRob V16 Extraction Performance
│ │ ├── compliance
│ │ │ ├── unknown.json
│ │ │ └── source
│ │ │ │ ├── agrobv16_bringup.json
│ │ │ │ ├── agrobv16_map_server.json
│ │ │ │ ├── agrob_path_planning_stack.json
│ │ │ │ ├── agrob_joy.json
│ │ │ │ ├── agrob_safety.json
│ │ │ │ ├── agrob_red_map.json
│ │ │ │ └── agrobv16_supervisor.json
│ │ ├── metrics
│ │ │ ├── Agrob_path.json
│ │ │ ├── agrob_joy.json
│ │ │ ├── agrob_red_map.json
│ │ │ ├── agrob_safety.json
│ │ │ ├── agrob_supervisor.json
│ │ │ ├── agrobv16_bringup.json
│ │ │ ├── agrobv16_map_server.json
│ │ │ ├── agrobv16_supervisor.json
│ │ │ └── agrob_path_planning_stack.json
│ │ └── summary.json
│ ├── Kobuki Architectural Analysis
│ │ ├── compliance
│ │ │ ├── unknown.json
│ │ │ └── source
│ │ │ │ ├── kobuki_keyop.json
│ │ │ │ ├── kobuki_node.json
│ │ │ │ ├── kobuki_bumper2pc.json
│ │ │ │ ├── yocs_cmd_vel_mux.json
│ │ │ │ ├── kobuki_random_walker.json
│ │ │ │ ├── yocs_safety_controller.json
│ │ │ │ ├── yocs_velocity_smoother.json
│ │ │ │ └── kobuki_safety_controller.json
│ │ ├── metrics
│ │ │ ├── kobuki_keyop.json
│ │ │ ├── kobuki_node.json
│ │ │ ├── kobuki_bumper2pc.json
│ │ │ ├── yocs_cmd_vel_mux.json
│ │ │ ├── kobuki_random_walker.json
│ │ │ ├── yocs_safety_controller.json
│ │ │ ├── yocs_velocity_smoother.json
│ │ │ └── kobuki_safety_controller.json
│ │ ├── summary.json
│ │ └── metrics.json
│ ├── Kobuki Extraction Performance
│ │ ├── compliance
│ │ │ ├── unknown.json
│ │ │ └── source
│ │ │ │ ├── kobuki_keyop.json
│ │ │ │ ├── kobuki_node.json
│ │ │ │ ├── kobuki_bumper2pc.json
│ │ │ │ ├── yocs_cmd_vel_mux.json
│ │ │ │ ├── kobuki_random_walker.json
│ │ │ │ ├── yocs_safety_controller.json
│ │ │ │ ├── yocs_velocity_smoother.json
│ │ │ │ └── kobuki_safety_controller.json
│ │ ├── metrics
│ │ │ ├── kobuki_keyop.json
│ │ │ ├── kobuki_node.json
│ │ │ ├── kobuki_bumper2pc.json
│ │ │ ├── yocs_cmd_vel_mux.json
│ │ │ ├── kobuki_random_walker.json
│ │ │ ├── yocs_safety_controller.json
│ │ │ ├── yocs_velocity_smoother.json
│ │ │ └── kobuki_safety_controller.json
│ │ └── summary.json
│ ├── Turtlebot Extraction Performance
│ │ ├── compliance
│ │ │ ├── unknown.json
│ │ │ └── source
│ │ │ │ ├── kobuki_keyop.json
│ │ │ │ ├── kobuki_node.json
│ │ │ │ ├── kobuki_bumper2pc.json
│ │ │ │ ├── kobuki_random_walker.json
│ │ │ │ ├── turtlebot_bringup.json
│ │ │ │ ├── yocs_cmd_vel_mux.json
│ │ │ │ ├── kobuki_safety_controller.json
│ │ │ │ ├── yocs_safety_controller.json
│ │ │ │ ├── yocs_velocity_smoother.json
│ │ │ │ └── turtlebot_navigation.json
│ │ ├── metrics
│ │ │ ├── kobuki_keyop.json
│ │ │ ├── kobuki_node.json
│ │ │ ├── kobuki_bumper2pc.json
│ │ │ ├── kobuki_random_walker.json
│ │ │ ├── turtlebot_bringup.json
│ │ │ ├── turtlebot_navigation.json
│ │ │ ├── yocs_cmd_vel_mux.json
│ │ │ ├── kobuki_safety_controller.json
│ │ │ ├── yocs_safety_controller.json
│ │ │ └── yocs_velocity_smoother.json
│ │ └── summary.json
│ └── projects.json
├── screenshots
│ ├── issues.png
│ ├── packages.png
│ ├── dashboard_1.png
│ └── dashboard_2.png
├── lib
│ └── fonts
│ │ ├── FontAwesome.otf
│ │ ├── fontawesome-webfont.eot
│ │ ├── fontawesome-webfont.ttf
│ │ ├── fontawesome-webfont.woff
│ │ ├── fontawesome-webfont.woff2
│ │ └── README.md
├── js
│ ├── views
│ │ ├── help.js
│ │ └── general.js
│ ├── routes.js
│ └── app.js
├── css
│ ├── color.css
│ └── type.css
├── QUERIES.md
└── FAQ.md
├── logo.png
├── harosviz
├── lib
│ └── fonts
│ │ ├── fontawesome-webfont.eot
│ │ ├── fontawesome-webfont.ttf
│ │ ├── fontawesome-webfont.woff
│ │ └── fontawesome-webfont.woff2
├── js
│ ├── views
│ │ └── help.js
│ ├── routes.js
│ └── app.js
└── css
│ ├── color.css
│ └── type.css
├── .gitignore
├── requirements.txt
├── LICENSE
├── haros-runner.py
├── setup.py
├── README.md
├── CONTRIBUTING.md
└── CITING.md
/haros/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/docs/data/Fictibot/compliance/unknown.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Fictibot/metrics/fictibot_msgs.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Fictibot/compliance/runtime/minimal.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Fictibot/metrics/fictibot_launch.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/haros_tutorials/compliance/unknown.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Fictibot/compliance/runtime/dual_bots.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Fictibot/compliance/runtime/multiplex.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Fictibot/compliance/runtime/type_check.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Fictibot/compliance/source/fictibot_msgs.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Fictibot/compliance/runtime/safe_random_walker.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Fictibot/compliance/source/fictibot_launch.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Code Quality Analysis/configurations.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/compliance/unknown.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/metrics/Agrob_path.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/metrics/agrob_joy.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/compliance/unknown.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/metrics/kobuki_keyop.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/metrics/kobuki_node.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Code Quality Analysis/compliance/unknown.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/compliance/unknown.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/metrics/kobuki_keyop.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/metrics/kobuki_node.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/compliance/unknown.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/metrics/agrob_red_map.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/metrics/agrob_safety.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/metrics/kobuki_bumper2pc.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/metrics/yocs_cmd_vel_mux.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/metrics/kobuki_bumper2pc.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/metrics/yocs_cmd_vel_mux.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/metrics/kobuki_keyop.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/metrics/kobuki_node.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/git-afsantos/haros/HEAD/logo.png
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/metrics/agrob_supervisor.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/metrics/agrobv16_bringup.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/metrics/agrobv16_map_server.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/metrics/agrobv16_supervisor.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/compliance/source/kobuki_keyop.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/compliance/source/kobuki_node.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/metrics/kobuki_random_walker.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/metrics/yocs_safety_controller.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/metrics/yocs_velocity_smoother.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/compliance/source/kobuki_keyop.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/compliance/source/kobuki_node.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/metrics/kobuki_random_walker.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/metrics/yocs_safety_controller.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/metrics/yocs_velocity_smoother.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/metrics/kobuki_bumper2pc.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/metrics/kobuki_random_walker.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/metrics/turtlebot_bringup.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/metrics/turtlebot_navigation.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/metrics/yocs_cmd_vel_mux.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/metrics/agrob_path_planning_stack.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/compliance/source/kobuki_bumper2pc.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/compliance/source/yocs_cmd_vel_mux.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/metrics/kobuki_safety_controller.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/compliance/source/kobuki_bumper2pc.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/compliance/source/yocs_cmd_vel_mux.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/metrics/kobuki_safety_controller.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/compliance/source/kobuki_keyop.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/compliance/source/kobuki_node.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/metrics/kobuki_safety_controller.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/metrics/yocs_safety_controller.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/metrics/yocs_velocity_smoother.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/compliance/source/agrobv16_bringup.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/compliance/source/agrobv16_map_server.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/compliance/source/kobuki_random_walker.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/compliance/source/yocs_safety_controller.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/compliance/source/yocs_velocity_smoother.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/compliance/source/kobuki_random_walker.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/compliance/source/yocs_safety_controller.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/compliance/source/yocs_velocity_smoother.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/compliance/source/kobuki_bumper2pc.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/compliance/source/kobuki_random_walker.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/compliance/source/turtlebot_bringup.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/compliance/source/yocs_cmd_vel_mux.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/compliance/source/agrob_path_planning_stack.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/compliance/source/kobuki_safety_controller.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/compliance/source/kobuki_safety_controller.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/compliance/source/kobuki_safety_controller.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/compliance/source/yocs_safety_controller.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/compliance/source/yocs_velocity_smoother.json:
--------------------------------------------------------------------------------
1 | []
--------------------------------------------------------------------------------
/docs/screenshots/issues.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/git-afsantos/haros/HEAD/docs/screenshots/issues.png
--------------------------------------------------------------------------------
/docs/screenshots/packages.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/git-afsantos/haros/HEAD/docs/screenshots/packages.png
--------------------------------------------------------------------------------
/docs/lib/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/git-afsantos/haros/HEAD/docs/lib/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/docs/screenshots/dashboard_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/git-afsantos/haros/HEAD/docs/screenshots/dashboard_1.png
--------------------------------------------------------------------------------
/docs/screenshots/dashboard_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/git-afsantos/haros/HEAD/docs/screenshots/dashboard_2.png
--------------------------------------------------------------------------------
/docs/lib/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/git-afsantos/haros/HEAD/docs/lib/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/docs/lib/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/git-afsantos/haros/HEAD/docs/lib/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/docs/lib/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/git-afsantos/haros/HEAD/docs/lib/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/docs/lib/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/git-afsantos/haros/HEAD/docs/lib/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/harosviz/lib/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/git-afsantos/haros/HEAD/harosviz/lib/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/harosviz/lib/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/git-afsantos/haros/HEAD/harosviz/lib/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/harosviz/lib/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/git-afsantos/haros/HEAD/harosviz/lib/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/harosviz/lib/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/git-afsantos/haros/HEAD/harosviz/lib/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | unused
2 | img
3 | haros/*.pyc
4 | haros/**/*.pyc
5 | /harosviz/*.bat
6 | /harosviz/data
7 | build
8 | dist
9 | haros.egg-info
10 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | pyflwor_ext>=1.2
2 | rospkg>=1.1.4
3 | bonsai_code>=0.6.7
4 | setuptools>=20.7.0
5 | PyYAML>=3.13,<4.0
6 | haros-plugins>=1.0.3,<2.0.0
7 | python-magic>=0.4.15
8 | hpl-specs
9 | ros-type-tokens
10 |
--------------------------------------------------------------------------------
/docs/data/haros_tutorials/compliance/runtime/name_collision.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "comment":"Query found: NodeInstance name_collision:/node",
4 | "resources":[
5 | {
6 | "resourceType":"node",
7 | "name":"/node"
8 | }
9 | ],
10 | "location":{
11 | "configuration":"name_collision"
12 | },
13 | "rule":"user:match_multiple_times"
14 | }
15 | ]
--------------------------------------------------------------------------------
/docs/data/Fictibot/compliance/source/fictibot_multiplex.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "rule":"haros_plugin_cppcheck:harosIntegerTypes",
4 | "comment":"Found implementation defined integer type.",
5 | "location":{
6 | "package":"fictibot_multiplex",
7 | "file":"src/multiplex_node.cpp",
8 | "line":5,
9 | "column":null,
10 | "function":null,
11 | "class":null
12 | },
13 | "resources":[]
14 | }
15 | ]
--------------------------------------------------------------------------------
/docs/data/Fictibot/compliance/source/fictibot_safety_controller.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "rule":"haros_plugin_cppcheck:harosIntegerTypes",
4 | "comment":"Found implementation defined integer type.",
5 | "location":{
6 | "package":"fictibot_safety_controller",
7 | "file":"src/controller_node.cpp",
8 | "line":5,
9 | "column":null,
10 | "function":null,
11 | "class":null
12 | },
13 | "resources":[]
14 | }
15 | ]
--------------------------------------------------------------------------------
/docs/data/haros_tutorials/compliance/runtime/params.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "comment":"Query found: NodeInstance params:/fictibase",
4 | "resources":[
5 | {
6 | "resourceType":"node",
7 | "name":"/fictibase"
8 | }
9 | ],
10 | "location":{
11 | "configuration":"params"
12 | },
13 | "rule":"user:match_multiple_times"
14 | },
15 | {
16 | "comment":"Query found: NodeInstance params:/ficticontrol",
17 | "resources":[
18 | {
19 | "resourceType":"node",
20 | "name":"/ficticontrol"
21 | }
22 | ],
23 | "location":{
24 | "configuration":"params"
25 | },
26 | "rule":"user:match_multiple_times"
27 | }
28 | ]
--------------------------------------------------------------------------------
/docs/data/haros_tutorials/compliance/runtime/barebones.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "comment":"Query found: NodeInstance barebones:/listener",
4 | "resources":[
5 | {
6 | "resourceType":"node",
7 | "name":"/listener"
8 | }
9 | ],
10 | "location":{
11 | "configuration":"barebones"
12 | },
13 | "rule":"user:match_multiple_times"
14 | },
15 | {
16 | "comment":"Query found: NodeInstance barebones:/talker",
17 | "resources":[
18 | {
19 | "resourceType":"node",
20 | "name":"/talker"
21 | }
22 | ],
23 | "location":{
24 | "configuration":"barebones"
25 | },
26 | "rule":"user:match_multiple_times"
27 | }
28 | ]
--------------------------------------------------------------------------------
/docs/data/haros_tutorials/compliance/runtime/minimal.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "comment":"Query found: NodeInstance minimal:/fictibase",
4 | "resources":[
5 | {
6 | "resourceType":"node",
7 | "name":"/fictibase"
8 | }
9 | ],
10 | "location":{
11 | "configuration":"minimal"
12 | },
13 | "rule":"user:match_multiple_times"
14 | },
15 | {
16 | "comment":"Query found: NodeInstance minimal:/ficticontrol",
17 | "resources":[
18 | {
19 | "resourceType":"node",
20 | "name":"/ficticontrol"
21 | }
22 | ],
23 | "location":{
24 | "configuration":"minimal"
25 | },
26 | "rule":"user:match_multiple_times"
27 | }
28 | ]
--------------------------------------------------------------------------------
/docs/data/haros_tutorials/compliance/runtime/rosparam.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "comment":"Query found: NodeInstance rosparam:/fictibase",
4 | "resources":[
5 | {
6 | "resourceType":"node",
7 | "name":"/fictibase"
8 | }
9 | ],
10 | "location":{
11 | "configuration":"rosparam"
12 | },
13 | "rule":"user:match_multiple_times"
14 | },
15 | {
16 | "comment":"Query found: NodeInstance rosparam:/ficticontrol",
17 | "resources":[
18 | {
19 | "resourceType":"node",
20 | "name":"/ficticontrol"
21 | }
22 | ],
23 | "location":{
24 | "configuration":"rosparam"
25 | },
26 | "rule":"user:match_multiple_times"
27 | }
28 | ]
--------------------------------------------------------------------------------
/docs/data/Fictibot/compliance/runtime/fictibot_safety_controller_fictibot_safety_controller.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "rule":"haros_plugin_pbt_gen:pbtest",
4 | "comment":"
The following property is false.
globally: /laser { (data <= 32) } causes /cmd_stop { True } within 0.2s
Counterexample:
- @868ms sent witness on /laser
data: 0
",
5 | "location":{
6 | "configuration":"fictibot_safety_controller_fictibot_safety_controller"
7 | },
8 | "resources":[
9 | {
10 | "name":"/laser",
11 | "resourceType":"topic"
12 | }
13 | ]
14 | }
15 | ]
--------------------------------------------------------------------------------
/docs/data/haros_tutorials/compliance/runtime/missing_node.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "comment":"Query found: NodeInstance missing_node:/fictibase",
4 | "resources":[
5 | {
6 | "resourceType":"node",
7 | "name":"/fictibase"
8 | }
9 | ],
10 | "location":{
11 | "configuration":"missing_node"
12 | },
13 | "rule":"user:match_multiple_times"
14 | },
15 | {
16 | "comment":"Query found: NodeInstance missing_node:/ficticontrol",
17 | "resources":[
18 | {
19 | "resourceType":"node",
20 | "name":"/ficticontrol"
21 | }
22 | ],
23 | "location":{
24 | "configuration":"missing_node"
25 | },
26 | "rule":"user:match_multiple_times"
27 | }
28 | ]
--------------------------------------------------------------------------------
/haros/schema/service.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | ---
3 | $schema: "http://json-schema.org/draft-07/schema#"
4 | $id: "https://github.com/git-afsantos/haros/tree/master/haros/schema/service.yaml"
5 | title: Service
6 | description: A ROS Service specification.
7 | allOf:
8 | - $ref: "common.yaml#/definitions/ros_resource"
9 | - properties:
10 | clients:
11 | description: A list of clients connected to this service.
12 | type: array
13 | items:
14 | $ref: "common.yaml#/definitions/client_link"
15 | server:
16 | description: The server that provides this service.
17 | oneOf:
18 | - $ref: "common.yaml#/definitions/server_link"
19 | - type: null
20 | required:
21 | - clients
22 | - server
23 |
--------------------------------------------------------------------------------
/haros/schema/topic.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | ---
3 | $schema: "http://json-schema.org/draft-07/schema#"
4 | $id: "https://github.com/git-afsantos/haros/tree/master/haros/schema/topic.yaml"
5 | title: Topic
6 | description: A ROS Topic specification.
7 | allOf:
8 | - $ref: "common.yaml#/definitions/ros_resource"
9 | - properties:
10 | publishers:
11 | description: A list of publishers connected to this topic.
12 | type: array
13 | items:
14 | $ref: "common.yaml#/definitions/publisher_link"
15 | subscribers:
16 | description: A list of subscribers connected to this topic.
17 | type: array
18 | items:
19 | $ref: "common.yaml#/definitions/subscriber_link"
20 | required:
21 | - publishers
22 | - subscribers
23 |
--------------------------------------------------------------------------------
/docs/data/Fictibot/compliance/source/fictibot_drivers.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "rule":"haros_plugin_cppcheck:redundantAssignment",
4 | "comment":"Variable 'wheel_msg.left' is reassigned a value before the old one has been used.",
5 | "location":{
6 | "package":"fictibot_drivers",
7 | "file":"src/sensor_manager.cpp",
8 | "line":63,
9 | "column":null,
10 | "function":null,
11 | "class":null
12 | },
13 | "resources":[]
14 | },
15 | {
16 | "rule":"haros_plugin_cppcheck:harosIntegerTypes",
17 | "comment":"Found implementation defined integer type.",
18 | "location":{
19 | "package":"fictibot_drivers",
20 | "file":"src/driver_node.cpp",
21 | "line":8,
22 | "column":null,
23 | "function":null,
24 | "class":null
25 | },
26 | "resources":[]
27 | }
28 | ]
--------------------------------------------------------------------------------
/docs/data/Fictibot/compliance/runtime/fictibot_random_controller_fictibot_random_controller.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "rule":"haros_plugin_pbt_gen:pbtest",
4 | "comment":"The following property is false.
globally: /bumper { ((left or center) or right) } causes /cmd_vel { True } within 0.2s
Counterexample:
- @665ms sent witness on /bumper
left: True
center: False
right: False - @665ms sent spam on /bumper
left: False
center: False
right: False
",
5 | "location":{
6 | "configuration":"fictibot_random_controller_fictibot_random_controller"
7 | },
8 | "resources":[
9 | {
10 | "name":"/bumper",
11 | "resourceType":"topic"
12 | }
13 | ]
14 | }
15 | ]
--------------------------------------------------------------------------------
/docs/data/Fictibot/compliance/source/fictibot_random_controller.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "rule":"no_global_names",
4 | "comment":"Query found: RosPrimitiveCall(/cmd_vel, , fictibot_msgs/VelocityCommand) Location2(package='fictibot_random_controller', file='src/random_controller.cpp', line=23, column=26) (depth 0)\nReported in fictibot_random_controller/src/random_controller.cpp:23:26",
5 | "location":{
6 | "package":"fictibot_random_controller",
7 | "file":"src/random_controller.cpp",
8 | "line":23,
9 | "column":26,
10 | "function":null,
11 | "class":null
12 | },
13 | "resources":[]
14 | },
15 | {
16 | "rule":"haros_plugin_cppcheck:harosIntegerTypes",
17 | "comment":"Found implementation defined integer type.",
18 | "location":{
19 | "package":"fictibot_random_controller",
20 | "file":"src/controller_node.cpp",
21 | "line":5,
22 | "column":null,
23 | "function":null,
24 | "class":null
25 | },
26 | "resources":[]
27 | }
28 | ]
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2016 Andre Santos
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy
4 | of this software and associated documentation files (the "Software"), to deal
5 | in the Software without restriction, including without limitation the rights
6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | copies of the Software, and to permit persons to whom the Software is
8 | furnished to do so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in
11 | all copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 | THE SOFTWARE.
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/compliance/source/agrob_joy.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "comment":"Query found: RosPrimitiveCall(/agrob/cmd_vel_joy, ~, geometry_msgs/TwistStamped) Location2(package='agrob_joy', file='src/teleop_joy.cpp', line=62, column=14) (depth 0)\nReported in agrob_joy/src/teleop_joy.cpp:62:14, in function TeleopJoy",
4 | "resources":[],
5 | "location":{
6 | "function":"TeleopJoy",
7 | "package":"agrob_joy",
8 | "column":14,
9 | "file":"src/teleop_joy.cpp",
10 | "line":62,
11 | "class":null
12 | },
13 | "rule":"no_global_names"
14 | },
15 | {
16 | "comment":"Query found: RosPrimitiveCall(/agrob/agrob_mode, ~, agrob_supervisor/agrob_mode) Location2(package='agrob_joy', file='src/teleop_joy.cpp', line=63, column=15) (depth 0)\nReported in agrob_joy/src/teleop_joy.cpp:63:15, in function TeleopJoy",
17 | "resources":[],
18 | "location":{
19 | "function":"TeleopJoy",
20 | "package":"agrob_joy",
21 | "column":15,
22 | "file":"src/teleop_joy.cpp",
23 | "line":63,
24 | "class":null
25 | },
26 | "rule":"no_global_names"
27 | }
28 | ]
--------------------------------------------------------------------------------
/docs/data/haros_tutorials/compliance/runtime/double_remap.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "comment":"Query found: NodeInstance double_remap:/fictibase",
4 | "resources":[
5 | {
6 | "resourceType":"node",
7 | "name":"/fictibase"
8 | }
9 | ],
10 | "location":{
11 | "configuration":"double_remap"
12 | },
13 | "rule":"user:match_multiple_times"
14 | },
15 | {
16 | "comment":"Query found: NodeInstance double_remap:/ficticontrol",
17 | "resources":[
18 | {
19 | "resourceType":"node",
20 | "name":"/ficticontrol"
21 | }
22 | ],
23 | "location":{
24 | "configuration":"double_remap"
25 | },
26 | "rule":"user:match_multiple_times"
27 | },
28 | {
29 | "comment":"Query found: (Configuration double_remap, ({u'sub': Subscription of node '/ficticontrol' to topic '/temp' of type 'std_msgs/Int8', u'pub': Publication of node '/fictibase' to topic '/fictibase/laser' of type 'std_msgs/Int8'},))\nReported in configuration double_remap",
30 | "resources":[],
31 | "location":{
32 | "configuration":"double_remap"
33 | },
34 | "rule":"user:disconnected_similar_topics"
35 | }
36 | ]
--------------------------------------------------------------------------------
/haros/schema/project.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | ---
3 | $schema: "http://json-schema.org/draft-07/schema#"
4 | $id: "https://github.com/git-afsantos/haros/tree/master/haros/schema/project.yaml"
5 | title: Project
6 | description: A ROS Project specification.
7 | type: object
8 | properties:
9 | name:
10 | description: The name of the ROS project.
11 | type: string
12 | minLength: 1
13 | packages:
14 | description: The set of packages that are part of this project.
15 | type: array
16 | uniqueItems: true
17 | minItems: 1
18 | items:
19 | $ref: "common.yaml#/definitions/package_name"
20 | # repositories:
21 | # description: The set of repositories that are part of this project.
22 | # type: array
23 | # uniqueItems: true
24 | # items:
25 | # type: string
26 | # minLength: 1
27 | configurations:
28 | description: The set of configurations that are part of this project.
29 | type: array
30 | uniqueItems: true
31 | items:
32 | $ref: "common.yaml#/definitions/config_ref"
33 | required:
34 | - name
35 | - packages
36 |
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/compliance/source/turtlebot_navigation.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "comment":"Query found: RosPrimitiveCall(/scan_filtered, ~, sensor_msgs/LaserScan) Location2(package='turtlebot_navigation', file='src/laser_footprint_filter.cpp', line=46, column=26) (depth 0)\nReported in turtlebot_navigation/src/laser_footprint_filter.cpp:46:26",
4 | "resources":[],
5 | "location":{
6 | "function":null,
7 | "package":"turtlebot_navigation",
8 | "column":26,
9 | "file":"src/laser_footprint_filter.cpp",
10 | "line":46,
11 | "class":null
12 | },
13 | "rule":"no_global_names"
14 | },
15 | {
16 | "comment":"Query found: RosPrimitiveCall(/scan, ~, sensor_msgs/LaserScan) Location2(package='turtlebot_navigation', file='src/laser_footprint_filter.cpp', line=47, column=17) (depth 0)\nReported in turtlebot_navigation/src/laser_footprint_filter.cpp:47:17",
17 | "resources":[],
18 | "location":{
19 | "function":null,
20 | "package":"turtlebot_navigation",
21 | "column":17,
22 | "file":"src/laser_footprint_filter.cpp",
23 | "line":47,
24 | "class":null
25 | },
26 | "rule":"no_global_names"
27 | }
28 | ]
--------------------------------------------------------------------------------
/haros-runner.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | #Copyright (c) 2016 Andre Santos
4 | #
5 | #Permission is hereby granted, free of charge, to any person obtaining a copy
6 | #of this software and associated documentation files (the "Software"), to deal
7 | #in the Software without restriction, including without limitation the rights
8 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | #copies of the Software, and to permit persons to whom the Software is
10 | #furnished to do so, subject to the following conditions:
11 |
12 | #The above copyright notice and this permission notice shall be included in
13 | #all copies or substantial portions of the Software.
14 |
15 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | #THE SOFTWARE.
22 |
23 | import sys
24 | from haros.haros import main
25 |
26 | sys.exit(main(source_runner = True))
27 |
--------------------------------------------------------------------------------
/docs/data/haros_tutorials/summary.json:
--------------------------------------------------------------------------------
1 | {
2 | "communications":{
3 | "remappings":null,
4 | "services":1,
5 | "topics":null,
6 | "messages":0,
7 | "actions":0
8 | },
9 | "analysis":{
10 | "rules":165,
11 | "userRules":7,
12 | "violatedRules":25,
13 | "plugins":11
14 | },
15 | "source":{
16 | "files":37,
17 | "languages":{
18 | "cpp":0.5594614809274495,
19 | "python":0.0,
20 | "cppLOC":748,
21 | "pythonLOC":0
22 | },
23 | "pkgDependencies":6,
24 | "packages":4,
25 | "scripts":0
26 | },
27 | "components":{
28 | "parameterFiles":null,
29 | "nodes":5,
30 | "nodelets":0,
31 | "launchFiles":15,
32 | "configurations":11
33 | },
34 | "issues":{
35 | "metrics":12,
36 | "ratio":"0.16",
37 | "total":208,
38 | "coding":200,
39 | "other":0
40 | },
41 | "history":{
42 | "metrics":[
43 | 12
44 | ],
45 | "complexity":[
46 | 2
47 | ],
48 | "lines_of_code":[
49 | 1337
50 | ],
51 | "issues":[
52 | 208
53 | ],
54 | "function_length":[
55 | 12
56 | ],
57 | "timestamps":[
58 | "2020-11-27-18-43"
59 | ],
60 | "comments":[
61 | 13
62 | ],
63 | "standards":[
64 | 200
65 | ]
66 | }
67 | }
--------------------------------------------------------------------------------
/haros/__main__.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 |
3 | #Copyright (c) 2016 Andre Santos
4 | #
5 | #Permission is hereby granted, free of charge, to any person obtaining a copy
6 | #of this software and associated documentation files (the "Software"), to deal
7 | #in the Software without restriction, including without limitation the rights
8 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | #copies of the Software, and to permit persons to whom the Software is
10 | #furnished to do so, subject to the following conditions:
11 |
12 | #The above copyright notice and this permission notice shall be included in
13 | #all copies or substantial portions of the Software.
14 |
15 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | #THE SOFTWARE.
22 |
23 | from __future__ import unicode_literals
24 | import sys
25 | from .haros import main
26 |
27 | sys.exit(main(source_runner = True))
28 |
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/summary.json:
--------------------------------------------------------------------------------
1 | {
2 | "communications":{
3 | "remappings":null,
4 | "services":0,
5 | "topics":null,
6 | "messages":0,
7 | "actions":0
8 | },
9 | "analysis":{
10 | "rules":29,
11 | "userRules":0,
12 | "violatedRules":0,
13 | "plugins":1
14 | },
15 | "source":{
16 | "files":132,
17 | "languages":{
18 | "cpp":0.5960868098504442,
19 | "python":0.03069830203530867,
20 | "cppLOC":5301,
21 | "pythonLOC":273
22 | },
23 | "pkgDependencies":27,
24 | "packages":8,
25 | "scripts":2
26 | },
27 | "components":{
28 | "parameterFiles":null,
29 | "nodes":10,
30 | "nodelets":7,
31 | "launchFiles":19,
32 | "configurations":1
33 | },
34 | "issues":{
35 | "metrics":0,
36 | "ratio":"0.00",
37 | "total":0,
38 | "coding":0,
39 | "other":0
40 | },
41 | "history":{
42 | "metrics":[
43 | 0
44 | ],
45 | "complexity":[
46 | 0
47 | ],
48 | "lines_of_code":[
49 | 8893
50 | ],
51 | "issues":[
52 | 0
53 | ],
54 | "function_length":[
55 | 0
56 | ],
57 | "timestamps":[
58 | "2021-02-26-15-26"
59 | ],
60 | "comments":[
61 | 0
62 | ],
63 | "standards":[
64 | 0
65 | ]
66 | }
67 | }
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/summary.json:
--------------------------------------------------------------------------------
1 | {
2 | "communications":{
3 | "remappings":null,
4 | "services":1,
5 | "topics":null,
6 | "messages":2,
7 | "actions":0
8 | },
9 | "analysis":{
10 | "rules":30,
11 | "userRules":0,
12 | "violatedRules":1,
13 | "plugins":1
14 | },
15 | "source":{
16 | "files":277,
17 | "languages":{
18 | "cpp":0.13736327148224614,
19 | "python":0.004058576869317672,
20 | "cppLOC":21424,
21 | "pythonLOC":633
22 | },
23 | "pkgDependencies":36,
24 | "packages":9,
25 | "scripts":2
26 | },
27 | "components":{
28 | "parameterFiles":null,
29 | "nodes":18,
30 | "nodelets":0,
31 | "launchFiles":109,
32 | "configurations":5
33 | },
34 | "issues":{
35 | "metrics":0,
36 | "ratio":"0.00",
37 | "total":71,
38 | "coding":71,
39 | "other":0
40 | },
41 | "history":{
42 | "metrics":[
43 | 0
44 | ],
45 | "complexity":[
46 | 0
47 | ],
48 | "lines_of_code":[
49 | 155966
50 | ],
51 | "issues":[
52 | 71
53 | ],
54 | "function_length":[
55 | 0
56 | ],
57 | "timestamps":[
58 | "2021-02-28-10-33"
59 | ],
60 | "comments":[
61 | 0
62 | ],
63 | "standards":[
64 | 71
65 | ]
66 | }
67 | }
--------------------------------------------------------------------------------
/docs/data/haros_tutorials/compliance/runtime/dual_bots.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "comment":"Query found: NodeInstance dual_bots:/one/fictibase",
4 | "resources":[
5 | {
6 | "resourceType":"node",
7 | "name":"/one/fictibase"
8 | }
9 | ],
10 | "location":{
11 | "configuration":"dual_bots"
12 | },
13 | "rule":"user:match_multiple_times"
14 | },
15 | {
16 | "comment":"Query found: NodeInstance dual_bots:/one/ficticontrol",
17 | "resources":[
18 | {
19 | "resourceType":"node",
20 | "name":"/one/ficticontrol"
21 | }
22 | ],
23 | "location":{
24 | "configuration":"dual_bots"
25 | },
26 | "rule":"user:match_multiple_times"
27 | },
28 | {
29 | "comment":"Query found: NodeInstance dual_bots:/two/fictibase",
30 | "resources":[
31 | {
32 | "resourceType":"node",
33 | "name":"/two/fictibase"
34 | }
35 | ],
36 | "location":{
37 | "configuration":"dual_bots"
38 | },
39 | "rule":"user:match_multiple_times"
40 | },
41 | {
42 | "comment":"Query found: NodeInstance dual_bots:/two/ficticontrol",
43 | "resources":[
44 | {
45 | "resourceType":"node",
46 | "name":"/two/ficticontrol"
47 | }
48 | ],
49 | "location":{
50 | "configuration":"dual_bots"
51 | },
52 | "rule":"user:match_multiple_times"
53 | }
54 | ]
--------------------------------------------------------------------------------
/haros/schema/repository.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | ---
3 | $schema: "http://json-schema.org/draft-07/schema#"
4 | $id: "https://github.com/git-afsantos/haros/tree/master/haros/schema/repository.yaml"
5 | title: Repository
6 | description: A source code repository specification.
7 | type: object
8 | properties:
9 | name:
10 | description: The name of the repository.
11 | type: string
12 | minLength: 1
13 | vcs:
14 | description: The version control system used for this repository.
15 | type: string
16 | enum:
17 | - git
18 | - svn
19 | - hg
20 | path:
21 | description: The file system path pointing to the root of this repository.
22 | type: string
23 | minLength: 1
24 | version:
25 | description: The version of the repository (e.g., 'master' branch).
26 | type: string
27 | minLength: 1
28 | # project:
29 | # description: The name of the project this repository belongs to.
30 | # type: string
31 | packages:
32 | description: A set of ROS packages that this repository includes.
33 | type: array
34 | uniqueItems: true
35 | minItems: 1
36 | items:
37 | $ref: "common.yaml#/definitions/package_name"
38 | required:
39 | - name
40 | - vcs
41 | - version
42 | - path
43 | - project
44 | - packages
45 |
--------------------------------------------------------------------------------
/docs/data/haros_tutorials/compliance/runtime/type_check.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "comment":"Query found: NodeInstance type_check:/fictibase",
4 | "resources":[
5 | {
6 | "resourceType":"node",
7 | "name":"/fictibase"
8 | }
9 | ],
10 | "location":{
11 | "configuration":"type_check"
12 | },
13 | "rule":"user:match_multiple_times"
14 | },
15 | {
16 | "comment":"Query found: NodeInstance type_check:/ficticontrol",
17 | "resources":[
18 | {
19 | "resourceType":"node",
20 | "name":"/ficticontrol"
21 | }
22 | ],
23 | "location":{
24 | "configuration":"type_check"
25 | },
26 | "rule":"user:match_multiple_times"
27 | },
28 | {
29 | "comment":"Query found: (Publication of node '/ficticontrol' to topic '/teleop_cmd' of type 'std_msgs/Empty', Subscription of node '/fictibase' to topic '/teleop_cmd' of type 'std_msgs/Float64')",
30 | "resources":[],
31 | "location":{
32 | "configuration":"type_check"
33 | },
34 | "rule":"user:type_check_topics"
35 | },
36 | {
37 | "comment":"Query found: (Subscription of node '/fictibase' to topic '/teleop_cmd' of type 'std_msgs/Float64', Publication of node '/ficticontrol' to topic '/teleop_cmd' of type 'std_msgs/Empty')",
38 | "resources":[],
39 | "location":{
40 | "configuration":"type_check"
41 | },
42 | "rule":"user:type_check_topics"
43 | }
44 | ]
--------------------------------------------------------------------------------
/docs/data/Kobuki Extraction Performance/summary.json:
--------------------------------------------------------------------------------
1 | {
2 | "communications":{
3 | "remappings":null,
4 | "services":0,
5 | "topics":null,
6 | "messages":0,
7 | "actions":0
8 | },
9 | "analysis":{
10 | "rules":30,
11 | "userRules":0,
12 | "violatedRules":0,
13 | "plugins":1
14 | },
15 | "source":{
16 | "files":132,
17 | "languages":{
18 | "cpp":0.5960868098504442,
19 | "python":0.03069830203530867,
20 | "cppLOC":5301,
21 | "pythonLOC":273
22 | },
23 | "pkgDependencies":27,
24 | "packages":8,
25 | "scripts":2
26 | },
27 | "components":{
28 | "parameterFiles":null,
29 | "nodes":10,
30 | "nodelets":7,
31 | "launchFiles":19,
32 | "configurations":3
33 | },
34 | "issues":{
35 | "metrics":0,
36 | "ratio":"0.00",
37 | "total":0,
38 | "coding":0,
39 | "other":0
40 | },
41 | "history":{
42 | "metrics":[
43 | 0,
44 | 0
45 | ],
46 | "complexity":[
47 | 0,
48 | 0
49 | ],
50 | "lines_of_code":[
51 | 8893,
52 | 8893
53 | ],
54 | "issues":[
55 | 0,
56 | 0
57 | ],
58 | "function_length":[
59 | 0,
60 | 0
61 | ],
62 | "timestamps":[
63 | "2021-02-26-10-27",
64 | "2021-02-26-10-46"
65 | ],
66 | "comments":[
67 | 0,
68 | 0
69 | ],
70 | "standards":[
71 | 0,
72 | 0
73 | ]
74 | }
75 | }
--------------------------------------------------------------------------------
/docs/data/Kobuki Code Quality Analysis/summary.json:
--------------------------------------------------------------------------------
1 | {
2 | "communications":{
3 | "remappings":null,
4 | "services":0,
5 | "topics":null,
6 | "messages":0,
7 | "actions":0
8 | },
9 | "analysis":{
10 | "rules":150,
11 | "userRules":0,
12 | "violatedRules":48,
13 | "plugins":6
14 | },
15 | "source":{
16 | "files":132,
17 | "languages":{
18 | "cpp":0.5960868098504442,
19 | "python":0.03069830203530867,
20 | "cppLOC":5301,
21 | "pythonLOC":273
22 | },
23 | "pkgDependencies":27,
24 | "packages":8,
25 | "scripts":2
26 | },
27 | "components":{
28 | "parameterFiles":null,
29 | "nodes":10,
30 | "nodelets":7,
31 | "launchFiles":19,
32 | "configurations":0
33 | },
34 | "issues":{
35 | "metrics":81,
36 | "ratio":"0.18",
37 | "total":1570,
38 | "coding":1517,
39 | "other":0
40 | },
41 | "history":{
42 | "metrics":[
43 | 0,
44 | 81
45 | ],
46 | "complexity":[
47 | 0,
48 | 3
49 | ],
50 | "lines_of_code":[
51 | 8893,
52 | 8893
53 | ],
54 | "issues":[
55 | 0,
56 | 1570
57 | ],
58 | "function_length":[
59 | 0,
60 | 15
61 | ],
62 | "timestamps":[
63 | "2021-02-27-11-15",
64 | "2021-02-27-11-15"
65 | ],
66 | "comments":[
67 | 0,
68 | 1528
69 | ],
70 | "standards":[
71 | 0,
72 | 1517
73 | ]
74 | }
75 | }
--------------------------------------------------------------------------------
/haros/schema/source_file.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | ---
3 | $schema: "http://json-schema.org/draft-07/schema#"
4 | $id: "https://github.com/git-afsantos/haros/tree/master/haros/schema/source_file.yaml"
5 | title: Source File
6 | description: A Source File specification.
7 | type: object
8 | properties:
9 | name:
10 | description: The relative path of the file within the package.
11 | $ref: "common.yaml#/definitions/file_name"
12 | package:
13 | description: The name of the ROS package this file belongs to.
14 | $ref: "common.yaml#/definitions/package_name"
15 | language:
16 | description: |
17 | The programming, configuration or data serialisation
18 | language this file is written in.
19 | type: string
20 | enum:
21 | - cpp
22 | - python
23 | - launch
24 | - package
25 | - cmake
26 | - msg
27 | - srv
28 | - action
29 | - cfg
30 | - yaml
31 | - unknown
32 | source_tree:
33 | description: An Abstract Syntax Tree of the file.
34 | $ref: "common.yaml#/definitions/source_tree"
35 | dependencies:
36 | description: A set of dependencies on other files, e.g., included files.
37 | type: array
38 | uniqueItems: true
39 | items:
40 | $ref: "common.yaml#/definitions/file_ref"
41 | required:
42 | - name
43 | - package
44 | - language
45 |
--------------------------------------------------------------------------------
/docs/data/haros_tutorials/compliance/runtime/missing_remap.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "comment":"Query found: NodeInstance missing_remap:/fictibase",
4 | "resources":[
5 | {
6 | "resourceType":"node",
7 | "name":"/fictibase"
8 | }
9 | ],
10 | "location":{
11 | "configuration":"missing_remap"
12 | },
13 | "rule":"user:match_multiple_times"
14 | },
15 | {
16 | "comment":"Query found: NodeInstance missing_remap:/ficticontrol",
17 | "resources":[
18 | {
19 | "resourceType":"node",
20 | "name":"/ficticontrol"
21 | }
22 | ],
23 | "location":{
24 | "configuration":"missing_remap"
25 | },
26 | "rule":"user:match_multiple_times"
27 | },
28 | {
29 | "comment":"Query found: (Configuration missing_remap, ({u'sub': Subscription of node '/ficticontrol' to topic '/bumper' of type 'std_msgs/Int8', u'pub': Publication of node '/fictibase' to topic '/fictibase/bumper' of type 'std_msgs/Int8'}, {u'sub': Subscription of node '/ficticontrol' to topic '/laser' of type 'std_msgs/Int8', u'pub': Publication of node '/fictibase' to topic '/fictibase/laser' of type 'std_msgs/Int8'}, {u'sub': Subscription of node '/ficticontrol' to topic '/wheel' of type 'std_msgs/Int8', u'pub': Publication of node '/fictibase' to topic '/fictibase/wheel' of type 'std_msgs/Int8'}))\nReported in configuration missing_remap",
30 | "resources":[],
31 | "location":{
32 | "configuration":"missing_remap"
33 | },
34 | "rule":"user:disconnected_similar_topics"
35 | }
36 | ]
--------------------------------------------------------------------------------
/docs/data/Turtlebot Extraction Performance/summary.json:
--------------------------------------------------------------------------------
1 | {
2 | "communications":{
3 | "remappings":null,
4 | "services":0,
5 | "topics":null,
6 | "messages":0,
7 | "actions":0
8 | },
9 | "analysis":{
10 | "rules":30,
11 | "userRules":0,
12 | "violatedRules":1,
13 | "plugins":1
14 | },
15 | "source":{
16 | "files":225,
17 | "languages":{
18 | "cpp":0.4392796300803115,
19 | "python":0.023525594224061003,
20 | "cppLOC":5415,
21 | "pythonLOC":290
22 | },
23 | "pkgDependencies":46,
24 | "packages":10,
25 | "scripts":3
26 | },
27 | "components":{
28 | "parameterFiles":null,
29 | "nodes":12,
30 | "nodelets":7,
31 | "launchFiles":60,
32 | "configurations":3
33 | },
34 | "issues":{
35 | "metrics":0,
36 | "ratio":"0.00",
37 | "total":2,
38 | "coding":2,
39 | "other":0
40 | },
41 | "history":{
42 | "metrics":[
43 | 0,
44 | 0,
45 | 0
46 | ],
47 | "complexity":[
48 | 0,
49 | 0,
50 | 0
51 | ],
52 | "lines_of_code":[
53 | 12327,
54 | 12327,
55 | 12327
56 | ],
57 | "issues":[
58 | 2,
59 | 2,
60 | 2
61 | ],
62 | "function_length":[
63 | 0,
64 | 0,
65 | 0
66 | ],
67 | "timestamps":[
68 | "2021-02-27-13-18",
69 | "2021-02-27-13-19",
70 | "2021-02-27-13-41"
71 | ],
72 | "comments":[
73 | 0,
74 | 0,
75 | 0
76 | ],
77 | "standards":[
78 | 2,
79 | 2,
80 | 2
81 | ]
82 | }
83 | }
--------------------------------------------------------------------------------
/docs/js/views/help.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright (c) 2016 Andre Santos
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in
12 | all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | THE SOFTWARE.
21 | */
22 |
23 | (function () {
24 | "use strict";
25 |
26 | var views = window.App.Views;
27 |
28 | views.HelpBoard = views.BaseView.extend({
29 | id: "help-board",
30 |
31 | events: {},
32 |
33 | initialize: function () {
34 | this.firstTime = true;
35 | },
36 |
37 | render: function () {
38 | return this;
39 | },
40 |
41 | build: function () {
42 | if (this.firstTime) {
43 | this.render();
44 | this.firstTime = false;
45 | }
46 | return this;
47 | }
48 | });
49 | })();
--------------------------------------------------------------------------------
/harosviz/js/views/help.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright (c) 2016 Andre Santos
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in
12 | all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | THE SOFTWARE.
21 | */
22 |
23 | (function () {
24 | "use strict";
25 |
26 | var views = window.App.Views;
27 |
28 | views.HelpBoard = views.BaseView.extend({
29 | id: "help-board",
30 |
31 | events: {},
32 |
33 | initialize: function () {
34 | this.firstTime = true;
35 | },
36 |
37 | render: function () {
38 | return this;
39 | },
40 |
41 | build: function () {
42 | if (this.firstTime) {
43 | this.render();
44 | this.firstTime = false;
45 | }
46 | return this;
47 | }
48 | });
49 | })();
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | import os
4 | from setuptools import setup, find_packages
5 |
6 | # Utility function to read the README file.
7 | # Used for the long_description. It"s nice, because now 1) we have a top level
8 | # README file and 2) it"s easier to type in the README file than to put a raw
9 | # string in below ...
10 | def read(fname):
11 | return open(os.path.join(os.path.dirname(__file__), fname)).read()
12 |
13 |
14 | # Courtesy of https://stackoverflow.com/a/36693250
15 | def package_files(directory):
16 | paths = []
17 | for (path, directories, filenames) in os.walk(directory):
18 | for filename in filenames:
19 | paths.append(os.path.join("..", path, filename))
20 | return paths
21 |
22 |
23 | extra_files = package_files("harosviz")
24 | extra_files.append("*.yaml")
25 | extra_files.append("models/*.yaml")
26 |
27 |
28 | setup(
29 | name = "haros",
30 | version = "3.10.20",
31 | author = u"André Santos",
32 | author_email = "haros.framework@gmail.com",
33 | description = "Static analysis framework for ROS",
34 | long_description= read("README.md"),
35 | long_description_content_type = "text/markdown",
36 | license = "MIT",
37 | keywords = "static-analysis ros",
38 | url = "https://github.com/git-afsantos/haros",
39 | packages = find_packages(),
40 | entry_points = {"console_scripts": ["haros = haros.haros:main"]},
41 | package_data = {"haros": extra_files},
42 | install_requires = [
43 | "pyyaml",
44 | "rospkg",
45 | 'python-magic',
46 | "bonsai-code>=0.6.7,<1.0.0",
47 | "haros-plugins>=1.0.3,<2.0.0",
48 | "hpl-specs",
49 | "ros-type-tokens",
50 | ],
51 | extras_require = {},
52 | zip_safe = True
53 | )
54 |
--------------------------------------------------------------------------------
/haros/models/tf.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | #Copyright (c) 2018 Andre Santos
3 | #
4 | #Permission is hereby granted, free of charge, to any person obtaining a copy
5 | #of this software and associated documentation files (the "Software"), to deal
6 | #in the Software without restriction, including without limitation the rights
7 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | #copies of the Software, and to permit persons to whom the Software is
9 | #furnished to do so, subject to the following conditions:
10 |
11 | #The above copyright notice and this permission notice shall be included in
12 | #all copies or substantial portions of the Software.
13 |
14 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | #THE SOFTWARE.
21 | ---
22 | indigo:
23 | static_transform_publisher:
24 | nodelet: false
25 | advertise:
26 | -
27 | name: "/tf_static"
28 | type: tf2_msgs/TFMessage
29 | namespace: ""
30 | queue: 100
31 | depth: 0
32 | location: null
33 | repeats: false
34 | conditions: []
35 | subscribe: []
36 | service: []
37 | client: []
38 | readParam: []
39 | writeParam: []
40 | kinetic:
41 | static_transform_publisher:
42 | base: indigo
43 | lunar:
44 | static_transform_publisher:
45 | base: indigo
46 | melodic:
47 | static_transform_publisher:
48 | base: indigo
49 |
--------------------------------------------------------------------------------
/haros/schema/configuration.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | ---
3 | $schema: "http://json-schema.org/draft-07/schema#"
4 | $id: "https://github.com/git-afsantos/haros/tree/master/haros/schema/configuration.yaml"
5 | title: Configuration
6 | description: A ROS Configuration specification.
7 | type: object
8 | properties:
9 | uid:
10 | description: A unique identifier for the configuration.
11 | $ref: "common.yaml#/definitions/config_ref"
12 | name:
13 | description: |
14 | A human-readable name for the configuration.
15 | Defaults to the `uid`.
16 | type: string
17 | minLength: 1
18 | project:
19 | description: The name of the project this configuration belongs to.
20 | type: string
21 | nodes:
22 | description: A list of node instances that are part of this configuration.
23 | type: array
24 | items:
25 | $ref: "node_instance.yaml#"
26 | parameters:
27 | description: A list of parameters that are part of this configuration.
28 | type: array
29 | items:
30 | $ref: "parameter.yaml#"
31 | launch_commands:
32 | description: A list of launch commands required to start this configuration.
33 | type: array
34 | minItems: 1
35 | items:
36 | $ref: "#/definitions/launch_command"
37 | properties:
38 | description: A list of behavioural properties that this configuration satisfies.
39 | type: array
40 | items:
41 | type: string
42 | environment:
43 | description: A mapping of necessary environment variables for this configuration.
44 | type: object
45 | additionalProperties:
46 | type: string
47 | required:
48 | - uid
49 | - project
50 | - nodes
51 | - parameters
52 | - launch_files
53 | definitions:
54 | launch_command:
55 | type: object
56 | properties:
57 | command:
58 | type: string
59 | enum: [roslaunch, rosrun]
60 | args:
61 | type: array
62 | required:
63 | - command
64 | - args
65 |
--------------------------------------------------------------------------------
/docs/lib/fonts/README.md:
--------------------------------------------------------------------------------
1 | Minimizing font size
2 | --------------------
3 |
4 | To reduce the size of the output HAROS reports (to save space and increase loading speed)
5 | it is possible to mimize the font to only those icons that are actually used.
6 |
7 | This can be done with [fonttools](https://github.com/fonttools/fonttools) `pyftsubset` script (available via pip: `pip install fonttools`):
8 |
9 | ```
10 | pyftsubset FontAwesome.otf --output-file=FontAwesome_min.otf --unicodes-file=codes.txt
11 | ```
12 |
13 | where `codes.txt` is a text file containing the unicode code numbers of those characters that are being used and should therefore remain in the font.
14 |
15 | The characters (icons) currently used in the HAROS report are:
16 |
17 | ```
18 | fa-flag-o f11d
19 | fa-ellipsis-h f141
20 | fa-folder f07b
21 | fa-cogs f085
22 | fa-question f128
23 | fa-briefcase f0b1
24 | fa-line-chart f201
25 | fa-arrow-left f060
26 | fa-arrow-right f061
27 | fa-filter f0b0
28 | fa-hand-rock-o f255
29 | fa-font f031
30 | fa-server f233
31 | fa-search f002
32 | fa-info f129
33 | fa-spinner f110
34 | fa-file-code-o f1c9
35 | fa-bug f188
36 | fa-gears f085
37 | fa-exchange f0ec
38 | fa-close f00d
39 | fa-group f0c0
40 | fa-wrench f0ad
41 | fa-code-fork f126
42 | fa-warning f071
43 | fa-external-link f08e
44 | fa-sitemap f0e8
45 | fa-database f1c0
46 | fa-list-ol f0cb
47 | fa-terminal f120
48 | fa-file-text f15c
49 | fa-asterisk f069
50 | fa-question-circle f059
51 | ```
52 |
53 | So the `codes.txt` for this subset of characters should look like this:
54 |
55 | ```
56 | U+0f11d
57 | U+0f141
58 | U+0f07b
59 | U+0f085
60 | U+0f128
61 | U+0f0b1
62 | U+0f201
63 | U+0f060
64 | U+0f061
65 | U+0f0b0
66 | U+0f255
67 | U+0f031
68 | U+0f233
69 | U+0f002
70 | U+0f129
71 | U+0f110
72 | U+0f1c9
73 | U+0f188
74 | U+0f085
75 | U+0f0ec
76 | U+0f00d
77 | U+0f0c0
78 | U+0f0ad
79 | U+0f126
80 | U+0f071
81 | U+0f08e
82 | U+0f0e8
83 | U+0f1c0
84 | U+0f0cb
85 | U+0f120
86 | U+0f15c
87 | U+0f069
88 | U+0f059
89 | ```
90 |
--------------------------------------------------------------------------------
/haros/schema/parameter.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | ---
3 | $schema: "http://json-schema.org/draft-07/schema#"
4 | $id: "https://github.com/git-afsantos/haros/tree/master/haros/schema/parameter.yaml"
5 | title: Parameter
6 | description: A ROS Parameter specification.
7 | allOf:
8 | - $ref: "common.yaml#/definitions/ros_resource"
9 | - properties:
10 | param_type:
11 | description: The default type for this parameter.
12 | $ref: "common.yaml#/definitions/param_type"
13 | default_value:
14 | description: The default value for this parameter, set at launch.
15 | traceability:
16 | description: |
17 | Location where the `` or `` tag begins
18 | in the respective launch file.
19 | If set via command-line, set to `null`.
20 | oneOf:
21 | - $ref: "common.yaml#/definitions/source_location"
22 | - type: null
23 | conditions:
24 | description: Unresolved launch file conditions that affect this parameter.
25 | $ref: "common.yaml#/definitions/control_flow_graph"
26 | setters:
27 | description: A list of parameter writers.
28 | type: array
29 | items:
30 | $ref: "common.yaml#/definitions/setter_link"
31 | getters:
32 | description: A list of parameter readers.
33 | type: array
34 | items:
35 | $ref: "common.yaml#/definitions/getter_link"
36 | required:
37 | - param_type
38 | - traceability
39 | - if: { properties: { param_type: { const: bool }}}
40 | then: { properties: { default_value: { type: [boolean, null] }}}
41 | - if: { properties: { param_type: { const: int }}}
42 | then: { properties: { default_value: { type: [integer, null] }}}
43 | - if: { properties: { param_type: { const: double }}}
44 | then: { properties: { default_value: { type: [number, null] }}}
45 | - if: { properties: { param_type: { const: str }}}
46 | then: { properties: { default_value: { type: [string, null] }}}
47 | - if: { properties: { param_type: { const: yaml }}}
48 | then: { properties: { default_value: { type: [object, array, null] }}}
49 |
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/compliance/source/agrob_safety.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "comment":"Query found: RosPrimitiveCall(/agrob/safe_mode, /, agrob_supervisor/agrob_safe_mode) Location2(package='agrob_safety', file='src/agrob_safety.cpp', line=335, column=24) (depth 0)\nReported in agrob_safety/src/agrob_safety.cpp:335:24, in function main",
4 | "resources":[],
5 | "location":{
6 | "function":"main",
7 | "package":"agrob_safety",
8 | "column":24,
9 | "file":"src/agrob_safety.cpp",
10 | "line":335,
11 | "class":null
12 | },
13 | "rule":"no_global_names"
14 | },
15 | {
16 | "comment":"Query found: RosPrimitiveCall(/velodyne_points, /, sensor_msgs/PointCloud2) Location2(package='agrob_safety', file='src/agrob_safety.cpp', line=327, column=25) (depth 0)\nReported in agrob_safety/src/agrob_safety.cpp:327:25, in function main",
17 | "resources":[],
18 | "location":{
19 | "function":"main",
20 | "package":"agrob_safety",
21 | "column":25,
22 | "file":"src/agrob_safety.cpp",
23 | "line":327,
24 | "class":null
25 | },
26 | "rule":"no_global_names"
27 | },
28 | {
29 | "comment":"Query found: RosPrimitiveCall(/darknet_ros/bounding_boxes, /, darknet_ros_msgs/BoundingBoxes) Location2(package='agrob_safety', file='src/agrob_safety.cpp', line=332, column=32) (depth 0)\nReported in agrob_safety/src/agrob_safety.cpp:332:32, in function main",
30 | "resources":[],
31 | "location":{
32 | "function":"main",
33 | "package":"agrob_safety",
34 | "column":32,
35 | "file":"src/agrob_safety.cpp",
36 | "line":332,
37 | "class":null
38 | },
39 | "rule":"no_global_names"
40 | },
41 | {
42 | "comment":"Query found: RosPrimitiveCall(/imu_um7/rpy, /, geometry_msgs/Vector3Stamped) Location2(package='agrob_safety', file='src/agrob_safety.cpp', line=333, column=30) (depth 0)\nReported in agrob_safety/src/agrob_safety.cpp:333:30, in function main",
43 | "resources":[],
44 | "location":{
45 | "function":"main",
46 | "package":"agrob_safety",
47 | "column":30,
48 | "file":"src/agrob_safety.cpp",
49 | "line":333,
50 | "class":null
51 | },
52 | "rule":"no_global_names"
53 | }
54 | ]
--------------------------------------------------------------------------------
/haros/models/lms1xx.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | #Copyright (c) 2018 Andre Santos
3 | #
4 | #Permission is hereby granted, free of charge, to any person obtaining a copy
5 | #of this software and associated documentation files (the "Software"), to deal
6 | #in the Software without restriction, including without limitation the rights
7 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | #copies of the Software, and to permit persons to whom the Software is
9 | #furnished to do so, subject to the following conditions:
10 |
11 | #The above copyright notice and this permission notice shall be included in
12 | #all copies or substantial portions of the Software.
13 |
14 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | #THE SOFTWARE.
21 | ---
22 | indigo:
23 | LMS1xx_node:
24 | nodelet: false
25 | advertise:
26 | -
27 | name: "scan"
28 | type: sensor_msgs/LaserScan
29 | namespace: ""
30 | queue: 1
31 | depth: 0
32 | location: null
33 | repeats: false
34 | conditions: []
35 | subscribe: []
36 | service: []
37 | client: []
38 | readParam:
39 | -
40 | name: "host"
41 | type: str
42 | default: "192.168.1.2"
43 | namespace: "~"
44 | depth: 0
45 | location: null
46 | repeats: false
47 | conditions: []
48 | -
49 | name: "frame_id"
50 | type: str
51 | default: "laser"
52 | namespace: "~"
53 | depth: 0
54 | location: null
55 | repeats: false
56 | conditions: []
57 | writeParam: []
58 | kinetic:
59 | LMS1xx_node:
60 | base: indigo
61 | lunar:
62 | LMS1xx_node:
63 | base: indigo
64 | melodic:
65 | LMS1xx_node:
66 | base: indigo
67 |
--------------------------------------------------------------------------------
/haros/schema/package.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | ---
3 | $schema: "http://json-schema.org/draft-07/schema#"
4 | $id: "https://github.com/git-afsantos/haros/tree/master/haros/schema/package.yaml"
5 | title: Package
6 | description: A ROS Package specification.
7 | type: object
8 | properties:
9 | name:
10 | description: The name of the ROS package.
11 | $ref: "common.yaml#/definitions/package_name"
12 | authors:
13 | description: The set of authors of this package.
14 | type: array
15 | uniqueItems: true
16 | items:
17 | $ref: "common.yaml#/definitions/person"
18 | maintainers:
19 | description: The set of maintainers of this package.
20 | type: array
21 | uniqueItems: true
22 | items:
23 | $ref: "common.yaml#/definitions/person"
24 | version:
25 | description: The version number of this package.
26 | type: string
27 | minLength: 1
28 | path:
29 | description: The file system path pointing to the root of this package.
30 | type: string
31 | minLength: 1
32 | is_metapackage:
33 | description: Whether this is a metapackage.
34 | type: boolean
35 | dependencies:
36 | description: A set of dependencies on other packages.
37 | type: array
38 | uniqueItems: true
39 | items:
40 | $ref: "common.yaml#/definitions/package_name"
41 | project:
42 | description: The name of the project this package belongs to.
43 | type: string
44 | repository:
45 | description: The name of the repository this package belongs to.
46 | type: string
47 | files:
48 | description: A set of files that this package includes.
49 | type: array
50 | uniqueItems: true
51 | minItems: 1
52 | items:
53 | $ref: "common.yaml#/definitions/file_name"
54 | nodes:
55 | description: |
56 | A set of ROS nodes built from this package.
57 | The set contains only the executable name,
58 | since the package is always the same.
59 | E.g., the 'move_base' package builds the 'move_base' node.
60 | type: array
61 | uniqueItems: true
62 | items:
63 | type: string
64 | minLength: 1
65 | required:
66 | - name
67 | - version
68 | - path
69 | - is_metapackage
70 | - project
71 | - files
72 |
--------------------------------------------------------------------------------
/haros/models/template.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | #Copyright (c) 2018 Andre Santos
3 | #
4 | #Permission is hereby granted, free of charge, to any person obtaining a copy
5 | #of this software and associated documentation files (the "Software"), to deal
6 | #in the Software without restriction, including without limitation the rights
7 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | #copies of the Software, and to permit persons to whom the Software is
9 | #furnished to do so, subject to the following conditions:
10 |
11 | #The above copyright notice and this permission notice shall be included in
12 | #all copies or substantial portions of the Software.
13 |
14 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | #THE SOFTWARE.
21 | ---
22 | indigo:
23 | node_type:
24 | rosname: null
25 | nodelet: false
26 | advertise: []
27 | subscribe:
28 | -
29 | name: "topic_name"
30 | type: std_msgs/Int32
31 | namespace: ""
32 | queue: 1
33 | depth: 0
34 | location: null
35 | repeats: false
36 | conditions: []
37 | service: []
38 | client: []
39 | readParam:
40 | -
41 | name: "param_name"
42 | type: str
43 | default: "value"
44 | namespace: "~"
45 | depth: 0
46 | location: null
47 | repeats: false
48 | conditions: []
49 | writeParam: []
50 | kinetic:
51 | node_type:
52 | base: indigo
53 | readParam:
54 | -
55 | name: "another_param"
56 | type: bool
57 | default: true
58 | namespace: ""
59 | depth: 0
60 | location: null
61 | repeats: false
62 | conditions: []
63 | lunar:
64 | node_type:
65 | base: kinetic
66 | melodic:
67 | node_type:
68 | base: kinetic
69 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://zenodo.org/badge/latestdoi/27440980)
2 |
3 | 
4 |
5 | HAROS is a framework for quality assurance of ROS-based code, mostly based on **static analysis** - which consists on *extracting information* from the source code *without executing it* (and, sometimes, even without compiling it).
6 | Its main goal is the **early detection of problems** in the software development life cycle, which would otherwise go unnoticed into later stages or even into production.
7 |
8 | **Try it yourself:** there is a demo page of the HAROS visualizer available on [GitHub](https://git-afsantos.github.io/haros).
9 |
10 | **Tutorials:** [on GitHub](https://github.com/git-afsantos/haros_tutorials/) and [on YouTube](https://youtube.com/playlist?list=PLrXxXaugT0cwVhjhlnxY6DU0_WYPLEmgq).
11 |
12 | **More info:** short video presentation [on YouTube](https://www.youtube.com/watch?v=s_Zmch8xjzQ).
13 |
14 | ## Current Status
15 |
16 | This version of HAROS works only for ROS1. It is no longer being developed.
17 | A new version of this tool, aimed at ROS2, is being developed from the ground up in another repository.
18 |
19 | ## Installing
20 |
21 | See [INSTALL](./INSTALL.md) for installation methods and instructions.
22 |
23 | ## How to Use
24 |
25 | See [USAGE](./docs/USAGE.md) for basic commands and usage instructions.
26 |
27 | ## Bugs, Questions and Support
28 |
29 | Check whether your question has an answer in the [FAQ](./docs/FAQ.md).
30 |
31 | Please use the [issue tracker](https://github.com/git-afsantos/haros/issues) for issues or feature requests directly related to HAROS.
32 |
33 | For issues related to plugins, please use the respective plugin repository.
34 |
35 | If you run into errors, or feel that something is not working, run HAROS in debug mode, so the log files do not miss any information, e.g.,
36 |
37 | ```
38 | haros --debug analyse ...
39 | ```
40 |
41 | Then, you can share the log file, found by default within `~/.haros/log.txt`.
42 |
43 | ## Citing
44 |
45 | See [CITING](./CITING.md).
46 |
47 | ## Contributing
48 |
49 | See [CONTRIBUTING](./CONTRIBUTING.md).
50 |
51 | ## Acknowledgment
52 |
53 | Until March 2021, this work was financed by the ERDF – European Regional Development Fund through the Operational Programme for Competitiveness and Internationalisation - COMPETE 2020 Programme and by National Funds through the Portuguese funding agency, FCT - Fundação para a Ciência e a Tecnologia within project PTDC/CCI-INF/29583/2017 (POCI-01-0145-FEDER-029583).
54 |
--------------------------------------------------------------------------------
/docs/css/color.css:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright (c) 2016 Andre Santos
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in
12 | all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | THE SOFTWARE.
21 | */
22 |
23 | html, body {
24 | color: #333;
25 | background-color: whitesmoke;
26 | }
27 |
28 | .bg-light-grey {
29 | background-color: lightgray;
30 | }
31 |
32 | .bg-grey {
33 | background-color: grey;
34 | }
35 |
36 | .bg-blue {
37 | background-color: steelblue !important;
38 | }
39 |
40 | .bg-yellow {
41 | background-color: #f3af34 !important;
42 | }
43 |
44 | #app-header {
45 | background-color: #333;
46 | color: whitesmoke;
47 | }
48 |
49 | #dashboard .panel,
50 | #ros-board .panel {
51 | background-color: snow;
52 | border-color: #333;
53 | }
54 |
55 | #dashboard .panel .label {
56 | color: dimgray;
57 | }
58 |
59 | .progress-bar > .progress {
60 | background-color: #999;
61 | }
62 |
63 |
64 | .label .overlay {
65 | background-color: rgba(255, 215, 0, 0.25);
66 | }
67 |
68 | svg .bar {
69 | fill: steelblue;
70 | }
71 |
72 | .issue-level-0 {
73 | background-color: white;
74 | }
75 |
76 | .issue-level-1 {
77 | background-color: rgb(0,255,126);
78 | }
79 |
80 | .issue-level-2 {
81 | background-color: rgb(11,255,37);
82 | }
83 |
84 | .issue-level-3 {
85 | background-color: rgb(89,255,23);
86 | }
87 |
88 | .issue-level-4 {
89 | background-color: rgb(183,255,35);
90 | }
91 |
92 | .issue-level-5 {
93 | background-color: rgb(255,241,47);
94 | }
95 |
96 | .issue-level-6 {
97 | background-color: rgb(255,165,59);
98 | }
99 |
100 | .issue-level-7 {
101 | background-color: rgb(255,99,71);
102 | }
103 |
--------------------------------------------------------------------------------
/harosviz/css/color.css:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright (c) 2016 Andre Santos
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in
12 | all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | THE SOFTWARE.
21 | */
22 |
23 | html, body {
24 | color: #333;
25 | background-color: whitesmoke;
26 | }
27 |
28 | .bg-light-grey {
29 | background-color: lightgray;
30 | }
31 |
32 | .bg-grey {
33 | background-color: grey;
34 | }
35 |
36 | .bg-blue {
37 | background-color: steelblue !important;
38 | }
39 |
40 | .bg-yellow {
41 | background-color: #f3af34 !important;
42 | }
43 |
44 | #app-header {
45 | background-color: #333;
46 | color: whitesmoke;
47 | }
48 |
49 | #dashboard .panel,
50 | #ros-board .panel {
51 | background-color: snow;
52 | border-color: #333;
53 | }
54 |
55 | #dashboard .panel .label {
56 | color: dimgray;
57 | }
58 |
59 | .progress-bar > .progress {
60 | background-color: #999;
61 | }
62 |
63 |
64 | .label .overlay {
65 | background-color: rgba(255, 215, 0, 0.25);
66 | }
67 |
68 | svg .bar {
69 | fill: steelblue;
70 | }
71 |
72 | .issue-level-0 {
73 | background-color: white;
74 | }
75 |
76 | .issue-level-1 {
77 | background-color: rgb(0,255,126);
78 | }
79 |
80 | .issue-level-2 {
81 | background-color: rgb(11,255,37);
82 | }
83 |
84 | .issue-level-3 {
85 | background-color: rgb(89,255,23);
86 | }
87 |
88 | .issue-level-4 {
89 | background-color: rgb(183,255,35);
90 | }
91 |
92 | .issue-level-5 {
93 | background-color: rgb(255,241,47);
94 | }
95 |
96 | .issue-level-6 {
97 | background-color: rgb(255,165,59);
98 | }
99 |
100 | .issue-level-7 {
101 | background-color: rgb(255,99,71);
102 | }
103 |
--------------------------------------------------------------------------------
/haros/schema/node.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | ---
3 | $schema: "http://json-schema.org/draft-07/schema#"
4 | $id: "https://github.com/git-afsantos/haros/tree/master/haros/schema/node.yaml"
5 | title: Node
6 | description: A ROS Node specification.
7 | type: object
8 | properties:
9 | name:
10 | description: The name of the ROS node.
11 | type: string
12 | minLength: 1
13 | package:
14 | description: The name of the ROS package this node belongs to.
15 | $ref: "common.yaml#/definitions/package_name"
16 | files:
17 | description: A set of files that build this node.
18 | type: array
19 | uniqueItems: true
20 | minItems: 1
21 | items:
22 | $ref: "common.yaml#/definitions/file_name"
23 | source_tree:
24 | description: An Abstract Syntax Tree of the node.
25 | $ref: "common.yaml#/definitions/source_tree"
26 | is_nodelet:
27 | description: Whether this is a nodelet.
28 | type: boolean
29 | properties:
30 | description: A list of behavioural properties that this node satisfies.
31 | type: array
32 | items:
33 | type: string
34 | ros_name:
35 | description: The default ROS name of the node in runtime.
36 | $ref: "common.yaml#/definitions/ros_name"
37 | instances:
38 | description: The set of runtime instances of this node.
39 | type: array
40 | uniqueItems: true
41 | items:
42 | type: string
43 | advertise:
44 | description: A list of publishers created by this node.
45 | type: array
46 | items:
47 | $ref: "common.yaml#/definitions/advertise"
48 | subscribe:
49 | description: A list of subscribers created by this node.
50 | type: array
51 | items:
52 | $ref: "common.yaml#/definitions/subscribe"
53 | service_client:
54 | description: A list of service clients created by this node.
55 | type: array
56 | items:
57 | $ref: "common.yaml#/definitions/service_client"
58 | advertise_service:
59 | description: A list of service servers created by this node.
60 | type: array
61 | items:
62 | $ref: "common.yaml#/definitions/advertise_service"
63 | set_param:
64 | description: A list of parameter setters created by this node.
65 | type: array
66 | items:
67 | $ref: "common.yaml#/definitions/set_param"
68 | get_param:
69 | description: A list of parameter getters created by this node.
70 | type: array
71 | items:
72 | $ref: "common.yaml#/definitions/get_param"
73 | required:
74 | - name
75 | - package
76 | - files
77 |
--------------------------------------------------------------------------------
/haros/models/interactive_marker_twist_server.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | #Copyright (c) 2018 Andre Santos
3 | #
4 | #Permission is hereby granted, free of charge, to any person obtaining a copy
5 | #of this software and associated documentation files (the "Software"), to deal
6 | #in the Software without restriction, including without limitation the rights
7 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | #copies of the Software, and to permit persons to whom the Software is
9 | #furnished to do so, subject to the following conditions:
10 |
11 | #The above copyright notice and this permission notice shall be included in
12 | #all copies or substantial portions of the Software.
13 |
14 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | #THE SOFTWARE.
21 | ---
22 | indigo:
23 | marker_server:
24 | nodelet: false
25 | advertise:
26 | -
27 | name: "cmd_vel"
28 | type: geometry_msgs/Twist
29 | namespace: "~"
30 | queue: 1
31 | depth: 0
32 | location: null
33 | repeats: false
34 | conditions: []
35 | subscribe: []
36 | service: []
37 | client: []
38 | readParam:
39 | -
40 | name: "link_name"
41 | type: str
42 | default: "/base_link"
43 | namespace: "~"
44 | depth: 0
45 | location: null
46 | repeats: false
47 | conditions: []
48 | -
49 | name: "robot_name"
50 | type: str
51 | default: "robot"
52 | namespace: "~"
53 | depth: 0
54 | location: null
55 | repeats: false
56 | conditions: []
57 | -
58 | name: "marker_size_scale"
59 | type: double
60 | default: 1.0
61 | namespace: "~"
62 | depth: 0
63 | location: null
64 | repeats: false
65 | conditions: []
66 | writeParam: []
67 | kinetic:
68 | marker_server:
69 | base: indigo
70 | lunar:
71 | marker_server:
72 | base: indigo
73 | melodic:
74 | marker_server:
75 | base: indigo
76 |
--------------------------------------------------------------------------------
/docs/QUERIES.md:
--------------------------------------------------------------------------------
1 | User-defined Queries
2 | --------------------
3 |
4 | As of HAROS v3, you can now specify custom queries to run over the extracted data.
5 | Results of these queries will be reported visually in the visualiser graph, as well
6 | as textually, like regular plugin issues. The query engine and language is based on
7 | [pyflwor](https://github.com/timtadh/pyflwor), so be sure to check it out for a
8 | language reference.
9 |
10 | As to defining custom queries, this can also be done in project files,
11 | in the `rules` section.
12 |
13 | ```yaml
14 | %YAML 1.1
15 | ---
16 | packages:
17 | - my_package
18 | rules:
19 | type_check_topics:
20 | name: Message Types Must Match
21 | description: All nodes using a topic must communicate using the same message type.
22 | tags:
23 | - type-check
24 | - ros-comm
25 | - custom-filter-tag
26 | scope: configuration
27 | query: "for p in ,
28 | s in
29 | where p.topic_name == s.topic_name and p.type != s.type
30 | return p, s"
31 | ```
32 |
33 | To define a rule, you must provide a `name`, a `description`, and a list of `tags`.
34 | The `query` field is where you can define your query. The `scope` field is optional,
35 | and affects what is available to the query.
36 |
37 | To know more about the attributes of each type of entity, check out the
38 | [metamodel](haros/metamodel.py).
39 |
40 | ### Queries without `scope`
41 |
42 | These have top-level access to both source-code and runtime entities.
43 |
44 | - `files` - the set of source code files (`SourceFile`).
45 | - `packages` - the set of packages (`Package`).
46 | - `nodes` - the set of nodes built from source (`Node`).
47 | - `configs` - the set of extracted ROS applications (`Configuration`).
48 |
49 | ### Queries with `scope: package`
50 |
51 | These queries are repeated for each package, and they have access to the following variables.
52 |
53 | - `package` - the current `Package` being queried.
54 | - `files` - the source files belonging to the package (`SourceFile`).
55 | - `nodes` - the set of nodes built from the current package (`Node`).
56 |
57 | ### Queries with `scope: configuration`
58 |
59 | These queries are repeated for each extracted Configuration, and they have
60 | access to the following variables.
61 |
62 | - `config` - the current `Configuration` being queried.
63 | - `nodes` - the set of *runtime* nodes belonging to the configuration (`NodeInstance`).
64 | - `topics` - the set of topics belonging to the configuration (`Topic`).
65 | - `services` - the set of services belonging to the configuration (`Service`).
66 | - `parameters` - the set of parameters belonging to the configuration (`Parameter`).
67 |
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/compliance/source/agrob_red_map.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "comment":"Query found: RosPrimitiveCall(/rectangle_map, ~, geometry_msgs/PoseArray) Location2(package='agrob_red_map', file='src/agrob_red_map_node.cpp', line=126, column=26) (depth 0)\nReported in agrob_red_map/src/agrob_red_map_node.cpp:126:26, in function map_red",
4 | "resources":[],
5 | "location":{
6 | "function":"map_red",
7 | "package":"agrob_red_map",
8 | "column":26,
9 | "file":"src/agrob_red_map_node.cpp",
10 | "line":126,
11 | "class":null
12 | },
13 | "rule":"no_global_names"
14 | },
15 | {
16 | "comment":"Query found: RosPrimitiveCall(/astar_gps_goal, ~, geographic_msgs/GeoPoint) Location2(package='agrob_red_map', file='src/agrob_red_map_node.cpp', line=128, column=16) (depth 0)\nReported in agrob_red_map/src/agrob_red_map_node.cpp:128:16, in function map_red",
17 | "resources":[],
18 | "location":{
19 | "function":"map_red",
20 | "package":"agrob_red_map",
21 | "column":16,
22 | "file":"src/agrob_red_map_node.cpp",
23 | "line":128,
24 | "class":null
25 | },
26 | "rule":"no_global_names"
27 | },
28 | {
29 | "comment":"Query found: RosPrimitiveCall(/obstacle_map, ~, geometry_msgs/PointStamped) Location2(package='agrob_red_map', file='src/agrob_red_map_node.cpp', line=130, column=20) (depth 0)\nReported in agrob_red_map/src/agrob_red_map_node.cpp:130:20, in function map_red",
30 | "resources":[],
31 | "location":{
32 | "function":"map_red",
33 | "package":"agrob_red_map",
34 | "column":20,
35 | "file":"src/agrob_red_map_node.cpp",
36 | "line":130,
37 | "class":null
38 | },
39 | "rule":"no_global_names"
40 | },
41 | {
42 | "comment":"Query found: RosPrimitiveCall(/map, ~, nav_msgs/OccupancyGrid) Location2(package='agrob_red_map', file='src/agrob_red_map_node.cpp', line=122, column=15) (depth 0)\nReported in agrob_red_map/src/agrob_red_map_node.cpp:122:15, in function map_red",
43 | "resources":[],
44 | "location":{
45 | "function":"map_red",
46 | "package":"agrob_red_map",
47 | "column":15,
48 | "file":"src/agrob_red_map_node.cpp",
49 | "line":122,
50 | "class":null
51 | },
52 | "rule":"no_global_names"
53 | },
54 | {
55 | "comment":"Query found: RosPrimitiveCall(/plan_pub, ~, nav_msgs/Path) Location2(package='agrob_red_map', file='src/agrob_red_map_node.cpp', line=124, column=18) (depth 0)\nReported in agrob_red_map/src/agrob_red_map_node.cpp:124:18, in function map_red",
56 | "resources":[],
57 | "location":{
58 | "function":"map_red",
59 | "package":"agrob_red_map",
60 | "column":18,
61 | "file":"src/agrob_red_map_node.cpp",
62 | "line":124,
63 | "class":null
64 | },
65 | "rule":"no_global_names"
66 | }
67 | ]
--------------------------------------------------------------------------------
/haros/schema/node_instance.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | ---
3 | $schema: "http://json-schema.org/draft-07/schema#"
4 | $id: "https://github.com/git-afsantos/haros/tree/master/haros/schema/node_instance.yaml"
5 | title: Node Instance
6 | description: A ROS Node Instance specification.
7 | allOf:
8 | - $ref: "common.yaml#/definitions/ros_resource"
9 | - properties:
10 | node_type:
11 | description: The executable from which this node is spawned.
12 | $ref: "common.yaml#/definitions/ros_type"
13 | args:
14 | description: Provided command-line arguments.
15 | type: string
16 | remaps:
17 | description: Provided name remappings.
18 | type: object
19 | patternProperties:
20 | # global ROS name
21 | "^/[a-zA-Z][0-9a-zA-Z_]*(/[a-zA-Z][0-9a-zA-Z_]*)*$":
22 | $ref: "common.yaml#/definitions/global_ros_name"
23 | traceability:
24 | description: |
25 | Location where the `` tag begins in the
26 | respective launch file.
27 | If spawned via `rosrun`, set to `null`.
28 | oneOf:
29 | - $ref: "common.yaml#/definitions/source_location"
30 | - type: null
31 | conditions:
32 | description: Unresolved launch file conditions that affect this node.
33 | $ref: "common.yaml#/definitions/control_flow_graph"
34 | publishers:
35 | description: A list of publishers created by this node.
36 | type: array
37 | items:
38 | $ref: "common.yaml#/definitions/publisher_link"
39 | subscribers:
40 | description: A list of subscribers created by this node.
41 | type: array
42 | items:
43 | $ref: "common.yaml#/definitions/subscriber_link"
44 | clients:
45 | description: A list of service clients created by this node.
46 | type: array
47 | items:
48 | $ref: "common.yaml#/definitions/client_link"
49 | servers:
50 | description: A list of service servers created by this node.
51 | type: array
52 | items:
53 | $ref: "common.yaml#/definitions/server_link"
54 | setters:
55 | description: A list of parameter setters created by this node.
56 | type: array
57 | items:
58 | $ref: "common.yaml#/definitions/setter_link"
59 | getters:
60 | description: A list of parameter getters created by this node.
61 | type: array
62 | items:
63 | $ref: "common.yaml#/definitions/getter_link"
64 | required:
65 | - node_type
66 | - traceability
67 | - if: { properties: { traceability: { const: null }}}
68 | then: { properties: { conditions: { const: [] }}}
69 |
--------------------------------------------------------------------------------
/docs/data/Fictibot/summary.json:
--------------------------------------------------------------------------------
1 | {
2 | "source":{
3 | "packages":6,
4 | "files":38,
5 | "scripts":0,
6 | "languages":{
7 | "cpp":0.5735580038885288,
8 | "cppLOC":885,
9 | "python":0.0,
10 | "pythonLOC":0
11 | },
12 | "pkgDependencies":5
13 | },
14 | "issues":{
15 | "total":6,
16 | "coding":6,
17 | "metrics":0,
18 | "other":0,
19 | "ratio":"0.00"
20 | },
21 | "components":{
22 | "launchFiles":9,
23 | "nodes":4,
24 | "nodelets":0,
25 | "parameterFiles":null,
26 | "configurations":5
27 | },
28 | "communications":{
29 | "topics":null,
30 | "remappings":null,
31 | "messages":3,
32 | "services":0,
33 | "actions":0
34 | },
35 | "analysis":{
36 | "plugins":3,
37 | "rules":59,
38 | "userRules":0,
39 | "violatedRules":3
40 | },
41 | "history":{
42 | "timestamps":[
43 | "2021-09-24-09-44",
44 | "2021-09-24-10-01",
45 | "2021-09-24-10-27",
46 | "2021-09-24-10-36",
47 | "2021-09-24-11-06",
48 | "2021-09-24-11-07",
49 | "2021-09-24-11-16",
50 | "2021-09-24-11-24",
51 | "2021-09-24-14-19",
52 | "2021-09-24-14-22",
53 | "2021-09-24-14-22",
54 | "2021-09-24-14-24",
55 | "2021-09-24-14-26"
56 | ],
57 | "lines_of_code":[
58 | 1532,
59 | 1532,
60 | 1532,
61 | 1532,
62 | 1531,
63 | 1531,
64 | 1531,
65 | 1543,
66 | 1543,
67 | 1543,
68 | 1543,
69 | 1543,
70 | 1543
71 | ],
72 | "comments":[
73 | 38,
74 | 38,
75 | 0,
76 | 0,
77 | 0,
78 | 0,
79 | 0,
80 | 0,
81 | 38,
82 | 38,
83 | 38,
84 | 38,
85 | 0
86 | ],
87 | "issues":[
88 | 205,
89 | 213,
90 | 10,
91 | 9,
92 | 7,
93 | 7,
94 | 7,
95 | 5,
96 | 34,
97 | 34,
98 | 35,
99 | 35,
100 | 6
101 | ],
102 | "standards":[
103 | 199,
104 | 207,
105 | 9,
106 | 8,
107 | 6,
108 | 6,
109 | 6,
110 | 5,
111 | 31,
112 | 31,
113 | 32,
114 | 32,
115 | 6
116 | ],
117 | "metrics":[
118 | 8,
119 | 8,
120 | 2,
121 | 2,
122 | 2,
123 | 2,
124 | 2,
125 | 0,
126 | 3,
127 | 3,
128 | 3,
129 | 3,
130 | 0
131 | ],
132 | "complexity":[
133 | 2,
134 | 2,
135 | 2,
136 | 2,
137 | 2,
138 | 2,
139 | 2,
140 | 2,
141 | 2,
142 | 2,
143 | 2,
144 | 2,
145 | 2
146 | ],
147 | "function_length":[
148 | 13,
149 | 13,
150 | 13,
151 | 13,
152 | 13,
153 | 13,
154 | 13,
155 | 12,
156 | 12,
157 | 12,
158 | 12,
159 | 12,
160 | 12
161 | ]
162 | }
163 | }
--------------------------------------------------------------------------------
/haros/models/joy.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | #Copyright (c) 2018 Andre Santos
3 | #
4 | #Permission is hereby granted, free of charge, to any person obtaining a copy
5 | #of this software and associated documentation files (the "Software"), to deal
6 | #in the Software without restriction, including without limitation the rights
7 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | #copies of the Software, and to permit persons to whom the Software is
9 | #furnished to do so, subject to the following conditions:
10 |
11 | #The above copyright notice and this permission notice shall be included in
12 | #all copies or substantial portions of the Software.
13 |
14 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | #THE SOFTWARE.
21 | ---
22 | indigo:
23 | joy_node:
24 | nodelet: false
25 | advertise:
26 | -
27 | name: "joy"
28 | type: sensor_msgs/Joy
29 | namespace: ""
30 | queue: 1
31 | depth: 0
32 | location: null
33 | repeats: false
34 | conditions: []
35 | subscribe: []
36 | service: []
37 | client: []
38 | readParam:
39 | -
40 | name: "dev"
41 | type: str
42 | default: "/dev/input/js0"
43 | namespace: "~"
44 | depth: 0
45 | location: null
46 | repeats: false
47 | conditions: []
48 | -
49 | name: "deadzone"
50 | type: double
51 | default: 0.05
52 | namespace: "~"
53 | depth: 0
54 | location: null
55 | repeats: false
56 | conditions: []
57 | -
58 | name: "autorepeat_rate"
59 | type: double
60 | default: 0.0
61 | namespace: "~"
62 | depth: 0
63 | location: null
64 | repeats: false
65 | conditions: []
66 | -
67 | name: "coalesce_interval"
68 | type: double
69 | default: 0.001
70 | namespace: "~"
71 | depth: 0
72 | location: null
73 | repeats: false
74 | conditions: []
75 | writeParam: []
76 | kinetic:
77 | joy_node:
78 | base: indigo
79 | lunar:
80 | joy_node:
81 | base: indigo
82 | melodic:
83 | joy_node:
84 | base: indigo
85 |
--------------------------------------------------------------------------------
/docs/FAQ.md:
--------------------------------------------------------------------------------
1 | # Frequently Asked Questions
2 |
3 | ## Model Extraction
4 |
5 | Getting model extraction to work requires some setup.
6 | If you are running HAROS on a new machine, you may have to go through some errors before it starts running.
7 |
8 | ### KeyError: 'ROS_WORKSPACE'
9 |
10 | This error tells that you do not have a catkin workspace, and that the `ROS_WORKSPACE` environment variable is not set.
11 | This variable should be automatically set by the `setup.sh` script after you install ROS and create a workspace.
12 |
13 | http://wiki.ros.org/ROS/EnvironmentVariables#ROS_WORKSPACE
14 | http://wiki.ros.org/catkin/Tutorials/create_a_workspace
15 |
16 | If you type `echo $ROS_WORKSPACE` in the same terminal you ran HAROS, you should get back a path.
17 |
18 | ### HAROS cannot find the CMakeLists.txt file
19 |
20 | HAROS is a tool for analysis of source code, so you always have to have package source code available.
21 |
22 | Also, the code must compile with Clang on your system (you have to have all dependencies of your code installed, but those can be with `apt-get`).
23 |
24 | If you analyse code that is not your own, sometimes you may have to change compiler flags, or some specific small things in the CMake files.
25 | This is because most projects are developed with GCC instead of Clang, but it should not be difficult to compile with both.
26 |
27 | ### The Models Only Show Nodes
28 |
29 | Make sure you are using the `-n` option on the `analyse` or `full` commands.
30 |
31 | Generate a `compile_commands.json` within your *build* directory.
32 |
33 | You can do it either with `catkin` or with `cmake`. Run within your workspace directory:
34 |
35 | ```
36 | cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DCMAKE_CXX_COMPILER=/usr/bin/clang++-3.8 src
37 | ```
38 |
39 | or
40 |
41 | ```
42 | catkin_make -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DCMAKE_CXX_COMPILER=/usr/bin/clang++-3.8
43 | ```
44 |
45 | ### Other Tips
46 |
47 | Make sure ROS knows where the packages you want to analyse are.
48 |
49 | > Running `rospack find YOUR_PACKAGE` should point to the directory where the *source* of the package is.
50 |
51 | Make sure the clang and the python bindings versions match (tested with 3.8).
52 |
53 | > Running `pip show clang` should print the same version as your libclang installation.
54 | > If the above command does not work, run `python` and inside the interpreter run:
55 |
56 | ```
57 | import pkg_resources
58 | pkg_resources.get_distribution("clang").version
59 | ```
60 |
61 | Make sure HAROS knows where to look for the files. This is optional in most cases.
62 |
63 | In the `~/.haros/configs.yaml` file make sure that:
64 |
65 | - `workspace` is pointing to your workspace directory, e.g. `/home/me/catkin_ws`
66 | - `cpp:parser_lib` is pointing to the directory where you have `libclang.so` installed, e.g. `/usr/lib/llvm-3.8/lib`
67 | - `cpp:std_includes` is pointing to the includes provided by Clang. Should be a couple directories below the above, e.g. `/usr/lib/llvm-3.8/lib/clang/3.8.0/include`
68 | - `cpp:compile_db` is pointing to the directory where your `compile_commands.json` is, e.g. `/home/me/catkin_ws/build`
69 |
--------------------------------------------------------------------------------
/haros/util.py:
--------------------------------------------------------------------------------
1 |
2 | #Copyright (c) 2017 Andre Santos
3 | #
4 | #Permission is hereby granted, free of charge, to any person obtaining a copy
5 | #of this software and associated documentation files (the "Software"), to deal
6 | #in the Software without restriction, including without limitation the rights
7 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | #copies of the Software, and to permit persons to whom the Software is
9 | #furnished to do so, subject to the following conditions:
10 |
11 | #The above copyright notice and this permission notice shall be included in
12 | #all copies or substantial portions of the Software.
13 |
14 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | #THE SOFTWARE.
21 |
22 | ###############################################################################
23 | # Imports
24 | ###############################################################################
25 |
26 | from __future__ import unicode_literals
27 | from builtins import object
28 | import logging
29 | import os
30 |
31 |
32 | ###############################################################################
33 | # Utility
34 | ###############################################################################
35 |
36 | class LoggingObject(object):
37 | log = logging.getLogger(__name__)
38 |
39 |
40 | class cwd(object):
41 | """Run a block of code from a specified working directory"""
42 | def __init__(self, path):
43 | self.path = path
44 |
45 | def __enter__(self):
46 | self.old_path = os.getcwd()
47 | os.chdir(self.path)
48 |
49 | def __exit__(self, exc_type, exc_value, traceback):
50 | os.chdir(self.old_path)
51 |
52 |
53 | # Credits to:
54 | # http://stackoverflow.com/a/2022629
55 | class Event(list):
56 | """Event subscription.
57 |
58 | A list of callable objects. Calling an instance of this will cause a
59 | call to each item in the list in ascending order by index.
60 |
61 | Example Usage:
62 | >>> def f(x):
63 | ... print 'f(%s)' % x
64 | >>> def g(x):
65 | ... print 'g(%s)' % x
66 | >>> e = Event()
67 | >>> e()
68 | >>> e.append(f)
69 | >>> e(123)
70 | f(123)
71 | >>> e.remove(f)
72 | >>> e()
73 | >>> e += (f, g)
74 | >>> e(10)
75 | f(10)
76 | g(10)
77 | >>> del e[0]
78 | >>> e(2)
79 | g(2)
80 | """
81 | def sub(self, callable):
82 | self.append(callable)
83 |
84 | def unsub(self, callable):
85 | self.remove(callable)
86 |
87 | def __call__(self, *args, **kwargs):
88 | for f in self:
89 | f(*args, **kwargs)
90 |
91 | def __repr__(self):
92 | return "Event({})".format(list.__repr__(self))
93 |
--------------------------------------------------------------------------------
/docs/data/projects.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "id":"Fictibot",
4 | "packages":[
5 | "fictibot_msgs",
6 | "fictibot_drivers",
7 | "fictibot_random_controller",
8 | "fictibot_safety_controller",
9 | "fictibot_multiplex",
10 | "fictibot_launch"
11 | ],
12 | "repositories":[]
13 | },
14 | {
15 | "packages":[
16 | "fictibot_drivers",
17 | "minimal_example",
18 | "fictibot_controller",
19 | "fictibot_multiplex"
20 | ],
21 | "repositories":[],
22 | "id":"haros_tutorials"
23 | },
24 | {
25 | "packages":[
26 | "kobuki_bumper2pc",
27 | "kobuki_safety_controller",
28 | "yocs_cmd_vel_mux",
29 | "yocs_safety_controller",
30 | "yocs_velocity_smoother",
31 | "kobuki_keyop",
32 | "kobuki_random_walker",
33 | "kobuki_node",
34 | "kobuki_description",
35 | "xacro"
36 | ],
37 | "repositories":[],
38 | "id":"Kobuki Extraction Performance"
39 | },
40 | {
41 | "packages":[
42 | "kobuki_bumper2pc",
43 | "kobuki_safety_controller",
44 | "yocs_cmd_vel_mux",
45 | "yocs_safety_controller",
46 | "yocs_velocity_smoother",
47 | "kobuki_keyop",
48 | "kobuki_random_walker",
49 | "kobuki_node",
50 | "kobuki_description",
51 | "xacro"
52 | ],
53 | "repositories":[],
54 | "id":"Kobuki Architectural Analysis"
55 | },
56 | {
57 | "packages":[
58 | "kobuki_bumper2pc",
59 | "kobuki_safety_controller",
60 | "yocs_cmd_vel_mux",
61 | "yocs_safety_controller",
62 | "yocs_velocity_smoother",
63 | "kobuki_keyop",
64 | "kobuki_random_walker",
65 | "kobuki_node",
66 | "kobuki_description",
67 | "xacro"
68 | ],
69 | "repositories":[],
70 | "id":"Kobuki Code Quality Analysis"
71 | },
72 | {
73 | "packages":[
74 | "kobuki_bumper2pc",
75 | "kobuki_safety_controller",
76 | "yocs_cmd_vel_mux",
77 | "yocs_safety_controller",
78 | "yocs_velocity_smoother",
79 | "kobuki_keyop",
80 | "kobuki_random_walker",
81 | "kobuki_node",
82 | "turtlebot_bringup",
83 | "turtlebot_navigation",
84 | "openni2_launch",
85 | "openni_launch",
86 | "capabilities",
87 | "turtlebot_description",
88 | "rocon_app_manager",
89 | "kobuki_description",
90 | "xacro"
91 | ],
92 | "repositories":[],
93 | "id":"Turtlebot Extraction Performance"
94 | },
95 | {
96 | "packages":[
97 | "Agrob_path",
98 | "agrob_path_planning_stack",
99 | "agrob_red_map",
100 | "agrob_supervisor",
101 | "agrobv16_bringup",
102 | "agrobv16_map_server",
103 | "agrobv16_supervisor",
104 | "agrob_joy",
105 | "agrob_safety",
106 | "twist_mux",
107 | "husky_base",
108 | "husky_control",
109 | "husky_description",
110 | "xacro",
111 | "octo_to_pcl"
112 | ],
113 | "repositories":[],
114 | "id":"AgRob V16 Extraction Performance"
115 | }
116 | ]
--------------------------------------------------------------------------------
/haros/pyflwor_monkey_patch.py:
--------------------------------------------------------------------------------
1 |
2 | #Copyright (c) 2019 Andre Santos
3 | #
4 | #Permission is hereby granted, free of charge, to any person obtaining a copy
5 | #of this software and associated documentation files (the "Software"), to deal
6 | #in the Software without restriction, including without limitation the rights
7 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | #copies of the Software, and to permit persons to whom the Software is
9 | #furnished to do so, subject to the following conditions:
10 |
11 | #The above copyright notice and this permission notice shall be included in
12 | #all copies or substantial portions of the Software.
13 |
14 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | #THE SOFTWARE.
21 |
22 |
23 | ###############################################################################
24 | # Imports
25 | ###############################################################################
26 |
27 | from __future__ import unicode_literals
28 | from builtins import str, bytes
29 |
30 | import sys
31 |
32 | from pyflwor.parser import Parser
33 | from pyflwor.lexer import Lexer
34 | from ply import lex, yacc
35 |
36 |
37 | ###############################################################################
38 | # Monkey-patched Classes
39 | ###############################################################################
40 |
41 | class MonkeyPatchLexer(Lexer):
42 | def __new__(cls, pyflwor_dir, **kwargs):
43 | self = super(Lexer, cls).__new__(cls, **kwargs)
44 | self.lexer = lex.lex(object=self, debug=False, optimize=True,
45 | outputdir=pyflwor_dir, **kwargs)
46 | return self.lexer
47 |
48 |
49 | class MonkeyPatchParser(Parser):
50 | def __new__(cls, pyflwor_dir, **kwargs):
51 | self = super(Parser, cls).__new__(cls, **kwargs)
52 | self.names = dict()
53 | self.yacc = yacc.yacc(module=self, debug=False,
54 | optimize=True, write_tables=False,
55 | outputdir=pyflwor_dir, **kwargs)
56 | return self.yacc
57 |
58 |
59 | ###############################################################################
60 | # Entry Point
61 | ###############################################################################
62 |
63 | def make_parser(pyflwor_dir):
64 | if pyflwor_dir not in sys.path:
65 | sys.path.insert(0, pyflwor_dir)
66 | def execute(query, namespace):
67 | lexer = MonkeyPatchLexer(pyflwor_dir)
68 | parser = MonkeyPatchParser(pyflwor_dir)
69 | qbytes = bytes(query, "utf-8").decode("unicode_escape")
70 | qfunction = parser.parse(qbytes, lexer=lexer)
71 | return qfunction(namespace)
72 | return execute
73 |
--------------------------------------------------------------------------------
/haros/models/prosilica_camera.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | #Copyright (c) 2018 Andre Santos
3 | #
4 | #Permission is hereby granted, free of charge, to any person obtaining a copy
5 | #of this software and associated documentation files (the "Software"), to deal
6 | #in the Software without restriction, including without limitation the rights
7 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | #copies of the Software, and to permit persons to whom the Software is
9 | #furnished to do so, subject to the following conditions:
10 |
11 | #The above copyright notice and this permission notice shall be included in
12 | #all copies or substantial portions of the Software.
13 |
14 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | #THE SOFTWARE.
21 | ---
22 | indigo:
23 | prosilica_node:
24 | nodelet: false
25 | advertise:
26 | -
27 | name: "camera/image_raw"
28 | type: sensor_msgs/Image
29 | namespace: ""
30 | queue: 1
31 | depth: 0
32 | location: null
33 | repeats: false
34 | conditions: []
35 | -
36 | name: "camera/camera_info"
37 | type: sensor_msgs/CameraInfo
38 | namespace: ""
39 | queue: 1
40 | depth: 0
41 | location: null
42 | repeats: false
43 | conditions: []
44 | subscribe: []
45 | service:
46 | -
47 | name: "set_camera_info"
48 | type: sensor_msgs/SetCameraInfo
49 | namespace: ""
50 | depth: 0
51 | location: null
52 | repeats: false
53 | conditions: []
54 | -
55 | name: "request_image"
56 | type: polled_camera/GetPolledImage
57 | namespace: ""
58 | depth: 0
59 | location: null
60 | repeats: false
61 | conditions: []
62 | client: []
63 | readParam:
64 | -
65 | name: "ip_address"
66 | type: str
67 | namespace: "~"
68 | depth: 0
69 | location: null
70 | repeats: false
71 | conditions: []
72 | -
73 | name: "guid"
74 | type: str
75 | namespace: "~"
76 | depth: 0
77 | location: null
78 | repeats: false
79 | conditions: []
80 | writeParam: []
81 | kinetic:
82 | prosilica_node:
83 | base: indigo
84 | lunar:
85 | prosilica_node:
86 | base: indigo
87 | melodic:
88 | prosilica_node:
89 | base: indigo
90 |
--------------------------------------------------------------------------------
/haros/models/nodelet.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | #Copyright (c) 2018 Andre Santos
3 | #
4 | #Permission is hereby granted, free of charge, to any person obtaining a copy
5 | #of this software and associated documentation files (the "Software"), to deal
6 | #in the Software without restriction, including without limitation the rights
7 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | #copies of the Software, and to permit persons to whom the Software is
9 | #furnished to do so, subject to the following conditions:
10 |
11 | #The above copyright notice and this permission notice shall be included in
12 | #all copies or substantial portions of the Software.
13 |
14 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | #THE SOFTWARE.
21 | ---
22 | indigo:
23 | nodelet:
24 | rosname: manager
25 | nodelet: false
26 | advertise: []
27 | subscribe: []
28 | service:
29 | -
30 | name: load_nodelet
31 | type: nodelet/NodeletLoad
32 | namespace: "~"
33 | depth: 0
34 | location:
35 | package: nodelet
36 | file: src/loader.cpp
37 | line: 81
38 | column: 24
39 | repeats: false
40 | conditions: []
41 | -
42 | name: unload_nodelet
43 | type: nodelet/NodeletUnload
44 | namespace: "~"
45 | depth: 0
46 | location:
47 | package: nodelet
48 | file: src/loader.cpp
49 | line: 82
50 | column: 26
51 | repeats: false
52 | conditions: []
53 | -
54 | name: list
55 | type: nodelet/NodeletList
56 | namespace: "~"
57 | depth: 0
58 | location:
59 | package: nodelet
60 | file: src/loader.cpp
61 | line: 83
62 | column: 24
63 | repeats: false
64 | conditions: []
65 | client: []
66 | readParam:
67 | -
68 | name: num_worker_threads
69 | type: int
70 | default: 0
71 | namespace: "~"
72 | depth: 0
73 | location:
74 | package: nodelet
75 | file: src/loader.cpp
76 | line: 231
77 | column: 15
78 | repeats: false
79 | conditions: []
80 | writeParam: []
81 | kinetic:
82 | nodelet:
83 | base: indigo
84 | lunar:
85 | nodelet:
86 | base: indigo
87 | melodic:
88 | nodelet:
89 | base: indigo
90 |
--------------------------------------------------------------------------------
/haros/models/controller_manager.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | #Copyright (c) 2018 Andre Santos
3 | #
4 | #Permission is hereby granted, free of charge, to any person obtaining a copy
5 | #of this software and associated documentation files (the "Software"), to deal
6 | #in the Software without restriction, including without limitation the rights
7 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | #copies of the Software, and to permit persons to whom the Software is
9 | #furnished to do so, subject to the following conditions:
10 |
11 | #The above copyright notice and this permission notice shall be included in
12 | #all copies or substantial portions of the Software.
13 |
14 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | #THE SOFTWARE.
21 | ---
22 | # TODO: incomplete
23 | indigo:
24 | spawner:
25 | nodelet: false
26 | advertise: []
27 | subscribe:
28 | -
29 | name: "?"
30 | type: std_msgs/Bool
31 | namespace: ""
32 | queue: 1
33 | depth: 1
34 | location: null
35 | repeats: false
36 | conditions:
37 | - statement: if
38 | condition: "wait_for_topic"
39 | service: []
40 | client:
41 | -
42 | name: "controller_manager/load_controller"
43 | type: controller_manager_msgs/LoadController
44 | namespace: ""
45 | depth: 0
46 | location: null
47 | repeats: false
48 | conditions: []
49 | -
50 | name: "controller_manager/switch_controller"
51 | type: controller_manager_msgs/SwitchController
52 | namespace: ""
53 | depth: 0
54 | location: null
55 | repeats: false
56 | conditions: []
57 | -
58 | name: "controller_manager/unload_controller"
59 | type: controller_manager_msgs/UnloadController
60 | namespace: ""
61 | depth: 0
62 | location: null
63 | repeats: false
64 | conditions: []
65 | readParam: []
66 | writeParam:
67 | -
68 | name: "?"
69 | type: yaml
70 | default: {}
71 | namespace: ""
72 | depth: 2
73 | location: null
74 | repeats: true
75 | conditions:
76 | - statement: for
77 | condition: "name in args.controllers"
78 | - statement: if
79 | condition: "os.path.exists(name)"
80 | kinetic:
81 | spawner:
82 | base: indigo
83 | lunar:
84 | spawner:
85 | base: indigo
86 | melodic:
87 | spawner:
88 | base: indigo
89 |
--------------------------------------------------------------------------------
/haros/models/map_server.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | #Copyright (c) 2021 Andre Santos
3 | #
4 | #Permission is hereby granted, free of charge, to any person obtaining a copy
5 | #of this software and associated documentation files (the "Software"), to deal
6 | #in the Software without restriction, including without limitation the rights
7 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | #copies of the Software, and to permit persons to whom the Software is
9 | #furnished to do so, subject to the following conditions:
10 |
11 | #The above copyright notice and this permission notice shall be included in
12 | #all copies or substantial portions of the Software.
13 |
14 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | #THE SOFTWARE.
21 | ---
22 | indigo:
23 | map_server:
24 | nodelet: false
25 | advertise:
26 | -
27 | name: "map_metadata"
28 | type: nav_msgs/MapMetaData
29 | namespace: ""
30 | queue: 1
31 | depth: 0
32 | latched: true
33 | location:
34 | package: map_server
35 | file: src/main.cpp
36 | line: 196
37 | column: 26
38 | repeats: false
39 | conditions: []
40 | -
41 | name: "map"
42 | type: nav_msgs/OccupancyGrid
43 | namespace: ""
44 | queue: 1
45 | depth: 0
46 | latched: true
47 | location:
48 | package: map_server
49 | file: src/main.cpp
50 | line: 200
51 | column: 22
52 | repeats: false
53 | conditions: []
54 | subscribe: []
55 | service:
56 | -
57 | name: "static_map"
58 | type: nav_msgs/GetMap
59 | namespace: ""
60 | depth: 0
61 | location:
62 | package: map_server
63 | file: src/main.cpp
64 | line: 192
65 | column: 30
66 | repeats: false
67 | conditions: []
68 | client: []
69 | readParam:
70 | -
71 | name: "frame_id"
72 | type: str
73 | default: "map"
74 | namespace: "~"
75 | depth: 0
76 | location:
77 | package: map_server
78 | file: src/main.cpp
79 | line: 72
80 | column: 18
81 | repeats: false
82 | conditions: []
83 | writeParam: []
84 | kinetic:
85 | map_server:
86 | base: indigo
87 | lunar:
88 | map_server:
89 | base: indogo
90 | melodic:
91 | map_server:
92 | base: indigo
93 |
--------------------------------------------------------------------------------
/docs/data/AgRob V16 Extraction Performance/compliance/source/agrobv16_supervisor.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "comment":"Query found: RosPrimitiveCall(/agrobv16/max_velocity, /, std_msgs/Float32MultiArray) Location2(package='agrobv16_supervisor', file='src/twist_mux.cpp', line=65, column=14) (depth 0)\nReported in agrobv16_supervisor/src/twist_mux.cpp:65:14, in function TwistMux",
4 | "resources":[],
5 | "location":{
6 | "function":"TwistMux",
7 | "package":"agrobv16_supervisor",
8 | "column":14,
9 | "file":"src/twist_mux.cpp",
10 | "line":65,
11 | "class":null
12 | },
13 | "rule":"no_global_names"
14 | },
15 | {
16 | "comment":"Query found: RosPrimitiveCall(/agrobv16/max_velocity, /, std_msgs/Float32MultiArray) Location2(package='agrobv16_supervisor', file='src/agrobv16_supervisor_node.cpp', line=523, column=29) (depth 0)\nReported in agrobv16_supervisor/src/agrobv16_supervisor_node.cpp:523:29, in function main",
17 | "resources":[],
18 | "location":{
19 | "function":"main",
20 | "package":"agrobv16_supervisor",
21 | "column":29,
22 | "file":"src/agrobv16_supervisor_node.cpp",
23 | "line":523,
24 | "class":null
25 | },
26 | "rule":"no_global_names"
27 | },
28 | {
29 | "comment":"Query found: RosPrimitiveCall(/agrobv16/states, /, std_msgs/String) Location2(package='agrobv16_supervisor', file='src/agrobv16_supervisor_node.cpp', line=524, column=33) (depth 0)\nReported in agrobv16_supervisor/src/agrobv16_supervisor_node.cpp:524:33, in function main",
30 | "resources":[],
31 | "location":{
32 | "function":"main",
33 | "package":"agrobv16_supervisor",
34 | "column":33,
35 | "file":"src/agrobv16_supervisor_node.cpp",
36 | "line":524,
37 | "class":null
38 | },
39 | "rule":"no_global_names"
40 | },
41 | {
42 | "comment":"Query found: RosPrimitiveCall(/agrobv16/current_state, /, std_msgs/Int16MultiArray) Location2(package='agrobv16_supervisor', file='src/agrobv16_supervisor_node.cpp', line=525, column=36) (depth 0)\nReported in agrobv16_supervisor/src/agrobv16_supervisor_node.cpp:525:36, in function main",
43 | "resources":[],
44 | "location":{
45 | "function":"main",
46 | "package":"agrobv16_supervisor",
47 | "column":36,
48 | "file":"src/agrobv16_supervisor_node.cpp",
49 | "line":525,
50 | "class":null
51 | },
52 | "rule":"no_global_names"
53 | },
54 | {
55 | "comment":"Query found: RosPrimitiveCall(/joy_teleop/joy, /, sensor_msgs/Joy) Location2(package='agrobv16_supervisor', file='src/agrobv16_supervisor_node.cpp', line=500, column=30) (depth 0)\nReported in agrobv16_supervisor/src/agrobv16_supervisor_node.cpp:500:30, in function main",
56 | "resources":[],
57 | "location":{
58 | "function":"main",
59 | "package":"agrobv16_supervisor",
60 | "column":30,
61 | "file":"src/agrobv16_supervisor_node.cpp",
62 | "line":500,
63 | "class":null
64 | },
65 | "rule":"no_global_names"
66 | },
67 | {
68 | "comment":"Query found: RosPrimitiveCall(/husky_velocity_controller/odom, ~, nav_msgs/Odometry) Location2(package='agrobv16_supervisor', file='src/imu_attitude_to_tf_node.cpp', line=82, column=20) (depth 0)\nReported in agrobv16_supervisor/src/imu_attitude_to_tf_node.cpp:82:20, in function imu_to_tf",
69 | "resources":[],
70 | "location":{
71 | "function":"imu_to_tf",
72 | "package":"agrobv16_supervisor",
73 | "column":20,
74 | "file":"src/imu_attitude_to_tf_node.cpp",
75 | "line":82,
76 | "class":null
77 | },
78 | "rule":"no_global_names"
79 | }
80 | ]
--------------------------------------------------------------------------------
/docs/data/haros_tutorials/compliance/runtime/multiplex.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "comment":"Query found: NodeInstance multiplex:/fictibase",
4 | "resources":[
5 | {
6 | "resourceType":"node",
7 | "name":"/fictibase"
8 | }
9 | ],
10 | "location":{
11 | "configuration":"multiplex"
12 | },
13 | "rule":"user:match_multiple_times"
14 | },
15 | {
16 | "comment":"Query found: NodeInstance multiplex:/fictiplex",
17 | "resources":[
18 | {
19 | "resourceType":"node",
20 | "name":"/fictiplex"
21 | }
22 | ],
23 | "location":{
24 | "configuration":"multiplex"
25 | },
26 | "rule":"user:match_multiple_times"
27 | },
28 | {
29 | "comment":"Query found: NodeInstance multiplex:/ficticontrol",
30 | "resources":[
31 | {
32 | "resourceType":"node",
33 | "name":"/ficticontrol"
34 | }
35 | ],
36 | "location":{
37 | "configuration":"multiplex"
38 | },
39 | "rule":"user:match_multiple_times"
40 | },
41 | {
42 | "comment":"Query None found 1 matches:\n[Publication of node '/ficticontrol' to topic '/normal_priority_stop' of type 'std_msgs/Empty']",
43 | "resources":[],
44 | "location":{
45 | "configuration":"multiplex"
46 | },
47 | "rule":"haros_plugin_pyflwor:query"
48 | },
49 | {
50 | "comment":"Found [Subscription of node '/ficticontrol' to topic '/custom_noparam' of type 'fictibot_msgs/Custom'] under a conditional statement.",
51 | "resources":[],
52 | "location":{
53 | "configuration":"multiplex"
54 | },
55 | "rule":"haros_plugin_pyflwor:query"
56 | },
57 | {
58 | "comment":"Found [Subscription of node '/ficticontrol' to topic '/custom_w_param' of type 'fictibot_msgs/Custom'] under a conditional statement.",
59 | "resources":[],
60 | "location":{
61 | "configuration":"multiplex"
62 | },
63 | "rule":"haros_plugin_pyflwor:query"
64 | },
65 | {
66 | "comment":"Found 1 topics with infinite queues - [Publication of node '/ficticontrol' to topic '/normal_priority_stop' of type 'std_msgs/Empty']",
67 | "resources":[],
68 | "location":{
69 | "configuration":"multiplex"
70 | },
71 | "rule":"haros_plugin_pyflwor:query"
72 | },
73 | {
74 | "comment":"Found 1 topics with queues of size 1 - [Publication of node '/ficticontrol' to topic '/normal_priority_cmd' of type 'std_msgs/Float64']",
75 | "resources":[],
76 | "location":{
77 | "configuration":"multiplex"
78 | },
79 | "rule":"haros_plugin_pyflwor:query"
80 | },
81 | {
82 | "comment":"Found 1 topics of type std_msgs/Empty - [Topic('/stop_cmd', std_msgs/Empty)]",
83 | "resources":[
84 | {
85 | "resourceType":"topic",
86 | "name":"/stop_cmd"
87 | }
88 | ],
89 | "location":{
90 | "configuration":"multiplex"
91 | },
92 | "rule":"haros_plugin_pyflwor:query"
93 | },
94 | {
95 | "comment":"Found 1 topics of type std_msgs/Empty - [Topic('/high_priority_stop', std_msgs/Empty)]",
96 | "resources":[
97 | {
98 | "resourceType":"topic",
99 | "name":"/high_priority_stop"
100 | }
101 | ],
102 | "location":{
103 | "configuration":"multiplex"
104 | },
105 | "rule":"haros_plugin_pyflwor:query"
106 | },
107 | {
108 | "comment":"Found 1 topics of type std_msgs/Empty - [Topic('/normal_priority_stop', std_msgs/Empty)]",
109 | "resources":[
110 | {
111 | "resourceType":"topic",
112 | "name":"/normal_priority_stop"
113 | }
114 | ],
115 | "location":{
116 | "configuration":"multiplex"
117 | },
118 | "rule":"haros_plugin_pyflwor:query"
119 | },
120 | {
121 | "comment":"Found 1 topics of type std_msgs/Empty - [Topic('/low_priority_stop', std_msgs/Empty)]",
122 | "resources":[
123 | {
124 | "resourceType":"topic",
125 | "name":"/low_priority_stop"
126 | }
127 | ],
128 | "location":{
129 | "configuration":"multiplex"
130 | },
131 | "rule":"haros_plugin_pyflwor:query"
132 | }
133 | ]
--------------------------------------------------------------------------------
/haros/models/teleop_twist_joy.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | #Copyright (c) 2018 Andre Santos
3 | #
4 | #Permission is hereby granted, free of charge, to any person obtaining a copy
5 | #of this software and associated documentation files (the "Software"), to deal
6 | #in the Software without restriction, including without limitation the rights
7 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | #copies of the Software, and to permit persons to whom the Software is
9 | #furnished to do so, subject to the following conditions:
10 |
11 | #The above copyright notice and this permission notice shall be included in
12 | #all copies or substantial portions of the Software.
13 |
14 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | #THE SOFTWARE.
21 | ---
22 | indigo:
23 | teleop_node:
24 | nodelet: false
25 | advertise:
26 | -
27 | name: "cmd_vel"
28 | type: geometry_msgs/Twist
29 | namespace: ""
30 | queue: 1
31 | depth: 0
32 | location: null
33 | repeats: false
34 | conditions: []
35 | subscribe:
36 | -
37 | name: "joy"
38 | type: sensor_msgs/Joy
39 | namespace: ""
40 | queue: 1
41 | depth: 0
42 | location: null
43 | repeats: false
44 | conditions: []
45 | service: []
46 | client: []
47 | readParam:
48 | -
49 | name: "enable_button"
50 | type: int
51 | default: 0
52 | namespace: "~"
53 | depth: 0
54 | location: null
55 | repeats: false
56 | conditions: []
57 | -
58 | name: "enable_turbo_button"
59 | type: int
60 | default: -1
61 | namespace: "~"
62 | depth: 0
63 | location: null
64 | repeats: false
65 | conditions: []
66 | -
67 | name: "axis_linear"
68 | type: int
69 | default: 1
70 | namespace: "~"
71 | depth: 0
72 | location: null
73 | repeats: false
74 | conditions: []
75 | -
76 | name: "scale_linear"
77 | type: double
78 | default: 0.5
79 | namespace: "~"
80 | depth: 0
81 | location: null
82 | repeats: false
83 | conditions: []
84 | -
85 | name: "scale_linear_turbo"
86 | type: double
87 | default: 1.0
88 | namespace: "~"
89 | depth: 0
90 | location: null
91 | repeats: false
92 | conditions: []
93 | -
94 | name: "axis_angular"
95 | type: int
96 | default: 0
97 | namespace: "~"
98 | depth: 0
99 | location: null
100 | repeats: false
101 | conditions: []
102 | -
103 | name: "scale_angular"
104 | type: double
105 | default: 1.0
106 | namespace: "~"
107 | depth: 0
108 | location: null
109 | repeats: false
110 | conditions: []
111 | writeParam: []
112 | kinetic:
113 | teleop_node:
114 | base: indigo
115 | lunar:
116 | teleop_node:
117 | base: indogo
118 | melodic:
119 | teleop_node:
120 | base: indigo
121 |
--------------------------------------------------------------------------------
/haros/models/husky_base.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | #Copyright (c) 2018 Andre Santos
3 | #
4 | #Permission is hereby granted, free of charge, to any person obtaining a copy
5 | #of this software and associated documentation files (the "Software"), to deal
6 | #in the Software without restriction, including without limitation the rights
7 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | #copies of the Software, and to permit persons to whom the Software is
9 | #furnished to do so, subject to the following conditions:
10 |
11 | #The above copyright notice and this permission notice shall be included in
12 | #all copies or substantial portions of the Software.
13 |
14 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | #THE SOFTWARE.
21 | ---
22 | indigo:
23 | husky_node:
24 | nodelet: false
25 | advertise:
26 | -
27 | name: "husky_velocity_controller/odom"
28 | type: nav_msgs/Odometry
29 | namespace: ""
30 | queue: 1
31 | depth: 0
32 | location: null
33 | repeats: false
34 | conditions: []
35 | -
36 | name: "status"
37 | type: husky_msgs/HuskyStatus
38 | namespace: ""
39 | queue: 1
40 | depth: 0
41 | location: null
42 | repeats: false
43 | conditions: []
44 | subscribe:
45 | -
46 | name: "husky_velocity_controller/cmd_vel"
47 | type: geometry_msgs/Twist
48 | namespace: ""
49 | queue: 1
50 | depth: 0
51 | location: null
52 | repeats: false
53 | conditions: []
54 | service: []
55 | client: []
56 | readParam:
57 | -
58 | name: "control_frequency"
59 | type: double
60 | default: 10.0
61 | namespace: "~"
62 | depth: 0
63 | location: null
64 | repeats: false
65 | conditions: []
66 | -
67 | name: "diagnostic_frequency"
68 | type: double
69 | default: 1.0
70 | namespace: "~"
71 | depth: 0
72 | location: null
73 | repeats: false
74 | conditions: []
75 | -
76 | name: "wheel_diameter"
77 | type: double
78 | default: 0.3555
79 | namespace: "~"
80 | depth: 0
81 | location: null
82 | repeats: false
83 | conditions: []
84 | -
85 | name: "max_accel"
86 | type: double
87 | default: 3.0
88 | namespace: "~"
89 | depth: 0
90 | location: null
91 | repeats: false
92 | conditions: []
93 | -
94 | name: "max_speed"
95 | type: double
96 | default: 1.0
97 | namespace: "~"
98 | depth: 0
99 | location: null
100 | repeats: false
101 | conditions: []
102 | -
103 | name: "port"
104 | type: str
105 | default: "/dev/prolific"
106 | namespace: "~"
107 | depth: 0
108 | location: null
109 | repeats: false
110 | conditions: []
111 | writeParam: []
112 | kinetic:
113 | husky_node:
114 | base: indigo
115 | lunar:
116 | husky_node:
117 | base: indigo
118 | melodic:
119 | husky_node:
120 | base: indigo
121 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other method with the owners of this repository before making a change.
4 |
5 | Please note we have a code of conduct, please follow it in all your interactions with the project.
6 |
7 | ## Pull Request Process
8 |
9 | 1. Ensure any install or build dependencies are removed before the end of the layer when doing a build.
10 | 2. Update the README.md with details of changes to the interface, this includes new environment variables, exposed ports, useful file locations and container parameters.
11 | 3. Increase the version numbers in any examples files and the README.rst to the new version that this Pull Request would represent.
12 | The versioning scheme we use is [SemVer](http://semver.org/).
13 | 4. You may merge the Pull Request in once you have the sign-off of two other developers, or if you do not have permission to do that, you may request the second reviewer to merge it for you.
14 |
15 | ## Code of Conduct
16 |
17 | ### Our Pledge
18 |
19 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
20 |
21 | ### Our Standards
22 |
23 | Examples of behavior that contributes to creating a positive environment include:
24 |
25 | * Using welcoming and inclusive language
26 | * Being respectful of differing viewpoints and experiences
27 | * Gracefully accepting constructive criticism
28 | * Focusing on what is best for the community
29 | * Showing empathy towards other community members
30 |
31 | Examples of unacceptable behavior by participants include:
32 |
33 | * The use of sexualized language or imagery and unwelcome sexual attention or advances
34 | * Trolling, insulting/derogatory comments, and personal or political attacks
35 | * Public or private harassment
36 | * Publishing others' private information, such as a physical or electronic address, without explicit permission
37 | * Other conduct which could reasonably be considered inappropriate in a professional setting
38 |
39 | ### Our Responsibilities
40 |
41 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
42 |
43 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
44 |
45 | ### Scope
46 |
47 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
48 | Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
49 | Representation of a project may be further defined and clarified by project maintainers.
50 |
51 | ### Enforcement
52 |
53 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at *haros.framework@gmail.com*.
54 | All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances.
55 | The project team is obligated to maintain confidentiality with regard to the reporter of an incident.
56 | Further details of specific enforcement policies may be posted separately.
57 |
58 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
59 |
60 | ### Attribution
61 |
62 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
63 |
64 | [homepage]: http://contributor-covenant.org
65 | [version]: http://contributor-covenant.org/version/1/4/
66 |
--------------------------------------------------------------------------------
/docs/js/routes.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright (c) 2016 Andre Santos
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in
12 | all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | THE SOFTWARE.
21 | */
22 |
23 | (function () {
24 | "use strict";
25 | var App = window.App,
26 | Router = Backbone.Router.extend({
27 | routes: {
28 | "": "home",
29 | "dashboard": "dashboard",
30 | "help": "help",
31 | "packages": "packages",
32 | "issues": "issues", // #issues
33 | "issues/:type": "issues", // #issues/source
34 | "issues/:type/:item": "issues", // #issues/source/kobuki
35 | "issues/:type/:item/p:n": "issues", // #issues/source/kobuki/p2
36 | "models": "models", // #models
37 | "models/:config": "models" // #models/minimal
38 | },
39 |
40 | home: function() {
41 | App.router.navigate("dashboard", { trigger: true });
42 | },
43 |
44 | dashboard: function() {
45 | if (App.board != null) App.board.hide();
46 | App.navigation.goTo("dashboard");
47 | App.dashboard.show().build(App.project);
48 | App.board = App.dashboard;
49 | },
50 |
51 | help: function() {
52 | if (App.board != null) App.board.hide();
53 | App.navigation.goTo("help");
54 | App.helpBoard.show().build();
55 | App.board = App.helpBoard;
56 | },
57 |
58 | packages: function() {
59 | if (App.project == null)
60 | return App.router.navigate("dashboard", { trigger: true });
61 | if (App.board != null) App.board.hide();
62 | App.navigation.goTo("packages");
63 | App.packageBoard.show().build(App.project);
64 | App.board = App.packageBoard;
65 | },
66 |
67 | issues: function(type, item, n) {
68 | if (App.project == null)
69 | return App.router.navigate("dashboard", { trigger: true });
70 | if (App.board != null) App.board.hide();
71 | if (type == null) {
72 | type = "source";
73 | App.router.navigate("issues/source", {
74 | trigger: false, replace: true
75 | });
76 | } else if (type === "other") {
77 | item = null;
78 | n = null;
79 | App.router.navigate("issues/other", {
80 | trigger: false, replace: true
81 | });
82 | }
83 | App.navigation.goTo("issues");
84 | App.issueBoard.show().build(App.project, type, item, n);
85 | App.board = App.issueBoard;
86 | },
87 |
88 | models: function(config) {
89 | if (App.project == null)
90 | return App.router.navigate("dashboard", { trigger: true });
91 | if (App.board != null) App.board.hide();
92 | App.navigation.goTo("ros");
93 | App.rosBoard.show().build(App.project, config);
94 | App.board = App.rosBoard;
95 | }
96 | });
97 | App.router = new Router();
98 | })();
--------------------------------------------------------------------------------
/harosviz/js/routes.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright (c) 2016 Andre Santos
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in
12 | all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | THE SOFTWARE.
21 | */
22 |
23 | (function () {
24 | "use strict";
25 | var App = window.App,
26 | Router = Backbone.Router.extend({
27 | routes: {
28 | "": "home",
29 | "dashboard": "dashboard",
30 | "help": "help",
31 | "packages": "packages",
32 | "issues": "issues", // #issues
33 | "issues/:type": "issues", // #issues/source
34 | "issues/:type/:item": "issues", // #issues/source/kobuki
35 | "issues/:type/:item/p:n": "issues", // #issues/source/kobuki/p2
36 | "models": "models", // #models
37 | "models/:config": "models" // #models/minimal
38 | },
39 |
40 | home: function() {
41 | App.router.navigate("dashboard", { trigger: true });
42 | },
43 |
44 | dashboard: function() {
45 | if (App.board != null) App.board.hide();
46 | App.navigation.goTo("dashboard");
47 | App.dashboard.show().build(App.project);
48 | App.board = App.dashboard;
49 | },
50 |
51 | help: function() {
52 | if (App.board != null) App.board.hide();
53 | App.navigation.goTo("help");
54 | App.helpBoard.show().build();
55 | App.board = App.helpBoard;
56 | },
57 |
58 | packages: function() {
59 | if (App.project == null)
60 | return App.router.navigate("dashboard", { trigger: true });
61 | if (App.board != null) App.board.hide();
62 | App.navigation.goTo("packages");
63 | App.packageBoard.show().build(App.project);
64 | App.board = App.packageBoard;
65 | },
66 |
67 | issues: function(type, item, n) {
68 | if (App.project == null)
69 | return App.router.navigate("dashboard", { trigger: true });
70 | if (App.board != null) App.board.hide();
71 | if (type == null) {
72 | type = "source";
73 | App.router.navigate("issues/source", {
74 | trigger: false, replace: true
75 | });
76 | } else if (type === "other") {
77 | item = null;
78 | n = null;
79 | App.router.navigate("issues/other", {
80 | trigger: false, replace: true
81 | });
82 | }
83 | App.navigation.goTo("issues");
84 | App.issueBoard.show().build(App.project, type, item, n);
85 | App.board = App.issueBoard;
86 | },
87 |
88 | models: function(config) {
89 | if (App.project == null)
90 | return App.router.navigate("dashboard", { trigger: true });
91 | if (App.board != null) App.board.hide();
92 | App.navigation.goTo("ros");
93 | App.rosBoard.show().build(App.project, config);
94 | App.board = App.rosBoard;
95 | }
96 | });
97 | App.router = new Router();
98 | })();
--------------------------------------------------------------------------------
/docs/data/Fictibot/packages.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "id":"fictibot_msgs",
4 | "metapackage":false,
5 | "version":"1.0.0",
6 | "description":"The fictibot_msgs package",
7 | "wiki":null,
8 | "repository":null,
9 | "bugTracker":null,
10 | "authors":[
11 | "Andre Santos"
12 | ],
13 | "maintainers":[
14 | "Andre Santos"
15 | ],
16 | "dependencies":[
17 | "std_msgs",
18 | "message_runtime",
19 | "message_generation",
20 | "rospy",
21 | "roscpp"
22 | ],
23 | "size":"1.78",
24 | "lines":83,
25 | "sloc":68,
26 | "analysis":{
27 | "violations":{},
28 | "metrics":{}
29 | }
30 | },
31 | {
32 | "id":"fictibot_drivers",
33 | "metapackage":false,
34 | "version":"1.0.0",
35 | "description":"The fictibot_drivers package",
36 | "wiki":null,
37 | "repository":null,
38 | "bugTracker":null,
39 | "authors":[
40 | "Andre Santos"
41 | ],
42 | "maintainers":[
43 | "Andre Santos"
44 | ],
45 | "dependencies":[
46 | "roscpp",
47 | "fictibot_msgs",
48 | "std_msgs",
49 | "rospy"
50 | ],
51 | "size":"10.79",
52 | "lines":452,
53 | "sloc":370,
54 | "analysis":{
55 | "violations":{
56 | "haros_plugin_cppcheck:redundantAssignment":1,
57 | "haros_plugin_cppcheck:harosIntegerTypes":1
58 | },
59 | "metrics":{}
60 | }
61 | },
62 | {
63 | "id":"fictibot_random_controller",
64 | "metapackage":false,
65 | "version":"1.0.0",
66 | "description":"The fictibot_random_controller package",
67 | "wiki":null,
68 | "repository":null,
69 | "bugTracker":null,
70 | "authors":[
71 | "Andre Santos"
72 | ],
73 | "maintainers":[
74 | "Andre Santos"
75 | ],
76 | "dependencies":[
77 | "roscpp",
78 | "fictibot_msgs",
79 | "std_msgs",
80 | "rospy"
81 | ],
82 | "size":"7.31",
83 | "lines":312,
84 | "sloc":255,
85 | "analysis":{
86 | "violations":{
87 | "no_global_names":1,
88 | "haros_plugin_cppcheck:harosIntegerTypes":1
89 | },
90 | "metrics":{}
91 | }
92 | },
93 | {
94 | "id":"fictibot_safety_controller",
95 | "metapackage":false,
96 | "version":"1.0.0",
97 | "description":"The fictibot_safety_controller package",
98 | "wiki":null,
99 | "repository":null,
100 | "bugTracker":null,
101 | "authors":[
102 | "Andre Santos"
103 | ],
104 | "maintainers":[
105 | "Andre Santos"
106 | ],
107 | "dependencies":[
108 | "roscpp",
109 | "fictibot_msgs",
110 | "std_msgs",
111 | "rospy"
112 | ],
113 | "size":"6.31",
114 | "lines":262,
115 | "sloc":201,
116 | "analysis":{
117 | "violations":{
118 | "haros_plugin_cppcheck:harosIntegerTypes":1
119 | },
120 | "metrics":{}
121 | }
122 | },
123 | {
124 | "id":"fictibot_multiplex",
125 | "metapackage":false,
126 | "version":"1.0.0",
127 | "description":"The fictibot_multiplex package",
128 | "wiki":null,
129 | "repository":null,
130 | "bugTracker":null,
131 | "authors":[
132 | "Andre Santos"
133 | ],
134 | "maintainers":[
135 | "Andre Santos"
136 | ],
137 | "dependencies":[
138 | "fictibot_drivers",
139 | "std_msgs",
140 | "rospy",
141 | "roscpp",
142 | "fictibot_msgs"
143 | ],
144 | "size":"8.37",
145 | "lines":298,
146 | "sloc":240,
147 | "analysis":{
148 | "violations":{
149 | "haros_plugin_cppcheck:harosIntegerTypes":1
150 | },
151 | "metrics":{}
152 | }
153 | },
154 | {
155 | "id":"fictibot_launch",
156 | "metapackage":false,
157 | "version":"0.3.0",
158 | "description":"The fictibot_launch package",
159 | "wiki":null,
160 | "repository":null,
161 | "bugTracker":null,
162 | "authors":[
163 | "Andre Santos"
164 | ],
165 | "maintainers":[
166 | "Andre Santos"
167 | ],
168 | "dependencies":[
169 | "fictibot_multiplex",
170 | "fictibot_safety_controller",
171 | "fictibot_drivers",
172 | "std_msgs",
173 | "fictibot_random_controller",
174 | "roscpp",
175 | "fictibot_msgs"
176 | ],
177 | "size":"4.39",
178 | "lines":136,
179 | "sloc":111,
180 | "analysis":{
181 | "violations":{},
182 | "metrics":{}
183 | }
184 | }
185 | ]
--------------------------------------------------------------------------------
/CITING.md:
--------------------------------------------------------------------------------
1 | # Citing HAROS
2 |
3 | ## The Framework
4 |
5 | Please cite the original [IROS 2016 paper](https://repositorium.sdum.uminho.pt/bitstream/1822/51442/1/P-00M-8D0.pdf),
6 |
7 | > Santos A, Cunha A, Macedo N, Lourenço C. *A framework for quality assessment of ROS repositories.* In 2016 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS) 2016 Oct 9 (pp. 4491-4496). IEEE.
8 |
9 | Or the more recent [RoSE 2021 tool paper](https://arxiv.org/pdf/2103.01603.pdf).
10 |
11 | > Santos A, Cunha A, Macedo N. *The high-assurance ROS framework.* In 3rd IEEE/ACM International Workshop on Robotics Software Engineering, RoSE@ICSE 2021 June 2 (pp. 37-40). IEEE.
12 |
13 | Here follow the BibTeX entries:
14 |
15 | ```bibtex
16 | @inproceedings{SantosCML:16,
17 | author = {Andr{\'{e}} Santos and Alcino Cunha and Nuno Macedo and Cl{\'{a}}udio Louren{\c{c}}o},
18 | title = {A Framework for Quality Assessment of {ROS} Repositories},
19 | booktitle = {{IEEE/RSJ} International Conference on Intelligent Robots and Systems ({IROS})},
20 | pages = {4491--4496},
21 | year = {2016},
22 | doi = {10.1109/IROS.2016.7759661},
23 | }
24 |
25 | @inproceedings{SantosCM:21,
26 | author = {Andr{\'{e}} Santos and Alcino Cunha and Nuno Macedo},
27 | title = {The High-Assurance {ROS} Framework},
28 | booktitle = {{IEEE/ACM} International Workshop on Robotics Software Engineering, {RoSE@ICSE}},
29 | pages = {37--40},
30 | publisher = {{IEEE}},
31 | year = {2021},
32 | doi = {10.1109/RoSE52553.2021.00013},
33 | }
34 | ```
35 |
36 | ## ROS Computation Graph Extraction
37 |
38 | Please cite the IRC 2019 paper:
39 |
40 | > Santos A, Cunha A, Macedo N. *Static-time extraction and analysis of the ROS computation graph.* In 2019 Third IEEE International Conference on Robotic Computing (IRC) 2019 Feb 25 (pp. 62-69). IEEE.
41 |
42 | You can find the paper [here](https://repositorium.sdum.uminho.pt/bitstream/1822/68522/1/irc19.pdf).
43 |
44 | Here follows a BibTeX entry:
45 |
46 | ```bibtex
47 | @inproceedings{SantosCM:19,
48 | author = {Andr{\'{e}} Santos and Alcino Cunha and Nuno Macedo},
49 | title = {Static-Time Extraction and Analysis of the {ROS} Computation Graph},
50 | booktitle = {{IEEE} International Conference on Robotic Computing ({IRC})},
51 | pages = {62--69},
52 | year = {2019},
53 | doi = {10.1109/IRC.2019.00018},
54 | }
55 | ```
56 |
57 | ## Applications of HAROS
58 |
59 | [IROS 2017 paper](https://repositorium.sdum.uminho.pt/bitstream/1822/52261/1/P-00N-9XE.pdf)
60 |
61 | > Santos A, Cunha A, Macedo N, Arrais R, Dos Santos FN. *Mining the usage patterns of ROS primitives.* In 2017 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS) 2017 Sep 24 (pp. 3855-3860). IEEE.
62 |
63 | ```bibtex
64 | @inproceedings{SantosCMAS:17,
65 | author = {Andr{\'{e}} Santos and Alcino Cunha and Nuno Macedo and Rafael Arrais and Filipe Neves dos Santos},
66 | title = {Mining the Usage Patterns of {ROS} Primitives},
67 | booktitle = {{IEEE/RSJ} International Conference on Intelligent Robots and Systems ({IROS})},
68 | pages = {3855--3860},
69 | year = {2017},
70 | doi = {10.1109/IROS.2017.8206237},
71 | }
72 | ```
73 |
74 | [ROBOT 2019 paper](https://repositorio.inesctec.pt/bitstream/123456789/11261/1/P-00R-DRP.pdf)
75 |
76 | > Neto T, Arrais R, Sousa A, Santos A, Veiga G. *Applying Software Static Analysis to ROS: The Case Study of the FASTEN European Project.* In Iberian Robotics conference 2019 Nov 20 (pp. 632-644). Springer, Cham.
77 |
78 | ```bibtex
79 | @inproceedings{NetoASSV:19,
80 | author = {Tiago Neto and Rafael Arrais and Armando Sousa and Andr{\'{e}} Santos and Germano Veiga},
81 | title = {Applying Software Static Analysis to {ROS:} The Case Study of the {FASTEN} European Project},
82 | booktitle = {Iberian Robotics Conference - Advances in Robotics ({ROBOT})},
83 | series = {Advances in Intelligent Systems and Computing},
84 | volume = {1092},
85 | pages = {632--644},
86 | publisher = {Springer},
87 | year = {2019},
88 | doi = {10.1007/978-3-030-35990-4\_51},
89 | }
90 | ```
91 |
92 | [MODELS 2019 paper](https://repositorio.inesctec.pt/bitstream/123456789/11437/1/P-00R-F97.pdf)
93 |
94 | > Garcia NH, Deval L, Lüdtke M, Santos A, Kahl B, Bordignon M. *Bootstrapping MDE Development from ROS Manual Code-Part 2: Model Generation.* In 2019 ACM/IEEE 22nd International Conference on Model Driven Engineering Languages and Systems (MODELS) 2019 Sep 15 (pp. 95-105). IEEE.
95 |
96 | ```bibtex
97 | @inproceedings{GarciaDLSKB:19,
98 | author = {Nadia Hammoudeh Garcia and Ludovic Delval and Mathias L{\"{u}}dtke and Andr{\'{e}} Santos and Bj{\"{o}}rn Kahl and Mirko Bordignon},
99 | title = {Bootstrapping {MDE} Development from {ROS} Manual Code - Part 2: Model Generation},
100 | booktitle = {{ACM/IEEE} International Conference on Model Driven Engineering Languages and Systems ({MODELS})},
101 | pages = {95--105},
102 | publisher = {{IEEE}},
103 | year = {2019},
104 | doi = {10.1109/MODELS.2019.00-11},
105 | }
106 | ```
107 |
--------------------------------------------------------------------------------
/docs/css/type.css:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright (c) 2016 Andre Santos
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in
12 | all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | THE SOFTWARE.
21 | */
22 |
23 | body {
24 | font-size: 100%;
25 | font-family: "lucida sans unicode","lucida grande",sans-serif;
26 | }
27 |
28 | body, caption, th, td, input, textarea, select, option, legend, fieldset, h1, h2, h3, h4, h5, h6 {
29 | font-size-adjust: 0.5;
30 | }
31 |
32 | .text-left {
33 | text-align: left;
34 | }
35 |
36 | .text-center {
37 | text-align: center;
38 | }
39 |
40 | .text-right {
41 | text-align: right;
42 | }
43 |
44 | .bold {
45 | font-weight: bold;
46 | }
47 |
48 | #app {
49 | font-size: 1em;
50 | /* equivalent to 16px */
51 | line-height: 1.25;
52 | /* equivalent to 20px */
53 | }
54 |
55 | .fa {
56 | line-height: 1.25;
57 | }
58 |
59 | @media (min-width: 48em) {
60 | #app {
61 | font-size: 1em;
62 | /* equivalent to 16px */
63 | line-height: 1.375;
64 | /* equivalent to 22px */
65 | }
66 |
67 | .fa {
68 | line-height: 1.375;
69 | }
70 | }
71 |
72 | h1 {
73 | font-size: 2em;
74 | /* 2x body copy size = 32px */
75 | line-height: 1.25;
76 | /* 45px / 36px */
77 | margin: 0.25em 0;
78 | }
79 |
80 | @media (min-width: 48em) {
81 | h1 {
82 | font-size: 2.5em;
83 | /* 2.5x body copy size = 40px */
84 | line-height: 1.125;
85 | }
86 | }
87 |
88 | @media (min-width: 64em) {
89 | h1 {
90 | font-size: 3em;
91 | /* 3x body copy size = 48px */
92 | line-height: 1.05;
93 | /* keep to a multiple of the 20px line height and something more appropriate for display headings */
94 | }
95 | }
96 |
97 | h2 {
98 | font-size: 1.625em;
99 | /* 1.625x body copy size = 26px */
100 | line-height: 1.15384615;
101 | /* 30px / 26px */
102 | margin: 0.25em 0;
103 | }
104 |
105 | @media (min-width: 48em) {
106 | h2 {
107 | font-size: 2em;
108 | /* 2x body copy size = 32px */
109 | line-height: 1.25;
110 | }
111 | }
112 |
113 | @media (min-width: 64em) {
114 | h2 {
115 | font-size: 2.25em;
116 | /* 2.25x body copy size = 36px */
117 | line-height: 1.25;
118 | }
119 | }
120 |
121 | h3 {
122 | font-size: 1.375em;
123 | /* 1.375x body copy size = 22px */
124 | line-height: 1.13636364;
125 | /* 25px / 22px */
126 | margin: 0.25em 0;
127 | }
128 |
129 | @media (min-width: 48em) {
130 | h3 {
131 | font-size: 1.5em;
132 | /* 1.5x body copy size = 24px */
133 | line-height: 1.25;
134 | }
135 | }
136 |
137 | @media (min-width: 64em) {
138 | h3 {
139 | font-size: 1.75em;
140 | /* 1.75x body copy size = 28px */
141 | line-height: 1.25;
142 | }
143 | }
144 |
145 | h4 {
146 | font-size: 1.125em;
147 | /* 1.125x body copy size = 18px */
148 | line-height: 1.11111111;
149 | margin: 0.25em 0;
150 | }
151 |
152 | @media (min-width: 48em) {
153 | h4 {
154 | line-height: 1.22222222;
155 | /* (22px / 18px */
156 | }
157 | }
158 |
159 | blockquote {
160 | font-size: 1.25em;
161 | /* 20px / 16px */
162 | line-height: 1.25;
163 | /* 25px / 20px */
164 | }
165 |
166 | @media (min-width: 48em) {
167 | blockquote {
168 | font-size: 1.5em;
169 | /* 24px / 16px = */
170 | line-height: 1.45833333;
171 | /* 35px / 24px */
172 | }
173 | }
174 |
175 | p {
176 | margin: 0.5em 0;
177 | }
178 |
179 |
180 | .panel .title {
181 | margin: 0;
182 | }
183 |
184 | .panel .label {
185 | font-style: italic;
186 | }
187 |
188 | .panel .badge-empty {
189 | font-weight: bold;
190 | }
191 |
192 | .panel > .featured {
193 | font-size: 2em;
194 | line-height: 1.25;
195 | font-weight: 700;
196 | margin: 0.375em 0;
197 | }
198 |
199 | @media (min-width: 48em) {
200 | .panel > .featured {
201 | line-height: 1.375;
202 | }
203 | }
204 |
205 | .panel .item {
206 | font-size: 1em;
207 | margin: 0.5em 0;
208 | }
209 |
210 | .panel a,
211 | .panel a:hover,
212 | .panel a:active,
213 | .panel a:visited {
214 | color: inherit;
215 | text-decoration: none;
216 | cursor: pointer;
217 | }
218 |
219 | #ros-board .panel > .node {
220 | word-wrap: break-word;
221 | }
222 |
223 | #ros-board .panel .node p {
224 | font-family: monospace;
225 | }
226 |
--------------------------------------------------------------------------------
/harosviz/css/type.css:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright (c) 2016 Andre Santos
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in
12 | all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | THE SOFTWARE.
21 | */
22 |
23 | body {
24 | font-size: 100%;
25 | font-family: "lucida sans unicode","lucida grande",sans-serif;
26 | }
27 |
28 | body, caption, th, td, input, textarea, select, option, legend, fieldset, h1, h2, h3, h4, h5, h6 {
29 | font-size-adjust: 0.5;
30 | }
31 |
32 | .text-left {
33 | text-align: left;
34 | }
35 |
36 | .text-center {
37 | text-align: center;
38 | }
39 |
40 | .text-right {
41 | text-align: right;
42 | }
43 |
44 | .bold {
45 | font-weight: bold;
46 | }
47 |
48 | #app {
49 | font-size: 1em;
50 | /* equivalent to 16px */
51 | line-height: 1.25;
52 | /* equivalent to 20px */
53 | }
54 |
55 | .fa {
56 | line-height: 1.25;
57 | }
58 |
59 | @media (min-width: 48em) {
60 | #app {
61 | font-size: 1em;
62 | /* equivalent to 16px */
63 | line-height: 1.375;
64 | /* equivalent to 22px */
65 | }
66 |
67 | .fa {
68 | line-height: 1.375;
69 | }
70 | }
71 |
72 | h1 {
73 | font-size: 2em;
74 | /* 2x body copy size = 32px */
75 | line-height: 1.25;
76 | /* 45px / 36px */
77 | margin: 0.25em 0;
78 | }
79 |
80 | @media (min-width: 48em) {
81 | h1 {
82 | font-size: 2.5em;
83 | /* 2.5x body copy size = 40px */
84 | line-height: 1.125;
85 | }
86 | }
87 |
88 | @media (min-width: 64em) {
89 | h1 {
90 | font-size: 3em;
91 | /* 3x body copy size = 48px */
92 | line-height: 1.05;
93 | /* keep to a multiple of the 20px line height and something more appropriate for display headings */
94 | }
95 | }
96 |
97 | h2 {
98 | font-size: 1.625em;
99 | /* 1.625x body copy size = 26px */
100 | line-height: 1.15384615;
101 | /* 30px / 26px */
102 | margin: 0.25em 0;
103 | }
104 |
105 | @media (min-width: 48em) {
106 | h2 {
107 | font-size: 2em;
108 | /* 2x body copy size = 32px */
109 | line-height: 1.25;
110 | }
111 | }
112 |
113 | @media (min-width: 64em) {
114 | h2 {
115 | font-size: 2.25em;
116 | /* 2.25x body copy size = 36px */
117 | line-height: 1.25;
118 | }
119 | }
120 |
121 | h3 {
122 | font-size: 1.375em;
123 | /* 1.375x body copy size = 22px */
124 | line-height: 1.13636364;
125 | /* 25px / 22px */
126 | margin: 0.25em 0;
127 | }
128 |
129 | @media (min-width: 48em) {
130 | h3 {
131 | font-size: 1.5em;
132 | /* 1.5x body copy size = 24px */
133 | line-height: 1.25;
134 | }
135 | }
136 |
137 | @media (min-width: 64em) {
138 | h3 {
139 | font-size: 1.75em;
140 | /* 1.75x body copy size = 28px */
141 | line-height: 1.25;
142 | }
143 | }
144 |
145 | h4 {
146 | font-size: 1.125em;
147 | /* 1.125x body copy size = 18px */
148 | line-height: 1.11111111;
149 | margin: 0.25em 0;
150 | }
151 |
152 | @media (min-width: 48em) {
153 | h4 {
154 | line-height: 1.22222222;
155 | /* (22px / 18px */
156 | }
157 | }
158 |
159 | blockquote {
160 | font-size: 1.25em;
161 | /* 20px / 16px */
162 | line-height: 1.25;
163 | /* 25px / 20px */
164 | }
165 |
166 | @media (min-width: 48em) {
167 | blockquote {
168 | font-size: 1.5em;
169 | /* 24px / 16px = */
170 | line-height: 1.45833333;
171 | /* 35px / 24px */
172 | }
173 | }
174 |
175 | p {
176 | margin: 0.5em 0;
177 | }
178 |
179 |
180 | .panel .title {
181 | margin: 0;
182 | }
183 |
184 | .panel .label {
185 | font-style: italic;
186 | }
187 |
188 | .panel .badge-empty {
189 | font-weight: bold;
190 | }
191 |
192 | .panel > .featured {
193 | font-size: 2em;
194 | line-height: 1.25;
195 | font-weight: 700;
196 | margin: 0.375em 0;
197 | }
198 |
199 | @media (min-width: 48em) {
200 | .panel > .featured {
201 | line-height: 1.375;
202 | }
203 | }
204 |
205 | .panel .item {
206 | font-size: 1em;
207 | margin: 0.5em 0;
208 | }
209 |
210 | .panel a,
211 | .panel a:hover,
212 | .panel a:active,
213 | .panel a:visited {
214 | color: inherit;
215 | text-decoration: none;
216 | cursor: pointer;
217 | }
218 |
219 | #ros-board .panel > .node {
220 | word-wrap: break-word;
221 | }
222 |
223 | #ros-board .panel .node p {
224 | font-family: monospace;
225 | }
226 |
--------------------------------------------------------------------------------
/docs/js/app.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright (c) 2016 Andre Santos
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in
12 | all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | THE SOFTWARE.
21 | */
22 |
23 | /*
24 | The idea is to have modular components, and this script will be the glue between them.
25 |
26 | This script should be included first, to define window.App.
27 | Other modules register themselves on window.App.
28 | When the document is ready, grab window.App and delete the global.
29 |
30 | Other modules will essentially use Backbone.Events to communicate.
31 |
32 | This script creates the views with the document nodes, and the models from data.
33 | */
34 |
35 | (function () {
36 | "use strict";
37 |
38 | var App = window.App = {
39 | Views: {},
40 | Models: {},
41 | project: null, // current project
42 | board: null, // current view
43 | rules: null,
44 | projects: null,
45 | packages: null,
46 | summary: null,
47 | violations: null,
48 | configurations: null
49 | };
50 |
51 | $(document).ready(function () {
52 | delete window.App;
53 |
54 | App.rules = new App.Models.RuleCollection();
55 | App.projects = new App.Models.ProjectCollection();
56 | App.packages = new App.Models.PackageCollection();
57 | App.summary = new App.Models.Summary();
58 | App.violations = new App.Models.ViolationCollection();
59 | App.configurations = new App.Models.ConfigurationCollection();
60 |
61 | $(window).resize(_.debounce(onResize, 100));
62 |
63 | bootstrapViews();
64 | Backbone.history.start();
65 | App.projects.fetch();
66 | });
67 |
68 |
69 |
70 | function bootstrapViews() {
71 | App.navigation = new App.Views.NavigationMenu({
72 | el: $("#app-header > .navigation-menu")
73 | });
74 | App.preloader = new App.Views.Preloader({
75 | el: $("#preloader"),
76 | model: App.summary,
77 | projects: App.projects,
78 | packages: App.packages,
79 | rules: App.rules,
80 | violations: App.violations,
81 | configurations: App.configurations
82 | });
83 | App.dashboard = new App.Views.Dashboard({
84 | el: $("#dashboard"),
85 | model: App.summary,
86 | projects: App.projects
87 | });
88 | App.dashboard.on("change:project", onProjectSelect);
89 | App.packageBoard = new App.Views.PackageBoard({
90 | el: $("#package-board"),
91 | collection: App.packages,
92 | rules: App.rules,
93 | router: App.router
94 | });
95 | App.issueBoard = new App.Views.IssueBoard({
96 | el: $("#issue-board"),
97 | collection: App.violations,
98 | packages: App.packages,
99 | configurations: App.configurations,
100 | rules: App.rules,
101 | router: App.router
102 | });
103 | App.rosBoard = new App.Views.RosBoard({
104 | el: $("#ros-board"),
105 | collection: App.configurations,
106 | router: App.router
107 | });
108 | App.helpBoard = new App.Views.HelpBoard({
109 | el: $("#help-board")
110 | });
111 | // TODO: use a system other than these "public variables".
112 | App.packageBoard.publicVars.issues = App.issueBoard.publicVars;
113 | // Hide everything. Each route shows its view.
114 | App.dashboard.hide();
115 | App.packageBoard.hide();
116 | App.issueBoard.hide();
117 | App.rosBoard.hide();
118 | App.helpBoard.hide();
119 | }
120 |
121 |
122 | function onProjectSelect(projectId) {
123 | App.project = App.projects.get(projectId);
124 | App.rules.projectId = projectId;
125 | App.rules.fetch();
126 | App.packages.projectId = projectId;
127 | App.packages.fetch();
128 | App.summary.projectId = projectId;
129 | App.summary.fetch();
130 | App.violations.projectId = projectId;
131 | App.configurations.projectId = projectId;
132 | App.configurations.fetch();
133 | }
134 |
135 |
136 | function onResize(event) {
137 | if (App.board != null) {
138 | App.board.onResize(event);
139 | }
140 | }
141 | })();
142 |
--------------------------------------------------------------------------------
/harosviz/js/app.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright (c) 2016 Andre Santos
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in
12 | all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | THE SOFTWARE.
21 | */
22 |
23 | /*
24 | The idea is to have modular components, and this script will be the glue between them.
25 |
26 | This script should be included first, to define window.App.
27 | Other modules register themselves on window.App.
28 | When the document is ready, grab window.App and delete the global.
29 |
30 | Other modules will essentially use Backbone.Events to communicate.
31 |
32 | This script creates the views with the document nodes, and the models from data.
33 | */
34 |
35 | (function () {
36 | "use strict";
37 |
38 | var App = window.App = {
39 | Views: {},
40 | Models: {},
41 | project: null, // current project
42 | board: null, // current view
43 | rules: null,
44 | projects: null,
45 | packages: null,
46 | summary: null,
47 | violations: null,
48 | configurations: null
49 | };
50 |
51 | $(document).ready(function () {
52 | delete window.App;
53 |
54 | App.rules = new App.Models.RuleCollection();
55 | App.projects = new App.Models.ProjectCollection();
56 | App.packages = new App.Models.PackageCollection();
57 | App.summary = new App.Models.Summary();
58 | App.violations = new App.Models.ViolationCollection();
59 | App.configurations = new App.Models.ConfigurationCollection();
60 |
61 | $(window).resize(_.debounce(onResize, 100));
62 |
63 | bootstrapViews();
64 | Backbone.history.start();
65 | App.projects.fetch();
66 | });
67 |
68 |
69 |
70 | function bootstrapViews() {
71 | App.navigation = new App.Views.NavigationMenu({
72 | el: $("#app-header > .navigation-menu")
73 | });
74 | App.preloader = new App.Views.Preloader({
75 | el: $("#preloader"),
76 | model: App.summary,
77 | projects: App.projects,
78 | packages: App.packages,
79 | rules: App.rules,
80 | violations: App.violations,
81 | configurations: App.configurations
82 | });
83 | App.dashboard = new App.Views.Dashboard({
84 | el: $("#dashboard"),
85 | model: App.summary,
86 | projects: App.projects
87 | });
88 | App.dashboard.on("change:project", onProjectSelect);
89 | App.packageBoard = new App.Views.PackageBoard({
90 | el: $("#package-board"),
91 | collection: App.packages,
92 | rules: App.rules,
93 | router: App.router
94 | });
95 | App.issueBoard = new App.Views.IssueBoard({
96 | el: $("#issue-board"),
97 | collection: App.violations,
98 | packages: App.packages,
99 | configurations: App.configurations,
100 | rules: App.rules,
101 | router: App.router
102 | });
103 | App.rosBoard = new App.Views.RosBoard({
104 | el: $("#ros-board"),
105 | collection: App.configurations,
106 | router: App.router
107 | });
108 | App.helpBoard = new App.Views.HelpBoard({
109 | el: $("#help-board")
110 | });
111 | // TODO: use a system other than these "public variables".
112 | App.packageBoard.publicVars.issues = App.issueBoard.publicVars;
113 | // Hide everything. Each route shows its view.
114 | App.dashboard.hide();
115 | App.packageBoard.hide();
116 | App.issueBoard.hide();
117 | App.rosBoard.hide();
118 | App.helpBoard.hide();
119 | }
120 |
121 |
122 | function onProjectSelect(projectId) {
123 | App.project = App.projects.get(projectId);
124 | App.rules.projectId = projectId;
125 | App.rules.fetch();
126 | App.packages.projectId = projectId;
127 | App.packages.fetch();
128 | App.summary.projectId = projectId;
129 | App.summary.fetch();
130 | App.violations.projectId = projectId;
131 | App.configurations.projectId = projectId;
132 | App.configurations.fetch();
133 | }
134 |
135 |
136 | function onResize(event) {
137 | if (App.board != null) {
138 | App.board.onResize(event);
139 | }
140 | }
141 | })();
142 |
--------------------------------------------------------------------------------
/docs/data/Fictibot/metrics.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "id":"comments",
4 | "name":"Lines of Comments",
5 | "scope":"file",
6 | "description":"Number of lines of comments",
7 | "minimum":0.0,
8 | "maximum":null
9 | },
10 | {
11 | "id":"comment_ratio",
12 | "name":"Comment Ratio",
13 | "scope":"file",
14 | "description":"Ratio between comments and lines of code. How much of the total lines is comments.",
15 | "minimum":0.0,
16 | "maximum":1.0
17 | },
18 | {
19 | "id":"coupling",
20 | "name":"Coupling Between Objects",
21 | "scope":"file",
22 | "description":"Coupling between objects.",
23 | "minimum":0.0,
24 | "maximum":null
25 | },
26 | {
27 | "id":"cyclomatic_complexity",
28 | "name":"Cyclomatic Complexity",
29 | "scope":"file",
30 | "description":"Cyclomatic Complexity is a quantitative measure of the number of linearly independent paths through a program's source code.",
31 | "minimum":1.0,
32 | "maximum":null
33 | },
34 | {
35 | "id":"eloc",
36 | "name":"Executable Lines of Code",
37 | "scope":"file",
38 | "description":"Number of executable lines (e.g. in a function).",
39 | "minimum":0.0,
40 | "maximum":null
41 | },
42 | {
43 | "id":"function_calls",
44 | "name":"Number of Function Calls",
45 | "scope":"function",
46 | "description":"How many functions a function calls.",
47 | "minimum":0.0,
48 | "maximum":null
49 | },
50 | {
51 | "id":"function_parameters",
52 | "name":"Number of Function Parameters",
53 | "scope":"function",
54 | "description":"How many parameters a function takes.",
55 | "minimum":0.0,
56 | "maximum":null
57 | },
58 | {
59 | "id":"halstead_bugs",
60 | "name":"Number of Delivered Bugs",
61 | "scope":"file",
62 | "description":"Estimate of the number of delivered bugs, according to the Halstead metrics.",
63 | "minimum":0.0,
64 | "maximum":null
65 | },
66 | {
67 | "id":"halstead_time",
68 | "name":"Time Required to Program",
69 | "scope":"file",
70 | "description":"Estimate of the time required to change or understand this code.",
71 | "minimum":0.0,
72 | "maximum":null
73 | },
74 | {
75 | "id":"halstead_volume",
76 | "name":"Halstead's Volume",
77 | "scope":"file",
78 | "description":"Halstead's Volume metric, related to the number of operators and operands in a program.",
79 | "minimum":0.0,
80 | "maximum":null
81 | },
82 | {
83 | "id":"depth_in_tree",
84 | "name":"Deepest Level of Inheritance",
85 | "scope":"file",
86 | "description":"This metric calculates how far down a class is declared in the inheritance hierarchy.",
87 | "minimum":1.0,
88 | "maximum":null
89 | },
90 | {
91 | "id":"lloc",
92 | "name":"Logical Lines of Code",
93 | "scope":"file",
94 | "description":"Logical lines of code",
95 | "minimum":0.0,
96 | "maximum":null
97 | },
98 | {
99 | "id":"maintainability_index",
100 | "name":"Maintainability Index",
101 | "scope":"file",
102 | "description":"Maintainability Index is a software metric which measures how maintainable (easy to support and change) the source code is. The maintainability index is calculated as a factored formula consisting of Lines Of Code, Cyclomatic Complexity and Halstead volume.",
103 | "minimum":0.0,
104 | "maximum":100.0
105 | },
106 | {
107 | "id":"methods_available",
108 | "name":"Methods Available in Class",
109 | "scope":"file",
110 | "description":"Number of exposed methods in a class.",
111 | "minimum":1.0,
112 | "maximum":null
113 | },
114 | {
115 | "id":"nested_control",
116 | "name":"Nesting of Control Structures",
117 | "scope":"function",
118 | "description":"Level of nesting of control structures",
119 | "minimum":0.0,
120 | "maximum":null
121 | },
122 | {
123 | "id":"number_of_children",
124 | "name":"Number of Immediate Children",
125 | "scope":"file",
126 | "description":"Number of Children in Tree (NOC) measures the number of direct subclasses of a class.",
127 | "minimum":0.0,
128 | "maximum":null
129 | },
130 | {
131 | "id":"ploc",
132 | "name":"Program Lines of Code",
133 | "scope":"file",
134 | "description":"Lines of real code (no comments or blank lines).",
135 | "minimum":0.0,
136 | "maximum":null
137 | },
138 | {
139 | "id":"sloc",
140 | "name":"Source Lines of Code",
141 | "scope":"file",
142 | "description":"Source lines of code (code and comments, no blank lines).",
143 | "minimum":0.0,
144 | "maximum":null
145 | },
146 | {
147 | "id":"static_path_count",
148 | "name":"Estimated Static Path Count",
149 | "scope":"function",
150 | "description":"Estimated number of static program paths inside a function",
151 | "minimum":1.0,
152 | "maximum":null
153 | },
154 | {
155 | "id":"unique_function_calls",
156 | "name":"Number of Distinct Function Calls",
157 | "scope":"function",
158 | "description":"How many distinct functions a function calls.",
159 | "minimum":0.0,
160 | "maximum":null
161 | },
162 | {
163 | "id":"weighted_methods",
164 | "name":"Weighted Methods per Class",
165 | "scope":"file",
166 | "description":"The WMC metric is the sum of the complexities of all class methods.",
167 | "minimum":1.0,
168 | "maximum":null
169 | }
170 | ]
--------------------------------------------------------------------------------
/docs/data/Kobuki Architectural Analysis/metrics.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "description":"Cyclomatic Complexity is a quantitative measure of the number of linearly independent paths through a program's source code.",
4 | "maximum":null,
5 | "minimum":1.0,
6 | "scope":"file",
7 | "id":"cyclomatic_complexity",
8 | "name":"Cyclomatic Complexity"
9 | },
10 | {
11 | "description":"How many parameters a function takes.",
12 | "maximum":null,
13 | "minimum":0.0,
14 | "scope":"function",
15 | "id":"function_parameters",
16 | "name":"Number of Function Parameters"
17 | },
18 | {
19 | "description":"Logical lines of code",
20 | "maximum":null,
21 | "minimum":0.0,
22 | "scope":"file",
23 | "id":"lloc",
24 | "name":"Logical Lines of Code"
25 | },
26 | {
27 | "description":"Maintainability Index is a software metric which measures how maintainable (easy to support and change) the source code is. The maintainability index is calculated as a factored formula consisting of Lines Of Code, Cyclomatic Complexity and Halstead volume.",
28 | "maximum":100.0,
29 | "minimum":0.0,
30 | "scope":"file",
31 | "id":"maintainability_index",
32 | "name":"Maintainability Index"
33 | },
34 | {
35 | "description":"Estimate of the time required to change or understand this code.",
36 | "maximum":null,
37 | "minimum":0.0,
38 | "scope":"file",
39 | "id":"halstead_time",
40 | "name":"Time Required to Program"
41 | },
42 | {
43 | "description":"Level of nesting of control structures",
44 | "maximum":null,
45 | "minimum":0.0,
46 | "scope":"function",
47 | "id":"nested_control",
48 | "name":"Nesting of Control Structures"
49 | },
50 | {
51 | "description":"Number of exposed methods in a class.",
52 | "maximum":null,
53 | "minimum":1.0,
54 | "scope":"file",
55 | "id":"methods_available",
56 | "name":"Methods Available in Class"
57 | },
58 | {
59 | "description":"Ratio between comments and lines of code. How much of the total lines is comments.",
60 | "maximum":1.0,
61 | "minimum":0.0,
62 | "scope":"file",
63 | "id":"comment_ratio",
64 | "name":"Comment Ratio"
65 | },
66 | {
67 | "description":"How many distinct functions a function calls.",
68 | "maximum":null,
69 | "minimum":0.0,
70 | "scope":"function",
71 | "id":"unique_function_calls",
72 | "name":"Number of Distinct Function Calls"
73 | },
74 | {
75 | "description":"Number of lines of comments",
76 | "maximum":null,
77 | "minimum":0.0,
78 | "scope":"file",
79 | "id":"comments",
80 | "name":"Lines of Comments"
81 | },
82 | {
83 | "description":"Number of Children in Tree (NOC) measures the number of direct subclasses of a class.",
84 | "maximum":null,
85 | "minimum":0.0,
86 | "scope":"file",
87 | "id":"number_of_children",
88 | "name":"Number of Immediate Children"
89 | },
90 | {
91 | "description":"Coupling between objects.",
92 | "maximum":null,
93 | "minimum":0.0,
94 | "scope":"file",
95 | "id":"coupling",
96 | "name":"Coupling Between Objects"
97 | },
98 | {
99 | "description":"Estimated number of static program paths inside a function",
100 | "maximum":null,
101 | "minimum":1.0,
102 | "scope":"function",
103 | "id":"static_path_count",
104 | "name":"Estimated Static Path Count"
105 | },
106 | {
107 | "description":"How many functions a function calls.",
108 | "maximum":null,
109 | "minimum":0.0,
110 | "scope":"function",
111 | "id":"function_calls",
112 | "name":"Number of Function Calls"
113 | },
114 | {
115 | "description":"Number of executable lines (e.g. in a function).",
116 | "maximum":null,
117 | "minimum":0.0,
118 | "scope":"file",
119 | "id":"eloc",
120 | "name":"Executable Lines of Code"
121 | },
122 | {
123 | "description":"Lines of real code (no comments or blank lines).",
124 | "maximum":null,
125 | "minimum":0.0,
126 | "scope":"file",
127 | "id":"ploc",
128 | "name":"Program Lines of Code"
129 | },
130 | {
131 | "description":"Source lines of code (code and comments, no blank lines).",
132 | "maximum":null,
133 | "minimum":0.0,
134 | "scope":"file",
135 | "id":"sloc",
136 | "name":"Source Lines of Code"
137 | },
138 | {
139 | "description":"The WMC metric is the sum of the complexities of all class methods.",
140 | "maximum":null,
141 | "minimum":1.0,
142 | "scope":"file",
143 | "id":"weighted_methods",
144 | "name":"Weighted Methods per Class"
145 | },
146 | {
147 | "description":"Estimate of the number of delivered bugs, according to the Halstead metrics.",
148 | "maximum":null,
149 | "minimum":0.0,
150 | "scope":"file",
151 | "id":"halstead_bugs",
152 | "name":"Number of Delivered Bugs"
153 | },
154 | {
155 | "description":"Halstead's Volume metric, related to the number of operators and operands in a program.",
156 | "maximum":null,
157 | "minimum":0.0,
158 | "scope":"file",
159 | "id":"halstead_volume",
160 | "name":"Halstead's Volume"
161 | },
162 | {
163 | "description":"This metric calculates how far down a class is declared in the inheritance hierarchy.",
164 | "maximum":null,
165 | "minimum":1.0,
166 | "scope":"file",
167 | "id":"depth_in_tree",
168 | "name":"Deepest Level of Inheritance"
169 | }
170 | ]
--------------------------------------------------------------------------------
/haros/models/robot_localization.yaml:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | #Copyright (c) 2018 Andre Santos
3 | #
4 | #Permission is hereby granted, free of charge, to any person obtaining a copy
5 | #of this software and associated documentation files (the "Software"), to deal
6 | #in the Software without restriction, including without limitation the rights
7 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | #copies of the Software, and to permit persons to whom the Software is
9 | #furnished to do so, subject to the following conditions:
10 |
11 | #The above copyright notice and this permission notice shall be included in
12 | #all copies or substantial portions of the Software.
13 |
14 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | #THE SOFTWARE.
21 | ---
22 | # TODO: incomplete
23 | indigo:
24 | ekf_localization_node:
25 | nodelet: false
26 | advertise:
27 | -
28 | name: "odometry/filtered"
29 | type: nav_msgs/Odometry
30 | namespace: ""
31 | queue: 20
32 | depth: 0
33 | location: null
34 | repeats: false
35 | conditions: []
36 | -
37 | name: "accel/filtered"
38 | type: geometry_msgs/AccelWithCovarianceStamped
39 | namespace: ""
40 | queue: 20
41 | depth: 0
42 | location: null
43 | repeats: false
44 | conditions: []
45 | subscribe:
46 | -
47 | name: "set_pose"
48 | type: geometry_msgs/PoseWithCovarianceStamped
49 | namespace: ""
50 | queue: 1
51 | depth: 0
52 | location: null
53 | repeats: false
54 | conditions: []
55 | -
56 | name: "?"
57 | type: nav_msgs/Odometry
58 | namespace: ""
59 | queue: null
60 | depth: 3
61 | location: null
62 | repeats: true
63 | conditions:
64 | - statement: if
65 | condition: "(poseUpdateSum + twistUpdateSum > 0)"
66 | - statement: if
67 | condition: "(moreParams)"
68 | - statement: while
69 | condition: "(moreParams)"
70 | service:
71 | -
72 | name: "set_pose"
73 | type: robot_localization/SetPose
74 | namespace: ""
75 | depth: 0
76 | location: null
77 | repeats: false
78 | conditions: []
79 | client: []
80 | readParam:
81 | -
82 | name: "frequency"
83 | type: double
84 | namespace: "~"
85 | depth: 0
86 | location: null
87 | repeats: false
88 | conditions: []
89 | -
90 | name: "sensor_timeout"
91 | type: double
92 | namespace: "~"
93 | depth: 0
94 | location: null
95 | repeats: false
96 | conditions: []
97 | -
98 | name: "two_d_mode"
99 | type: bool
100 | default: false
101 | namespace: "~"
102 | depth: 0
103 | location: null
104 | repeats: false
105 | conditions: []
106 | -
107 | name: "map_frame"
108 | type: str
109 | default: "map"
110 | namespace: "~"
111 | depth: 0
112 | location: null
113 | repeats: false
114 | conditions: []
115 | -
116 | name: "odom_frame"
117 | type: str
118 | default: "odom"
119 | namespace: "~"
120 | depth: 0
121 | location: null
122 | repeats: false
123 | conditions: []
124 | -
125 | name: "base_link_frame"
126 | type: str
127 | default: "base_link"
128 | namespace: "~"
129 | depth: 0
130 | location: null
131 | repeats: false
132 | conditions: []
133 | -
134 | name: "world_frame"
135 | type: str
136 | default: "odom"
137 | namespace: "~"
138 | depth: 0
139 | location: null
140 | repeats: false
141 | conditions: []
142 | writeParam: []
143 | kinetic:
144 | ekf_localization_node:
145 | base: indigo
146 | lunar:
147 | ekf_localization_node:
148 | base: indigo
149 | melodic:
150 | ekf_localization_node:
151 | base: indigo
152 |
--------------------------------------------------------------------------------
/haros/visualiser.py:
--------------------------------------------------------------------------------
1 |
2 | #Copyright (c) 2016 Andre Santos
3 | #
4 | #Permission is hereby granted, free of charge, to any person obtaining a copy
5 | #of this software and associated documentation files (the "Software"), to deal
6 | #in the Software without restriction, including without limitation the rights
7 | #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | #copies of the Software, and to permit persons to whom the Software is
9 | #furnished to do so, subject to the following conditions:
10 |
11 | #The above copyright notice and this permission notice shall be included in
12 | #all copies or substantial portions of the Software.
13 |
14 | #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | #THE SOFTWARE.
21 |
22 | from __future__ import print_function
23 | from __future__ import unicode_literals
24 | from future import standard_library
25 | standard_library.install_aliases()
26 | from builtins import input
27 |
28 | import logging
29 | import os
30 | import subprocess
31 | import threading
32 |
33 | from distutils.dir_util import copy_tree
34 | from pkg_resources import Requirement, resource_filename
35 | from shutil import rmtree
36 |
37 | import http.server
38 | from http.server import HTTPServer
39 | from http.server import SimpleHTTPRequestHandler
40 |
41 | # Known online replacements for js libraries used by the report.
42 | js_lib_replacements = {
43 | 'backbone.min.js' : 'https://backbonejs.org/backbone-min.js',
44 | 'd3.min.js' : 'https://d3js.org/d3.v4.min.js',
45 | 'dagre.min.js' : 'https://dagrejs.github.io/project/dagre/latest/dagre.min.js',
46 | 'jquery-2.2.1.min.js' : 'https://ajax.googleapis.com/ajax/libs/jquery/2.2.1/jquery.min.js',
47 | 'underscore.min.js' : 'https://underscorejs.org/underscore-min.js',
48 | }
49 |
50 | class BaseHTTPRequestHandler(SimpleHTTPRequestHandler):
51 | def end_headers(self):
52 | self.send_my_headers()
53 | SimpleHTTPRequestHandler.end_headers(self)
54 |
55 | def send_my_headers(self):
56 | self.send_header("Cache-Control", "no-cache, no-store, must-revalidate")
57 | self.send_header("Pragma", "no-cache")
58 | self.send_header("Expires", "0")
59 |
60 |
61 | _log = logging.getLogger(__name__)
62 |
63 |
64 | def install(dst, source_runner, force = False, minimal_output = False):
65 | if force and os.path.exists(dst):
66 | rmtree(dst)
67 | if not os.path.exists(dst):
68 | _log.info("Creating %s", dst)
69 | os.mkdir(dst)
70 | _log.info("Copying viz files.")
71 | if source_runner:
72 | src = os.path.abspath(os.path.join(os.path.dirname(__file__),
73 | "..", "harosviz"))
74 | else:
75 | src = resource_filename(Requirement.parse("haros"), "harosviz")
76 | copy_tree(src, dst)
77 |
78 | if minimal_output:
79 | # remove external js libraries that we can link to from report
80 | index_html_path = os.path.join(dst, 'index.html')
81 | with open(index_html_path, 'r') as f:
82 | index_html = f.read()
83 | for js_lib, replacement in js_lib_replacements.items():
84 | if js_lib in index_html:
85 | index_html = index_html.replace('lib/js/'+js_lib, replacement)
86 | os.remove(os.path.join(dst,"lib", "js", js_lib))
87 | with open(index_html_path, 'w') as f:
88 | f.write(index_html)
89 | #
90 |
91 | data_dir = os.path.join(dst, "data")
92 | if not os.path.exists(data_dir):
93 | _log.info("Creating %s", data_dir)
94 | os.mkdir(data_dir)
95 |
96 |
97 | def serve(directory, host_str, headless = False):
98 | host = host_str.split(":")
99 | if len(host) != 2:
100 | raise RuntimeError("Invalid host:port provided: " + host_str)
101 | server = None
102 | p = None
103 | wd = os.getcwd()
104 | try:
105 | os.chdir(directory)
106 | server = HTTPServer((host[0], int(host[1])), BaseHTTPRequestHandler)
107 | print("[HAROS] Serving visualisation at", host_str)
108 | if not headless:
109 | thread = threading.Thread(target = server.serve_forever)
110 | thread.daemon = True
111 | thread.start()
112 | _log.info("Starting web browser process.")
113 | cmd = ["python", "-m", "webbrowser", "-t", "http://" + host_str]
114 | with open(os.devnull, "wb") as devnull:
115 | p = subprocess.Popen(cmd, stdout = devnull,
116 | stderr = subprocess.STDOUT)
117 | input("[HAROS] Press enter to shutdown the viz server:")
118 | else:
119 | server.serve_forever()
120 | return True
121 | except ValueError as e:
122 | _log.error("Invalid port for the viz server %s", host[1])
123 | return False
124 | finally:
125 | if server:
126 | server.shutdown()
127 | os.chdir(wd)
128 | if p:
129 | _log.debug("Killing web browser process.")
130 | p.kill()
131 |
--------------------------------------------------------------------------------
/docs/js/views/general.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright (c) 2016 Andre Santos
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in
12 | all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | THE SOFTWARE.
21 | */
22 |
23 | (function () {
24 | "use strict";
25 |
26 | var views = window.App.Views;
27 |
28 | views.BaseView = Backbone.View.extend({
29 | visible: false,
30 |
31 | build: function () {
32 | return this;
33 | },
34 |
35 | show: function () {
36 | this.$el.show();
37 | this.visible = true;
38 | return this;
39 | },
40 |
41 | hide: function () {
42 | this.$el.hide();
43 | this.visible = false;
44 | return this;
45 | },
46 |
47 | onResize: function () {}
48 | });
49 |
50 |
51 | views.NavigationMenu = Backbone.View.extend({
52 | className: "navigation-menu",
53 |
54 | initialize: function () {
55 | this.view = "";
56 | this.$dashboard = this.$el.children("#navigation-dashboard");
57 | this.$packages = this.$el.children("#navigation-packages");
58 | this.$issues = this.$el.children("#navigation-issues");
59 | this.$ros = this.$el.children("#navigation-ros");
60 | this.$help = this.$el.children("#navigation-help");
61 | this.$selected = $();
62 | },
63 |
64 | goTo: function (view) {
65 | if (view != this.view) {
66 | this.$selected.removeClass("selected");
67 | this.view = view;
68 | switch (view) {
69 | case "dashboard":
70 | this.$selected = this.$dashboard;
71 | break;
72 | case "packages":
73 | this.$selected = this.$packages;
74 | break;
75 | case "issues":
76 | this.$selected = this.$issues;
77 | break;
78 | case "ros":
79 | this.$selected = this.$ros;
80 | break;
81 | case "help":
82 | this.$selected = this.$help;
83 | break;
84 | default:
85 | this.$selected = $();
86 | break;
87 | }
88 | this.$selected.addClass("selected");
89 | }
90 | }
91 | });
92 |
93 |
94 |
95 | views.Preloader = Backbone.View.extend({
96 | id: "preloader",
97 |
98 | initialize: function (options) {
99 | this.loading = 0;
100 | this.projects = options.projects;
101 | this.packages = options.packages;
102 | this.rules = options.rules;
103 | this.violations = options.violations;
104 | this.configurations = options.configurations;
105 | this.listenTo(this.model, "request", this.onRequest);
106 | this.listenTo(this.model, "sync", this.onSync);
107 | this.listenTo(this.projects, "request", this.onRequest);
108 | this.listenTo(this.projects, "sync", this.onSync);
109 | this.listenTo(this.packages, "request", this.onRequest);
110 | this.listenTo(this.packages, "sync", this.onSync);
111 | this.listenTo(this.rules, "request", this.onRequest);
112 | this.listenTo(this.rules, "sync", this.onSync);
113 | this.listenTo(this.violations, "request", this.onRequest);
114 | this.listenTo(this.violations, "sync", this.onSync);
115 | this.listenTo(this.configurations, "request", this.onRequest);
116 | this.listenTo(this.configurations, "sync", this.onSync);
117 | },
118 |
119 | onRequest: function (model_or_collection, xhr, options) {
120 | ++this.loading;
121 | if (this.loading === 1) this.$el.show();
122 | },
123 |
124 | onSync: function (model_or_collection, response, options) {
125 | --this.loading;
126 | if (this.loading === 0) this.$el.hide();
127 | }
128 | });
129 |
130 |
131 |
132 | views.Modal = Backbone.View.extend({
133 | events: {
134 | "click .button-close": "hide"
135 | },
136 |
137 | show: function () {
138 | this.$el.show();
139 | this.trigger("show", this);
140 | this.render();
141 | return this;
142 | },
143 |
144 | hide: function () {
145 | this.$el.hide();
146 | this.trigger("hide", this);
147 | return this;
148 | }
149 | });
150 | })();
--------------------------------------------------------------------------------