├── 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:

  1. @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:

  1. @665ms sent witness on /bumper
    left: True
    center: False
    right: False
  2. @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 | [![DOI](https://zenodo.org/badge/27440980.svg)](https://zenodo.org/badge/latestdoi/27440980) 2 | 3 | ![HAROS](logo.png?raw=true "HAROS Logo") 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 | })(); --------------------------------------------------------------------------------