From ce68ac424b0b56f43b5b9ce3c77f5507b09ed20c Mon Sep 17 00:00:00 2001 From: Nevin Valsaraj Date: Tue, 10 Mar 2026 23:31:25 -0700 Subject: [PATCH 1/6] refactor(assets): consolidate all images into top-level assets/images/ directory --- _templates/template.md | 2 +- .../assets => assets/images}/2dwr1.png | Bin .../images}/3DPrinters-10477.png | Bin .../images}/3DPrinters-a3389.png | Bin .../images}/AdafruitGPS-69ceb.png | Bin .../images}/AdafruitGPS-c715f.png | Bin .../AdaptiveMonteCarloLocalization-0d322.png | Bin .../AdaptiveMonteCarloLocalization-65e37.png | Bin .../images}/AltiumCircuitmaker-1caa4.png | Bin .../images}/AltiumCircuitmaker-3f756.png | Bin .../images}/AltiumCircuitmaker-4b425.png | Bin .../images}/AltiumCircuitmaker-78555.png | Bin .../images}/AltiumCircuitmaker-8aecd.png | Bin .../images}/AltiumCircuitmaker-e83b9.png | Bin .../images}/AltiumCircuitmaker-f5782.png | Bin .../images}/AltiumCircuitmaker-fcf01.png | Bin .../images}/Arduino-2369d.png | Bin .../images}/Arduino-c30e6.png | Bin .../images}/Arduino-d9b3f.png | Bin .../images}/Arduino-de522.png | Bin .../images}/BoostLibrary-f962f.png | Bin .../images}/CableManagement-654ae.png | Bin .../images}/CableManagement-6f4d5.png | Bin .../images}/CableManagement-b3a03.png | Bin .../images}/CableManagement-c5b3a.png | Bin .../CoppeliaSim_sim.jpg | Bin .../assets => assets/images}/Data_capture.png | Bin .../images}/DelphiESRRadar-8394b.png | Bin .../images}/DelphiESRRadar-eba02.png | Bin .../images}/EigenLibrary-35715.png | Bin .../assets => assets/images}/Gr00t.png | Bin .../assets => assets/images}/HD_map.png | Bin .../images}/IntraFace-6b43f.png | Bin .../assets => assets/images}/KHEPERA4.png | Bin .../assets => assets/images}/NLP_image1.png | Bin .../assets => assets/images}/NLP_image2.png | Bin .../assets => assets/images}/NLP_image3.png | Bin .../assets => assets/images}/NLP_image4.png | Bin .../images}/PCBDesignNotes-05e85.png | Bin .../images}/PCBDesignNotes-09baf.png | Bin .../images}/PCBDesignNotes-8fedc.png | Bin .../images}/PCBDesignNotes-d5ba2.png | Bin .../assets => assets/images}/PyQt-final.png | Bin .../assets => assets/images}/PyQt-green.png | Bin .../assets => assets/images}/PyQt-init.png | Bin .../assets => assets/images}/PyQt-logs.png | Bin .../assets => assets/images}/PyQt-orange.png | Bin .../assets => assets/images}/PyQt-red.png | Bin .../assets => assets/images}/PyQt-yellow.png | Bin .../Qtcreator-ros-new-project-class-menu.png | Bin .../Qtcreator-ros-new-project-design.png | Bin .../Qtcreator-ros-new-project-edit-text.png | Bin .../images}/Qtcreator-ros-new-project-kit.png | Bin .../Qtcreator-ros-new-project-menu.png | Bin .../images}/Qtcreator-ros-new-project-run.png | Bin .../Qtcreator-ros-new-project-run2.png | Bin .../Qtcreator-ros-new-project-ui-elements.png | Bin ...tcreator-ros-new-project-ui-obj-rename.png | Bin .../Qtcreator-ros-new-project-ui-obj.png | Bin .../images}/Qtcreator-ros-new-project.png | Bin .../images}/ROSCostMaps-2dba7.png | Bin .../images}/ROSCostMaps-8c746.png | Bin .../images}/ROSCostMaps-90ce8.png | Bin .../images}/ROSCostMaps-fad65.png | Bin .../images}/ROSDistributed-1b70c.png | Bin .../images}/ROSNavigation-72039.png | Bin .../images}/ROSNavigation-7d9d1.png | Bin .../images}/ROSNavigation-d06e2.png | Bin .../images}/SeriesA_APIKey.jpg | Bin .../images}/SeriesA_PLA_SP.jpg | Bin .../SubsystemInterfaceModeling-4e816.png | Bin .../SubsystemInterfaceModeling-7097d.png | Bin .../SubsystemInterfaceModeling-73d8e.png | Bin .../SubsystemInterfaceModeling-8748c.png | Bin .../SubsystemInterfaceModeling-8e94f.png | Bin .../SubsystemInterfaceModeling-fb765.png | Bin .../assets => assets/images}/Tracker-01.PNG | Bin .../assets => assets/images}/Tracker-02.PNG | Bin .../images}/ULN2003AMotorController-8ee22.png | Bin .../images}/UR5e_about_button.jpg | Bin .../images}/UR5e_about_page.jpg | Bin .../assets => assets/images}/UR5e_bootup.JPG | Bin .../images}/UR5e_remote_control.JPG | Bin .../images}/UR5e_static_ip.JPG | Bin .../images}/XbeeProDigiMesh900-1fc56.png | Bin .../images}/abstract_execution_classes.png | Bin .../images}/abstract_navigation_server.png | Bin .../images}/abstract_plugin_classes.png | Bin .../airsim_sim.png | Bin .../{robotics_project_guide => }/all_sim.png | Bin .../images}/apriltags-6719c.png | Bin .../assets_decawave_example_multi_anchor.png | Bin .../images/assets_leica_field_image.jpg | Bin .../assets => assets/images}/astar_h_viz.png | Bin .../assets => assets}/images/autoware_gui.png | Bin .../assets => assets}/images/autoware_map.png | Bin .../images/autoware_models.png | Bin .../images/autoware_pkgs.png | Bin .../images/autoware_plan.png | Bin .../images/autoware_rviz.png | Bin .../images/autoware_worlds.png | Bin .../assets => assets/images}/bucket_fill.png | Bin .../images}/camera-radar-targets.png | Bin .../assets => assets}/images/card-system.png | Bin .../assets => assets}/images/carter.png | Bin .../cartesian.png | Bin .../assets => assets/images}/carto-1.png | Bin .../assets => assets/images}/carto-2.png | Bin .../assets => assets/images}/carto-3.jpeg | Bin .../assets => assets/images}/carto-4.png | Bin .../assets => assets/images}/carto-5.png | Bin .../assets => assets/images}/carto-6.png | Bin .../images}/cell_traversal.png | Bin .../images}/central_planner.png | Bin .../assets => assets/images}/clr1.png | Bin .../assets => assets/images}/clr2.png | Bin .../assets => assets/images}/cluster.png | Bin .../images}/cmake_file_structure.png | Bin .../images}/costmatrix_formation.png | Bin .../images}/coverage_planner_event_types.png | Bin .../images}/coverage_planner_steps.png | Bin .../assets => assets/images}/cropped.png | Bin .../assets => assets/images}/datacapture.png | Bin .../assets => assets/images}/debug1.jpeg | Bin .../assets => assets/images}/debug2.jpeg | Bin .../assets => assets/images}/debug3.jpeg | Bin .../images}/decawave_example_multi_anchor.png | Bin .../assets => assets/images}/deltaviz.jpg | Bin .../images}/detection_sort_output.png | Bin .../images}/diffusion_policy_diagram.png | Bin .../assets => assets/images}/distance.png | Bin .../images}/docker_socket.png | Bin .../assets => assets/images}/downsampled.png | Bin .../drone_image.png | Bin .../assets => assets/images}/drtls_app.png | Bin .../assets => assets/images}/drtls_ids.png | Bin .../assets => assets/images}/dwm_arch.png | Bin .../{robotics_project_guide => }/f1tenth.jpg | Bin .../assets => assets/images}/f_path.png | Bin .../assets => assets/images}/form_factor.png | Bin .../gazebo_sim.png | Bin .../assets => assets/images}/gdop_example.png | Bin .../go2_image.jpg | Bin .../go2_package.png | Bin .../assets => assets/images}/gpConnection.png | Bin .../sensing/assets => assets/images}/gps1.png | Bin .../sensing/assets => assets/images}/gps2.png | Bin .../sensing/assets => assets/images}/gps3.png | Bin .../sensing/assets => assets/images}/gps4.png | Bin .../assets => assets/images}/hsv_img.png | Bin .../images/images_Hk47portrait-298x300.jpg | Bin .../assets => assets/images}/ipm_two.png | Bin .../images/isaac_simpleroom.png | Bin .../isaaclab_sim.jpg | Bin .../images/jira_burndown_chart.png | Bin .../assets => assets/images}/kinect.jpg | Bin .../images}/leica_360_prism.jpeg | Bin .../images}/leica_field_image.jpg | Bin .../images}/lt_controller.png | Bin .../images}/manage_layers.png | Bin .../manipulators_all.png | Bin .../images}/marvelmind_example.jpg | Bin .../images}/mask_annotation.png | Bin .../images}/mediapipe_platforms.png | Bin .../images}/mediapipe_solutions.png | Bin .../images/meeting-notes.png | Bin .../images/micro-ros-architecture.png | Bin .../images/micro-ros-docker.png | Bin .../assets => assets}/images/milestones.png | Bin .../assets => assets/images}/mission_exec.png | Bin .../images}/mixedGaussian.jpg | Bin .../images}/move_base_flex_full.png | Bin .../assets => assets/images}/moveit_1.png | Bin .../assets => assets/images}/moveit_2.png | Bin .../assets => assets/images}/moveit_3.png | Bin .../assets => assets/images}/moveit_4.png | Bin ...eit_setup_assistant_author_information.png | Bin ...moveit_setup_assistant_collision_check.png | Bin .../moveit_setup_assistant_controllers.png | Bin .../images}/moveit_setup_assistant_end.png | Bin .../moveit_setup_assistant_end_effectors.png | Bin .../moveit_setup_assistant_passive_joints.png | Bin .../moveit_setup_assistant_perception.png | Bin ...sistant_planning_group_kinematic_chain.png | Bin ...moveit_setup_assistant_planning_groups.png | Bin .../moveit_setup_assistant_robot_poses.png | Bin .../moveit_setup_assistant_simulation.png | Bin .../images}/moveit_setup_assistant_start.png | Bin .../moveit_setup_assistant_virtual_joints.png | Bin .../mujoco_sim.jpg | Bin .../images}/multi_vs_single_query.png | Bin .../assets => assets}/images/nav2.png | Bin .../assets => assets/images}/new_layer.png | Bin .../assets => assets/images}/norm_img.png | Bin .../assets => assets/images}/norm_mask.png | Bin .../assets => assets/images}/norm_result.png | Bin .../assets => assets/images}/normalized.png | Bin .../assets => assets/images}/nvidia-cuda.png | Bin .../assets => assets/images}/nvidia-cudnn.png | Bin .../images}/occupancy-grid.png | Bin .../assets => assets}/images/office-hours.png | Bin .../openaigym_sim.png | Bin .../assets => assets/images}/original.png | Bin .../images}/path_planning.png | Bin .../assets => assets/images}/pavucontrol.png | Bin .../assets => assets/images}/pipeline.png | Bin .../images}/planning_intro.png | Bin .../images}/prioritised_astar.png | Bin .../images/project-schedule.png | Bin .../pybullet_sim.png | Bin .../quadrotors_all.png | Bin .../quadrupeds_all.png | Bin .../assets => assets/images}/ransac1.png | Bin .../assets => assets/images}/ransac2.png | Bin .../assets => assets/images}/realsense.jpg | Bin .../assets => assets}/images/realsense.png | Bin .../assets => assets/images}/ref_path.png | Bin .../assets => assets/images}/refactor1.png | Bin .../assets => assets/images}/refactor2.jpeg | Bin .../assets => assets/images}/refactor3.png | Bin .../assets => assets/images}/refactor4.png | Bin .../assets => assets/images}/rgb_vector.png | Bin .../robot_overview.png | Bin .../assets => assets}/images/ros-bridge.png | Bin .../rrtstar.png | Bin .../assets => assets/images}/select_tool.png | Bin .../images}/servoing-action.png | Bin .../simulation_testing.png | Bin .../sensing/assets => assets/images}/slam.png | Bin .../assets => assets/images}/sort-tracker.jpg | Bin .../images}/stag_exposure.gif | Bin .../state_machine.png | Bin .../images}/steer-by-wire.png | Bin .../images}/system1system2.png | Bin .../assets => assets}/images/task-list.png | Bin .../images}/throttle-by-wire.png | Bin .../images}/tracking_results.png | Bin .../images}/trapezoid_decomposition.png | Bin .../turtlebot3.png | Bin .../assets => assets/images}/uncertainty.png | Bin .../assets => assets/images}/unitree_side.png | 0 .../assets => assets/images}/unitree_top.png | Bin .../unity_sim.png | Bin .../urdf_to_sim.png | Bin .../vader_planning_seq.png | Bin .../images}/velocity_obstacles.png | Bin .../assets => assets/images}/vscode1.png | Bin .../assets => assets/images}/vscode10.png | Bin .../assets => assets/images}/vscode11.png | Bin .../assets => assets/images}/vscode12.png | Bin .../assets => assets/images}/vscode13.png | Bin .../assets => assets/images}/vscode14.png | Bin .../assets => assets/images}/vscode2.png | Bin .../assets => assets/images}/vscode3.png | Bin .../assets => assets/images}/vscode4.png | Bin .../assets => assets/images}/vscode5.png | Bin .../assets => assets/images}/vscode6.png | Bin .../assets => assets/images}/vscode7.png | Bin .../assets => assets/images}/vscode8.png | Bin .../assets => assets/images}/vscode9.png | Bin .../wheeled_robot_image.png | Bin .../wheeled_robots_all.png | Bin .../assets => assets/images}/wired.png | Bin .../assets => assets/images}/wireless.png | Bin .../assets => assets/images}/yolo_demo.png | Bin .../images}/yolov5_onnx_input.png | Bin .../images}/yolov5_onnx_output.png | Bin .../assets => assets/images}/zoom1.png | Bin .../assets => assets/images}/zoom2.png | Bin wiki/actuation/__all_subsections.md | 30 +++---- wiki/actuation/drive-by-wire.md | 4 +- wiki/actuation/moveit-and-HEBI-integration.md | 24 ++--- wiki/actuation/uln2003a-motor-controller.md | 2 +- wiki/common-platforms/__all_subsections.md | 18 ++-- ...-drone-breakdown-for-technical-projects.md | 2 +- wiki/common-platforms/khepera4.md | 2 +- wiki/common-platforms/unitree-go1.md | 6 +- wiki/common-platforms/ur5e.md | 8 +- wiki/computing/__all_subsections.md | 8 +- wiki/computing/arduino.md | 8 +- wiki/fabrication/3d-printers.md | 4 +- wiki/fabrication/__all_subsections.md | 8 +- wiki/fabrication/series-A-pro.md | 4 +- wiki/interfacing/__all_subsections.md | 6 +- .../microros-for-ros2-on-microcontrollers.md | 4 +- wiki/interfacing/ros1_ros2_bridge.md | 2 +- wiki/machine-learning/__all_subsections.md | 20 ++--- wiki/machine-learning/custom-semantic-data.md | 10 +-- wiki/machine-learning/imitation-learning.md | 8 +- wiki/machine-learning/nlp-for-robotics.md | 8 +- wiki/machine-learning/ros-yolo-gpu.md | 2 +- wiki/math/__all_subsections.md | 6 +- ...gaussian-process-gaussian-mixture-model.md | 6 +- wiki/networking/__all_subsections.md | 2 +- wiki/networking/xbee-pro-digimesh-900.md | 2 +- wiki/planning/__all_subsections.md | 32 +++---- .../advanced-moveit-manipulator-planning.md | 6 +- .../astar_planning_implementation_guide.md | 2 +- .../coverage-planning-implementation-guide.md | 8 +- wiki/planning/frenet-frame-planning.md | 4 +- wiki/planning/move_base_flex.md | 8 +- wiki/planning/multi-robot-planning.md | 10 +-- wiki/programming/__all_subsections.md | 6 +- wiki/programming/boost-library.md | 2 +- wiki/programming/cmake.md | 2 +- wiki/programming/eigen-library.md | 2 +- wiki/programming/yasmin-ros2-state-machine.md | 2 +- wiki/project-management/__all_subsections.md | 14 +-- wiki/project-management/jira.md | 2 +- .../using-notion-for-project-management.md | 12 +-- wiki/robotics-project-guide/choose-a-robot.md | 10 +-- wiki/robotics-project-guide/choose-a-sim.md | 20 ++--- .../define-your-goals-and-requirements.md | 4 +- wiki/sensing/___all_subsections.md | 74 ++++++++-------- wiki/sensing/adafruit-gps.md | 2 +- wiki/sensing/apriltags.md | 2 +- wiki/sensing/azure-block-detection.md | 10 +-- wiki/sensing/delphi-esr-radar.md | 4 +- wiki/sensing/gps.md | 8 +- wiki/sensing/pcl.md | 18 ++-- wiki/sensing/robotic-total-stations.md | 4 +- wiki/sensing/speech-recognition.md | 2 +- wiki/sensing/stag.md | 2 +- .../trajectory_extraction_static_camera.md | 12 +-- .../ultrawideband-beacon-positioning.md | 10 +-- ...wning-and-Controlling-Vehicles-in-CARLA.md | 10 +-- wiki/simulation/__all_subsections.md | 24 ++--- .../simulating-vehicle-using-autoware.md | 14 +-- wiki/simulation/simulation-isaacsim-setup.md | 8 +- .../Cartographer-ROS-Integration.md | 4 +- wiki/state-estimation/__all_subsections.md | 40 ++++----- .../adaptive-monte-carlo-localization.md | 4 +- .../gps-lacking-state-estimation-sensors.md | 6 +- .../radar-camera-sensor-fusion.md | 10 +-- wiki/state-estimation/ros-cost-maps.md | 8 +- wiki/state-estimation/ros-navigation.md | 6 +- wiki/state-estimation/visual-servoing.md | 2 +- .../__all_subsections.md | 28 +++--- .../cable-management.md | 8 +- wiki/system-design-development/pcb-design.md | 8 +- .../subsystem-interface-modeling.md | 12 +-- wiki/tools/Qtcreator-ros.md | 22 ++--- wiki/tools/__all_subsections.md | 82 +++++++++--------- wiki/tools/altium-circuitmaker.md | 16 ++-- wiki/tools/clion.md | 14 +-- ...editors-introduction-to-vs-code-and-vim.md | 22 ++--- wiki/tools/docker-security.md | 2 +- wiki/tools/ros-gui.md | 12 +-- 348 files changed, 431 insertions(+), 431 deletions(-) rename {wiki/planning/assets => assets/images}/2dwr1.png (100%) rename {wiki/fabrication/assets => assets/images}/3DPrinters-10477.png (100%) rename {wiki/fabrication/assets => assets/images}/3DPrinters-a3389.png (100%) rename {wiki/sensing/assets => assets/images}/AdafruitGPS-69ceb.png (100%) rename {wiki/sensing/assets => assets/images}/AdafruitGPS-c715f.png (100%) rename {wiki/state-estimation/assets => assets/images}/AdaptiveMonteCarloLocalization-0d322.png (100%) rename {wiki/state-estimation/assets => assets/images}/AdaptiveMonteCarloLocalization-65e37.png (100%) rename {wiki/tools/assets => assets/images}/AltiumCircuitmaker-1caa4.png (100%) rename {wiki/tools/assets => assets/images}/AltiumCircuitmaker-3f756.png (100%) rename {wiki/tools/assets => assets/images}/AltiumCircuitmaker-4b425.png (100%) rename {wiki/tools/assets => assets/images}/AltiumCircuitmaker-78555.png (100%) rename {wiki/tools/assets => assets/images}/AltiumCircuitmaker-8aecd.png (100%) rename {wiki/tools/assets => assets/images}/AltiumCircuitmaker-e83b9.png (100%) rename {wiki/tools/assets => assets/images}/AltiumCircuitmaker-f5782.png (100%) rename {wiki/tools/assets => assets/images}/AltiumCircuitmaker-fcf01.png (100%) rename {wiki/computing/assets => assets/images}/Arduino-2369d.png (100%) rename {wiki/computing/assets => assets/images}/Arduino-c30e6.png (100%) rename {wiki/computing/assets => assets/images}/Arduino-d9b3f.png (100%) rename {wiki/computing/assets => assets/images}/Arduino-de522.png (100%) rename {wiki/programming/assets => assets/images}/BoostLibrary-f962f.png (100%) rename {wiki/system-design-development/assets => assets/images}/CableManagement-654ae.png (100%) rename {wiki/system-design-development/assets => assets/images}/CableManagement-6f4d5.png (100%) rename {wiki/system-design-development/assets => assets/images}/CableManagement-b3a03.png (100%) rename {wiki/system-design-development/assets => assets/images}/CableManagement-c5b3a.png (100%) rename assets/images/{robotics_project_guide => }/CoppeliaSim_sim.jpg (100%) rename {wiki/sensing/assets => assets/images}/Data_capture.png (100%) rename {wiki/sensing/assets => assets/images}/DelphiESRRadar-8394b.png (100%) rename {wiki/sensing/assets => assets/images}/DelphiESRRadar-eba02.png (100%) rename {wiki/programming/assets => assets/images}/EigenLibrary-35715.png (100%) rename {wiki/machine-learning/assets => assets/images}/Gr00t.png (100%) rename {wiki/sensing/assets => assets/images}/HD_map.png (100%) rename {wiki/state-estimation/assets => assets/images}/IntraFace-6b43f.png (100%) rename {wiki/common-platforms/assets => assets/images}/KHEPERA4.png (100%) rename {wiki/machine-learning/assets => assets/images}/NLP_image1.png (100%) rename {wiki/machine-learning/assets => assets/images}/NLP_image2.png (100%) rename {wiki/machine-learning/assets => assets/images}/NLP_image3.png (100%) rename {wiki/machine-learning/assets => assets/images}/NLP_image4.png (100%) rename {wiki/system-design-development/assets => assets/images}/PCBDesignNotes-05e85.png (100%) rename {wiki/system-design-development/assets => assets/images}/PCBDesignNotes-09baf.png (100%) rename {wiki/system-design-development/assets => assets/images}/PCBDesignNotes-8fedc.png (100%) rename {wiki/system-design-development/assets => assets/images}/PCBDesignNotes-d5ba2.png (100%) rename {wiki/tools/assets => assets/images}/PyQt-final.png (100%) rename {wiki/tools/assets => assets/images}/PyQt-green.png (100%) rename {wiki/tools/assets => assets/images}/PyQt-init.png (100%) rename {wiki/tools/assets => assets/images}/PyQt-logs.png (100%) rename {wiki/tools/assets => assets/images}/PyQt-orange.png (100%) rename {wiki/tools/assets => assets/images}/PyQt-red.png (100%) rename {wiki/tools/assets => assets/images}/PyQt-yellow.png (100%) rename {wiki/tools/assets => assets/images}/Qtcreator-ros-new-project-class-menu.png (100%) rename {wiki/tools/assets => assets/images}/Qtcreator-ros-new-project-design.png (100%) rename {wiki/tools/assets => assets/images}/Qtcreator-ros-new-project-edit-text.png (100%) rename {wiki/tools/assets => assets/images}/Qtcreator-ros-new-project-kit.png (100%) rename {wiki/tools/assets => assets/images}/Qtcreator-ros-new-project-menu.png (100%) rename {wiki/tools/assets => assets/images}/Qtcreator-ros-new-project-run.png (100%) rename {wiki/tools/assets => assets/images}/Qtcreator-ros-new-project-run2.png (100%) rename {wiki/tools/assets => assets/images}/Qtcreator-ros-new-project-ui-elements.png (100%) rename {wiki/tools/assets => assets/images}/Qtcreator-ros-new-project-ui-obj-rename.png (100%) rename {wiki/tools/assets => assets/images}/Qtcreator-ros-new-project-ui-obj.png (100%) rename {wiki/tools/assets => assets/images}/Qtcreator-ros-new-project.png (100%) rename {wiki/state-estimation/assets => assets/images}/ROSCostMaps-2dba7.png (100%) rename {wiki/state-estimation/assets => assets/images}/ROSCostMaps-8c746.png (100%) rename {wiki/state-estimation/assets => assets/images}/ROSCostMaps-90ce8.png (100%) rename {wiki/state-estimation/assets => assets/images}/ROSCostMaps-fad65.png (100%) rename {wiki/programming/assets => assets/images}/ROSDistributed-1b70c.png (100%) rename {wiki/state-estimation/assets => assets/images}/ROSNavigation-72039.png (100%) rename {wiki/state-estimation/assets => assets/images}/ROSNavigation-7d9d1.png (100%) rename {wiki/state-estimation/assets => assets/images}/ROSNavigation-d06e2.png (100%) rename {wiki/fabrication/assets => assets/images}/SeriesA_APIKey.jpg (100%) rename {wiki/fabrication/assets => assets/images}/SeriesA_PLA_SP.jpg (100%) rename {wiki/system-design-development/assets => assets/images}/SubsystemInterfaceModeling-4e816.png (100%) rename {wiki/system-design-development/assets => assets/images}/SubsystemInterfaceModeling-7097d.png (100%) rename {wiki/system-design-development/assets => assets/images}/SubsystemInterfaceModeling-73d8e.png (100%) rename {wiki/system-design-development/assets => assets/images}/SubsystemInterfaceModeling-8748c.png (100%) rename {wiki/system-design-development/assets => assets/images}/SubsystemInterfaceModeling-8e94f.png (100%) rename {wiki/system-design-development/assets => assets/images}/SubsystemInterfaceModeling-fb765.png (100%) rename {wiki/state-estimation/assets => assets/images}/Tracker-01.PNG (100%) rename {wiki/state-estimation/assets => assets/images}/Tracker-02.PNG (100%) rename {wiki/actuation/assets => assets/images}/ULN2003AMotorController-8ee22.png (100%) rename {wiki/actuation/assets => assets/images}/UR5e_about_button.jpg (100%) rename {wiki/actuation/assets => assets/images}/UR5e_about_page.jpg (100%) rename {wiki/actuation/assets => assets/images}/UR5e_bootup.JPG (100%) rename {wiki/actuation/assets => assets/images}/UR5e_remote_control.JPG (100%) rename {wiki/actuation/assets => assets/images}/UR5e_static_ip.JPG (100%) rename {wiki/networking/assets => assets/images}/XbeeProDigiMesh900-1fc56.png (100%) rename {wiki/planning/assets/MBF => assets/images}/abstract_execution_classes.png (100%) rename {wiki/planning/assets/MBF => assets/images}/abstract_navigation_server.png (100%) rename {wiki/planning/assets/MBF => assets/images}/abstract_plugin_classes.png (100%) rename assets/images/{robotics_project_guide => }/airsim_sim.png (100%) rename assets/images/{robotics_project_guide => }/all_sim.png (100%) rename {wiki/sensing/assets => assets/images}/apriltags-6719c.png (100%) rename wiki/sensing/assets/decawave_example_multi_anchor.png => assets/images/assets_decawave_example_multi_anchor.png (100%) rename wiki/sensing/assets/leica_field_image.jpg => assets/images/assets_leica_field_image.jpg (100%) rename {wiki/planning/assets => assets/images}/astar_h_viz.png (100%) rename {wiki/simulation/assets => assets}/images/autoware_gui.png (100%) rename {wiki/simulation/assets => assets}/images/autoware_map.png (100%) rename {wiki/simulation/assets => assets}/images/autoware_models.png (100%) rename {wiki/simulation/assets => assets}/images/autoware_pkgs.png (100%) rename {wiki/simulation/assets => assets}/images/autoware_plan.png (100%) rename {wiki/simulation/assets => assets}/images/autoware_rviz.png (100%) rename {wiki/simulation/assets => assets}/images/autoware_worlds.png (100%) rename {wiki/machine-learning/assets => assets/images}/bucket_fill.png (100%) rename {wiki/state-estimation/assets => assets/images}/camera-radar-targets.png (100%) rename {wiki/project-management/assets => assets}/images/card-system.png (100%) rename {wiki/simulation/assets => assets}/images/carter.png (100%) rename assets/images/{adv-moveit-manipulator-planning => }/cartesian.png (100%) rename {wiki/state-estimation/assets => assets/images}/carto-1.png (100%) rename {wiki/state-estimation/assets => assets/images}/carto-2.png (100%) rename {wiki/state-estimation/assets => assets/images}/carto-3.jpeg (100%) rename {wiki/state-estimation/assets => assets/images}/carto-4.png (100%) rename {wiki/state-estimation/assets => assets/images}/carto-5.png (100%) rename {wiki/state-estimation/assets => assets/images}/carto-6.png (100%) rename {wiki/planning/assets => assets/images}/cell_traversal.png (100%) rename {wiki/planning/assets => assets/images}/central_planner.png (100%) rename {wiki/planning/assets => assets/images}/clr1.png (100%) rename {wiki/planning/assets => assets/images}/clr2.png (100%) rename {wiki/sensing/assets => assets/images}/cluster.png (100%) rename {wiki/programming/assets => assets/images}/cmake_file_structure.png (100%) rename {wiki/sensing/assets => assets/images}/costmatrix_formation.png (100%) rename {wiki/planning/assets => assets/images}/coverage_planner_event_types.png (100%) rename {wiki/planning/assets => assets/images}/coverage_planner_steps.png (100%) rename {wiki/sensing/assets => assets/images}/cropped.png (100%) rename {wiki/sensing/assets => assets/images}/datacapture.png (100%) rename {wiki/tools/assets => assets/images}/debug1.jpeg (100%) rename {wiki/tools/assets => assets/images}/debug2.jpeg (100%) rename {wiki/tools/assets => assets/images}/debug3.jpeg (100%) rename {wiki/state-estimation/assets => assets/images}/decawave_example_multi_anchor.png (100%) rename {wiki/tools/assets => assets/images}/deltaviz.jpg (100%) rename {wiki/sensing/assets => assets/images}/detection_sort_output.png (100%) rename {wiki/machine-learning/assets => assets/images}/diffusion_policy_diagram.png (100%) rename {wiki/sensing/assets => assets/images}/distance.png (100%) rename {wiki/common-platforms/assets => assets/images}/docker_socket.png (100%) rename {wiki/sensing/assets => assets/images}/downsampled.png (100%) rename assets/images/{robotics_project_guide => }/drone_image.png (100%) rename {wiki/sensing/assets => assets/images}/drtls_app.png (100%) rename {wiki/sensing/assets => assets/images}/drtls_ids.png (100%) rename {wiki/sensing/assets => assets/images}/dwm_arch.png (100%) rename assets/images/{robotics_project_guide => }/f1tenth.jpg (100%) rename {wiki/planning/assets => assets/images}/f_path.png (100%) rename {wiki/common-platforms/assets => assets/images}/form_factor.png (100%) rename assets/images/{robotics_project_guide => }/gazebo_sim.png (100%) rename {wiki/sensing/assets => assets/images}/gdop_example.png (100%) rename assets/images/{robotics_project_guide => }/go2_image.jpg (100%) rename assets/images/{robotics_project_guide => }/go2_package.png (100%) rename {wiki/math/assets => assets/images}/gpConnection.png (100%) rename {wiki/sensing/assets => assets/images}/gps1.png (100%) rename {wiki/sensing/assets => assets/images}/gps2.png (100%) rename {wiki/sensing/assets => assets/images}/gps3.png (100%) rename {wiki/sensing/assets => assets/images}/gps4.png (100%) rename {wiki/sensing/assets => assets/images}/hsv_img.png (100%) rename _templates/assets/images/Hk47portrait-298x300.jpg => assets/images/images_Hk47portrait-298x300.jpg (100%) rename {wiki/state-estimation/assets => assets/images}/ipm_two.png (100%) rename {wiki/simulation/assets => assets}/images/isaac_simpleroom.png (100%) rename assets/images/{robotics_project_guide => }/isaaclab_sim.jpg (100%) rename {wiki/project-management/assets => assets}/images/jira_burndown_chart.png (100%) rename {wiki/sensing/assets => assets/images}/kinect.jpg (100%) rename {wiki/sensing/assets => assets/images}/leica_360_prism.jpeg (100%) rename {wiki/state-estimation/assets => assets/images}/leica_field_image.jpg (100%) rename {wiki/planning/assets => assets/images}/lt_controller.png (100%) rename {wiki/machine-learning/assets => assets/images}/manage_layers.png (100%) rename assets/images/{robotics_project_guide => }/manipulators_all.png (100%) rename {wiki/state-estimation/assets => assets/images}/marvelmind_example.jpg (100%) rename {wiki/machine-learning/assets => assets/images}/mask_annotation.png (100%) rename {wiki/machine-learning/assets => assets/images}/mediapipe_platforms.png (100%) rename {wiki/machine-learning/assets => assets/images}/mediapipe_solutions.png (100%) rename {wiki/project-management/assets => assets}/images/meeting-notes.png (100%) rename {wiki/interfacing/assets => assets}/images/micro-ros-architecture.png (100%) rename {wiki/interfacing/assets => assets}/images/micro-ros-docker.png (100%) rename {wiki/project-management/assets => assets}/images/milestones.png (100%) rename {wiki/planning/assets => assets/images}/mission_exec.png (100%) rename {wiki/math/assets => assets/images}/mixedGaussian.jpg (100%) rename {wiki/planning/assets/MBF => assets/images}/move_base_flex_full.png (100%) rename {wiki/common-platforms/assets => assets/images}/moveit_1.png (100%) rename {wiki/common-platforms/assets => assets/images}/moveit_2.png (100%) rename {wiki/common-platforms/assets => assets/images}/moveit_3.png (100%) rename {wiki/common-platforms/assets => assets/images}/moveit_4.png (100%) rename {wiki/actuation/assets => assets/images}/moveit_setup_assistant_author_information.png (100%) rename {wiki/actuation/assets => assets/images}/moveit_setup_assistant_collision_check.png (100%) rename {wiki/actuation/assets => assets/images}/moveit_setup_assistant_controllers.png (100%) rename {wiki/actuation/assets => assets/images}/moveit_setup_assistant_end.png (100%) rename {wiki/actuation/assets => assets/images}/moveit_setup_assistant_end_effectors.png (100%) rename {wiki/actuation/assets => assets/images}/moveit_setup_assistant_passive_joints.png (100%) rename {wiki/actuation/assets => assets/images}/moveit_setup_assistant_perception.png (100%) rename {wiki/actuation/assets => assets/images}/moveit_setup_assistant_planning_group_kinematic_chain.png (100%) rename {wiki/actuation/assets => assets/images}/moveit_setup_assistant_planning_groups.png (100%) rename {wiki/actuation/assets => assets/images}/moveit_setup_assistant_robot_poses.png (100%) rename {wiki/actuation/assets => assets/images}/moveit_setup_assistant_simulation.png (100%) rename {wiki/actuation/assets => assets/images}/moveit_setup_assistant_start.png (100%) rename {wiki/actuation/assets => assets/images}/moveit_setup_assistant_virtual_joints.png (100%) rename assets/images/{robotics_project_guide => }/mujoco_sim.jpg (100%) rename {wiki/planning/assets => assets/images}/multi_vs_single_query.png (100%) rename {wiki/simulation/assets => assets}/images/nav2.png (100%) rename {wiki/machine-learning/assets => assets/images}/new_layer.png (100%) rename {wiki/sensing/assets => assets/images}/norm_img.png (100%) rename {wiki/sensing/assets => assets/images}/norm_mask.png (100%) rename {wiki/sensing/assets => assets/images}/norm_result.png (100%) rename {wiki/sensing/assets => assets/images}/normalized.png (100%) rename {wiki/computing/assets => assets/images}/nvidia-cuda.png (100%) rename {wiki/computing/assets => assets/images}/nvidia-cudnn.png (100%) rename {wiki/state-estimation/assets => assets/images}/occupancy-grid.png (100%) rename {wiki/project-management/assets => assets}/images/office-hours.png (100%) rename assets/images/{robotics_project_guide => }/openaigym_sim.png (100%) rename {wiki/sensing/assets => assets/images}/original.png (100%) rename {wiki/planning/assets => assets/images}/path_planning.png (100%) rename {wiki/sensing/assets => assets/images}/pavucontrol.png (100%) rename {wiki/sensing/assets => assets/images}/pipeline.png (100%) rename {wiki/planning/assets => assets/images}/planning_intro.png (100%) rename {wiki/planning/assets => assets/images}/prioritised_astar.png (100%) rename {wiki/project-management/assets => assets}/images/project-schedule.png (100%) rename assets/images/{robotics_project_guide => }/pybullet_sim.png (100%) rename assets/images/{robotics_project_guide => }/quadrotors_all.png (100%) rename assets/images/{robotics_project_guide => }/quadrupeds_all.png (100%) rename {wiki/sensing/assets => assets/images}/ransac1.png (100%) rename {wiki/sensing/assets => assets/images}/ransac2.png (100%) rename {wiki/sensing/assets => assets/images}/realsense.jpg (100%) rename {wiki/simulation/assets => assets}/images/realsense.png (100%) rename {wiki/planning/assets => assets/images}/ref_path.png (100%) rename {wiki/tools/assets => assets/images}/refactor1.png (100%) rename {wiki/tools/assets => assets/images}/refactor2.jpeg (100%) rename {wiki/tools/assets => assets/images}/refactor3.png (100%) rename {wiki/tools/assets => assets/images}/refactor4.png (100%) rename {wiki/sensing/assets => assets/images}/rgb_vector.png (100%) rename assets/images/{robotics_project_guide => }/robot_overview.png (100%) rename {wiki/interfacing/assets => assets}/images/ros-bridge.png (100%) rename assets/images/{adv-moveit-manipulator-planning => }/rrtstar.png (100%) rename {wiki/machine-learning/assets => assets/images}/select_tool.png (100%) rename {wiki/state-estimation/assets => assets/images}/servoing-action.png (100%) rename assets/images/{adv-moveit-manipulator-planning => }/simulation_testing.png (100%) rename {wiki/sensing/assets => assets/images}/slam.png (100%) rename {wiki/state-estimation/assets => assets/images}/sort-tracker.jpg (100%) rename {wiki/sensing/assets => assets/images}/stag_exposure.gif (100%) rename assets/images/{robotics_project_guide => }/state_machine.png (100%) rename {wiki/actuation/assets => assets/images}/steer-by-wire.png (100%) rename {wiki/machine-learning/assets => assets/images}/system1system2.png (100%) rename {wiki/project-management/assets => assets}/images/task-list.png (100%) rename {wiki/actuation/assets => assets/images}/throttle-by-wire.png (100%) rename {wiki/sensing/assets => assets/images}/tracking_results.png (100%) rename {wiki/planning/assets => assets/images}/trapezoid_decomposition.png (100%) rename assets/images/{robotics_project_guide => }/turtlebot3.png (100%) rename {wiki/math/assets => assets/images}/uncertainty.png (100%) rename {wiki/common-platforms/assets => assets/images}/unitree_side.png (100%) rename {wiki/common-platforms/assets => assets/images}/unitree_top.png (100%) rename assets/images/{robotics_project_guide => }/unity_sim.png (100%) rename assets/images/{robotics_project_guide => }/urdf_to_sim.png (100%) rename assets/images/{adv-moveit-manipulator-planning => }/vader_planning_seq.png (100%) rename {wiki/planning/assets => assets/images}/velocity_obstacles.png (100%) rename {wiki/tools/assets => assets/images}/vscode1.png (100%) rename {wiki/tools/assets => assets/images}/vscode10.png (100%) rename {wiki/tools/assets => assets/images}/vscode11.png (100%) rename {wiki/tools/assets => assets/images}/vscode12.png (100%) rename {wiki/tools/assets => assets/images}/vscode13.png (100%) rename {wiki/tools/assets => assets/images}/vscode14.png (100%) rename {wiki/tools/assets => assets/images}/vscode2.png (100%) rename {wiki/tools/assets => assets/images}/vscode3.png (100%) rename {wiki/tools/assets => assets/images}/vscode4.png (100%) rename {wiki/tools/assets => assets/images}/vscode5.png (100%) rename {wiki/tools/assets => assets/images}/vscode6.png (100%) rename {wiki/tools/assets => assets/images}/vscode7.png (100%) rename {wiki/tools/assets => assets/images}/vscode8.png (100%) rename {wiki/tools/assets => assets/images}/vscode9.png (100%) rename assets/images/{robotics_project_guide => }/wheeled_robot_image.png (100%) rename assets/images/{robotics_project_guide => }/wheeled_robots_all.png (100%) rename {wiki/common-platforms/assets => assets/images}/wired.png (100%) rename {wiki/common-platforms/assets => assets/images}/wireless.png (100%) rename {wiki/machine-learning/assets => assets/images}/yolo_demo.png (100%) rename {wiki/machine-learning/assets => assets/images}/yolov5_onnx_input.png (100%) rename {wiki/machine-learning/assets => assets/images}/yolov5_onnx_output.png (100%) rename {wiki/sensing/assets => assets/images}/zoom1.png (100%) rename {wiki/sensing/assets => assets/images}/zoom2.png (100%) diff --git a/_templates/template.md b/_templates/template.md index 41bc280f..482c9d03 100644 --- a/_templates/template.md +++ b/_templates/template.md @@ -80,7 +80,7 @@ $$ \frac{1}{n^{2}} $$ #### Images and Video Images and embedded video are supported. -![Put a relevant caption here](assets/images/Hk47portrait-298x300.jpg) +![Put a relevant caption here](/assets/images/images_Hk47portrait-298x300.jpg) {% include video id="8P9geWwi9e0" provider="youtube" %} diff --git a/wiki/planning/assets/2dwr1.png b/assets/images/2dwr1.png similarity index 100% rename from wiki/planning/assets/2dwr1.png rename to assets/images/2dwr1.png diff --git a/wiki/fabrication/assets/3DPrinters-10477.png b/assets/images/3DPrinters-10477.png similarity index 100% rename from wiki/fabrication/assets/3DPrinters-10477.png rename to assets/images/3DPrinters-10477.png diff --git a/wiki/fabrication/assets/3DPrinters-a3389.png b/assets/images/3DPrinters-a3389.png similarity index 100% rename from wiki/fabrication/assets/3DPrinters-a3389.png rename to assets/images/3DPrinters-a3389.png diff --git a/wiki/sensing/assets/AdafruitGPS-69ceb.png b/assets/images/AdafruitGPS-69ceb.png similarity index 100% rename from wiki/sensing/assets/AdafruitGPS-69ceb.png rename to assets/images/AdafruitGPS-69ceb.png diff --git a/wiki/sensing/assets/AdafruitGPS-c715f.png b/assets/images/AdafruitGPS-c715f.png similarity index 100% rename from wiki/sensing/assets/AdafruitGPS-c715f.png rename to assets/images/AdafruitGPS-c715f.png diff --git a/wiki/state-estimation/assets/AdaptiveMonteCarloLocalization-0d322.png b/assets/images/AdaptiveMonteCarloLocalization-0d322.png similarity index 100% rename from wiki/state-estimation/assets/AdaptiveMonteCarloLocalization-0d322.png rename to assets/images/AdaptiveMonteCarloLocalization-0d322.png diff --git a/wiki/state-estimation/assets/AdaptiveMonteCarloLocalization-65e37.png b/assets/images/AdaptiveMonteCarloLocalization-65e37.png similarity index 100% rename from wiki/state-estimation/assets/AdaptiveMonteCarloLocalization-65e37.png rename to assets/images/AdaptiveMonteCarloLocalization-65e37.png diff --git a/wiki/tools/assets/AltiumCircuitmaker-1caa4.png b/assets/images/AltiumCircuitmaker-1caa4.png similarity index 100% rename from wiki/tools/assets/AltiumCircuitmaker-1caa4.png rename to assets/images/AltiumCircuitmaker-1caa4.png diff --git a/wiki/tools/assets/AltiumCircuitmaker-3f756.png b/assets/images/AltiumCircuitmaker-3f756.png similarity index 100% rename from wiki/tools/assets/AltiumCircuitmaker-3f756.png rename to assets/images/AltiumCircuitmaker-3f756.png diff --git a/wiki/tools/assets/AltiumCircuitmaker-4b425.png b/assets/images/AltiumCircuitmaker-4b425.png similarity index 100% rename from wiki/tools/assets/AltiumCircuitmaker-4b425.png rename to assets/images/AltiumCircuitmaker-4b425.png diff --git a/wiki/tools/assets/AltiumCircuitmaker-78555.png b/assets/images/AltiumCircuitmaker-78555.png similarity index 100% rename from wiki/tools/assets/AltiumCircuitmaker-78555.png rename to assets/images/AltiumCircuitmaker-78555.png diff --git a/wiki/tools/assets/AltiumCircuitmaker-8aecd.png b/assets/images/AltiumCircuitmaker-8aecd.png similarity index 100% rename from wiki/tools/assets/AltiumCircuitmaker-8aecd.png rename to assets/images/AltiumCircuitmaker-8aecd.png diff --git a/wiki/tools/assets/AltiumCircuitmaker-e83b9.png b/assets/images/AltiumCircuitmaker-e83b9.png similarity index 100% rename from wiki/tools/assets/AltiumCircuitmaker-e83b9.png rename to assets/images/AltiumCircuitmaker-e83b9.png diff --git a/wiki/tools/assets/AltiumCircuitmaker-f5782.png b/assets/images/AltiumCircuitmaker-f5782.png similarity index 100% rename from wiki/tools/assets/AltiumCircuitmaker-f5782.png rename to assets/images/AltiumCircuitmaker-f5782.png diff --git a/wiki/tools/assets/AltiumCircuitmaker-fcf01.png b/assets/images/AltiumCircuitmaker-fcf01.png similarity index 100% rename from wiki/tools/assets/AltiumCircuitmaker-fcf01.png rename to assets/images/AltiumCircuitmaker-fcf01.png diff --git a/wiki/computing/assets/Arduino-2369d.png b/assets/images/Arduino-2369d.png similarity index 100% rename from wiki/computing/assets/Arduino-2369d.png rename to assets/images/Arduino-2369d.png diff --git a/wiki/computing/assets/Arduino-c30e6.png b/assets/images/Arduino-c30e6.png similarity index 100% rename from wiki/computing/assets/Arduino-c30e6.png rename to assets/images/Arduino-c30e6.png diff --git a/wiki/computing/assets/Arduino-d9b3f.png b/assets/images/Arduino-d9b3f.png similarity index 100% rename from wiki/computing/assets/Arduino-d9b3f.png rename to assets/images/Arduino-d9b3f.png diff --git a/wiki/computing/assets/Arduino-de522.png b/assets/images/Arduino-de522.png similarity index 100% rename from wiki/computing/assets/Arduino-de522.png rename to assets/images/Arduino-de522.png diff --git a/wiki/programming/assets/BoostLibrary-f962f.png b/assets/images/BoostLibrary-f962f.png similarity index 100% rename from wiki/programming/assets/BoostLibrary-f962f.png rename to assets/images/BoostLibrary-f962f.png diff --git a/wiki/system-design-development/assets/CableManagement-654ae.png b/assets/images/CableManagement-654ae.png similarity index 100% rename from wiki/system-design-development/assets/CableManagement-654ae.png rename to assets/images/CableManagement-654ae.png diff --git a/wiki/system-design-development/assets/CableManagement-6f4d5.png b/assets/images/CableManagement-6f4d5.png similarity index 100% rename from wiki/system-design-development/assets/CableManagement-6f4d5.png rename to assets/images/CableManagement-6f4d5.png diff --git a/wiki/system-design-development/assets/CableManagement-b3a03.png b/assets/images/CableManagement-b3a03.png similarity index 100% rename from wiki/system-design-development/assets/CableManagement-b3a03.png rename to assets/images/CableManagement-b3a03.png diff --git a/wiki/system-design-development/assets/CableManagement-c5b3a.png b/assets/images/CableManagement-c5b3a.png similarity index 100% rename from wiki/system-design-development/assets/CableManagement-c5b3a.png rename to assets/images/CableManagement-c5b3a.png diff --git a/assets/images/robotics_project_guide/CoppeliaSim_sim.jpg b/assets/images/CoppeliaSim_sim.jpg similarity index 100% rename from assets/images/robotics_project_guide/CoppeliaSim_sim.jpg rename to assets/images/CoppeliaSim_sim.jpg diff --git a/wiki/sensing/assets/Data_capture.png b/assets/images/Data_capture.png similarity index 100% rename from wiki/sensing/assets/Data_capture.png rename to assets/images/Data_capture.png diff --git a/wiki/sensing/assets/DelphiESRRadar-8394b.png b/assets/images/DelphiESRRadar-8394b.png similarity index 100% rename from wiki/sensing/assets/DelphiESRRadar-8394b.png rename to assets/images/DelphiESRRadar-8394b.png diff --git a/wiki/sensing/assets/DelphiESRRadar-eba02.png b/assets/images/DelphiESRRadar-eba02.png similarity index 100% rename from wiki/sensing/assets/DelphiESRRadar-eba02.png rename to assets/images/DelphiESRRadar-eba02.png diff --git a/wiki/programming/assets/EigenLibrary-35715.png b/assets/images/EigenLibrary-35715.png similarity index 100% rename from wiki/programming/assets/EigenLibrary-35715.png rename to assets/images/EigenLibrary-35715.png diff --git a/wiki/machine-learning/assets/Gr00t.png b/assets/images/Gr00t.png similarity index 100% rename from wiki/machine-learning/assets/Gr00t.png rename to assets/images/Gr00t.png diff --git a/wiki/sensing/assets/HD_map.png b/assets/images/HD_map.png similarity index 100% rename from wiki/sensing/assets/HD_map.png rename to assets/images/HD_map.png diff --git a/wiki/state-estimation/assets/IntraFace-6b43f.png b/assets/images/IntraFace-6b43f.png similarity index 100% rename from wiki/state-estimation/assets/IntraFace-6b43f.png rename to assets/images/IntraFace-6b43f.png diff --git a/wiki/common-platforms/assets/KHEPERA4.png b/assets/images/KHEPERA4.png similarity index 100% rename from wiki/common-platforms/assets/KHEPERA4.png rename to assets/images/KHEPERA4.png diff --git a/wiki/machine-learning/assets/NLP_image1.png b/assets/images/NLP_image1.png similarity index 100% rename from wiki/machine-learning/assets/NLP_image1.png rename to assets/images/NLP_image1.png diff --git a/wiki/machine-learning/assets/NLP_image2.png b/assets/images/NLP_image2.png similarity index 100% rename from wiki/machine-learning/assets/NLP_image2.png rename to assets/images/NLP_image2.png diff --git a/wiki/machine-learning/assets/NLP_image3.png b/assets/images/NLP_image3.png similarity index 100% rename from wiki/machine-learning/assets/NLP_image3.png rename to assets/images/NLP_image3.png diff --git a/wiki/machine-learning/assets/NLP_image4.png b/assets/images/NLP_image4.png similarity index 100% rename from wiki/machine-learning/assets/NLP_image4.png rename to assets/images/NLP_image4.png diff --git a/wiki/system-design-development/assets/PCBDesignNotes-05e85.png b/assets/images/PCBDesignNotes-05e85.png similarity index 100% rename from wiki/system-design-development/assets/PCBDesignNotes-05e85.png rename to assets/images/PCBDesignNotes-05e85.png diff --git a/wiki/system-design-development/assets/PCBDesignNotes-09baf.png b/assets/images/PCBDesignNotes-09baf.png similarity index 100% rename from wiki/system-design-development/assets/PCBDesignNotes-09baf.png rename to assets/images/PCBDesignNotes-09baf.png diff --git a/wiki/system-design-development/assets/PCBDesignNotes-8fedc.png b/assets/images/PCBDesignNotes-8fedc.png similarity index 100% rename from wiki/system-design-development/assets/PCBDesignNotes-8fedc.png rename to assets/images/PCBDesignNotes-8fedc.png diff --git a/wiki/system-design-development/assets/PCBDesignNotes-d5ba2.png b/assets/images/PCBDesignNotes-d5ba2.png similarity index 100% rename from wiki/system-design-development/assets/PCBDesignNotes-d5ba2.png rename to assets/images/PCBDesignNotes-d5ba2.png diff --git a/wiki/tools/assets/PyQt-final.png b/assets/images/PyQt-final.png similarity index 100% rename from wiki/tools/assets/PyQt-final.png rename to assets/images/PyQt-final.png diff --git a/wiki/tools/assets/PyQt-green.png b/assets/images/PyQt-green.png similarity index 100% rename from wiki/tools/assets/PyQt-green.png rename to assets/images/PyQt-green.png diff --git a/wiki/tools/assets/PyQt-init.png b/assets/images/PyQt-init.png similarity index 100% rename from wiki/tools/assets/PyQt-init.png rename to assets/images/PyQt-init.png diff --git a/wiki/tools/assets/PyQt-logs.png b/assets/images/PyQt-logs.png similarity index 100% rename from wiki/tools/assets/PyQt-logs.png rename to assets/images/PyQt-logs.png diff --git a/wiki/tools/assets/PyQt-orange.png b/assets/images/PyQt-orange.png similarity index 100% rename from wiki/tools/assets/PyQt-orange.png rename to assets/images/PyQt-orange.png diff --git a/wiki/tools/assets/PyQt-red.png b/assets/images/PyQt-red.png similarity index 100% rename from wiki/tools/assets/PyQt-red.png rename to assets/images/PyQt-red.png diff --git a/wiki/tools/assets/PyQt-yellow.png b/assets/images/PyQt-yellow.png similarity index 100% rename from wiki/tools/assets/PyQt-yellow.png rename to assets/images/PyQt-yellow.png diff --git a/wiki/tools/assets/Qtcreator-ros-new-project-class-menu.png b/assets/images/Qtcreator-ros-new-project-class-menu.png similarity index 100% rename from wiki/tools/assets/Qtcreator-ros-new-project-class-menu.png rename to assets/images/Qtcreator-ros-new-project-class-menu.png diff --git a/wiki/tools/assets/Qtcreator-ros-new-project-design.png b/assets/images/Qtcreator-ros-new-project-design.png similarity index 100% rename from wiki/tools/assets/Qtcreator-ros-new-project-design.png rename to assets/images/Qtcreator-ros-new-project-design.png diff --git a/wiki/tools/assets/Qtcreator-ros-new-project-edit-text.png b/assets/images/Qtcreator-ros-new-project-edit-text.png similarity index 100% rename from wiki/tools/assets/Qtcreator-ros-new-project-edit-text.png rename to assets/images/Qtcreator-ros-new-project-edit-text.png diff --git a/wiki/tools/assets/Qtcreator-ros-new-project-kit.png b/assets/images/Qtcreator-ros-new-project-kit.png similarity index 100% rename from wiki/tools/assets/Qtcreator-ros-new-project-kit.png rename to assets/images/Qtcreator-ros-new-project-kit.png diff --git a/wiki/tools/assets/Qtcreator-ros-new-project-menu.png b/assets/images/Qtcreator-ros-new-project-menu.png similarity index 100% rename from wiki/tools/assets/Qtcreator-ros-new-project-menu.png rename to assets/images/Qtcreator-ros-new-project-menu.png diff --git a/wiki/tools/assets/Qtcreator-ros-new-project-run.png b/assets/images/Qtcreator-ros-new-project-run.png similarity index 100% rename from wiki/tools/assets/Qtcreator-ros-new-project-run.png rename to assets/images/Qtcreator-ros-new-project-run.png diff --git a/wiki/tools/assets/Qtcreator-ros-new-project-run2.png b/assets/images/Qtcreator-ros-new-project-run2.png similarity index 100% rename from wiki/tools/assets/Qtcreator-ros-new-project-run2.png rename to assets/images/Qtcreator-ros-new-project-run2.png diff --git a/wiki/tools/assets/Qtcreator-ros-new-project-ui-elements.png b/assets/images/Qtcreator-ros-new-project-ui-elements.png similarity index 100% rename from wiki/tools/assets/Qtcreator-ros-new-project-ui-elements.png rename to assets/images/Qtcreator-ros-new-project-ui-elements.png diff --git a/wiki/tools/assets/Qtcreator-ros-new-project-ui-obj-rename.png b/assets/images/Qtcreator-ros-new-project-ui-obj-rename.png similarity index 100% rename from wiki/tools/assets/Qtcreator-ros-new-project-ui-obj-rename.png rename to assets/images/Qtcreator-ros-new-project-ui-obj-rename.png diff --git a/wiki/tools/assets/Qtcreator-ros-new-project-ui-obj.png b/assets/images/Qtcreator-ros-new-project-ui-obj.png similarity index 100% rename from wiki/tools/assets/Qtcreator-ros-new-project-ui-obj.png rename to assets/images/Qtcreator-ros-new-project-ui-obj.png diff --git a/wiki/tools/assets/Qtcreator-ros-new-project.png b/assets/images/Qtcreator-ros-new-project.png similarity index 100% rename from wiki/tools/assets/Qtcreator-ros-new-project.png rename to assets/images/Qtcreator-ros-new-project.png diff --git a/wiki/state-estimation/assets/ROSCostMaps-2dba7.png b/assets/images/ROSCostMaps-2dba7.png similarity index 100% rename from wiki/state-estimation/assets/ROSCostMaps-2dba7.png rename to assets/images/ROSCostMaps-2dba7.png diff --git a/wiki/state-estimation/assets/ROSCostMaps-8c746.png b/assets/images/ROSCostMaps-8c746.png similarity index 100% rename from wiki/state-estimation/assets/ROSCostMaps-8c746.png rename to assets/images/ROSCostMaps-8c746.png diff --git a/wiki/state-estimation/assets/ROSCostMaps-90ce8.png b/assets/images/ROSCostMaps-90ce8.png similarity index 100% rename from wiki/state-estimation/assets/ROSCostMaps-90ce8.png rename to assets/images/ROSCostMaps-90ce8.png diff --git a/wiki/state-estimation/assets/ROSCostMaps-fad65.png b/assets/images/ROSCostMaps-fad65.png similarity index 100% rename from wiki/state-estimation/assets/ROSCostMaps-fad65.png rename to assets/images/ROSCostMaps-fad65.png diff --git a/wiki/programming/assets/ROSDistributed-1b70c.png b/assets/images/ROSDistributed-1b70c.png similarity index 100% rename from wiki/programming/assets/ROSDistributed-1b70c.png rename to assets/images/ROSDistributed-1b70c.png diff --git a/wiki/state-estimation/assets/ROSNavigation-72039.png b/assets/images/ROSNavigation-72039.png similarity index 100% rename from wiki/state-estimation/assets/ROSNavigation-72039.png rename to assets/images/ROSNavigation-72039.png diff --git a/wiki/state-estimation/assets/ROSNavigation-7d9d1.png b/assets/images/ROSNavigation-7d9d1.png similarity index 100% rename from wiki/state-estimation/assets/ROSNavigation-7d9d1.png rename to assets/images/ROSNavigation-7d9d1.png diff --git a/wiki/state-estimation/assets/ROSNavigation-d06e2.png b/assets/images/ROSNavigation-d06e2.png similarity index 100% rename from wiki/state-estimation/assets/ROSNavigation-d06e2.png rename to assets/images/ROSNavigation-d06e2.png diff --git a/wiki/fabrication/assets/SeriesA_APIKey.jpg b/assets/images/SeriesA_APIKey.jpg similarity index 100% rename from wiki/fabrication/assets/SeriesA_APIKey.jpg rename to assets/images/SeriesA_APIKey.jpg diff --git a/wiki/fabrication/assets/SeriesA_PLA_SP.jpg b/assets/images/SeriesA_PLA_SP.jpg similarity index 100% rename from wiki/fabrication/assets/SeriesA_PLA_SP.jpg rename to assets/images/SeriesA_PLA_SP.jpg diff --git a/wiki/system-design-development/assets/SubsystemInterfaceModeling-4e816.png b/assets/images/SubsystemInterfaceModeling-4e816.png similarity index 100% rename from wiki/system-design-development/assets/SubsystemInterfaceModeling-4e816.png rename to assets/images/SubsystemInterfaceModeling-4e816.png diff --git a/wiki/system-design-development/assets/SubsystemInterfaceModeling-7097d.png b/assets/images/SubsystemInterfaceModeling-7097d.png similarity index 100% rename from wiki/system-design-development/assets/SubsystemInterfaceModeling-7097d.png rename to assets/images/SubsystemInterfaceModeling-7097d.png diff --git a/wiki/system-design-development/assets/SubsystemInterfaceModeling-73d8e.png b/assets/images/SubsystemInterfaceModeling-73d8e.png similarity index 100% rename from wiki/system-design-development/assets/SubsystemInterfaceModeling-73d8e.png rename to assets/images/SubsystemInterfaceModeling-73d8e.png diff --git a/wiki/system-design-development/assets/SubsystemInterfaceModeling-8748c.png b/assets/images/SubsystemInterfaceModeling-8748c.png similarity index 100% rename from wiki/system-design-development/assets/SubsystemInterfaceModeling-8748c.png rename to assets/images/SubsystemInterfaceModeling-8748c.png diff --git a/wiki/system-design-development/assets/SubsystemInterfaceModeling-8e94f.png b/assets/images/SubsystemInterfaceModeling-8e94f.png similarity index 100% rename from wiki/system-design-development/assets/SubsystemInterfaceModeling-8e94f.png rename to assets/images/SubsystemInterfaceModeling-8e94f.png diff --git a/wiki/system-design-development/assets/SubsystemInterfaceModeling-fb765.png b/assets/images/SubsystemInterfaceModeling-fb765.png similarity index 100% rename from wiki/system-design-development/assets/SubsystemInterfaceModeling-fb765.png rename to assets/images/SubsystemInterfaceModeling-fb765.png diff --git a/wiki/state-estimation/assets/Tracker-01.PNG b/assets/images/Tracker-01.PNG similarity index 100% rename from wiki/state-estimation/assets/Tracker-01.PNG rename to assets/images/Tracker-01.PNG diff --git a/wiki/state-estimation/assets/Tracker-02.PNG b/assets/images/Tracker-02.PNG similarity index 100% rename from wiki/state-estimation/assets/Tracker-02.PNG rename to assets/images/Tracker-02.PNG diff --git a/wiki/actuation/assets/ULN2003AMotorController-8ee22.png b/assets/images/ULN2003AMotorController-8ee22.png similarity index 100% rename from wiki/actuation/assets/ULN2003AMotorController-8ee22.png rename to assets/images/ULN2003AMotorController-8ee22.png diff --git a/wiki/actuation/assets/UR5e_about_button.jpg b/assets/images/UR5e_about_button.jpg similarity index 100% rename from wiki/actuation/assets/UR5e_about_button.jpg rename to assets/images/UR5e_about_button.jpg diff --git a/wiki/actuation/assets/UR5e_about_page.jpg b/assets/images/UR5e_about_page.jpg similarity index 100% rename from wiki/actuation/assets/UR5e_about_page.jpg rename to assets/images/UR5e_about_page.jpg diff --git a/wiki/actuation/assets/UR5e_bootup.JPG b/assets/images/UR5e_bootup.JPG similarity index 100% rename from wiki/actuation/assets/UR5e_bootup.JPG rename to assets/images/UR5e_bootup.JPG diff --git a/wiki/actuation/assets/UR5e_remote_control.JPG b/assets/images/UR5e_remote_control.JPG similarity index 100% rename from wiki/actuation/assets/UR5e_remote_control.JPG rename to assets/images/UR5e_remote_control.JPG diff --git a/wiki/actuation/assets/UR5e_static_ip.JPG b/assets/images/UR5e_static_ip.JPG similarity index 100% rename from wiki/actuation/assets/UR5e_static_ip.JPG rename to assets/images/UR5e_static_ip.JPG diff --git a/wiki/networking/assets/XbeeProDigiMesh900-1fc56.png b/assets/images/XbeeProDigiMesh900-1fc56.png similarity index 100% rename from wiki/networking/assets/XbeeProDigiMesh900-1fc56.png rename to assets/images/XbeeProDigiMesh900-1fc56.png diff --git a/wiki/planning/assets/MBF/abstract_execution_classes.png b/assets/images/abstract_execution_classes.png similarity index 100% rename from wiki/planning/assets/MBF/abstract_execution_classes.png rename to assets/images/abstract_execution_classes.png diff --git a/wiki/planning/assets/MBF/abstract_navigation_server.png b/assets/images/abstract_navigation_server.png similarity index 100% rename from wiki/planning/assets/MBF/abstract_navigation_server.png rename to assets/images/abstract_navigation_server.png diff --git a/wiki/planning/assets/MBF/abstract_plugin_classes.png b/assets/images/abstract_plugin_classes.png similarity index 100% rename from wiki/planning/assets/MBF/abstract_plugin_classes.png rename to assets/images/abstract_plugin_classes.png diff --git a/assets/images/robotics_project_guide/airsim_sim.png b/assets/images/airsim_sim.png similarity index 100% rename from assets/images/robotics_project_guide/airsim_sim.png rename to assets/images/airsim_sim.png diff --git a/assets/images/robotics_project_guide/all_sim.png b/assets/images/all_sim.png similarity index 100% rename from assets/images/robotics_project_guide/all_sim.png rename to assets/images/all_sim.png diff --git a/wiki/sensing/assets/apriltags-6719c.png b/assets/images/apriltags-6719c.png similarity index 100% rename from wiki/sensing/assets/apriltags-6719c.png rename to assets/images/apriltags-6719c.png diff --git a/wiki/sensing/assets/decawave_example_multi_anchor.png b/assets/images/assets_decawave_example_multi_anchor.png similarity index 100% rename from wiki/sensing/assets/decawave_example_multi_anchor.png rename to assets/images/assets_decawave_example_multi_anchor.png diff --git a/wiki/sensing/assets/leica_field_image.jpg b/assets/images/assets_leica_field_image.jpg similarity index 100% rename from wiki/sensing/assets/leica_field_image.jpg rename to assets/images/assets_leica_field_image.jpg diff --git a/wiki/planning/assets/astar_h_viz.png b/assets/images/astar_h_viz.png similarity index 100% rename from wiki/planning/assets/astar_h_viz.png rename to assets/images/astar_h_viz.png diff --git a/wiki/simulation/assets/images/autoware_gui.png b/assets/images/autoware_gui.png similarity index 100% rename from wiki/simulation/assets/images/autoware_gui.png rename to assets/images/autoware_gui.png diff --git a/wiki/simulation/assets/images/autoware_map.png b/assets/images/autoware_map.png similarity index 100% rename from wiki/simulation/assets/images/autoware_map.png rename to assets/images/autoware_map.png diff --git a/wiki/simulation/assets/images/autoware_models.png b/assets/images/autoware_models.png similarity index 100% rename from wiki/simulation/assets/images/autoware_models.png rename to assets/images/autoware_models.png diff --git a/wiki/simulation/assets/images/autoware_pkgs.png b/assets/images/autoware_pkgs.png similarity index 100% rename from wiki/simulation/assets/images/autoware_pkgs.png rename to assets/images/autoware_pkgs.png diff --git a/wiki/simulation/assets/images/autoware_plan.png b/assets/images/autoware_plan.png similarity index 100% rename from wiki/simulation/assets/images/autoware_plan.png rename to assets/images/autoware_plan.png diff --git a/wiki/simulation/assets/images/autoware_rviz.png b/assets/images/autoware_rviz.png similarity index 100% rename from wiki/simulation/assets/images/autoware_rviz.png rename to assets/images/autoware_rviz.png diff --git a/wiki/simulation/assets/images/autoware_worlds.png b/assets/images/autoware_worlds.png similarity index 100% rename from wiki/simulation/assets/images/autoware_worlds.png rename to assets/images/autoware_worlds.png diff --git a/wiki/machine-learning/assets/bucket_fill.png b/assets/images/bucket_fill.png similarity index 100% rename from wiki/machine-learning/assets/bucket_fill.png rename to assets/images/bucket_fill.png diff --git a/wiki/state-estimation/assets/camera-radar-targets.png b/assets/images/camera-radar-targets.png similarity index 100% rename from wiki/state-estimation/assets/camera-radar-targets.png rename to assets/images/camera-radar-targets.png diff --git a/wiki/project-management/assets/images/card-system.png b/assets/images/card-system.png similarity index 100% rename from wiki/project-management/assets/images/card-system.png rename to assets/images/card-system.png diff --git a/wiki/simulation/assets/images/carter.png b/assets/images/carter.png similarity index 100% rename from wiki/simulation/assets/images/carter.png rename to assets/images/carter.png diff --git a/assets/images/adv-moveit-manipulator-planning/cartesian.png b/assets/images/cartesian.png similarity index 100% rename from assets/images/adv-moveit-manipulator-planning/cartesian.png rename to assets/images/cartesian.png diff --git a/wiki/state-estimation/assets/carto-1.png b/assets/images/carto-1.png similarity index 100% rename from wiki/state-estimation/assets/carto-1.png rename to assets/images/carto-1.png diff --git a/wiki/state-estimation/assets/carto-2.png b/assets/images/carto-2.png similarity index 100% rename from wiki/state-estimation/assets/carto-2.png rename to assets/images/carto-2.png diff --git a/wiki/state-estimation/assets/carto-3.jpeg b/assets/images/carto-3.jpeg similarity index 100% rename from wiki/state-estimation/assets/carto-3.jpeg rename to assets/images/carto-3.jpeg diff --git a/wiki/state-estimation/assets/carto-4.png b/assets/images/carto-4.png similarity index 100% rename from wiki/state-estimation/assets/carto-4.png rename to assets/images/carto-4.png diff --git a/wiki/state-estimation/assets/carto-5.png b/assets/images/carto-5.png similarity index 100% rename from wiki/state-estimation/assets/carto-5.png rename to assets/images/carto-5.png diff --git a/wiki/state-estimation/assets/carto-6.png b/assets/images/carto-6.png similarity index 100% rename from wiki/state-estimation/assets/carto-6.png rename to assets/images/carto-6.png diff --git a/wiki/planning/assets/cell_traversal.png b/assets/images/cell_traversal.png similarity index 100% rename from wiki/planning/assets/cell_traversal.png rename to assets/images/cell_traversal.png diff --git a/wiki/planning/assets/central_planner.png b/assets/images/central_planner.png similarity index 100% rename from wiki/planning/assets/central_planner.png rename to assets/images/central_planner.png diff --git a/wiki/planning/assets/clr1.png b/assets/images/clr1.png similarity index 100% rename from wiki/planning/assets/clr1.png rename to assets/images/clr1.png diff --git a/wiki/planning/assets/clr2.png b/assets/images/clr2.png similarity index 100% rename from wiki/planning/assets/clr2.png rename to assets/images/clr2.png diff --git a/wiki/sensing/assets/cluster.png b/assets/images/cluster.png similarity index 100% rename from wiki/sensing/assets/cluster.png rename to assets/images/cluster.png diff --git a/wiki/programming/assets/cmake_file_structure.png b/assets/images/cmake_file_structure.png similarity index 100% rename from wiki/programming/assets/cmake_file_structure.png rename to assets/images/cmake_file_structure.png diff --git a/wiki/sensing/assets/costmatrix_formation.png b/assets/images/costmatrix_formation.png similarity index 100% rename from wiki/sensing/assets/costmatrix_formation.png rename to assets/images/costmatrix_formation.png diff --git a/wiki/planning/assets/coverage_planner_event_types.png b/assets/images/coverage_planner_event_types.png similarity index 100% rename from wiki/planning/assets/coverage_planner_event_types.png rename to assets/images/coverage_planner_event_types.png diff --git a/wiki/planning/assets/coverage_planner_steps.png b/assets/images/coverage_planner_steps.png similarity index 100% rename from wiki/planning/assets/coverage_planner_steps.png rename to assets/images/coverage_planner_steps.png diff --git a/wiki/sensing/assets/cropped.png b/assets/images/cropped.png similarity index 100% rename from wiki/sensing/assets/cropped.png rename to assets/images/cropped.png diff --git a/wiki/sensing/assets/datacapture.png b/assets/images/datacapture.png similarity index 100% rename from wiki/sensing/assets/datacapture.png rename to assets/images/datacapture.png diff --git a/wiki/tools/assets/debug1.jpeg b/assets/images/debug1.jpeg similarity index 100% rename from wiki/tools/assets/debug1.jpeg rename to assets/images/debug1.jpeg diff --git a/wiki/tools/assets/debug2.jpeg b/assets/images/debug2.jpeg similarity index 100% rename from wiki/tools/assets/debug2.jpeg rename to assets/images/debug2.jpeg diff --git a/wiki/tools/assets/debug3.jpeg b/assets/images/debug3.jpeg similarity index 100% rename from wiki/tools/assets/debug3.jpeg rename to assets/images/debug3.jpeg diff --git a/wiki/state-estimation/assets/decawave_example_multi_anchor.png b/assets/images/decawave_example_multi_anchor.png similarity index 100% rename from wiki/state-estimation/assets/decawave_example_multi_anchor.png rename to assets/images/decawave_example_multi_anchor.png diff --git a/wiki/tools/assets/deltaviz.jpg b/assets/images/deltaviz.jpg similarity index 100% rename from wiki/tools/assets/deltaviz.jpg rename to assets/images/deltaviz.jpg diff --git a/wiki/sensing/assets/detection_sort_output.png b/assets/images/detection_sort_output.png similarity index 100% rename from wiki/sensing/assets/detection_sort_output.png rename to assets/images/detection_sort_output.png diff --git a/wiki/machine-learning/assets/diffusion_policy_diagram.png b/assets/images/diffusion_policy_diagram.png similarity index 100% rename from wiki/machine-learning/assets/diffusion_policy_diagram.png rename to assets/images/diffusion_policy_diagram.png diff --git a/wiki/sensing/assets/distance.png b/assets/images/distance.png similarity index 100% rename from wiki/sensing/assets/distance.png rename to assets/images/distance.png diff --git a/wiki/common-platforms/assets/docker_socket.png b/assets/images/docker_socket.png similarity index 100% rename from wiki/common-platforms/assets/docker_socket.png rename to assets/images/docker_socket.png diff --git a/wiki/sensing/assets/downsampled.png b/assets/images/downsampled.png similarity index 100% rename from wiki/sensing/assets/downsampled.png rename to assets/images/downsampled.png diff --git a/assets/images/robotics_project_guide/drone_image.png b/assets/images/drone_image.png similarity index 100% rename from assets/images/robotics_project_guide/drone_image.png rename to assets/images/drone_image.png diff --git a/wiki/sensing/assets/drtls_app.png b/assets/images/drtls_app.png similarity index 100% rename from wiki/sensing/assets/drtls_app.png rename to assets/images/drtls_app.png diff --git a/wiki/sensing/assets/drtls_ids.png b/assets/images/drtls_ids.png similarity index 100% rename from wiki/sensing/assets/drtls_ids.png rename to assets/images/drtls_ids.png diff --git a/wiki/sensing/assets/dwm_arch.png b/assets/images/dwm_arch.png similarity index 100% rename from wiki/sensing/assets/dwm_arch.png rename to assets/images/dwm_arch.png diff --git a/assets/images/robotics_project_guide/f1tenth.jpg b/assets/images/f1tenth.jpg similarity index 100% rename from assets/images/robotics_project_guide/f1tenth.jpg rename to assets/images/f1tenth.jpg diff --git a/wiki/planning/assets/f_path.png b/assets/images/f_path.png similarity index 100% rename from wiki/planning/assets/f_path.png rename to assets/images/f_path.png diff --git a/wiki/common-platforms/assets/form_factor.png b/assets/images/form_factor.png similarity index 100% rename from wiki/common-platforms/assets/form_factor.png rename to assets/images/form_factor.png diff --git a/assets/images/robotics_project_guide/gazebo_sim.png b/assets/images/gazebo_sim.png similarity index 100% rename from assets/images/robotics_project_guide/gazebo_sim.png rename to assets/images/gazebo_sim.png diff --git a/wiki/sensing/assets/gdop_example.png b/assets/images/gdop_example.png similarity index 100% rename from wiki/sensing/assets/gdop_example.png rename to assets/images/gdop_example.png diff --git a/assets/images/robotics_project_guide/go2_image.jpg b/assets/images/go2_image.jpg similarity index 100% rename from assets/images/robotics_project_guide/go2_image.jpg rename to assets/images/go2_image.jpg diff --git a/assets/images/robotics_project_guide/go2_package.png b/assets/images/go2_package.png similarity index 100% rename from assets/images/robotics_project_guide/go2_package.png rename to assets/images/go2_package.png diff --git a/wiki/math/assets/gpConnection.png b/assets/images/gpConnection.png similarity index 100% rename from wiki/math/assets/gpConnection.png rename to assets/images/gpConnection.png diff --git a/wiki/sensing/assets/gps1.png b/assets/images/gps1.png similarity index 100% rename from wiki/sensing/assets/gps1.png rename to assets/images/gps1.png diff --git a/wiki/sensing/assets/gps2.png b/assets/images/gps2.png similarity index 100% rename from wiki/sensing/assets/gps2.png rename to assets/images/gps2.png diff --git a/wiki/sensing/assets/gps3.png b/assets/images/gps3.png similarity index 100% rename from wiki/sensing/assets/gps3.png rename to assets/images/gps3.png diff --git a/wiki/sensing/assets/gps4.png b/assets/images/gps4.png similarity index 100% rename from wiki/sensing/assets/gps4.png rename to assets/images/gps4.png diff --git a/wiki/sensing/assets/hsv_img.png b/assets/images/hsv_img.png similarity index 100% rename from wiki/sensing/assets/hsv_img.png rename to assets/images/hsv_img.png diff --git a/_templates/assets/images/Hk47portrait-298x300.jpg b/assets/images/images_Hk47portrait-298x300.jpg similarity index 100% rename from _templates/assets/images/Hk47portrait-298x300.jpg rename to assets/images/images_Hk47portrait-298x300.jpg diff --git a/wiki/state-estimation/assets/ipm_two.png b/assets/images/ipm_two.png similarity index 100% rename from wiki/state-estimation/assets/ipm_two.png rename to assets/images/ipm_two.png diff --git a/wiki/simulation/assets/images/isaac_simpleroom.png b/assets/images/isaac_simpleroom.png similarity index 100% rename from wiki/simulation/assets/images/isaac_simpleroom.png rename to assets/images/isaac_simpleroom.png diff --git a/assets/images/robotics_project_guide/isaaclab_sim.jpg b/assets/images/isaaclab_sim.jpg similarity index 100% rename from assets/images/robotics_project_guide/isaaclab_sim.jpg rename to assets/images/isaaclab_sim.jpg diff --git a/wiki/project-management/assets/images/jira_burndown_chart.png b/assets/images/jira_burndown_chart.png similarity index 100% rename from wiki/project-management/assets/images/jira_burndown_chart.png rename to assets/images/jira_burndown_chart.png diff --git a/wiki/sensing/assets/kinect.jpg b/assets/images/kinect.jpg similarity index 100% rename from wiki/sensing/assets/kinect.jpg rename to assets/images/kinect.jpg diff --git a/wiki/sensing/assets/leica_360_prism.jpeg b/assets/images/leica_360_prism.jpeg similarity index 100% rename from wiki/sensing/assets/leica_360_prism.jpeg rename to assets/images/leica_360_prism.jpeg diff --git a/wiki/state-estimation/assets/leica_field_image.jpg b/assets/images/leica_field_image.jpg similarity index 100% rename from wiki/state-estimation/assets/leica_field_image.jpg rename to assets/images/leica_field_image.jpg diff --git a/wiki/planning/assets/lt_controller.png b/assets/images/lt_controller.png similarity index 100% rename from wiki/planning/assets/lt_controller.png rename to assets/images/lt_controller.png diff --git a/wiki/machine-learning/assets/manage_layers.png b/assets/images/manage_layers.png similarity index 100% rename from wiki/machine-learning/assets/manage_layers.png rename to assets/images/manage_layers.png diff --git a/assets/images/robotics_project_guide/manipulators_all.png b/assets/images/manipulators_all.png similarity index 100% rename from assets/images/robotics_project_guide/manipulators_all.png rename to assets/images/manipulators_all.png diff --git a/wiki/state-estimation/assets/marvelmind_example.jpg b/assets/images/marvelmind_example.jpg similarity index 100% rename from wiki/state-estimation/assets/marvelmind_example.jpg rename to assets/images/marvelmind_example.jpg diff --git a/wiki/machine-learning/assets/mask_annotation.png b/assets/images/mask_annotation.png similarity index 100% rename from wiki/machine-learning/assets/mask_annotation.png rename to assets/images/mask_annotation.png diff --git a/wiki/machine-learning/assets/mediapipe_platforms.png b/assets/images/mediapipe_platforms.png similarity index 100% rename from wiki/machine-learning/assets/mediapipe_platforms.png rename to assets/images/mediapipe_platforms.png diff --git a/wiki/machine-learning/assets/mediapipe_solutions.png b/assets/images/mediapipe_solutions.png similarity index 100% rename from wiki/machine-learning/assets/mediapipe_solutions.png rename to assets/images/mediapipe_solutions.png diff --git a/wiki/project-management/assets/images/meeting-notes.png b/assets/images/meeting-notes.png similarity index 100% rename from wiki/project-management/assets/images/meeting-notes.png rename to assets/images/meeting-notes.png diff --git a/wiki/interfacing/assets/images/micro-ros-architecture.png b/assets/images/micro-ros-architecture.png similarity index 100% rename from wiki/interfacing/assets/images/micro-ros-architecture.png rename to assets/images/micro-ros-architecture.png diff --git a/wiki/interfacing/assets/images/micro-ros-docker.png b/assets/images/micro-ros-docker.png similarity index 100% rename from wiki/interfacing/assets/images/micro-ros-docker.png rename to assets/images/micro-ros-docker.png diff --git a/wiki/project-management/assets/images/milestones.png b/assets/images/milestones.png similarity index 100% rename from wiki/project-management/assets/images/milestones.png rename to assets/images/milestones.png diff --git a/wiki/planning/assets/mission_exec.png b/assets/images/mission_exec.png similarity index 100% rename from wiki/planning/assets/mission_exec.png rename to assets/images/mission_exec.png diff --git a/wiki/math/assets/mixedGaussian.jpg b/assets/images/mixedGaussian.jpg similarity index 100% rename from wiki/math/assets/mixedGaussian.jpg rename to assets/images/mixedGaussian.jpg diff --git a/wiki/planning/assets/MBF/move_base_flex_full.png b/assets/images/move_base_flex_full.png similarity index 100% rename from wiki/planning/assets/MBF/move_base_flex_full.png rename to assets/images/move_base_flex_full.png diff --git a/wiki/common-platforms/assets/moveit_1.png b/assets/images/moveit_1.png similarity index 100% rename from wiki/common-platforms/assets/moveit_1.png rename to assets/images/moveit_1.png diff --git a/wiki/common-platforms/assets/moveit_2.png b/assets/images/moveit_2.png similarity index 100% rename from wiki/common-platforms/assets/moveit_2.png rename to assets/images/moveit_2.png diff --git a/wiki/common-platforms/assets/moveit_3.png b/assets/images/moveit_3.png similarity index 100% rename from wiki/common-platforms/assets/moveit_3.png rename to assets/images/moveit_3.png diff --git a/wiki/common-platforms/assets/moveit_4.png b/assets/images/moveit_4.png similarity index 100% rename from wiki/common-platforms/assets/moveit_4.png rename to assets/images/moveit_4.png diff --git a/wiki/actuation/assets/moveit_setup_assistant_author_information.png b/assets/images/moveit_setup_assistant_author_information.png similarity index 100% rename from wiki/actuation/assets/moveit_setup_assistant_author_information.png rename to assets/images/moveit_setup_assistant_author_information.png diff --git a/wiki/actuation/assets/moveit_setup_assistant_collision_check.png b/assets/images/moveit_setup_assistant_collision_check.png similarity index 100% rename from wiki/actuation/assets/moveit_setup_assistant_collision_check.png rename to assets/images/moveit_setup_assistant_collision_check.png diff --git a/wiki/actuation/assets/moveit_setup_assistant_controllers.png b/assets/images/moveit_setup_assistant_controllers.png similarity index 100% rename from wiki/actuation/assets/moveit_setup_assistant_controllers.png rename to assets/images/moveit_setup_assistant_controllers.png diff --git a/wiki/actuation/assets/moveit_setup_assistant_end.png b/assets/images/moveit_setup_assistant_end.png similarity index 100% rename from wiki/actuation/assets/moveit_setup_assistant_end.png rename to assets/images/moveit_setup_assistant_end.png diff --git a/wiki/actuation/assets/moveit_setup_assistant_end_effectors.png b/assets/images/moveit_setup_assistant_end_effectors.png similarity index 100% rename from wiki/actuation/assets/moveit_setup_assistant_end_effectors.png rename to assets/images/moveit_setup_assistant_end_effectors.png diff --git a/wiki/actuation/assets/moveit_setup_assistant_passive_joints.png b/assets/images/moveit_setup_assistant_passive_joints.png similarity index 100% rename from wiki/actuation/assets/moveit_setup_assistant_passive_joints.png rename to assets/images/moveit_setup_assistant_passive_joints.png diff --git a/wiki/actuation/assets/moveit_setup_assistant_perception.png b/assets/images/moveit_setup_assistant_perception.png similarity index 100% rename from wiki/actuation/assets/moveit_setup_assistant_perception.png rename to assets/images/moveit_setup_assistant_perception.png diff --git a/wiki/actuation/assets/moveit_setup_assistant_planning_group_kinematic_chain.png b/assets/images/moveit_setup_assistant_planning_group_kinematic_chain.png similarity index 100% rename from wiki/actuation/assets/moveit_setup_assistant_planning_group_kinematic_chain.png rename to assets/images/moveit_setup_assistant_planning_group_kinematic_chain.png diff --git a/wiki/actuation/assets/moveit_setup_assistant_planning_groups.png b/assets/images/moveit_setup_assistant_planning_groups.png similarity index 100% rename from wiki/actuation/assets/moveit_setup_assistant_planning_groups.png rename to assets/images/moveit_setup_assistant_planning_groups.png diff --git a/wiki/actuation/assets/moveit_setup_assistant_robot_poses.png b/assets/images/moveit_setup_assistant_robot_poses.png similarity index 100% rename from wiki/actuation/assets/moveit_setup_assistant_robot_poses.png rename to assets/images/moveit_setup_assistant_robot_poses.png diff --git a/wiki/actuation/assets/moveit_setup_assistant_simulation.png b/assets/images/moveit_setup_assistant_simulation.png similarity index 100% rename from wiki/actuation/assets/moveit_setup_assistant_simulation.png rename to assets/images/moveit_setup_assistant_simulation.png diff --git a/wiki/actuation/assets/moveit_setup_assistant_start.png b/assets/images/moveit_setup_assistant_start.png similarity index 100% rename from wiki/actuation/assets/moveit_setup_assistant_start.png rename to assets/images/moveit_setup_assistant_start.png diff --git a/wiki/actuation/assets/moveit_setup_assistant_virtual_joints.png b/assets/images/moveit_setup_assistant_virtual_joints.png similarity index 100% rename from wiki/actuation/assets/moveit_setup_assistant_virtual_joints.png rename to assets/images/moveit_setup_assistant_virtual_joints.png diff --git a/assets/images/robotics_project_guide/mujoco_sim.jpg b/assets/images/mujoco_sim.jpg similarity index 100% rename from assets/images/robotics_project_guide/mujoco_sim.jpg rename to assets/images/mujoco_sim.jpg diff --git a/wiki/planning/assets/multi_vs_single_query.png b/assets/images/multi_vs_single_query.png similarity index 100% rename from wiki/planning/assets/multi_vs_single_query.png rename to assets/images/multi_vs_single_query.png diff --git a/wiki/simulation/assets/images/nav2.png b/assets/images/nav2.png similarity index 100% rename from wiki/simulation/assets/images/nav2.png rename to assets/images/nav2.png diff --git a/wiki/machine-learning/assets/new_layer.png b/assets/images/new_layer.png similarity index 100% rename from wiki/machine-learning/assets/new_layer.png rename to assets/images/new_layer.png diff --git a/wiki/sensing/assets/norm_img.png b/assets/images/norm_img.png similarity index 100% rename from wiki/sensing/assets/norm_img.png rename to assets/images/norm_img.png diff --git a/wiki/sensing/assets/norm_mask.png b/assets/images/norm_mask.png similarity index 100% rename from wiki/sensing/assets/norm_mask.png rename to assets/images/norm_mask.png diff --git a/wiki/sensing/assets/norm_result.png b/assets/images/norm_result.png similarity index 100% rename from wiki/sensing/assets/norm_result.png rename to assets/images/norm_result.png diff --git a/wiki/sensing/assets/normalized.png b/assets/images/normalized.png similarity index 100% rename from wiki/sensing/assets/normalized.png rename to assets/images/normalized.png diff --git a/wiki/computing/assets/nvidia-cuda.png b/assets/images/nvidia-cuda.png similarity index 100% rename from wiki/computing/assets/nvidia-cuda.png rename to assets/images/nvidia-cuda.png diff --git a/wiki/computing/assets/nvidia-cudnn.png b/assets/images/nvidia-cudnn.png similarity index 100% rename from wiki/computing/assets/nvidia-cudnn.png rename to assets/images/nvidia-cudnn.png diff --git a/wiki/state-estimation/assets/occupancy-grid.png b/assets/images/occupancy-grid.png similarity index 100% rename from wiki/state-estimation/assets/occupancy-grid.png rename to assets/images/occupancy-grid.png diff --git a/wiki/project-management/assets/images/office-hours.png b/assets/images/office-hours.png similarity index 100% rename from wiki/project-management/assets/images/office-hours.png rename to assets/images/office-hours.png diff --git a/assets/images/robotics_project_guide/openaigym_sim.png b/assets/images/openaigym_sim.png similarity index 100% rename from assets/images/robotics_project_guide/openaigym_sim.png rename to assets/images/openaigym_sim.png diff --git a/wiki/sensing/assets/original.png b/assets/images/original.png similarity index 100% rename from wiki/sensing/assets/original.png rename to assets/images/original.png diff --git a/wiki/planning/assets/path_planning.png b/assets/images/path_planning.png similarity index 100% rename from wiki/planning/assets/path_planning.png rename to assets/images/path_planning.png diff --git a/wiki/sensing/assets/pavucontrol.png b/assets/images/pavucontrol.png similarity index 100% rename from wiki/sensing/assets/pavucontrol.png rename to assets/images/pavucontrol.png diff --git a/wiki/sensing/assets/pipeline.png b/assets/images/pipeline.png similarity index 100% rename from wiki/sensing/assets/pipeline.png rename to assets/images/pipeline.png diff --git a/wiki/planning/assets/planning_intro.png b/assets/images/planning_intro.png similarity index 100% rename from wiki/planning/assets/planning_intro.png rename to assets/images/planning_intro.png diff --git a/wiki/planning/assets/prioritised_astar.png b/assets/images/prioritised_astar.png similarity index 100% rename from wiki/planning/assets/prioritised_astar.png rename to assets/images/prioritised_astar.png diff --git a/wiki/project-management/assets/images/project-schedule.png b/assets/images/project-schedule.png similarity index 100% rename from wiki/project-management/assets/images/project-schedule.png rename to assets/images/project-schedule.png diff --git a/assets/images/robotics_project_guide/pybullet_sim.png b/assets/images/pybullet_sim.png similarity index 100% rename from assets/images/robotics_project_guide/pybullet_sim.png rename to assets/images/pybullet_sim.png diff --git a/assets/images/robotics_project_guide/quadrotors_all.png b/assets/images/quadrotors_all.png similarity index 100% rename from assets/images/robotics_project_guide/quadrotors_all.png rename to assets/images/quadrotors_all.png diff --git a/assets/images/robotics_project_guide/quadrupeds_all.png b/assets/images/quadrupeds_all.png similarity index 100% rename from assets/images/robotics_project_guide/quadrupeds_all.png rename to assets/images/quadrupeds_all.png diff --git a/wiki/sensing/assets/ransac1.png b/assets/images/ransac1.png similarity index 100% rename from wiki/sensing/assets/ransac1.png rename to assets/images/ransac1.png diff --git a/wiki/sensing/assets/ransac2.png b/assets/images/ransac2.png similarity index 100% rename from wiki/sensing/assets/ransac2.png rename to assets/images/ransac2.png diff --git a/wiki/sensing/assets/realsense.jpg b/assets/images/realsense.jpg similarity index 100% rename from wiki/sensing/assets/realsense.jpg rename to assets/images/realsense.jpg diff --git a/wiki/simulation/assets/images/realsense.png b/assets/images/realsense.png similarity index 100% rename from wiki/simulation/assets/images/realsense.png rename to assets/images/realsense.png diff --git a/wiki/planning/assets/ref_path.png b/assets/images/ref_path.png similarity index 100% rename from wiki/planning/assets/ref_path.png rename to assets/images/ref_path.png diff --git a/wiki/tools/assets/refactor1.png b/assets/images/refactor1.png similarity index 100% rename from wiki/tools/assets/refactor1.png rename to assets/images/refactor1.png diff --git a/wiki/tools/assets/refactor2.jpeg b/assets/images/refactor2.jpeg similarity index 100% rename from wiki/tools/assets/refactor2.jpeg rename to assets/images/refactor2.jpeg diff --git a/wiki/tools/assets/refactor3.png b/assets/images/refactor3.png similarity index 100% rename from wiki/tools/assets/refactor3.png rename to assets/images/refactor3.png diff --git a/wiki/tools/assets/refactor4.png b/assets/images/refactor4.png similarity index 100% rename from wiki/tools/assets/refactor4.png rename to assets/images/refactor4.png diff --git a/wiki/sensing/assets/rgb_vector.png b/assets/images/rgb_vector.png similarity index 100% rename from wiki/sensing/assets/rgb_vector.png rename to assets/images/rgb_vector.png diff --git a/assets/images/robotics_project_guide/robot_overview.png b/assets/images/robot_overview.png similarity index 100% rename from assets/images/robotics_project_guide/robot_overview.png rename to assets/images/robot_overview.png diff --git a/wiki/interfacing/assets/images/ros-bridge.png b/assets/images/ros-bridge.png similarity index 100% rename from wiki/interfacing/assets/images/ros-bridge.png rename to assets/images/ros-bridge.png diff --git a/assets/images/adv-moveit-manipulator-planning/rrtstar.png b/assets/images/rrtstar.png similarity index 100% rename from assets/images/adv-moveit-manipulator-planning/rrtstar.png rename to assets/images/rrtstar.png diff --git a/wiki/machine-learning/assets/select_tool.png b/assets/images/select_tool.png similarity index 100% rename from wiki/machine-learning/assets/select_tool.png rename to assets/images/select_tool.png diff --git a/wiki/state-estimation/assets/servoing-action.png b/assets/images/servoing-action.png similarity index 100% rename from wiki/state-estimation/assets/servoing-action.png rename to assets/images/servoing-action.png diff --git a/assets/images/adv-moveit-manipulator-planning/simulation_testing.png b/assets/images/simulation_testing.png similarity index 100% rename from assets/images/adv-moveit-manipulator-planning/simulation_testing.png rename to assets/images/simulation_testing.png diff --git a/wiki/sensing/assets/slam.png b/assets/images/slam.png similarity index 100% rename from wiki/sensing/assets/slam.png rename to assets/images/slam.png diff --git a/wiki/state-estimation/assets/sort-tracker.jpg b/assets/images/sort-tracker.jpg similarity index 100% rename from wiki/state-estimation/assets/sort-tracker.jpg rename to assets/images/sort-tracker.jpg diff --git a/wiki/sensing/assets/stag_exposure.gif b/assets/images/stag_exposure.gif similarity index 100% rename from wiki/sensing/assets/stag_exposure.gif rename to assets/images/stag_exposure.gif diff --git a/assets/images/robotics_project_guide/state_machine.png b/assets/images/state_machine.png similarity index 100% rename from assets/images/robotics_project_guide/state_machine.png rename to assets/images/state_machine.png diff --git a/wiki/actuation/assets/steer-by-wire.png b/assets/images/steer-by-wire.png similarity index 100% rename from wiki/actuation/assets/steer-by-wire.png rename to assets/images/steer-by-wire.png diff --git a/wiki/machine-learning/assets/system1system2.png b/assets/images/system1system2.png similarity index 100% rename from wiki/machine-learning/assets/system1system2.png rename to assets/images/system1system2.png diff --git a/wiki/project-management/assets/images/task-list.png b/assets/images/task-list.png similarity index 100% rename from wiki/project-management/assets/images/task-list.png rename to assets/images/task-list.png diff --git a/wiki/actuation/assets/throttle-by-wire.png b/assets/images/throttle-by-wire.png similarity index 100% rename from wiki/actuation/assets/throttle-by-wire.png rename to assets/images/throttle-by-wire.png diff --git a/wiki/sensing/assets/tracking_results.png b/assets/images/tracking_results.png similarity index 100% rename from wiki/sensing/assets/tracking_results.png rename to assets/images/tracking_results.png diff --git a/wiki/planning/assets/trapezoid_decomposition.png b/assets/images/trapezoid_decomposition.png similarity index 100% rename from wiki/planning/assets/trapezoid_decomposition.png rename to assets/images/trapezoid_decomposition.png diff --git a/assets/images/robotics_project_guide/turtlebot3.png b/assets/images/turtlebot3.png similarity index 100% rename from assets/images/robotics_project_guide/turtlebot3.png rename to assets/images/turtlebot3.png diff --git a/wiki/math/assets/uncertainty.png b/assets/images/uncertainty.png similarity index 100% rename from wiki/math/assets/uncertainty.png rename to assets/images/uncertainty.png diff --git a/wiki/common-platforms/assets/unitree_side.png b/assets/images/unitree_side.png similarity index 100% rename from wiki/common-platforms/assets/unitree_side.png rename to assets/images/unitree_side.png diff --git a/wiki/common-platforms/assets/unitree_top.png b/assets/images/unitree_top.png similarity index 100% rename from wiki/common-platforms/assets/unitree_top.png rename to assets/images/unitree_top.png diff --git a/assets/images/robotics_project_guide/unity_sim.png b/assets/images/unity_sim.png similarity index 100% rename from assets/images/robotics_project_guide/unity_sim.png rename to assets/images/unity_sim.png diff --git a/assets/images/robotics_project_guide/urdf_to_sim.png b/assets/images/urdf_to_sim.png similarity index 100% rename from assets/images/robotics_project_guide/urdf_to_sim.png rename to assets/images/urdf_to_sim.png diff --git a/assets/images/adv-moveit-manipulator-planning/vader_planning_seq.png b/assets/images/vader_planning_seq.png similarity index 100% rename from assets/images/adv-moveit-manipulator-planning/vader_planning_seq.png rename to assets/images/vader_planning_seq.png diff --git a/wiki/planning/assets/velocity_obstacles.png b/assets/images/velocity_obstacles.png similarity index 100% rename from wiki/planning/assets/velocity_obstacles.png rename to assets/images/velocity_obstacles.png diff --git a/wiki/tools/assets/vscode1.png b/assets/images/vscode1.png similarity index 100% rename from wiki/tools/assets/vscode1.png rename to assets/images/vscode1.png diff --git a/wiki/tools/assets/vscode10.png b/assets/images/vscode10.png similarity index 100% rename from wiki/tools/assets/vscode10.png rename to assets/images/vscode10.png diff --git a/wiki/tools/assets/vscode11.png b/assets/images/vscode11.png similarity index 100% rename from wiki/tools/assets/vscode11.png rename to assets/images/vscode11.png diff --git a/wiki/tools/assets/vscode12.png b/assets/images/vscode12.png similarity index 100% rename from wiki/tools/assets/vscode12.png rename to assets/images/vscode12.png diff --git a/wiki/tools/assets/vscode13.png b/assets/images/vscode13.png similarity index 100% rename from wiki/tools/assets/vscode13.png rename to assets/images/vscode13.png diff --git a/wiki/tools/assets/vscode14.png b/assets/images/vscode14.png similarity index 100% rename from wiki/tools/assets/vscode14.png rename to assets/images/vscode14.png diff --git a/wiki/tools/assets/vscode2.png b/assets/images/vscode2.png similarity index 100% rename from wiki/tools/assets/vscode2.png rename to assets/images/vscode2.png diff --git a/wiki/tools/assets/vscode3.png b/assets/images/vscode3.png similarity index 100% rename from wiki/tools/assets/vscode3.png rename to assets/images/vscode3.png diff --git a/wiki/tools/assets/vscode4.png b/assets/images/vscode4.png similarity index 100% rename from wiki/tools/assets/vscode4.png rename to assets/images/vscode4.png diff --git a/wiki/tools/assets/vscode5.png b/assets/images/vscode5.png similarity index 100% rename from wiki/tools/assets/vscode5.png rename to assets/images/vscode5.png diff --git a/wiki/tools/assets/vscode6.png b/assets/images/vscode6.png similarity index 100% rename from wiki/tools/assets/vscode6.png rename to assets/images/vscode6.png diff --git a/wiki/tools/assets/vscode7.png b/assets/images/vscode7.png similarity index 100% rename from wiki/tools/assets/vscode7.png rename to assets/images/vscode7.png diff --git a/wiki/tools/assets/vscode8.png b/assets/images/vscode8.png similarity index 100% rename from wiki/tools/assets/vscode8.png rename to assets/images/vscode8.png diff --git a/wiki/tools/assets/vscode9.png b/assets/images/vscode9.png similarity index 100% rename from wiki/tools/assets/vscode9.png rename to assets/images/vscode9.png diff --git a/assets/images/robotics_project_guide/wheeled_robot_image.png b/assets/images/wheeled_robot_image.png similarity index 100% rename from assets/images/robotics_project_guide/wheeled_robot_image.png rename to assets/images/wheeled_robot_image.png diff --git a/assets/images/robotics_project_guide/wheeled_robots_all.png b/assets/images/wheeled_robots_all.png similarity index 100% rename from assets/images/robotics_project_guide/wheeled_robots_all.png rename to assets/images/wheeled_robots_all.png diff --git a/wiki/common-platforms/assets/wired.png b/assets/images/wired.png similarity index 100% rename from wiki/common-platforms/assets/wired.png rename to assets/images/wired.png diff --git a/wiki/common-platforms/assets/wireless.png b/assets/images/wireless.png similarity index 100% rename from wiki/common-platforms/assets/wireless.png rename to assets/images/wireless.png diff --git a/wiki/machine-learning/assets/yolo_demo.png b/assets/images/yolo_demo.png similarity index 100% rename from wiki/machine-learning/assets/yolo_demo.png rename to assets/images/yolo_demo.png diff --git a/wiki/machine-learning/assets/yolov5_onnx_input.png b/assets/images/yolov5_onnx_input.png similarity index 100% rename from wiki/machine-learning/assets/yolov5_onnx_input.png rename to assets/images/yolov5_onnx_input.png diff --git a/wiki/machine-learning/assets/yolov5_onnx_output.png b/assets/images/yolov5_onnx_output.png similarity index 100% rename from wiki/machine-learning/assets/yolov5_onnx_output.png rename to assets/images/yolov5_onnx_output.png diff --git a/wiki/sensing/assets/zoom1.png b/assets/images/zoom1.png similarity index 100% rename from wiki/sensing/assets/zoom1.png rename to assets/images/zoom1.png diff --git a/wiki/sensing/assets/zoom2.png b/assets/images/zoom2.png similarity index 100% rename from wiki/sensing/assets/zoom2.png rename to assets/images/zoom2.png diff --git a/wiki/actuation/__all_subsections.md b/wiki/actuation/__all_subsections.md index eb582c61..99b4b892 100644 --- a/wiki/actuation/__all_subsections.md +++ b/wiki/actuation/__all_subsections.md @@ -26,7 +26,7 @@ Throttle-by-wire, or accelerate-by-wire, was the first type of drive-by-wire sys As shown in the figure below, With throttle by wire a sensor is attached to the gas pedal and detects how far it has been pressed. This information is then sent down a wire to the car's computer. The computer analyzes the information and commands a motor to open the butterfly in the throttle body. Since the computer is in control of the throttle opening things like idle speed control, cruise control, and traction control can easily be integrated. Because automatic transmissions are also usually controlled by the computer it can adjust the throttle during gear changes. It also allows the addition of eco or sport buttons to change the way the throttle reacts when pressed, increasing fuel economy or throttle response. -![Throttle-by-wire Outline](assets/throttle-by-wire.png) +![Throttle-by-wire Outline](/assets/images/throttle-by-wire.png) ### Brake-by-wire There are two types of brake-by-wire systems. Hydraulic, or "wet," brake-by-wire uses additional hydraulic parts to create pressure on the brakes. Electric, or "dry," brake-by-wire, on the other hand, simply uses an electric motor and no hydraulic brake fluid. @@ -49,7 +49,7 @@ Most vehicles use a rack-and-pinion unit or worm-and-sector steering gear that i As shown in the figure below, in vehicles that are equipped with steer-by-wire technology, there is no physical connection between the steering wheel and the tires. Steer-by-wire systems don't technically need to use steering wheels at all. When a steering wheel is used, some type of steering feel emulator is typically used to provide the driver with feedback. -![Steer-by-wire Outline](assets/steer-by-wire.png) +![Steer-by-wire Outline](/assets/images/steer-by-wire.png) ## Benefits and Drawbacks of Drive-by-wire Systems Some people are excited about the prospect of more drive-by-wire systems in cars. By replacing conventional throttle systems, drive-by-wire systems can significantly reduce the number of moving parts in a vehicle. This reduces weight, increases operational accuracy and stretches out the time between service visits for things like mechanical maintenance and other adjustments. Some by-wire systems wouldn't even require service at all. Less weight and better accuracy would equal better fuel efficiency and fewer emissions, too. @@ -506,55 +506,55 @@ Select “Create New MoveIt Configuration Package” then select the URDF model Once the URDF model is loaded, you will go through the various steps to configure and set up the MoveIt model. Select “Self-Collisions”. You should see the following: -![moveit_setup_assistant_collision](assets/moveit_setup_assistant_collision_check.png) +![moveit_setup_assistant_collision](/assets/images/moveit_setup_assistant_collision_check.png) The best option to choose here is to slide the “Sampling Density” slider all the way to the right to the highest density setting. With this setting, the GUI will compute all pairs of geometries that can collide with each other and pairs that will definitely not. Select “Generate Collision Matrix” to compute the non-colliding geometry pairs of the model. The next option window is the virtual joints window. Here, you would configure a robot link with an external frame of reference that is fixed. In this particular case you can configure the world frame to the world frame as a virtual joint if you want the origin point of the robot arm to be the same as the URDF file. -![moveit_setup_assistant_virtual_joints](assets/moveit_setup_assistant_virtual_joints.png) +![moveit_setup_assistant_virtual_joints](/assets/images/moveit_setup_assistant_virtual_joints.png) The next window is the “Planning Groups” window. Here, you would configure the joint groups of the robot model. There are many ways to go about this, but one method is to create a kinetic chain of joints, given you are working with a serial manipulator arm. -![moveit_setup_assistant_planning_groups](assets/moveit_setup_assistant_planning_groups.png) +![moveit_setup_assistant_planning_groups](/assets/images/moveit_setup_assistant_planning_groups.png) Select “Add Group”. Fill in a name for the planning group you are using. Next, select “Kinematic Solver”. The most common solver is the “kdl_kinematics_plugin/KDLKinematicsPlugin” option. Next, select the “Group Default Planner”. The most common planner is “RRTConnect”. The next step is to define your kinematic chain. Select “Add Kin. Chain” option. Given how you set up your URDF model, the chain of joints and linkages should be created and shown for you. All you have to do is to select the base link, which is the “world” link, and the tip link which is the “end_link/INPUT_INTERFACE” in this case. Afterwards, select “Save”. NOTE: There are tutorials available online that go through the “Add Joints” method to create the planning group, which can be another viable configuration option to explore. -![moveit_setup_assistant_kinematic_chain](assets/moveit_setup_assistant_planning_group_kinematic_chain.png) +![moveit_setup_assistant_kinematic_chain](/assets/images/moveit_setup_assistant_planning_group_kinematic_chain.png) Moving onto “Robot Poses”, you can configure different preset positions of the robot. In the screenshot below, preset positions were made for when the serial manipulator arm is stretched out, compacted in, and in an intermediate position. Create however many preset poses you desire. -![moveit_setup_assistant_robot_poses](assets/moveit_setup_assistant_robot_poses.png) +![moveit_setup_assistant_robot_poses](/assets/images/moveit_setup_assistant_robot_poses.png) The next window is the “End Effectors” window. For this particular article, I will not go into the details of configuring an actuated end effector. Instead, this particular project opted to go for a simple end effector and as such configured a simple one through MoveIt. Essentially, the tip link configured in the kinetic chain portion of the setup was selected as the “Parent Link” of the end effector. -![moveit_setup_assistant_end_effectors](assets/moveit_setup_assistant_end_effectors.png) +![moveit_setup_assistant_end_effectors](/assets/images/moveit_setup_assistant_end_effectors.png) The “Passive Joints” section of the setup was autofilled, so we can skip the details of this window. -![moveit_setup_assistant_passive_joints](assets/moveit_setup_assistant_passive_joints.png) +![moveit_setup_assistant_passive_joints](/assets/images/moveit_setup_assistant_passive_joints.png) The next window “ROS Control” can be an important one. Here, you can configure a ROS controller to control the physical hardware of your robot. This can be important if you want the MoveIt pipeline to directly interface with your motors and actuators using different control schemes such as effort, velocity, or position controllers. In our case, we opted to use the simulation portion of the ROS controller, which is essentially a fake joint controller. -![moveit_setup_assistant_controllers](assets/moveit_setup_assistant_controllers.png) +![moveit_setup_assistant_controllers](/assets/images/moveit_setup_assistant_controllers.png) The next window is the “Simulation” window. By selecting the “Generate URDF” option, you can generate replacement URDF code to input to your URDF file in order to have the model working on Gazebo, which is the ROS simulation environment. Simply copy and paste the selected code over to your URDF file code. -![moveit_setup_assistant_simulation](assets/moveit_setup_assistant_simulation.png) +![moveit_setup_assistant_simulation](/assets/images/moveit_setup_assistant_simulation.png) In the “3D perception” window, you can configure a point cloud or depth map topic to interface with MoveIt. Here, the Octomap plugin for MoveIt will look at this topic and configure obstacles within the environment, as shown in RViz. This is an important window if you want to configure dynamic obstacles for the robot to be aware of and avoid. -![moveit_setup_assistant_perception](assets/moveit_setup_assistant_perception.png) +![moveit_setup_assistant_perception](/assets/images/moveit_setup_assistant_perception.png) The next window is “Author Information” within which you would fill in your name and the email of the maintainer of this ROS MoveIt node. -![moveit_setup_assistant_author_information](assets/moveit_setup_assistant_author_information.png) +![moveit_setup_assistant_author_information](/assets/images/moveit_setup_assistant_author_information.png) Finally, within the “Configuration File” portion of the setup assistant, the GUI will drop all the configured files to a set folder location. If this is a first-time setup, normally you would like to check off all the selected file options. Otherwise, you may want to only drop the files that you have changed since the last setup instance. Specify a “Configuration Package Save Path” location and select “Generate Package”. Once that is completed, you can select “Exit Setup Assistant”. -![moveit_setup_assistant_configuration_file](assets/moveit_setup_assistant_end.png) +![moveit_setup_assistant_configuration_file](/assets/images/moveit_setup_assistant_end.png) ### Simulate URDF model through Rviz @@ -1025,7 +1025,7 @@ https://www.sv-jme.eu/article/a-weighted-gradient-projection-method-for-inverse- date: 2017-08-21 title: Using ULN 2003A as a motor controller --- -![Using ULN 2003A as a stepper motor controller](assets/ULN2003AMotorController-8ee22.png) +![Using ULN 2003A as a stepper motor controller](/assets/images/ULN2003AMotorController-8ee22.png) ## ULN 2003A - Darlington Array ULN 2003A or otherwise known as Darlington array is a way to use signals from a microcontroller or any device that can only withstand low currents to control high current drawing devices such as relays, motors, bulbs etc. diff --git a/wiki/actuation/drive-by-wire.md b/wiki/actuation/drive-by-wire.md index d5778e8f..849c5d9f 100644 --- a/wiki/actuation/drive-by-wire.md +++ b/wiki/actuation/drive-by-wire.md @@ -24,7 +24,7 @@ Throttle-by-wire, or accelerate-by-wire, was the first type of drive-by-wire sys As shown in the figure below, With throttle by wire a sensor is attached to the gas pedal and detects how far it has been pressed. This information is then sent down a wire to the car's computer. The computer analyzes the information and commands a motor to open the butterfly in the throttle body. Since the computer is in control of the throttle opening things like idle speed control, cruise control, and traction control can easily be integrated. Because automatic transmissions are also usually controlled by the computer it can adjust the throttle during gear changes. It also allows the addition of eco or sport buttons to change the way the throttle reacts when pressed, increasing fuel economy or throttle response. -![Throttle-by-wire Outline](assets/throttle-by-wire.png) +![Throttle-by-wire Outline](/assets/images/throttle-by-wire.png) ### Brake-by-wire There are two types of brake-by-wire systems. Hydraulic, or "wet," brake-by-wire uses additional hydraulic parts to create pressure on the brakes. Electric, or "dry," brake-by-wire, on the other hand, simply uses an electric motor and no hydraulic brake fluid. @@ -47,7 +47,7 @@ Most vehicles use a rack-and-pinion unit or worm-and-sector steering gear that i As shown in the figure below, in vehicles that are equipped with steer-by-wire technology, there is no physical connection between the steering wheel and the tires. Steer-by-wire systems don't technically need to use steering wheels at all. When a steering wheel is used, some type of steering feel emulator is typically used to provide the driver with feedback. -![Steer-by-wire Outline](assets/steer-by-wire.png) +![Steer-by-wire Outline](/assets/images/steer-by-wire.png) ## Benefits and Drawbacks of Drive-by-wire Systems Some people are excited about the prospect of more drive-by-wire systems in cars. By replacing conventional throttle systems, drive-by-wire systems can significantly reduce the number of moving parts in a vehicle. This reduces weight, increases operational accuracy and stretches out the time between service visits for things like mechanical maintenance and other adjustments. Some by-wire systems wouldn't even require service at all. Less weight and better accuracy would equal better fuel efficiency and fewer emissions, too. diff --git a/wiki/actuation/moveit-and-HEBI-integration.md b/wiki/actuation/moveit-and-HEBI-integration.md index 32246e79..f2d6977a 100644 --- a/wiki/actuation/moveit-and-HEBI-integration.md +++ b/wiki/actuation/moveit-and-HEBI-integration.md @@ -64,55 +64,55 @@ Select “Create New MoveIt Configuration Package” then select the URDF model Once the URDF model is loaded, you will go through the various steps to configure and set up the MoveIt model. Select “Self-Collisions”. You should see the following: -![moveit_setup_assistant_collision](assets/moveit_setup_assistant_collision_check.png) +![moveit_setup_assistant_collision](/assets/images/moveit_setup_assistant_collision_check.png) The best option to choose here is to slide the “Sampling Density” slider all the way to the right to the highest density setting. With this setting, the GUI will compute all pairs of geometries that can collide with each other and pairs that will definitely not. Select “Generate Collision Matrix” to compute the non-colliding geometry pairs of the model. The next option window is the virtual joints window. Here, you would configure a robot link with an external frame of reference that is fixed. In this particular case you can configure the world frame to the world frame as a virtual joint if you want the origin point of the robot arm to be the same as the URDF file. -![moveit_setup_assistant_virtual_joints](assets/moveit_setup_assistant_virtual_joints.png) +![moveit_setup_assistant_virtual_joints](/assets/images/moveit_setup_assistant_virtual_joints.png) The next window is the “Planning Groups” window. Here, you would configure the joint groups of the robot model. There are many ways to go about this, but one method is to create a kinetic chain of joints, given you are working with a serial manipulator arm. -![moveit_setup_assistant_planning_groups](assets/moveit_setup_assistant_planning_groups.png) +![moveit_setup_assistant_planning_groups](/assets/images/moveit_setup_assistant_planning_groups.png) Select “Add Group”. Fill in a name for the planning group you are using. Next, select “Kinematic Solver”. The most common solver is the “kdl_kinematics_plugin/KDLKinematicsPlugin” option. Next, select the “Group Default Planner”. The most common planner is “RRTConnect”. The next step is to define your kinematic chain. Select “Add Kin. Chain” option. Given how you set up your URDF model, the chain of joints and linkages should be created and shown for you. All you have to do is to select the base link, which is the “world” link, and the tip link which is the “end_link/INPUT_INTERFACE” in this case. Afterwards, select “Save”. NOTE: There are tutorials available online that go through the “Add Joints” method to create the planning group, which can be another viable configuration option to explore. -![moveit_setup_assistant_kinematic_chain](assets/moveit_setup_assistant_planning_group_kinematic_chain.png) +![moveit_setup_assistant_kinematic_chain](/assets/images/moveit_setup_assistant_planning_group_kinematic_chain.png) Moving onto “Robot Poses”, you can configure different preset positions of the robot. In the screenshot below, preset positions were made for when the serial manipulator arm is stretched out, compacted in, and in an intermediate position. Create however many preset poses you desire. -![moveit_setup_assistant_robot_poses](assets/moveit_setup_assistant_robot_poses.png) +![moveit_setup_assistant_robot_poses](/assets/images/moveit_setup_assistant_robot_poses.png) The next window is the “End Effectors” window. For this particular article, I will not go into the details of configuring an actuated end effector. Instead, this particular project opted to go for a simple end effector and as such configured a simple one through MoveIt. Essentially, the tip link configured in the kinetic chain portion of the setup was selected as the “Parent Link” of the end effector. -![moveit_setup_assistant_end_effectors](assets/moveit_setup_assistant_end_effectors.png) +![moveit_setup_assistant_end_effectors](/assets/images/moveit_setup_assistant_end_effectors.png) The “Passive Joints” section of the setup was autofilled, so we can skip the details of this window. -![moveit_setup_assistant_passive_joints](assets/moveit_setup_assistant_passive_joints.png) +![moveit_setup_assistant_passive_joints](/assets/images/moveit_setup_assistant_passive_joints.png) The next window “ROS Control” can be an important one. Here, you can configure a ROS controller to control the physical hardware of your robot. This can be important if you want the MoveIt pipeline to directly interface with your motors and actuators using different control schemes such as effort, velocity, or position controllers. In our case, we opted to use the simulation portion of the ROS controller, which is essentially a fake joint controller. -![moveit_setup_assistant_controllers](assets/moveit_setup_assistant_controllers.png) +![moveit_setup_assistant_controllers](/assets/images/moveit_setup_assistant_controllers.png) The next window is the “Simulation” window. By selecting the “Generate URDF” option, you can generate replacement URDF code to input to your URDF file in order to have the model working on Gazebo, which is the ROS simulation environment. Simply copy and paste the selected code over to your URDF file code. -![moveit_setup_assistant_simulation](assets/moveit_setup_assistant_simulation.png) +![moveit_setup_assistant_simulation](/assets/images/moveit_setup_assistant_simulation.png) In the “3D perception” window, you can configure a point cloud or depth map topic to interface with MoveIt. Here, the Octomap plugin for MoveIt will look at this topic and configure obstacles within the environment, as shown in RViz. This is an important window if you want to configure dynamic obstacles for the robot to be aware of and avoid. -![moveit_setup_assistant_perception](assets/moveit_setup_assistant_perception.png) +![moveit_setup_assistant_perception](/assets/images/moveit_setup_assistant_perception.png) The next window is “Author Information” within which you would fill in your name and the email of the maintainer of this ROS MoveIt node. -![moveit_setup_assistant_author_information](assets/moveit_setup_assistant_author_information.png) +![moveit_setup_assistant_author_information](/assets/images/moveit_setup_assistant_author_information.png) Finally, within the “Configuration File” portion of the setup assistant, the GUI will drop all the configured files to a set folder location. If this is a first-time setup, normally you would like to check off all the selected file options. Otherwise, you may want to only drop the files that you have changed since the last setup instance. Specify a “Configuration Package Save Path” location and select “Generate Package”. Once that is completed, you can select “Exit Setup Assistant”. -![moveit_setup_assistant_configuration_file](assets/moveit_setup_assistant_end.png) +![moveit_setup_assistant_configuration_file](/assets/images/moveit_setup_assistant_end.png) ### Simulate URDF model through Rviz diff --git a/wiki/actuation/uln2003a-motor-controller.md b/wiki/actuation/uln2003a-motor-controller.md index 1a763afd..a99edda4 100644 --- a/wiki/actuation/uln2003a-motor-controller.md +++ b/wiki/actuation/uln2003a-motor-controller.md @@ -2,7 +2,7 @@ date: 2017-08-21 title: Using ULN 2003A as a motor controller --- -![Using ULN 2003A as a stepper motor controller](assets/ULN2003AMotorController-8ee22.png) +![Using ULN 2003A as a stepper motor controller](/assets/images/ULN2003AMotorController-8ee22.png) ## ULN 2003A - Darlington Array ULN 2003A or otherwise known as Darlington array is a way to use signals from a microcontroller or any device that can only withstand low currents to control high current drawing devices such as relays, motors, bulbs etc. diff --git a/wiki/common-platforms/__all_subsections.md b/wiki/common-platforms/__all_subsections.md index bd454ce8..2d994762 100644 --- a/wiki/common-platforms/__all_subsections.md +++ b/wiki/common-platforms/__all_subsections.md @@ -334,7 +334,7 @@ DJI drones have one of the best commercially available PID controllers along wit To be more specific, below we will look at the components involved in controlling a DJI drone. -![DJI Control Scheme](../../assets/images/DJI.png) +![DJI Control Scheme](/assets/images/DJI.png) The keypoint is: > DJI drones *need to read from its own GPS* to satisfy its EKF needs in order to produce proper state estimations for Position and Velocity Controls. @@ -610,7 +610,7 @@ published: true --- This article with serve as an introduction, overview, and quick-start guide to K-Team's Khepera 4 robots. -![Put a relevant caption here](assets/KHEPERA4.png) +![Put a relevant caption here](/assets/images/KHEPERA4.png) The Khepera 4 is a robot platform designed for indoor applications, meant to operate on tables and floor of labs. They are meant to provide a way to test algorithms developed in simulations or on paper in the real world. They're most often used to test navigation, swarm, and artificial intelligence applications, providing researchers an easy way to see how their code runs on an actual robot. @@ -1305,7 +1305,7 @@ This is an article that provides an overview of the Unitree Go1 Edu robot, inclu There are three versions of the Unitree Go1: Air, Pro, and Edu. The Edu model is designed for educational purposes and provides developers with access to the platform. In this article, we will focus on the capabilities of the Go1 Edu, which is a popular choice for students and researchers due to its affordability and ease of use. ## Form Factor -![Form_Factor](assets/form_factor.png) +![Form_Factor](/assets/images/form_factor.png) The Unitree Go1 Edu has compact dimensions of 645 x 280 x 400 mm and weighs 12 kg. It boasts a top speed of 3.7-5 m/s and a maximum load capacity of 10 kg, although it's recommended to keep the payload under 5 kg. By default, the robot can traverse steps up to 10 cm high, but with programming, it's possible to overcome larger obstacles. @@ -1313,7 +1313,7 @@ The Go1 Edu features 12 degrees of freedom, including HAA (hip abduction/adducti The Body/Thigh Joint Motor design is highly adaptable to various mechanical equipment, with an instantaneous torque of 23.7 N·m, while the Knee Joint has a torque of 35.55 N·m. ## Power and Interface -![Unitree_TOP](assets/unitree_top.png) +![Unitree_TOP](/assets/images/unitree_top.png) The Unitree Go1 Edu robot is equipped with a reliable lithium-ion power cell with a 6000mAh capacity that provides an endurance time of 1-2.5 hours. The robot's battery management system (BMS) closely monitors the battery status, ensuring safe and stable operation during use. The batteries themselves feature overcharge protection, providing an additional layer of safety. @@ -1331,7 +1331,7 @@ Moreover, Unitree provides customization options for processors and additional s * Raspberry Pi also has an extra Wi-Fi card, which is used as a hotspot 192.168.12.1. * User laptop connects to the robot hotspot, with a static IP 192.168.12.18. * Users can connect to all four devices via Ethernet cable, with a static IP 192.168.123.123. -![Wired](assets/wired.png) +![Wired](/assets/images/wired.png) * Each Nano controls and processes a pair of fisheye cameras. The Unitree camera SDK provides an API that captures and rectifies skewed fisheye camera stream and sends out the UDP packets. * `./bins/example_putImagetrans` sends camera streams with udp packets @@ -1511,19 +1511,19 @@ roslaunch ur5e_moveit_config moveit_rviz.launch rviz_config:=$(rospack find ur5e This should launch a Rviz window with a robot model. -![](./assets/moveit_1.png) +![](/assets/images/moveit_1.png) You can change the tcp target by dragging around the blue ball. The orange robot will show the configuration used to reach the target pose. -![](./assets/moveit_2.png) +![](/assets/images/moveit_2.png) By clicking on the "Plan" button in the left panel a path from the current pose to the target pose is calculated. On success, it gets animated using a semi-transparent version of the robot. -![](./assets/moveit_3.png) +![](/assets/images/moveit_3.png) By clicking on the Execute button in the left panel the robot executes the planned motion. -![](./assets/moveit_4.png) +![](/assets/images/moveit_4.png) In a real-world application you would not use the ur5e_moveit_config package but create your own moveit configuration matching your actual workcell with all obstacles and sensors. diff --git a/wiki/common-platforms/dji-drone-breakdown-for-technical-projects.md b/wiki/common-platforms/dji-drone-breakdown-for-technical-projects.md index 03e154d1..aa1bc244 100644 --- a/wiki/common-platforms/dji-drone-breakdown-for-technical-projects.md +++ b/wiki/common-platforms/dji-drone-breakdown-for-technical-projects.md @@ -13,7 +13,7 @@ DJI drones have one of the best commercially available PID controllers along wit To be more specific, below we will look at the components involved in controlling a DJI drone. -![DJI Control Scheme](../../assets/images/DJI.png) +![DJI Control Scheme](/assets/images/DJI.png) The keypoint is: > DJI drones *need to read from its own GPS* to satisfy its EKF needs in order to produce proper state estimations for Position and Velocity Controls. diff --git a/wiki/common-platforms/khepera4.md b/wiki/common-platforms/khepera4.md index 7bfdf442..aca2ef4c 100644 --- a/wiki/common-platforms/khepera4.md +++ b/wiki/common-platforms/khepera4.md @@ -5,7 +5,7 @@ published: true --- This article with serve as an introduction, overview, and quick-start guide to K-Team's Khepera 4 robots. -![Put a relevant caption here](assets/KHEPERA4.png) +![Put a relevant caption here](/assets/images/KHEPERA4.png) The Khepera 4 is a robot platform designed for indoor applications, meant to operate on tables and floor of labs. They are meant to provide a way to test algorithms developed in simulations or on paper in the real world. They're most often used to test navigation, swarm, and artificial intelligence applications, providing researchers an easy way to see how their code runs on an actual robot. diff --git a/wiki/common-platforms/unitree-go1.md b/wiki/common-platforms/unitree-go1.md index e9032b9c..668959a3 100644 --- a/wiki/common-platforms/unitree-go1.md +++ b/wiki/common-platforms/unitree-go1.md @@ -14,7 +14,7 @@ This is an article that provides an overview of the Unitree Go1 Edu robot, inclu There are three versions of the Unitree Go1: Air, Pro, and Edu. The Edu model is designed for educational purposes and provides developers with access to the platform. In this article, we will focus on the capabilities of the Go1 Edu, which is a popular choice for students and researchers due to its affordability and ease of use. ## Form Factor -![Form_Factor](assets/form_factor.png) +![Form_Factor](/assets/images/form_factor.png) The Unitree Go1 Edu has compact dimensions of 645 x 280 x 400 mm and weighs 12 kg. It boasts a top speed of 3.7-5 m/s and a maximum load capacity of 10 kg, although it's recommended to keep the payload under 5 kg. By default, the robot can traverse steps up to 10 cm high, but with programming, it's possible to overcome larger obstacles. @@ -22,7 +22,7 @@ The Go1 Edu features 12 degrees of freedom, including HAA (hip abduction/adducti The Body/Thigh Joint Motor design is highly adaptable to various mechanical equipment, with an instantaneous torque of 23.7 N·m, while the Knee Joint has a torque of 35.55 N·m. ## Power and Interface -![Unitree_TOP](assets/unitree_top.png) +![Unitree_TOP](/assets/images/unitree_top.png) The Unitree Go1 Edu robot is equipped with a reliable lithium-ion power cell with a 6000mAh capacity that provides an endurance time of 1-2.5 hours. The robot's battery management system (BMS) closely monitors the battery status, ensuring safe and stable operation during use. The batteries themselves feature overcharge protection, providing an additional layer of safety. @@ -40,7 +40,7 @@ Moreover, Unitree provides customization options for processors and additional s * Raspberry Pi also has an extra Wi-Fi card, which is used as a hotspot 192.168.12.1. * User laptop connects to the robot hotspot, with a static IP 192.168.12.18. * Users can connect to all four devices via Ethernet cable, with a static IP 192.168.123.123. -![Wired](assets/wired.png) +![Wired](/assets/images/wired.png) * Each Nano controls and processes a pair of fisheye cameras. The Unitree camera SDK provides an API that captures and rectifies skewed fisheye camera stream and sends out the UDP packets. * `./bins/example_putImagetrans` sends camera streams with udp packets diff --git a/wiki/common-platforms/ur5e.md b/wiki/common-platforms/ur5e.md index 1a7626f3..0d445603 100644 --- a/wiki/common-platforms/ur5e.md +++ b/wiki/common-platforms/ur5e.md @@ -114,19 +114,19 @@ roslaunch ur5e_moveit_config moveit_rviz.launch rviz_config:=$(rospack find ur5e This should launch a Rviz window with a robot model. -![](./assets/moveit_1.png) +![](/assets/images/moveit_1.png) You can change the tcp target by dragging around the blue ball. The orange robot will show the configuration used to reach the target pose. -![](./assets/moveit_2.png) +![](/assets/images/moveit_2.png) By clicking on the "Plan" button in the left panel a path from the current pose to the target pose is calculated. On success, it gets animated using a semi-transparent version of the robot. -![](./assets/moveit_3.png) +![](/assets/images/moveit_3.png) By clicking on the Execute button in the left panel the robot executes the planned motion. -![](./assets/moveit_4.png) +![](/assets/images/moveit_4.png) In a real-world application you would not use the ur5e_moveit_config package but create your own moveit configuration matching your actual workcell with all obstacles and sensors. diff --git a/wiki/computing/__all_subsections.md b/wiki/computing/__all_subsections.md index 4e06606a..20205634 100644 --- a/wiki/computing/__all_subsections.md +++ b/wiki/computing/__all_subsections.md @@ -9,7 +9,7 @@ This tutorial covers the basics of different Arduinos, and how to implement comm The main Arduino boards witnessed being used in these applications are the Arduino Uno and Arduino Mega. ## The Uno -![Arduino Uno R3 Front](assets/Arduino-d9b3f.png) +![Arduino Uno R3 Front](/assets/images/Arduino-d9b3f.png) Good for smaller projects - Has 14 digital input/output pins, 6 analog inputs (which can also be used as digital input/output pins), and a 5v as well as a 3.3v regulator @@ -19,7 +19,7 @@ Good for smaller projects - If you are going to power it externally, you have to use between 7 and 12 volts on the Vin pin, and the ground of your power source has to go to a GND pin. A 9 volt battery works well for this. Make sure you connect the hot to Vin and the ground/negative terminal to ground of the power supply, or else you can fry the board. ## The Mega -![Arduino Mega R3](assets/Arduino-c30e6.png) +![Arduino Mega R3](/assets/images/Arduino-c30e6.png) Good for bigger projects - Has 54 digital input/output pins, 16 analog inputs (which can also be used as digital input/output pins), and a 5v as well as a 3.3v regulator @@ -32,7 +32,7 @@ Good for bigger projects ## Wiring: ### Limit Switch: #### Example: -![Limit Switch Wiring](assets/Arduino-2369d.png) +![Limit Switch Wiring](/assets/images/Arduino-2369d.png) Whatever pin that is connected to the Normally Open pin of the limit switch, needs to be setup by using ``pinMode(pin#, INPUT_PULLUP);`` @@ -48,7 +48,7 @@ So to use this intuitively, use ``!digitalRead(pin#);`` this will return HIGH wh ## Motor Driver: Example with L298 Compact Motor Driver available in Mechatronics Lab: -![Motor Driver Wiring](assets/Arduino-de522.png) +![Motor Driver Wiring](/assets/images/Arduino-de522.png) With this example, the yellow lines connected to pins 10 and 11 (which are PWM) are the enables for the motors. When the enable is HIGH, the motor is turned on. For PWM lines, you use ``analogWrite(pin#, pwmValue);``, where ``pwmValue`` is an integer between 0-255, with 0 being off, and 255 being always HIGH, with inbetween values able to control speed if your motor is capable of that. diff --git a/wiki/computing/arduino.md b/wiki/computing/arduino.md index f9db4404..0e6a3352 100644 --- a/wiki/computing/arduino.md +++ b/wiki/computing/arduino.md @@ -8,7 +8,7 @@ This tutorial covers the basics of different Arduinos, and how to implement comm The main Arduino boards witnessed being used in these applications are the Arduino Uno and Arduino Mega. ## The Uno -![Arduino Uno R3 Front](assets/Arduino-d9b3f.png) +![Arduino Uno R3 Front](/assets/images/Arduino-d9b3f.png) Good for smaller projects - Has 14 digital input/output pins, 6 analog inputs (which can also be used as digital input/output pins), and a 5v as well as a 3.3v regulator @@ -18,7 +18,7 @@ Good for smaller projects - If you are going to power it externally, you have to use between 7 and 12 volts on the Vin pin, and the ground of your power source has to go to a GND pin. A 9 volt battery works well for this. Make sure you connect the hot to Vin and the ground/negative terminal to ground of the power supply, or else you can fry the board. ## The Mega -![Arduino Mega R3](assets/Arduino-c30e6.png) +![Arduino Mega R3](/assets/images/Arduino-c30e6.png) Good for bigger projects - Has 54 digital input/output pins, 16 analog inputs (which can also be used as digital input/output pins), and a 5v as well as a 3.3v regulator @@ -31,7 +31,7 @@ Good for bigger projects ## Wiring: ### Limit Switch: #### Example: -![Limit Switch Wiring](assets/Arduino-2369d.png) +![Limit Switch Wiring](/assets/images/Arduino-2369d.png) Whatever pin that is connected to the Normally Open pin of the limit switch, needs to be setup by using ``pinMode(pin#, INPUT_PULLUP);`` @@ -47,7 +47,7 @@ So to use this intuitively, use ``!digitalRead(pin#);`` this will return HIGH wh ## Motor Driver: Example with L298 Compact Motor Driver available in Mechatronics Lab: -![Motor Driver Wiring](assets/Arduino-de522.png) +![Motor Driver Wiring](/assets/images/Arduino-de522.png) With this example, the yellow lines connected to pins 10 and 11 (which are PWM) are the enables for the motors. When the enable is HIGH, the motor is turned on. For PWM lines, you use ``analogWrite(pin#, pwmValue);``, where ``pwmValue`` is an integer between 0-255, with 0 being off, and 255 being always HIGH, with inbetween values able to control speed if your motor is capable of that. diff --git a/wiki/fabrication/3d-printers.md b/wiki/fabrication/3d-printers.md index 7914b35a..4d70e78b 100644 --- a/wiki/fabrication/3d-printers.md +++ b/wiki/fabrication/3d-printers.md @@ -8,7 +8,7 @@ title: 3D Printers ### What is 3D printing? Fundamentally, 3D Printing is the concept of additively producing a physical part from a 3D part file. Typically, this done by breaking a 3D part into horizontal layers and then printing each layer as a planar part of constant thickness. However, there are other methods. For example, [Carbon3D](http://carbon3d.com/), uses an alternative approach known as Digital Light Synthesis which is a two step process of printing with a support resin then melting the support structure away. -![Layering of Material to Create a Shape used in 3D Printing](assets/3DPrinters-10477.png) +![Layering of Material to Create a Shape used in 3D Printing](/assets/images/3DPrinters-10477.png) Recently 3D printing has become somewhat of a revolution for three reasons: @@ -58,7 +58,7 @@ Material jetting machines are known to produce parts with good surface finishes ## Industry Segmentation [IBISWorld](http://clients1.ibisworld.com/?u=XTrdcEUxGT9ofTiep6uaiw==&p=Evn+48Pl8G+/5sICIXpGHA==) provides a overview of the 3D printer manufacturing industry. This is focused on large high volume companies such as Straysis and [3D Systems](http://www.3dsystems.com/) and does not include many of the effects of smaller volume 'maker' targeted companies. It shows a roughly equal breakdown between SLA, SLS, and FDM technologies. -![Industry Segmentation by 3D Printing Technologies](assets/3DPrinters-a3389.png) +![Industry Segmentation by 3D Printing Technologies](/assets/images/3DPrinters-a3389.png) diff --git a/wiki/fabrication/__all_subsections.md b/wiki/fabrication/__all_subsections.md index bd1cd23c..764accd3 100644 --- a/wiki/fabrication/__all_subsections.md +++ b/wiki/fabrication/__all_subsections.md @@ -9,7 +9,7 @@ title: 3D Printers ### What is 3D printing? Fundamentally, 3D Printing is the concept of additively producing a physical part from a 3D part file. Typically, this done by breaking a 3D part into horizontal layers and then printing each layer as a planar part of constant thickness. However, there are other methods. For example, [Carbon3D](http://carbon3d.com/), uses an alternative approach known as Digital Light Synthesis which is a two step process of printing with a support resin then melting the support structure away. -![Layering of Material to Create a Shape used in 3D Printing](assets/3DPrinters-10477.png) +![Layering of Material to Create a Shape used in 3D Printing](/assets/images/3DPrinters-10477.png) Recently 3D printing has become somewhat of a revolution for three reasons: @@ -59,7 +59,7 @@ Material jetting machines are known to produce parts with good surface finishes ## Industry Segmentation [IBISWorld](http://clients1.ibisworld.com/?u=XTrdcEUxGT9ofTiep6uaiw==&p=Evn+48Pl8G+/5sICIXpGHA==) provides a overview of the 3D printer manufacturing industry. This is focused on large high volume companies such as Straysis and [3D Systems](http://www.3dsystems.com/) and does not include many of the effects of smaller volume 'maker' targeted companies. It shows a roughly equal breakdown between SLA, SLS, and FDM technologies. -![Industry Segmentation by 3D Printing Technologies](assets/3DPrinters-a3389.png) +![Industry Segmentation by 3D Printing Technologies](/assets/images/3DPrinters-a3389.png) @@ -421,7 +421,7 @@ In a bowser window, go to . This should load th Once you are connected, open Cura Type A. When prompted, type in our printer's serial number and API key: - Serial number: 10610 - API Key: Click on the wrench icon in the upper right hand corner of the Series A webpage and go to the API tab. Copy and paste the API key. -![Find your API Key here](assets/SeriesA_APIKey.jpg) +![Find your API Key here](/assets/images/SeriesA_APIKey.jpg) Click the "Configure" button to prepare your printer. Cura Type A should open. @@ -435,7 +435,7 @@ The Series A Pro printer generally uses PLA (as opposed to ABS). PLA requires ve ### Print Profiles The standard profile is a good compromise between speed and print quality for PLA on the Series A Pro. [Download SeriesA_Standard_Profile.zip](assets/SeriesA_Standard_Profile.zip) -![Print Quality of Standard Profile](assets/SeriesA_PLA_SP.jpg) +![Print Quality of Standard Profile](/assets/images/SeriesA_PLA_SP.jpg) ## Tips #### Changing Fillament diff --git a/wiki/fabrication/series-A-pro.md b/wiki/fabrication/series-A-pro.md index 1f482cf3..ca78e247 100644 --- a/wiki/fabrication/series-A-pro.md +++ b/wiki/fabrication/series-A-pro.md @@ -18,7 +18,7 @@ In a bowser window, go to . This should load th Once you are connected, open Cura Type A. When prompted, type in our printer's serial number and API key: - Serial number: 10610 - API Key: Click on the wrench icon in the upper right hand corner of the Series A webpage and go to the API tab. Copy and paste the API key. -![Find your API Key here](assets/SeriesA_APIKey.jpg) +![Find your API Key here](/assets/images/SeriesA_APIKey.jpg) Click the "Configure" button to prepare your printer. Cura Type A should open. @@ -32,7 +32,7 @@ The Series A Pro printer generally uses PLA (as opposed to ABS). PLA requires ve ### Print Profiles The standard profile is a good compromise between speed and print quality for PLA on the Series A Pro. [Download SeriesA_Standard_Profile.zip](assets/SeriesA_Standard_Profile.zip) -![Print Quality of Standard Profile](assets/SeriesA_PLA_SP.jpg) +![Print Quality of Standard Profile](/assets/images/SeriesA_PLA_SP.jpg) ## Tips #### Changing Fillament diff --git a/wiki/interfacing/__all_subsections.md b/wiki/interfacing/__all_subsections.md index 42bb6c26..9813d4ef 100644 --- a/wiki/interfacing/__all_subsections.md +++ b/wiki/interfacing/__all_subsections.md @@ -74,7 +74,7 @@ title: micro-ROS for ROS2 on Microcontrollers ## Conceptual Overview micro-ROS consists of a `node` running on the microcontroller and an `agent` running on the host computer. The `agent` handles the interface between the `node` and the rest of the ROS2 stack. This allows the ROS2 stack and microcontroller `node` to publish and subscribe to each other as if the `node` was like any other ROS2 node. Great! The hardware interface is most commonly a serial connection, such as USB. This tutorial will walk through how to prepare the microcontroller and host computer environments for the `node` and `agent` respectively, and then show some examples for how to test the connection and make a first `node` on the microcontroller. -![Simplified micro-ROS architecture](assets/images/micro-ros-architecture.png) +![Simplified micro-ROS architecture](/assets/images/micro-ros-architecture.png) ## Installation Overview @@ -214,7 +214,7 @@ This container should be some variant of Linux OS with a ROS2 installation. You exit ``` -![Example steps of running micro-ROS Docker image](assets/images/micro-ros-docker.png) +![Example steps of running micro-ROS Docker image](/assets/images/micro-ros-docker.png) 7. Finally, don't forget to stop the container and remove any unnecessary build cache. You can do so by: @@ -609,7 +609,7 @@ ROS 2 is widely used nowadays due to its better security features and code organ ### ROS 1 - ROS 2 Bridge The [ROS 1 bridge](https://github.com/ros2/ros1_bridge) is a ROS 2 package that provides nodes to bridge topics between ROS 1 and ROS 2. A point to be noted here is that bridging is only available on Ubuntu 20.04, as this distribution is the only one that supports both ROS 1 Noetic and ROS 2 Foxy. This package is capable of bridging the stantard ROS interfaces (messages/services) listed in the [ros2/common_interfaces](https://github.com/ros2/common_interfaces) repository. To use the bridge with custom message types, the package needs to be build from source, and the custom types should also be sourced in seperate ROS 1 and ROS 2 workspaces. Services need to be bridged explicitly between ROS 2 and ROS 1, and ROS 1 and ROS 2. -![ROS 1 - ROS 2 Bridge Setup](assets/images/ros-bridge.png) +![ROS 1 - ROS 2 Bridge Setup](/assets/images/ros-bridge.png) ### Installation: Installation instructions are provided in the [ROS 1 bridge](https://github.com/ros2/common_interfaces) repository README. Note that you need to have both ROS 1 Noetic and ROS 2 Foxy installed in the system. There are 2 main ways to install the bridge: diff --git a/wiki/interfacing/microros-for-ros2-on-microcontrollers.md b/wiki/interfacing/microros-for-ros2-on-microcontrollers.md index de6af809..aa1c4642 100644 --- a/wiki/interfacing/microros-for-ros2-on-microcontrollers.md +++ b/wiki/interfacing/microros-for-ros2-on-microcontrollers.md @@ -14,7 +14,7 @@ title: micro-ROS for ROS2 on Microcontrollers ## Conceptual Overview micro-ROS consists of a `node` running on the microcontroller and an `agent` running on the host computer. The `agent` handles the interface between the `node` and the rest of the ROS2 stack. This allows the ROS2 stack and microcontroller `node` to publish and subscribe to each other as if the `node` was like any other ROS2 node. Great! The hardware interface is most commonly a serial connection, such as USB. This tutorial will walk through how to prepare the microcontroller and host computer environments for the `node` and `agent` respectively, and then show some examples for how to test the connection and make a first `node` on the microcontroller. -![Simplified micro-ROS architecture](assets/images/micro-ros-architecture.png) +![Simplified micro-ROS architecture](/assets/images/micro-ros-architecture.png) ## Installation Overview @@ -154,7 +154,7 @@ This container should be some variant of Linux OS with a ROS2 installation. You exit ``` -![Example steps of running micro-ROS Docker image](assets/images/micro-ros-docker.png) +![Example steps of running micro-ROS Docker image](/assets/images/micro-ros-docker.png) 7. Finally, don't forget to stop the container and remove any unnecessary build cache. You can do so by: diff --git a/wiki/interfacing/ros1_ros2_bridge.md b/wiki/interfacing/ros1_ros2_bridge.md index 8f850901..4b081a02 100644 --- a/wiki/interfacing/ros1_ros2_bridge.md +++ b/wiki/interfacing/ros1_ros2_bridge.md @@ -15,7 +15,7 @@ ROS 2 is widely used nowadays due to its better security features and code organ ### ROS 1 - ROS 2 Bridge The [ROS 1 bridge](https://github.com/ros2/ros1_bridge) is a ROS 2 package that provides nodes to bridge topics between ROS 1 and ROS 2. A point to be noted here is that bridging is only available on Ubuntu 20.04, as this distribution is the only one that supports both ROS 1 Noetic and ROS 2 Foxy. This package is capable of bridging the stantard ROS interfaces (messages/services) listed in the [ros2/common_interfaces](https://github.com/ros2/common_interfaces) repository. To use the bridge with custom message types, the package needs to be build from source, and the custom types should also be sourced in seperate ROS 1 and ROS 2 workspaces. Services need to be bridged explicitly between ROS 2 and ROS 1, and ROS 1 and ROS 2. -![ROS 1 - ROS 2 Bridge Setup](assets/images/ros-bridge.png) +![ROS 1 - ROS 2 Bridge Setup](/assets/images/ros-bridge.png) ### Installation: Installation instructions are provided in the [ROS 1 bridge](https://github.com/ros2/common_interfaces) repository README. Note that you need to have both ROS 1 Noetic and ROS 2 Foxy installed in the system. There are 2 main ways to install the bridge: diff --git a/wiki/machine-learning/__all_subsections.md b/wiki/machine-learning/__all_subsections.md index 754442ef..e5f6f40b 100644 --- a/wiki/machine-learning/__all_subsections.md +++ b/wiki/machine-learning/__all_subsections.md @@ -25,7 +25,7 @@ def encode_segmap(self, mask): return mask[:, :, 0] # target should be h x w, no depth ``` -![mask annotation](assets/mask_annotation.png) +![mask annotation](/assets/images/mask_annotation.png) ## Installing gimp copy and paste the following command in your terminal to install gimp @@ -41,17 +41,17 @@ Navigate to file->open botton on the top left to open a rgb image that you'd li ### Step 2 Create mask Navigate to layer->new layer to create a mask over your image. Choose Foreground color will create a black layer over your image. You can also change the foreground color on the left panel before you create a new layer, this will give you a layer with different color (which would corresponds to background in this tutorial) -![mask annotation](assets/new_layer.png) +![mask annotation](/assets/images/new_layer.png) After creating new layer, you will see your newly created layer on the right panel. Click on the eye symbol and make the layer invisible. -![manage layers](assets/manage_layers.png) +![manage layers](/assets/images/manage_layers.png) ### Step 3 Creating annotations Select the free select tool on the left panel. **IMPORTANT:** Uncheck the anti-aliasing option, otherwise non-solid colors will appear at the edge of your annotations. Select the region of interest, and then use bucket fill tool to fill in color annotation. Click on the eye symbol again on the right panel will show you the annotated layer. -![free select tool](assets/select_tool.png) -![create annotation](assets/bucket_fill.png) +![free select tool](/assets/images/select_tool.png) +![create annotation](/assets/images/bucket_fill.png) ### Step 4 Saving files Hit ctrl+E to export your layer as an png image, which is your label for this image. Hit ctrl+S to save the gimp file as .xcf file. This step is important if you want to modify your annotation in the future. @@ -354,9 +354,9 @@ Transformers have become increasingly popular in NLP due to their ability to cap Transformers are a powerful tool for NLP and have revolutionized the field. They have enabled researchers to create models that can accurately capture the meaning of text and make accurate predictions. -![Transformer Architecture simplified](./assets/NLP_image1.png) +![Transformer Architecture simplified](/assets/images/NLP_image1.png) -![Transformer Architecture](./assets/NLP_image2.png) +![Transformer Architecture](/assets/images/NLP_image2.png) Encoder (left): The encoder receives an input and builds a representation of it (its features). This means that the model is optimized to acquire understanding from the input. @@ -470,7 +470,7 @@ preds = vqa(image=image, question=question) preds = [{"score": round(pred["score"], 4), "answer": pred["answer"]} for pred in preds] ``` -![Input Image](./assets/NLP_image3.png) +![Input Image](/assets/images/NLP_image3.png) @@ -496,7 +496,7 @@ OUTPUT: [ Below is a table describing some of the basic pipeline identifiers and their use. -![List of different pipelines](./assets/NLP_image4.png) +![List of different pipelines](/assets/images/NLP_image4.png) # Fine-tuning a pretrained model @@ -676,7 +676,7 @@ This article serves as a step-by-step tutorial of how to integrate YOLO in ROS a --- ## Integrating YOLO with ROS -![YOLO Demo](assets/yolo_demo.png) +![YOLO Demo](/assets/images/yolo_demo.png) To install YOLO in ROS, we will use a YOLO ROS wrapper GitHub repository [darknet_ros](https://github.com/leggedrobotics/darknet_ros). You can simply follow their instructions in the README or follow the instructions below. diff --git a/wiki/machine-learning/custom-semantic-data.md b/wiki/machine-learning/custom-semantic-data.md index d5725190..8d9e1456 100644 --- a/wiki/machine-learning/custom-semantic-data.md +++ b/wiki/machine-learning/custom-semantic-data.md @@ -24,7 +24,7 @@ def encode_segmap(self, mask): return mask[:, :, 0] # target should be h x w, no depth ``` -![mask annotation](assets/mask_annotation.png) +![mask annotation](/assets/images/mask_annotation.png) ## Installing gimp copy and paste the following command in your terminal to install gimp @@ -40,17 +40,17 @@ Navigate to file->open botton on the top left to open a rgb image that you'd li ### Step 2 Create mask Navigate to layer->new layer to create a mask over your image. Choose Foreground color will create a black layer over your image. You can also change the foreground color on the left panel before you create a new layer, this will give you a layer with different color (which would corresponds to background in this tutorial) -![mask annotation](assets/new_layer.png) +![mask annotation](/assets/images/new_layer.png) After creating new layer, you will see your newly created layer on the right panel. Click on the eye symbol and make the layer invisible. -![manage layers](assets/manage_layers.png) +![manage layers](/assets/images/manage_layers.png) ### Step 3 Creating annotations Select the free select tool on the left panel. **IMPORTANT:** Uncheck the anti-aliasing option, otherwise non-solid colors will appear at the edge of your annotations. Select the region of interest, and then use bucket fill tool to fill in color annotation. Click on the eye symbol again on the right panel will show you the annotated layer. -![free select tool](assets/select_tool.png) -![create annotation](assets/bucket_fill.png) +![free select tool](/assets/images/select_tool.png) +![create annotation](/assets/images/bucket_fill.png) ### Step 4 Saving files Hit ctrl+E to export your layer as an png image, which is your label for this image. Hit ctrl+S to save the gimp file as .xcf file. This step is important if you want to modify your annotation in the future. diff --git a/wiki/machine-learning/imitation-learning.md b/wiki/machine-learning/imitation-learning.md index 7aa99983..2231f649 100644 --- a/wiki/machine-learning/imitation-learning.md +++ b/wiki/machine-learning/imitation-learning.md @@ -26,7 +26,7 @@ The most foundational IL method is Behavior Cloning (BC). In BC, a supervised le To address this limitation, DAgger-style iterative methods expand the dataset by repeatedly allowing the robot to act, querying the expert for corrections, and aggregating these new samples. This produces a training distribution that more closely matches what the robot will encounter at deployment time, significantly improving robustness. Modern IL for humanoid robots also relies on rich, multi-modal representations. -![The workings of Diffusion Policy](/wiki/machine-learning/assets/diffusion_policy_diagram.png) +![The workings of Diffusion Policy](/assets/images/diffusion_policy_diagram.png) image [source](https://arxiv.org/pdf/2303.04137) @@ -204,7 +204,7 @@ A useful conceptual framing of this pipeline is the **System-1 / System-2 hierar The ability to process large volumes of data and generate responses swiftly mirrors a type of human cognition described by psychologist Daniel Kahneman in his book “Thinking, Fast and Slow”. Kahneman identifies two types of thinking systems in human cognition: System 1 and System 2 (see Figure below). -![Concept of thinking systems in human cognition](/wiki/machine-learning/assets/system1system2.png) +![Concept of thinking systems in human cognition](/assets/images/system1system2.png) image source: Nguyen Ha Thanh Bridging Generative Models and System 1 with System 2: [link](https://blog.nguyenthanh.asia/bridging-generative-models-and-system-1-with-system-2-the-role-of-logical-programming-in-ai-58ca105c2f) @@ -214,7 +214,7 @@ Whereas System-1 executes moment-to-moment motor control, System-2 provides **pl The figure below demonstrates NVIDIA GR00T’s System1-System2 architecture: -![NVIDIA Isaac GR00T N1 Model Architecture](/wiki/machine-learning/assets/Gr00t.png) +![NVIDIA Isaac GR00T N1 Model Architecture](/assets/images/Gr00t.png) image source: [GR00T paper](https://arxiv.org/pdf/2503.14734) @@ -257,7 +257,7 @@ For deployment guidance, we recommend examining FALCON's sim2real pipeline. Toge ## Further Reading -1. [Concept of thinking systems in human cognition](/wiki/machine-learning/assets/system1system2.png) +1. [Concept of thinking systems in human cognition](/assets/images/system1system2.png) 2. Figure AI's robot sorting packages [youtube](https://www.youtube.com/watch?v=lkc2y0yb89U&t=70s) 3. 1X performing human-like long-horizon tasks [youtube](https://www.youtube.com/watch?v=uVcBa6NXAbk) 4. Sunday Robotics performing distinct household tasks [youtube](https://www.youtube.com/watch?v=jjOfpsMRhL4) diff --git a/wiki/machine-learning/nlp-for-robotics.md b/wiki/machine-learning/nlp-for-robotics.md index 214a396b..ca355537 100644 --- a/wiki/machine-learning/nlp-for-robotics.md +++ b/wiki/machine-learning/nlp-for-robotics.md @@ -19,9 +19,9 @@ Transformers have become increasingly popular in NLP due to their ability to cap Transformers are a powerful tool for NLP and have revolutionized the field. They have enabled researchers to create models that can accurately capture the meaning of text and make accurate predictions. -![Transformer Architecture simplified](./assets/NLP_image1.png) +![Transformer Architecture simplified](/assets/images/NLP_image1.png) -![Transformer Architecture](./assets/NLP_image2.png) +![Transformer Architecture](/assets/images/NLP_image2.png) Encoder (left): The encoder receives an input and builds a representation of it (its features). This means that the model is optimized to acquire understanding from the input. @@ -135,7 +135,7 @@ preds = vqa(image=image, question=question) preds = [{"score": round(pred["score"], 4), "answer": pred["answer"]} for pred in preds] ``` -![Input Image](./assets/NLP_image3.png) +![Input Image](/assets/images/NLP_image3.png) @@ -161,7 +161,7 @@ OUTPUT: [ Below is a table describing some of the basic pipeline identifiers and their use. -![List of different pipelines](./assets/NLP_image4.png) +![List of different pipelines](/assets/images/NLP_image4.png) # Fine-tuning a pretrained model diff --git a/wiki/machine-learning/ros-yolo-gpu.md b/wiki/machine-learning/ros-yolo-gpu.md index 65db971d..a310fa76 100644 --- a/wiki/machine-learning/ros-yolo-gpu.md +++ b/wiki/machine-learning/ros-yolo-gpu.md @@ -16,7 +16,7 @@ This article serves as a step-by-step tutorial of how to integrate YOLO in ROS a --- ## Integrating YOLO with ROS -![YOLO Demo](assets/yolo_demo.png) +![YOLO Demo](/assets/images/yolo_demo.png) To install YOLO in ROS, we will use a YOLO ROS wrapper GitHub repository [darknet_ros](https://github.com/leggedrobotics/darknet_ros). You can simply follow their instructions in the README or follow the instructions below. diff --git a/wiki/math/__all_subsections.md b/wiki/math/__all_subsections.md index 29b23fae..4a57cd2b 100644 --- a/wiki/math/__all_subsections.md +++ b/wiki/math/__all_subsections.md @@ -25,7 +25,7 @@ You will be able to have a basic understanding on Gaussian Process (what is it a A Gaussian Process(GP) is a probability distribution over functions \\( p(\textbf{f}) \\) , where the functions are defined by a set of random function variables \\(\textbf{f} = \{f_1, f_2, . . . , f_N\}\\). For a GP, any finite linear combination of those function variables has a joint (zero mean) Gaussian distribution. It can be used for nonlinear regression, classification, ranking, preference learning, ordinal regression. In robotics, it can be applied to state estimation, motion planning and in our case environment modeling. GPs are closely related to other models and can be derived using bayesian kernel machines, linear regression with basis functions, infinite multi-layer perceptron neural networks (it becomes a GP if there are infinitely many hidden units and Gaussian priors on the weights), spline models. A simple connections between different methods can be found in the following figure. -![](assets/gpConnection.png) +![](/assets/images/gpConnection.png) @@ -36,7 +36,7 @@ GPs are closely related to other models and can be derived using bayesian kernel Before all the equations, lets have a look at why do we want to use GP? ### Why do we want to use GP? The major reasons why GP is popular includes: -1. It can handle uncertainty in unknown function by averaging, not minimizing as GP is rooted in probability and bayesian inference.![](assets/uncertainty.png) +1. It can handle uncertainty in unknown function by averaging, not minimizing as GP is rooted in probability and bayesian inference.![](/assets/images/uncertainty.png) Classifier comparison(https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) This property is not commonly shared by other methods. For example, in the above classification method comparison. Neural nets and random forests are confident about the points that are far from the training data. 2. We can incorporate prior knowledge by choosing different kernels 3. GP can learn the kernel and regularization parameters automatically during the learning process. (GP is a non-parametric model, but all data are needed to generate the model. In other words, it need finite but unbounded number of parameters that grows with data.) @@ -104,7 +104,7 @@ While \\( \mu \\) is the average value of the data (Expectations), \\( \Sigma \\ The Gaussian mixture model can be regarded as a model composed of K single Gaussian models, which are hidden variables of the hybrid model. In general, a mixed model can use any probability distribution. The Gaussian mixture model is used here because the Gaussian distribution has good mathematical properties and good computational performance. For example, we now have a bunch of samples of dogs. Different types of dogs have different body types, colors, and looks, but they all belong to the dog category. At this time, the single Gaussian model may not describe the distribution very well since the sample data distribution is not a single ellipse. However, a mixed Gaussian distribution can better describe the problem, as shown in the following figure: -![](assets/mixedGaussian.jpg) +![](/assets/images/mixedGaussian.jpg) Define: * \\( x_j \\) is the number \\( j \\) of the observed data, \\( j = 1, 2, ..., N \\) diff --git a/wiki/math/gaussian-process-gaussian-mixture-model.md b/wiki/math/gaussian-process-gaussian-mixture-model.md index fd016852..dab07a3d 100644 --- a/wiki/math/gaussian-process-gaussian-mixture-model.md +++ b/wiki/math/gaussian-process-gaussian-mixture-model.md @@ -24,7 +24,7 @@ You will be able to have a basic understanding on Gaussian Process (what is it a A Gaussian Process(GP) is a probability distribution over functions \\( p(\textbf{f}) \\) , where the functions are defined by a set of random function variables \\(\textbf{f} = \{f_1, f_2, . . . , f_N\}\\). For a GP, any finite linear combination of those function variables has a joint (zero mean) Gaussian distribution. It can be used for nonlinear regression, classification, ranking, preference learning, ordinal regression. In robotics, it can be applied to state estimation, motion planning and in our case environment modeling. GPs are closely related to other models and can be derived using bayesian kernel machines, linear regression with basis functions, infinite multi-layer perceptron neural networks (it becomes a GP if there are infinitely many hidden units and Gaussian priors on the weights), spline models. A simple connections between different methods can be found in the following figure. -![](assets/gpConnection.png) +![](/assets/images/gpConnection.png) @@ -35,7 +35,7 @@ GPs are closely related to other models and can be derived using bayesian kernel Before all the equations, lets have a look at why do we want to use GP? ### Why do we want to use GP? The major reasons why GP is popular includes: -1. It can handle uncertainty in unknown function by averaging, not minimizing as GP is rooted in probability and bayesian inference.![](assets/uncertainty.png) +1. It can handle uncertainty in unknown function by averaging, not minimizing as GP is rooted in probability and bayesian inference.![](/assets/images/uncertainty.png) Classifier comparison(https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) This property is not commonly shared by other methods. For example, in the above classification method comparison. Neural nets and random forests are confident about the points that are far from the training data. 2. We can incorporate prior knowledge by choosing different kernels 3. GP can learn the kernel and regularization parameters automatically during the learning process. (GP is a non-parametric model, but all data are needed to generate the model. In other words, it need finite but unbounded number of parameters that grows with data.) @@ -103,7 +103,7 @@ While \\( \mu \\) is the average value of the data (Expectations), \\( \Sigma \\ The Gaussian mixture model can be regarded as a model composed of K single Gaussian models, which are hidden variables of the hybrid model. In general, a mixed model can use any probability distribution. The Gaussian mixture model is used here because the Gaussian distribution has good mathematical properties and good computational performance. For example, we now have a bunch of samples of dogs. Different types of dogs have different body types, colors, and looks, but they all belong to the dog category. At this time, the single Gaussian model may not describe the distribution very well since the sample data distribution is not a single ellipse. However, a mixed Gaussian distribution can better describe the problem, as shown in the following figure: -![](assets/mixedGaussian.jpg) +![](/assets/images/mixedGaussian.jpg) Define: * \\( x_j \\) is the number \\( j \\) of the observed data, \\( j = 1, 2, ..., N \\) diff --git a/wiki/networking/__all_subsections.md b/wiki/networking/__all_subsections.md index 3ae798dc..1dd87138 100644 --- a/wiki/networking/__all_subsections.md +++ b/wiki/networking/__all_subsections.md @@ -241,7 +241,7 @@ XBee-PRO 900 DigiMesh is useful for setting up your own low bandwidth mesh netwo Firstly, download and install X-CTU. [The official guide from DIGI](https://docs.digi.com/display/XCTU/Download+and+install+XCTU) will walk you through this process. Once you are done with this, plug in your XBee adapter and launch X-CTU. The device should get detected automatically and you'll be presented with a screen similar to the one seen below. -![X-CTU Screen](assets/XbeeProDigiMesh900-1fc56.png) +![X-CTU Screen](/assets/images/XbeeProDigiMesh900-1fc56.png) Now it is important to note that this is not an ordinary XBee adapter which is why you'll see many more options than usual. Firstly, all your devices should be have same Modem VID (ID) and Hopping Channel (HP) for them to communicate. Now, further settings will depend on your individual requirements but just to explain some important parameters: - **Multi-Transmit (MT):** To set/read number of additional broadcast re-transmissions. All broadcast packets are transmitted MT+1 times to ensure it is received. diff --git a/wiki/networking/xbee-pro-digimesh-900.md b/wiki/networking/xbee-pro-digimesh-900.md index 8b191877..4cc0f7cb 100644 --- a/wiki/networking/xbee-pro-digimesh-900.md +++ b/wiki/networking/xbee-pro-digimesh-900.md @@ -11,7 +11,7 @@ XBee-PRO 900 DigiMesh is useful for setting up your own low bandwidth mesh netwo Firstly, download and install X-CTU. [The official guide from DIGI](https://docs.digi.com/display/XCTU/Download+and+install+XCTU) will walk you through this process. Once you are done with this, plug in your XBee adapter and launch X-CTU. The device should get detected automatically and you'll be presented with a screen similar to the one seen below. -![X-CTU Screen](assets/XbeeProDigiMesh900-1fc56.png) +![X-CTU Screen](/assets/images/XbeeProDigiMesh900-1fc56.png) Now it is important to note that this is not an ordinary XBee adapter which is why you'll see many more options than usual. Firstly, all your devices should be have same Modem VID (ID) and Hopping Channel (HP) for them to communicate. Now, further settings will depend on your individual requirements but just to explain some important parameters: - **Multi-Transmit (MT):** To set/read number of additional broadcast re-transmissions. All broadcast packets are transmitted MT+1 times to ensure it is received. diff --git a/wiki/planning/__all_subsections.md b/wiki/planning/__all_subsections.md index 4094fe34..8ce137e7 100644 --- a/wiki/planning/__all_subsections.md +++ b/wiki/planning/__all_subsections.md @@ -30,7 +30,7 @@ A* is a popular search algorithm that is guaranteed to return an optimal path, a A* works by computing optimal g-values for all states along the search at any point in time. -![](assets/astar_h_viz.png) +![](/assets/images/astar_h_viz.png) ## Planning Representation When designing a planner, you first need to decide a few things about how your problem will be represented. Key questions: @@ -132,7 +132,7 @@ This wiki details how to implement a basic coverage planner, which can be used f ## High Level Architecture of Coverage Planner Before we dive into the small details of this coverage planner, we will first look at the high level architecture of the coverage planner we will be designing. The image below shows the three main steps. - ![Coverage Planner Steps](assets/coverage_planner_steps.png) + ![Coverage Planner Steps](/assets/images/coverage_planner_steps.png) The input to the coverage planner is the region we want to generate the coverage plan for. We will represent our region of interest as an outer polygon with a set of polygonal holes. The holes represent areas within the overall outer polygon that we don't want to cover. For instance, in a robotic lawnmowing application, holes could represent gardens in the middle of the lawn that we don't want to mow. Similarly, in a drone wildfire-monitoring application, holes might represent lakes, which would not have any fire, and so you would not want to spend time monitoring them. The outer polygon as well as polygonal holes each are represented as lists of vertices, with each vertex being an x,y coordinate pair. @@ -144,7 +144,7 @@ This wiki details how to implement a basic coverage planner, which can be used f As mentioned above, the first step to our coverage planner will be decomposing the region of interest into simpler trapezoids. To perform this trapezoidal decomposition, we will use a vertical sweep line method. This involves "sweeping" a vertical line from left to right across the region. As the sweep line encounters events, which correspond to vertices, it processes them. We maintain a list of trapezoidal cells that are currently open, meaning that their right edge is unknown. Processing an event involves closing some open cells and opening new cells. Once the sweep line has made it past the right-most event, there should be no more open cells and the closed cells represent the full trapezoidal decomposition of the region. An example of such a trapezoidal decomposition from section 6.1 of the Principles of Robot Motion textbook is shown in the image below. - ![Trapezoidal Decomposition](assets/trapezoid_decomposition.png) + ![Trapezoidal Decomposition](/assets/images/trapezoid_decomposition.png) Diving into more detail, the first step of trapezoidal decomposition is to convert the outer boundary and holes into a list of events. To do this, we need to discuss what an event is. Events correspond to vertices of the region of interest, but they also contain some additional information. In addition to the current vertex (the vertex that the event corresponds to), an event contains the previous vertex, the next vertex, and the event type. The previous vertex and next vertex refer to the two vertices directly connected to the current vertex via edges. In order to distinguish between the next and previous vertex, we will use the convention that as you traverse the edges of the outer boundary or a hole, the region of interest (area you care about covering) will be to your left. Thus, we will traverse the outer boundary in counter-clockwise order and traverse holes in clockwise order. @@ -154,7 +154,7 @@ This wiki details how to implement a basic coverage planner, which can be used f This classification into different event types will be useful later as we process events, since each type will need to be processed differently. - ![Coverage Planner Event Types](assets/coverage_planner_event_types.png) + ![Coverage Planner Event Types](/assets/images/coverage_planner_event_types.png) To generate the list of events, loop through the vertices of the outer boundary in CCW order and loop through the vertices of each hole in CW order. At each vertex, add a new event with its previous, current, and next vertex. To determine the event type, you need to examine the x and y components of the previous and next vertex. For example, if both the previous and next vertex have an x component to the left of the current vertex, the event is either an OUT or CLOSE event. Comparing the y coordinate of the previous and next vertex can then distinguish between these two event types. Similarly, if the previous and next vertex are both to the right of the current vertex, the event type is either OPEN or IN. Again, you can then compare the y coordinate of the previous and next vertex to distinguish them. If the previous vertex is to the left of the current vertex and the next vertex is to the right of the current vertex, the event type is FLOOR. Finally, if the previous vertex is to the right while the next vertex is to the left, the event type is CEILING. @@ -182,7 +182,7 @@ This wiki details how to implement a basic coverage planner, which can be used f The trapezoidal cells define an implicit graph via their neighbor lists. Once we have the trapezoidal cells, we need to determine a cell traversal. This is an order in which to visit each cell. An example (incomplete) cell traversal from section 6.1 of the Principles of Robot Motion textbook is shown below. - ![Cell Traversal](assets/cell_traversal.png) + ![Cell Traversal](/assets/images/cell_traversal.png) There are lots of different ways to generate a cell traversal. For example, you could start from some random cell and perform depth-first search. You could use a greedy method where, from each cell, you go to the nearest unvisited cell. You could also use a more complex method such as using a TSP solver. @@ -321,8 +321,8 @@ from Frenet coordinates to the local vehicle frame in Cartesian coordinates is a Images and embedded video are supported. ![Path planning in frenet coordinates](assets/path_planning.jpg) -![frenet path](assets/ref_path.png) -![f_path](assets/f_path.png) +![frenet path](/assets/images/ref_path.png) +![f_path](/assets/images/f_path.png) ## Summary The given article describes in detail what is Frenet Frame and how robot motion planning is done. The importance and relevance of frenet frame with path planning in systems engineering is also highlighted in the given article. @@ -373,23 +373,23 @@ This package handles all the interactions between the planner, the controller (w This is what the architecture of MBF looks like: -![MBF Architecture](assets/MBF/move_base_flex_full.png) +![MBF Architecture](/assets/images/move_base_flex_full.png) The parts above the dotted line are the abstract classes and their interactions between them. These abstract classes are what you have to implement to get MBF to work. After doing this, you can write a simple node that instantiates the navigation server class you implemented, and your navigation stack is ready to be used on the robot. ### Plugin classes -![MBF Architecture](assets/MBF/abstract_plugin_classes.png) +![MBF Architecture](/assets/images/abstract_plugin_classes.png) These classes are dynamically loaded at runtime by the navigation server (detailed below) using ROS pluginlib, and do the high-level planning, low-level planning, and recovery behaviors. These classes are purely abstract. You have to make your global planner, local planner, and recovery classes inherit from these classes and implement the pure virtual functions of these classes. You can look at the header files in the *mbf_abstract_core* package in the MBF repository to find more information on the methods that you must implement. ### The abstract navigation server class -![MBF Architecture](assets/MBF/abstract_navigation_server.png) +![MBF Architecture](/assets/images/abstract_navigation_server.png) This class is the main class that runs the entire navigation stack and handles the loading, initialization, and interaction of the plugin classes mentioned above. The abstract_navigation_server is also a pure abstract class. You have to make your navigation server class inherit from the abstract_navigation_server and implement the pure virtual functions of these classes. You can look at `abstract_navigation_server.h` in the *mbf_abstraction_nav* package to get more information on what methods you must implement. Note here that, unlike the plugin classes, you don't need to re-implement all the functions of the abstract navigation server, just the pure virtual ones. However, you can re-implement any of those functions as well if you want to change the execution of those functions. ### The abstract execution classes -![MBF Architecture](assets/MBF/abstract_execution_classes.png) +![MBF Architecture](/assets/images/abstract_execution_classes.png) There are abstract classes for controlling the planner, controller, and recovery execution, but these are not pure abstract classes, and MBF has already implemented their functions. However, you may want to change how your planner, controller, and recovery behaviors execute and tie in with your navigation server. In that case, you can inherit from these classes and implement the functions you want to change. You can look at the `abstract_planner_execution.h`, `abstract_controller_execution.h`, and `abstract_recovery_execution.h` in the *mbf_abstract_nav* package to get more information on the functions. @@ -588,7 +588,7 @@ Centralised family of algorithms can be further subdivided into two classes of a ## Navigation Stack Design 1 : [Planning based approach](https://www.youtube.com/watch?v=K1_bagcw8Gc&themeRefresh=1) In a planning based approach, we design and implement a centralised multi robot planner which calculates collision free trajectories for each robot in the fleet and then these are executed by each robot with a decentralised controller. -![](assets/central_planner.png) +![](/assets/images/central_planner.png) ### Centralised Planner : [Prioritised Collaborative A*](https://github.com/MRSD-Team-RoboSAR/robosar_navigation) @@ -608,7 +608,7 @@ At a high level the prioritized multi A* performs these steps in a loop to perfo The planner is built on top of a 3D graph which consists of nodes in x,y and time. The graph handles all the nearest neighbor searches, collision checks, distance queries and other utility functions for the planner. The graph uses a cost map of the environment to do its collision checks. The costmap inflates all the obstacles in the occupancy grid map and also assigns some cost to neutral motion to encourage planner to take the shortest paths. It also uses cached trajectories of other robots while doing the collision checks so that robots have collision free trajectories in time. The planner currently uses a manhattan distance heuristic to estimate the cost to goal. All set and map data structures are optimized using a custom 3D hash function and have an O(1) lookup time. Priorities are currently assigned to the robots arbitrary before planning and then planning is done sequentially. This is something that can be improved! An interesting finding is about relative cost of waiting in time as against moving. We found that if both moving as well as waiting have the same cost, then A* almost always prefer moving than waiting which can lead to suboptimal behavior. So as of now we have lower cost to waiting than moving which gives us better paths leads to increased search times which is undesirable. We found the paths to be very suboptimal in a 4 connected grid so we use an 8 connected grid which gives very good results but obviously also contributes to our increased search times. -![](assets/prioritised_astar.png) +![](/assets/images/prioritised_astar.png) ### Decentralised controller : [LGController](https://github.com/MRSD-Team-RoboSAR/robosar_controller) @@ -627,7 +627,7 @@ Our trajectories in time include some pauses/stops along the way for avoiding co We wrote a ROS action server to wrap this controller and use it with the rest of the subsystems. So during operation we have a LGController action server running per robot. So we can say that the planning is centralized but the control is completely decentralised. -![](assets/mission_exec.png) +![](/assets/images/mission_exec.png) Once the planner and the controller were ready, there was a need to integrate them with the rest of the system. For this we wrote the Mission Executive class. Mission Executive does a lot of things during the operation. The first thing it is incharge of is asking the latest fleet information from the fleet management system and then setting up the controller servers for each robot in the fleet. It also listens for any changes in the fleet from the FMS and takes appropriate action based on it. It listens to tasks from the task allocation subsystem and is in charge of executing this mission. It first runs the planner on the tasks received from the task allocation. If planning was successful then the mission executive creates a ROS action client for each successful plan and then sends the planned trajectory to the appropriate controller server for execution. Then the mission executive also monitors the execution of the controller and gets ready for a new mission as soon as the controllers are done executing. @@ -656,7 +656,7 @@ The Lazy Traffic controller takes in the paths from the decentralised planner an At high level the basic principle is to not do extensive collision checking or planning unless explicitly required due to an immediate impending collision. How we do this is by enforcing a narrow neighborhood around each robot and doing local collision avoidance to avoid collisions in this neighborhood. This gives the controller its ‘laziness’. This local collision avoidance is implemented using the velocity obstacles algorithm. For each agent, all other agents act as obstacles in the velocity space and hence invalidate a set of velocities that this agent can execute. Velocity obstacles tries to select the best velocity as close to the preferred velocity as possible from the set of valid velocities. Preferred velocity is calculated for each agent from the global A* path found by the planner. Staying on this A* path is the preferred thing to do unless otherwise ruled out due to obstacles. -![](assets/velocity_obstacles.png) +![](/assets/images/velocity_obstacles.png) The lazy traffic controller has many interfaces with a lot of subsystems. The LT controller talks to the fleet management system to receive updates on the status of the fleet. It talks to the SLAM subsystem to receive the latest map of the environment. It also takes the pose for each agent from the transformation tree. It advertises a controller service which is used by the Mission Executive to actually send the list of agents and their planned paths for execution by the controller. Last but not least, it advertises the controller status of each robot, so that the task allocator can assign new tasks once old ones are completed! Pseudocode for the LT controller can be written as : @@ -672,7 +672,7 @@ Pseudocode for the LT controller can be written as : - Modify velocity using interrobot repulsion if another neighbour within repulsion radius -![](assets/lt_controller.png) +![](/assets/images/lt_controller.png) ### Takeaways 1. This design works really well when robots have unconstrained motion around each other in 2D and robots are small in size compared to the free space around them! diff --git a/wiki/planning/advanced-moveit-manipulator-planning.md b/wiki/planning/advanced-moveit-manipulator-planning.md index 8b89766b..bae11b23 100644 --- a/wiki/planning/advanced-moveit-manipulator-planning.md +++ b/wiki/planning/advanced-moveit-manipulator-planning.md @@ -30,7 +30,7 @@ The primary task of our dual-manipulator project is to harvest and store green p * Move cutter fully into grasp position, * After harvest, the cutter goes to home pose while the gripper moves the pepper to a storage bin. -![VADER planning sequence](/assets/images/adv-moveit-manipulator-planning/vader_planning_seq.png) +![VADER planning sequence](/assets/images/vader_planning_seq.png) The home pose of both arms, as well as the gripper pose when storing the pepper, are fixed. The coarse and fine pose estimates of the target pepper depends on the placement of the system, and are therefore fairly variable. @@ -47,7 +47,7 @@ The Cartesian planner plans in a straight line from A to B, and computes the joi | Advantages | Consistently finds a viable solution, especially if using joint goals. Maneuvers freely in obstacle-rich environment to disentangle arms. | Very fast to compute & execute. Path deterministic and predictable. | | Drawbacks | Solution not deterministic and can travel too far in free space. Requires careful placement of collision objects to discourage winding paths. Slower to compute & execute. | Solution could cause singularities and controller error if running into joint limits. This means the solution success is dependent on the starting joint configuration. | | Usage | This is used in our Homing motions as well as the gripper move-to-storage motion. | This is used in our pregrasp, final grasp, retraction (after harvest), and lowering the pepper down to the final storage location. | -| Example Path | ![RRTStar example path](/assets/images/adv-moveit-manipulator-planning/rrtstar.png) | ![Cartesian example path](/assets/images/adv-moveit-manipulator-planning/cartesian.png) | +| Example Path | ![RRTStar example path](/assets/images/rrtstar.png) | ![Cartesian example path](/assets/images/cartesian.png) | We will talk about each of these planners in greater detail below. @@ -102,7 +102,7 @@ To help in testing the robustness and failure modes of our planning and state ma For each simulated run, a randomized pepper ground truth pose is generated, and noise added. We run the entire system given this pose estimate, and watch how the RRT and Cartesian planners fail in which circumstances (due to reachability, planner failure, etc.). An example result of 100 aggregated runs is shown below, and higher failure rates at either ends of the horizontal workspace are observed. -![Simulation testing results](/assets/images/adv-moveit-manipulator-planning/simulation_testing.png) +![Simulation testing results](/assets/images/simulation_testing.png) This helped us quantify exactly how the overall system may fail due to lack of reachability for either arms, and how to position our platform in front of peppers during the Fall Validation Demo. diff --git a/wiki/planning/astar_planning_implementation_guide.md b/wiki/planning/astar_planning_implementation_guide.md index 2376f089..1a8a222d 100644 --- a/wiki/planning/astar_planning_implementation_guide.md +++ b/wiki/planning/astar_planning_implementation_guide.md @@ -29,7 +29,7 @@ A* is a popular search algorithm that is guaranteed to return an optimal path, a A* works by computing optimal g-values for all states along the search at any point in time. -![](assets/astar_h_viz.png) +![](/assets/images/astar_h_viz.png) ## Planning Representation When designing a planner, you first need to decide a few things about how your problem will be represented. Key questions: diff --git a/wiki/planning/coverage-planning-implementation-guide.md b/wiki/planning/coverage-planning-implementation-guide.md index 0ce9375c..2267eeff 100644 --- a/wiki/planning/coverage-planning-implementation-guide.md +++ b/wiki/planning/coverage-planning-implementation-guide.md @@ -19,7 +19,7 @@ This wiki details how to implement a basic coverage planner, which can be used f ## High Level Architecture of Coverage Planner Before we dive into the small details of this coverage planner, we will first look at the high level architecture of the coverage planner we will be designing. The image below shows the three main steps. - ![Coverage Planner Steps](assets/coverage_planner_steps.png) + ![Coverage Planner Steps](/assets/images/coverage_planner_steps.png) The input to the coverage planner is the region we want to generate the coverage plan for. We will represent our region of interest as an outer polygon with a set of polygonal holes. The holes represent areas within the overall outer polygon that we don't want to cover. For instance, in a robotic lawnmowing application, holes could represent gardens in the middle of the lawn that we don't want to mow. Similarly, in a drone wildfire-monitoring application, holes might represent lakes, which would not have any fire, and so you would not want to spend time monitoring them. The outer polygon as well as polygonal holes each are represented as lists of vertices, with each vertex being an x,y coordinate pair. @@ -31,7 +31,7 @@ This wiki details how to implement a basic coverage planner, which can be used f As mentioned above, the first step to our coverage planner will be decomposing the region of interest into simpler trapezoids. To perform this trapezoidal decomposition, we will use a vertical sweep line method. This involves "sweeping" a vertical line from left to right across the region. As the sweep line encounters events, which correspond to vertices, it processes them. We maintain a list of trapezoidal cells that are currently open, meaning that their right edge is unknown. Processing an event involves closing some open cells and opening new cells. Once the sweep line has made it past the right-most event, there should be no more open cells and the closed cells represent the full trapezoidal decomposition of the region. An example of such a trapezoidal decomposition from section 6.1 of the Principles of Robot Motion textbook is shown in the image below. - ![Trapezoidal Decomposition](assets/trapezoid_decomposition.png) + ![Trapezoidal Decomposition](/assets/images/trapezoid_decomposition.png) Diving into more detail, the first step of trapezoidal decomposition is to convert the outer boundary and holes into a list of events. To do this, we need to discuss what an event is. Events correspond to vertices of the region of interest, but they also contain some additional information. In addition to the current vertex (the vertex that the event corresponds to), an event contains the previous vertex, the next vertex, and the event type. The previous vertex and next vertex refer to the two vertices directly connected to the current vertex via edges. In order to distinguish between the next and previous vertex, we will use the convention that as you traverse the edges of the outer boundary or a hole, the region of interest (area you care about covering) will be to your left. Thus, we will traverse the outer boundary in counter-clockwise order and traverse holes in clockwise order. @@ -41,7 +41,7 @@ This wiki details how to implement a basic coverage planner, which can be used f This classification into different event types will be useful later as we process events, since each type will need to be processed differently. - ![Coverage Planner Event Types](assets/coverage_planner_event_types.png) + ![Coverage Planner Event Types](/assets/images/coverage_planner_event_types.png) To generate the list of events, loop through the vertices of the outer boundary in CCW order and loop through the vertices of each hole in CW order. At each vertex, add a new event with its previous, current, and next vertex. To determine the event type, you need to examine the x and y components of the previous and next vertex. For example, if both the previous and next vertex have an x component to the left of the current vertex, the event is either an OUT or CLOSE event. Comparing the y coordinate of the previous and next vertex can then distinguish between these two event types. Similarly, if the previous and next vertex are both to the right of the current vertex, the event type is either OPEN or IN. Again, you can then compare the y coordinate of the previous and next vertex to distinguish them. If the previous vertex is to the left of the current vertex and the next vertex is to the right of the current vertex, the event type is FLOOR. Finally, if the previous vertex is to the right while the next vertex is to the left, the event type is CEILING. @@ -69,7 +69,7 @@ This wiki details how to implement a basic coverage planner, which can be used f The trapezoidal cells define an implicit graph via their neighbor lists. Once we have the trapezoidal cells, we need to determine a cell traversal. This is an order in which to visit each cell. An example (incomplete) cell traversal from section 6.1 of the Principles of Robot Motion textbook is shown below. - ![Cell Traversal](assets/cell_traversal.png) + ![Cell Traversal](/assets/images/cell_traversal.png) There are lots of different ways to generate a cell traversal. For example, you could start from some random cell and perform depth-first search. You could use a greedy method where, from each cell, you go to the nearest unvisited cell. You could also use a more complex method such as using a TSP solver. diff --git a/wiki/planning/frenet-frame-planning.md b/wiki/planning/frenet-frame-planning.md index 0b61cb47..b1bf16eb 100644 --- a/wiki/planning/frenet-frame-planning.md +++ b/wiki/planning/frenet-frame-planning.md @@ -98,8 +98,8 @@ from Frenet coordinates to the local vehicle frame in Cartesian coordinates is a Images and embedded video are supported. ![Path planning in frenet coordinates](assets/path_planning.jpg) -![frenet path](assets/ref_path.png) -![f_path](assets/f_path.png) +![frenet path](/assets/images/ref_path.png) +![f_path](/assets/images/f_path.png) ## Summary The given article describes in detail what is Frenet Frame and how robot motion planning is done. The importance and relevance of frenet frame with path planning in systems engineering is also highlighted in the given article. diff --git a/wiki/planning/move_base_flex.md b/wiki/planning/move_base_flex.md index e0593dc1..0c0a87d4 100644 --- a/wiki/planning/move_base_flex.md +++ b/wiki/planning/move_base_flex.md @@ -29,23 +29,23 @@ This package handles all the interactions between the planner, the controller (w This is what the architecture of MBF looks like: -![MBF Architecture](assets/MBF/move_base_flex_full.png) +![MBF Architecture](/assets/images/move_base_flex_full.png) The parts above the dotted line are the abstract classes and their interactions between them. These abstract classes are what you have to implement to get MBF to work. After doing this, you can write a simple node that instantiates the navigation server class you implemented, and your navigation stack is ready to be used on the robot. ### Plugin classes -![MBF Architecture](assets/MBF/abstract_plugin_classes.png) +![MBF Architecture](/assets/images/abstract_plugin_classes.png) These classes are dynamically loaded at runtime by the navigation server (detailed below) using ROS pluginlib, and do the high-level planning, low-level planning, and recovery behaviors. These classes are purely abstract. You have to make your global planner, local planner, and recovery classes inherit from these classes and implement the pure virtual functions of these classes. You can look at the header files in the *mbf_abstract_core* package in the MBF repository to find more information on the methods that you must implement. ### The abstract navigation server class -![MBF Architecture](assets/MBF/abstract_navigation_server.png) +![MBF Architecture](/assets/images/abstract_navigation_server.png) This class is the main class that runs the entire navigation stack and handles the loading, initialization, and interaction of the plugin classes mentioned above. The abstract_navigation_server is also a pure abstract class. You have to make your navigation server class inherit from the abstract_navigation_server and implement the pure virtual functions of these classes. You can look at `abstract_navigation_server.h` in the *mbf_abstraction_nav* package to get more information on what methods you must implement. Note here that, unlike the plugin classes, you don't need to re-implement all the functions of the abstract navigation server, just the pure virtual ones. However, you can re-implement any of those functions as well if you want to change the execution of those functions. ### The abstract execution classes -![MBF Architecture](assets/MBF/abstract_execution_classes.png) +![MBF Architecture](/assets/images/abstract_execution_classes.png) There are abstract classes for controlling the planner, controller, and recovery execution, but these are not pure abstract classes, and MBF has already implemented their functions. However, you may want to change how your planner, controller, and recovery behaviors execute and tie in with your navigation server. In that case, you can inherit from these classes and implement the functions you want to change. You can look at the `abstract_planner_execution.h`, `abstract_controller_execution.h`, and `abstract_recovery_execution.h` in the *mbf_abstract_nav* package to get more information on the functions. diff --git a/wiki/planning/multi-robot-planning.md b/wiki/planning/multi-robot-planning.md index 4993801c..5802bb12 100644 --- a/wiki/planning/multi-robot-planning.md +++ b/wiki/planning/multi-robot-planning.md @@ -20,7 +20,7 @@ Centralised family of algorithms can be further subdivided into two classes of a ## Navigation Stack Design 1 : [Planning based approach](https://www.youtube.com/watch?v=K1_bagcw8Gc&themeRefresh=1) In a planning based approach, we design and implement a centralised multi robot planner which calculates collision free trajectories for each robot in the fleet and then these are executed by each robot with a decentralised controller. -![](assets/central_planner.png) +![](/assets/images/central_planner.png) ### Centralised Planner : [Prioritised Collaborative A*](https://github.com/MRSD-Team-RoboSAR/robosar_navigation) @@ -40,7 +40,7 @@ At a high level the prioritized multi A* performs these steps in a loop to perfo The planner is built on top of a 3D graph which consists of nodes in x,y and time. The graph handles all the nearest neighbor searches, collision checks, distance queries and other utility functions for the planner. The graph uses a cost map of the environment to do its collision checks. The costmap inflates all the obstacles in the occupancy grid map and also assigns some cost to neutral motion to encourage planner to take the shortest paths. It also uses cached trajectories of other robots while doing the collision checks so that robots have collision free trajectories in time. The planner currently uses a manhattan distance heuristic to estimate the cost to goal. All set and map data structures are optimized using a custom 3D hash function and have an O(1) lookup time. Priorities are currently assigned to the robots arbitrary before planning and then planning is done sequentially. This is something that can be improved! An interesting finding is about relative cost of waiting in time as against moving. We found that if both moving as well as waiting have the same cost, then A* almost always prefer moving than waiting which can lead to suboptimal behavior. So as of now we have lower cost to waiting than moving which gives us better paths leads to increased search times which is undesirable. We found the paths to be very suboptimal in a 4 connected grid so we use an 8 connected grid which gives very good results but obviously also contributes to our increased search times. -![](assets/prioritised_astar.png) +![](/assets/images/prioritised_astar.png) ### Decentralised controller : [LGController](https://github.com/MRSD-Team-RoboSAR/robosar_controller) @@ -59,7 +59,7 @@ Our trajectories in time include some pauses/stops along the way for avoiding co We wrote a ROS action server to wrap this controller and use it with the rest of the subsystems. So during operation we have a LGController action server running per robot. So we can say that the planning is centralized but the control is completely decentralised. -![](assets/mission_exec.png) +![](/assets/images/mission_exec.png) Once the planner and the controller were ready, there was a need to integrate them with the rest of the system. For this we wrote the Mission Executive class. Mission Executive does a lot of things during the operation. The first thing it is incharge of is asking the latest fleet information from the fleet management system and then setting up the controller servers for each robot in the fleet. It also listens for any changes in the fleet from the FMS and takes appropriate action based on it. It listens to tasks from the task allocation subsystem and is in charge of executing this mission. It first runs the planner on the tasks received from the task allocation. If planning was successful then the mission executive creates a ROS action client for each successful plan and then sends the planned trajectory to the appropriate controller server for execution. Then the mission executive also monitors the execution of the controller and gets ready for a new mission as soon as the controllers are done executing. @@ -88,7 +88,7 @@ The Lazy Traffic controller takes in the paths from the decentralised planner an At high level the basic principle is to not do extensive collision checking or planning unless explicitly required due to an immediate impending collision. How we do this is by enforcing a narrow neighborhood around each robot and doing local collision avoidance to avoid collisions in this neighborhood. This gives the controller its ‘laziness’. This local collision avoidance is implemented using the velocity obstacles algorithm. For each agent, all other agents act as obstacles in the velocity space and hence invalidate a set of velocities that this agent can execute. Velocity obstacles tries to select the best velocity as close to the preferred velocity as possible from the set of valid velocities. Preferred velocity is calculated for each agent from the global A* path found by the planner. Staying on this A* path is the preferred thing to do unless otherwise ruled out due to obstacles. -![](assets/velocity_obstacles.png) +![](/assets/images/velocity_obstacles.png) The lazy traffic controller has many interfaces with a lot of subsystems. The LT controller talks to the fleet management system to receive updates on the status of the fleet. It talks to the SLAM subsystem to receive the latest map of the environment. It also takes the pose for each agent from the transformation tree. It advertises a controller service which is used by the Mission Executive to actually send the list of agents and their planned paths for execution by the controller. Last but not least, it advertises the controller status of each robot, so that the task allocator can assign new tasks once old ones are completed! Pseudocode for the LT controller can be written as : @@ -104,7 +104,7 @@ Pseudocode for the LT controller can be written as : - Modify velocity using interrobot repulsion if another neighbour within repulsion radius -![](assets/lt_controller.png) +![](/assets/images/lt_controller.png) ### Takeaways 1. This design works really well when robots have unconstrained motion around each other in 2D and robots are small in size compared to the free space around them! diff --git a/wiki/programming/__all_subsections.md b/wiki/programming/__all_subsections.md index 2e6eae69..cc0cbd0c 100644 --- a/wiki/programming/__all_subsections.md +++ b/wiki/programming/__all_subsections.md @@ -3,7 +3,7 @@ date: 2017-08-21 title: Boost C++ Libraries --- -[![Boost Logo](assets/BoostLibrary-f962f.png)](https://www.boost.org/) +[![Boost Logo](/assets/images/BoostLibrary-f962f.png)](https://www.boost.org/) Boost is the most popular and widely used C++ library. It is available online for free. This stable C++ library contains many helpful data structures, algorithms, utilities, and more. This library influenced the design and implementation of the newest C++ library standard (C++11). @@ -61,7 +61,7 @@ Writing a Makefile can be a complicated task, especially for larger projects. CM When using CMake, it is common and accepted practice to organize a project folder according to a specific folder structure, as seen in the image below. -![CMake File Structure](assets/cmake_file_structure.png) +![CMake File Structure](/assets/images/cmake_file_structure.png) - **bin:** contains the executable files which can be run on the computer. - **build:** contains the makefiles which are required to build the project. @@ -163,7 +163,7 @@ Additionally, you can: The applications are the following 1. Convert Pose to Quaternions and vice versa 2. Find the relative pose transformations by just using simple 3D homogeneous transformation `Eigen::Affine3d T` is a 4*4 homogeneous transform: -![Homogeneous Equation Example](assets/EigenLibrary-35715.png) +![Homogeneous Equation Example](/assets/images/EigenLibrary-35715.png) 3. Now all the transformations (rotation or translation) can be represented in homogeneous form as simple 4*4 matrix multiplications. 4. Suppose you have a pose transform T of robot in the world and you want to find robot’s X-direction relative to the world. You can do this by using `Eigen::Vector3d x_bearing= T.rotation * Eigen::Vector3d::UnitX();` diff --git a/wiki/programming/boost-library.md b/wiki/programming/boost-library.md index db2bc1d8..ec7cddbe 100644 --- a/wiki/programming/boost-library.md +++ b/wiki/programming/boost-library.md @@ -2,7 +2,7 @@ date: 2017-08-21 title: Boost C++ Libraries --- -[![Boost Logo](assets/BoostLibrary-f962f.png)](https://www.boost.org/) +[![Boost Logo](/assets/images/BoostLibrary-f962f.png)](https://www.boost.org/) Boost is the most popular and widely used C++ library. It is available online for free. This stable C++ library contains many helpful data structures, algorithms, utilities, and more. This library influenced the design and implementation of the newest C++ library standard (C++11). diff --git a/wiki/programming/cmake.md b/wiki/programming/cmake.md index dd4c2a20..c9775592 100644 --- a/wiki/programming/cmake.md +++ b/wiki/programming/cmake.md @@ -10,7 +10,7 @@ Writing a Makefile can be a complicated task, especially for larger projects. CM When using CMake, it is common and accepted practice to organize a project folder according to a specific folder structure, as seen in the image below. -![CMake File Structure](assets/cmake_file_structure.png) +![CMake File Structure](/assets/images/cmake_file_structure.png) - **bin:** contains the executable files which can be run on the computer. - **build:** contains the makefiles which are required to build the project. diff --git a/wiki/programming/eigen-library.md b/wiki/programming/eigen-library.md index 2f906dca..2b4ac76c 100644 --- a/wiki/programming/eigen-library.md +++ b/wiki/programming/eigen-library.md @@ -30,7 +30,7 @@ Additionally, you can: The applications are the following 1. Convert Pose to Quaternions and vice versa 2. Find the relative pose transformations by just using simple 3D homogeneous transformation `Eigen::Affine3d T` is a 4*4 homogeneous transform: -![Homogeneous Equation Example](assets/EigenLibrary-35715.png) +![Homogeneous Equation Example](/assets/images/EigenLibrary-35715.png) 3. Now all the transformations (rotation or translation) can be represented in homogeneous form as simple 4*4 matrix multiplications. 4. Suppose you have a pose transform T of robot in the world and you want to find robot’s X-direction relative to the world. You can do this by using `Eigen::Vector3d x_bearing= T.rotation * Eigen::Vector3d::UnitX();` diff --git a/wiki/programming/yasmin-ros2-state-machine.md b/wiki/programming/yasmin-ros2-state-machine.md index a01c1009..fecb452e 100644 --- a/wiki/programming/yasmin-ros2-state-machine.md +++ b/wiki/programming/yasmin-ros2-state-machine.md @@ -125,7 +125,7 @@ sm() - Visualization: `YasminViewerPub("yasmin_snaak", sm)` publishes the state machine so operators can inspect progress live. The visualization of our system is shown below -![Yasmin state machine](/assets/images/robotics_project_guide/state_machine.png) +![Yasmin state machine](/assets/images/state_machine.png) ## Yasmin vs. Behavior Trees diff --git a/wiki/project-management/__all_subsections.md b/wiki/project-management/__all_subsections.md index 06772d7f..9100de9b 100644 --- a/wiki/project-management/__all_subsections.md +++ b/wiki/project-management/__all_subsections.md @@ -283,7 +283,7 @@ Some more example automation possibilities can be found here: The burndown chart is a popular chart among project managers. This allows the PM to view how the work is progressing over a sprint and the work is not falling behind. It displays the days in the sprint by the story points allocated for that sprint. This can be found in Reports → Burndown Chart. The goal is to have the remaining work track the Guideline. -![Example Burndown Chart](assets/images/jira_burndown_chart.png) +![Example Burndown Chart](/assets/images/jira_burndown_chart.png) ## Summary In summary, Jira is a powerful tool for agile development. There are numerous features that can help a project be propelled to success. This article only lists a few features. Use whichever features work best for your team. @@ -469,7 +469,7 @@ A standard meeting notes document should have the following content-sections: Here is an example of maintaining meeting notes on Notion. -![Meeting Notes List](assets/images/meeting-notes.png) +![Meeting Notes List](/assets/images/meeting-notes.png) ### Task List @@ -492,7 +492,7 @@ A standard task card should have the following content-sections: - Evidence of Completion Here is an example of tracking tasks on Notion. -![image2.png](assets/images/task-list.png) +![image2.png](/assets/images/task-list.png) @@ -500,10 +500,10 @@ Here is an example of tracking tasks on Notion. Notion automatically converts your task list to a timeline format (Gantt chart). However, Notion can only do this to tasks that have a start date and end date defined. Additionally, you can edit the task list to add dependencies between tasks. Here is an example of managing a project's schedule on Notion. -![Picture2.png](assets/images/project-schedule.png) +![Picture2.png](/assets/images/project-schedule.png) > While coming up with a project schedule, make sure that you keep external milestones and delivery dates in mind. It is a good practice to come up with intermediate internal milestones enroute external milestones. The image below shows an example of how you can keep track of milestones for your project. -![Picture5.png](assets/images/milestones.png) +![Picture5.png](/assets/images/milestones.png) @@ -562,7 +562,7 @@ Here are the rules: Feel free to modify the rules to suit your team’s interests! -![Picture3.png](assets/images/card-system.png) +![Picture3.png](/assets/images/card-system.png) ### Office Hours @@ -575,7 +575,7 @@ A fun strategy here is to define project ‘**Office Hours**’ – specific tim After committing to weekly ‘Office Hour’ timings, each team member should try to stick to these timings (or cover up for them where applicable). These office hours will help the project manager keep track of each individual’s progress, efficiency and contribution over time, which will help in future planning activities. Here is an example of Team Availability (Office Hours) that you could apply to your project as well. -![Picture4.png](assets/images/office-hours.png) +![Picture4.png](/assets/images/office-hours.png) ### Communication Channels diff --git a/wiki/project-management/jira.md b/wiki/project-management/jira.md index 7e3f6f0a..9b38765c 100644 --- a/wiki/project-management/jira.md +++ b/wiki/project-management/jira.md @@ -121,7 +121,7 @@ Some more example automation possibilities can be found here: The burndown chart is a popular chart among project managers. This allows the PM to view how the work is progressing over a sprint and the work is not falling behind. It displays the days in the sprint by the story points allocated for that sprint. This can be found in Reports → Burndown Chart. The goal is to have the remaining work track the Guideline. -![Example Burndown Chart](assets/images/jira_burndown_chart.png) +![Example Burndown Chart](/assets/images/jira_burndown_chart.png) ## Summary In summary, Jira is a powerful tool for agile development. There are numerous features that can help a project be propelled to success. This article only lists a few features. Use whichever features work best for your team. diff --git a/wiki/project-management/using-notion-for-project-management.md b/wiki/project-management/using-notion-for-project-management.md index 94d4135f..e96668d2 100644 --- a/wiki/project-management/using-notion-for-project-management.md +++ b/wiki/project-management/using-notion-for-project-management.md @@ -55,7 +55,7 @@ A standard meeting notes document should have the following content-sections: Here is an example of maintaining meeting notes on Notion. -![Meeting Notes List](assets/images/meeting-notes.png) +![Meeting Notes List](/assets/images/meeting-notes.png) ### Task List @@ -78,7 +78,7 @@ A standard task card should have the following content-sections: - Evidence of Completion Here is an example of tracking tasks on Notion. -![image2.png](assets/images/task-list.png) +![image2.png](/assets/images/task-list.png) @@ -86,10 +86,10 @@ Here is an example of tracking tasks on Notion. Notion automatically converts your task list to a timeline format (Gantt chart). However, Notion can only do this to tasks that have a start date and end date defined. Additionally, you can edit the task list to add dependencies between tasks. Here is an example of managing a project's schedule on Notion. -![Picture2.png](assets/images/project-schedule.png) +![Picture2.png](/assets/images/project-schedule.png) > While coming up with a project schedule, make sure that you keep external milestones and delivery dates in mind. It is a good practice to come up with intermediate internal milestones enroute external milestones. The image below shows an example of how you can keep track of milestones for your project. -![Picture5.png](assets/images/milestones.png) +![Picture5.png](/assets/images/milestones.png) @@ -148,7 +148,7 @@ Here are the rules: Feel free to modify the rules to suit your team’s interests! -![Picture3.png](assets/images/card-system.png) +![Picture3.png](/assets/images/card-system.png) ### Office Hours @@ -161,7 +161,7 @@ A fun strategy here is to define project ‘**Office Hours**’ – specific tim After committing to weekly ‘Office Hour’ timings, each team member should try to stick to these timings (or cover up for them where applicable). These office hours will help the project manager keep track of each individual’s progress, efficiency and contribution over time, which will help in future planning activities. Here is an example of Team Availability (Office Hours) that you could apply to your project as well. -![Picture4.png](assets/images/office-hours.png) +![Picture4.png](/assets/images/office-hours.png) ### Communication Channels diff --git a/wiki/robotics-project-guide/choose-a-robot.md b/wiki/robotics-project-guide/choose-a-robot.md index 2bc59b59..7a702eff 100644 --- a/wiki/robotics-project-guide/choose-a-robot.md +++ b/wiki/robotics-project-guide/choose-a-robot.md @@ -4,7 +4,7 @@ title: Choose a Robot mermaid: true --- -![RobotOverview](/assets/images/robotics_project_guide/robot_overview.png) +![RobotOverview](/assets/images/robot_overview.png) [Image source](https://www.machinedesign.com/markets/robotics/article/21835000/whats-the-difference-between-industrial-robots) Truly, there are so many robots that you can choose from to achieve your goal. Once you choose what platform you will be using for your project, it's now time to choose the specific platform. @@ -49,7 +49,7 @@ Despite their advantages, quadrotors come with notable disadvantages. Their limi **Popular Platforms:** -![Quadrotor Platforms](/assets/images/robotics_project_guide/quadrotors_all.png) +![Quadrotor Platforms](/assets/images/quadrotors_all.png) Without getting into the nitty-gritty details, the basic idea is - if you want to have an extremely customized quadrotor, you should use the PX4 Autopilot Platform. PX4 is an open-source flight control system that provides unparalleled flexibility, allowing users to design and implement custom hardware configurations, integrate specialized sensors, and modify flight algorithms. Its modular architecture supports a wide range of hardware, from small indoor drones to large outdoor quadrotors, making it adaptable to various applications. @@ -133,7 +133,7 @@ Compared to wheeled robots, quadrupeds are generally slower but more versatile i **Popular Platforms:** -![Quadruped Platforms](/assets/images/robotics_project_guide/quadrupeds_all.png) +![Quadruped Platforms](/assets/images/quadrupeds_all.png) 1. **Unitree Robots:** - **Unitree Go1 EDU:** A compact and affordable quadruped ideal for education and research, offering advanced locomotion capabilities and ROS support. [Unitree Go1](https://www.unitree.com/products/go1) @@ -192,7 +192,7 @@ Although wheeled robots are primarily suited to flat, obstacle-free environments **Popular Platforms:** -![Wheeled Robots](/assets/images/robotics_project_guide/wheeled_robots_all.png) +![Wheeled Robots](/assets/images/wheeled_robots_all.png) 1. **TurtleBot Series:** - **TurtleBot3 Burger:** A compact, affordable, and programmable ROS-based mobile robot designed for education and research. It features modularity and open-source software, allowing for extensive customization. @@ -238,7 +238,7 @@ Fixed manipulators are stationary robotic arms designed for tasks such as assemb **Popular Platforms:** -![Manipulator Robots](/assets/images/robotics_project_guide/manipulators_all.png) +![Manipulator Robots](/assets/images/manipulators_all.png) 1. **Kinova Gen3 (7 DoF):** - **Degrees of Freedom:** 7 diff --git a/wiki/robotics-project-guide/choose-a-sim.md b/wiki/robotics-project-guide/choose-a-sim.md index c6be13f0..dba7193a 100644 --- a/wiki/robotics-project-guide/choose-a-sim.md +++ b/wiki/robotics-project-guide/choose-a-sim.md @@ -4,7 +4,7 @@ title: Choose a Simulator mermaid: true --- -![all_sim](/assets/images/robotics_project_guide/all_sim.png) +![all_sim](/assets/images/all_sim.png) Selecting the appropriate simulator is a pivotal step in any robotics project. Simulators allow you to test algorithms, design robots, and visualize environments without the need for physical hardware, saving both time and resources. This section will guide you through the importance of simulators, help you identify the type of simulator that suits your project's needs, and provide comparisons of popular options across various categories. @@ -138,7 +138,7 @@ Users define the physical and kinematic properties of robots using formats like By providing this information in a URDF file, simulators can accurately construct and simulate the robot's behavior within a virtual environment. -![urdf_to_sim](/assets/images/robotics_project_guide/urdf_to_sim.png) +![urdf_to_sim](/assets/images/urdf_to_sim.png) Here, the `"link"` in the red square on left-side is the URDF section that defines the Unitree G1's pelvis link. Based on the information provided here, the physics engine simulates the pelvis on the humanoid robot. **Extended Effects Through Plugins or Force/Torque Models** @@ -176,7 +176,7 @@ We first go over some popular simulators tailored for robotics applications. *Free for personal or educational use; commercial licenses may apply. ### [Gazebo](https://gazebosim.org/home) -![gazebo_sim](/assets/images/robotics_project_guide/gazebo_sim.png) +![gazebo_sim](/assets/images/gazebo_sim.png) Gazebo is a widely-used open-source robotics simulator that offers robust physics simulation and sensor modeling capabilities. It provides a 3D environment where users can test and develop robots in realistic scenarios. Gazebo's integration with the Robot Operating System (ROS) makes it a standard choice for many robotics projects, facilitating seamless communication between simulation and real-world applications. @@ -192,7 +192,7 @@ Gazebo is a widely-used open-source robotics simulator that offers robust physic - **Learning Curve**: May require time to master its extensive features and functionalities. ### [AirSim (on Unity)](https://microsoft.github.io/AirSim/Unity/?utm_source=chatgpt.com) -![airsim_sim](/assets/images/robotics_project_guide/airsim_sim.png) +![airsim_sim](/assets/images/airsim_sim.png) Developed by Microsoft, AirSim is an open-source simulator designed primarily for drones and autonomous vehicles. Built on the Unreal Engine, it provides high-fidelity visuals and accurate physics modeling, making it suitable for machine learning and computer vision research. AirSim supports both software-in-the-loop and hardware-in-the-loop simulations, allowing for seamless transitions from virtual to real-world testing. **Pros**: @@ -208,7 +208,7 @@ Developed by Microsoft, AirSim is an open-source simulator designed primarily fo ### [CoppeliaSim (formerly V-REP)](https://www.coppeliarobotics.com/) -![coppeliasim_sim](/assets/images/robotics_project_guide/CoppeliaSim_sim.jpg) +![coppeliasim_sim](/assets/images/CoppeliaSim_sim.jpg) CoppeliaSim is a versatile robotics simulator known for its extensive feature set and modularity. It supports a wide range of robot models and includes several physics engines for accurate simulation. CoppeliaSim's integrated development environment allows for rapid prototyping and testing of robotic algorithms. It also offers support for multiple programming languages, enhancing its flexibility for various applications. @@ -225,7 +225,7 @@ CoppeliaSim is a versatile robotics simulator known for its extensive feature se ### [Unity](https://unity.com/blog/engine-platform/robotics-simulation-is-easy-as-1-2-3) -![unity_sim](/assets/images/robotics_project_guide/unity_sim.png) +![unity_sim](/assets/images/unity_sim.png) Unity is a powerful game development platform that has gained popularity in robotics for its high-quality rendering and flexible environment creation. While not specifically designed for robotics, Unity's extensive asset store and scripting capabilities allow users to build complex simulations. With the addition of plugins and bridges, Unity can integrate with ROS, enabling the development of sophisticated robotic applications with realistic visuals. @@ -254,7 +254,7 @@ As the field of robotics increasingly incorporates reinforcement learning (RL) t ### OpenAI Gym -![openaigym_sim](/assets/images/robotics_project_guide/openaigym_sim.png) +![openaigym_sim](/assets/images/openaigym_sim.png) OpenAI Gym is a widely-used toolkit for developing and comparing reinforcement learning algorithms. It provides a standardized API to interact with a variety of environments, ranging from simple tasks to complex simulations. Many RL training simulators are built upon the Gym framework, making it a foundational tool in the RL community. OpenAI Gym itself is not a single physics engine or simulator. Instead, it’s a framework that provides a standardized API for a large collection of reinforcement learning environments. Many other RL simulators follow the conventions used in Gym. @@ -278,7 +278,7 @@ OpenAI Gym itself is not a single physics engine or simulator. Instead, it’s a ### MuJoCo -![mujoco_sim](/assets/images/robotics_project_guide/mujoco_sim.jpg) +![mujoco_sim](/assets/images/mujoco_sim.jpg) MuJoCo (Multi-Joint dynamics with Contact) is a physics engine designed for fast and accurate simulation of articulated structures, making it ideal for reinforcement learning tasks that require high-fidelity physics modeling. @@ -300,7 +300,7 @@ MuJoCo (Multi-Joint dynamics with Contact) is a physics engine designed for fast ### PyBullet -![pybullet_sim](/assets/images/robotics_project_guide/pybullet_sim.png) +![pybullet_sim](/assets/images/pybullet_sim.png) PyBullet is an open-source physics engine that offers real-time simulation of rigid body dynamics, making it suitable for reinforcement learning and robotics research. @@ -322,7 +322,7 @@ PyBullet is an open-source physics engine that offers real-time simulation of ri ### Isaac Lab -![isaaclab_sim](/assets/images/robotics_project_guide/isaaclab_sim.jpg) +![isaaclab_sim](/assets/images/isaaclab_sim.jpg) Isaac Lab is an open-source, GPU-accelerated framework for robot learning, built on top of NVIDIA Isaac Sim. It provides high-fidelity physics simulation using NVIDIA PhysX and photorealistic rendering, making it suitable for training robot policies in simulation before deploying them in real-world scenarios. diff --git a/wiki/robotics-project-guide/define-your-goals-and-requirements.md b/wiki/robotics-project-guide/define-your-goals-and-requirements.md index 1f3875a4..4a57d6fc 100644 --- a/wiki/robotics-project-guide/define-your-goals-and-requirements.md +++ b/wiki/robotics-project-guide/define-your-goals-and-requirements.md @@ -29,7 +29,7 @@ Start by clarifying the primary function of your robot: Example: For our quadrupedal robot Tod, the goal is to assist elderly shoppers by carrying their products in a shopping center. The end-users are senior citizens who may have difficulty carrying heavy items, and the environment is a bustling retail space with various obstacles. -Go2 Package Robot +Go2 Package Robot This is the Go2 Package Robot, designed to assist users in carrying heavy items. The robot can navigate autonomously, avoid obstacles, and carry payloads of up to 12 kg. With its robust design, it is well-suited for use in indoor environments such as shopping centers or warehouses. @@ -48,7 +48,7 @@ Functional requirements detail what your robot must be able to do: - **Navigation**: Will it operate autonomously or require human control? - **Interaction**: Does it need to communicate with users or other systems? -| ![Quadruped Robot](/assets/images/robotics_project_guide/go2_image.jpg) | ![Wheeled Robot](/assets/images/robotics_project_guide/wheeled_robot_image.png) | ![Drone Robot](/assets/images/robotics_project_guide/drone_image.png) | +| ![Quadruped Robot](/assets/images/go2_image.jpg) | ![Wheeled Robot](/assets/images/wheeled_robot_image.png) | ![Drone Robot](/assets/images/drone_image.png) | |:---------------------------------:|:---------------------------------:|:-------------------------------:| | Quadruped | Wheeled Vehicle | Drone | diff --git a/wiki/sensing/___all_subsections.md b/wiki/sensing/___all_subsections.md index 955e9102..5e8421bb 100644 --- a/wiki/sensing/___all_subsections.md +++ b/wiki/sensing/___all_subsections.md @@ -3,7 +3,7 @@ date: 2017-08-15 title: Adafruit GPS --- -![Adafruit GPS Components](assets/AdafruitGPS-c715f.png) ![Adafruit GPS Assembled](assets/AdafruitGPS-69ceb.png) +![Adafruit GPS Components](/assets/images/AdafruitGPS-c715f.png) ![Adafruit GPS Assembled](/assets/images/AdafruitGPS-69ceb.png) The Adafruit Ultimate GPS module is designed for convenient use with Arduino, Raspberry Pi, or other commonly used micro-controllers. The breakout is built around the MTK3339 chipset, a no-nonsense, high-quality GPS module that can track up to 22 satellites on 66 channels, has an excellent high-sensitivity receiver (-165 dB tracking), and a built-in antenna! @@ -43,7 +43,7 @@ title: AprilTags --- AprilTags is a visual fiducial system, useful for a wide variety of tasks including augmented reality, robotics, and camera calibration. The tags provide a means of identification and 3D positioning, even in low visibility conditions. The tags act like barcodes, storing a small amount of information (tag ID), while also enabling simple and accurate 6D (x, y, z, roll, pitch, yaw) pose estimation of the tag. -![AprilTags placed on multiple mobile robots platforms](assets/apriltags-6719c.png) +![AprilTags placed on multiple mobile robots platforms](/assets/images/apriltags-6719c.png) The AprilTags project originates from a team at the University of Michigan, that has a [detailed website dedicated to the research](https://april.eecs.umich.edu/apriltag/), which is a good starting off point for learning how to use all of the software. The team has provided implementations in both Java and C to read AprilTags from a camera and there are additional implementations available online for tag reading. In addition to the software available on their website, a student at MIT has released a [C++ implementation](http://people.csail.mit.edu/kaess/apriltags). This website also has printable AprilTags for several tag families available in PDF format. @@ -105,14 +105,14 @@ This article presents an overview of object detection using the Azure camera wit To identify individual blocks and their respective grasping points, the perception subsystem undergoes a series of five steps. Initially, it crops the Azure Kinect camera image to center on the workspace. Following this, it applies color thresholding to filter out irrelevant objects and discern the blocks. Subsequently, it identifies the contours of these blocks and filters them based on their area and shape characteristics. Once the blocks are recognized, the perception subsystem computes the grasping points for each block. Collectively, these steps facilitate the accurate detection of block locations and their corresponding grasping points on the workstation. -![Pipeline of Block Detection](assets/pipeline.png) +![Pipeline of Block Detection](/assets/images/pipeline.png) ### Image Cropping The initial stage of the perception subsystem involves cropping the raw image. Raw images often contain extraneous details, such as the workspace's supporting platform or the presence of individuals' feet near the robot. By cropping the image to focus solely on the workspace, we eliminate a significant amount of unnecessary information, thereby enhancing the system's efficiency and robustness. Currently, this approach employs hard-coded cropping parameters, requiring manual specification of the rows and columns to retain within the image. -![Cropped Image](assets/cropped.png) +![Cropped Image](/assets/images/cropped.png) ### Color Segmentation Color segmentation can pose challenges in images with prominent shadows. Shadows cause a decrease in RGB pixel values, while light causes an increase, making it challenging to distinguish between different colors. To address this, we employ HSV (Hue, Saturation, Value) thresholding on the image. @@ -123,7 +123,7 @@ To tackle this issue, we employed color meter software to establish the brown co To further refine Jenga block detection and eliminate background noise, we apply a mask to the HSV thresholded image. Initially, we create a mask by contour area thresholding and then fill any holes within the contour to obtain a solid mask. The resulting masked image is shown in Figure 6a. This process ensures the reliable detection of Jenga blocks by removing remaining noise or unwanted objects. -![RGB Vector](assets/rgb_vector.png) +![RGB Vector](/assets/images/rgb_vector.png) ### Block Contours @@ -135,7 +135,7 @@ To simplify contours and reduce points, we apply OpenCV2's 'minAreaRect' functio Subsequently, we identify the two grasp points of the block by detecting its longer sides. To determine these grasp points in the image frame, we align the depth image with the RGB image to acquire the depth value. Utilizing the x, y, and depth values, we transform the 2D pixel points back to the 3D pose in the camera frame using the intrinsic matrix. The grasp point concerning the base frame is then computed by performing a transform tree lookup, thereby completing the entire perception cycle. -![Contours](assets/zoom1.png) +![Contours](/assets/images/zoom1.png) ### Image HSV Thresholding vs. Normalization @@ -148,7 +148,7 @@ Although image normalization showed promise, it proved less effective in clutter Normalized Image | HSV Image :-------------------------:|:-------------------------: -![Norm](assets/norm_img.png) | ![HSV](assets/hsv_img.png) +![Norm](/assets/images/norm_img.png) | ![HSV](/assets/images/hsv_img.png) ## References @@ -338,12 +338,12 @@ date: 2017-08-15 title: Delphi ESR Radar --- -![Delphi ESR Radar](assets/DelphiESRRadar-8394b.png) +![Delphi ESR Radar](/assets/images/DelphiESRRadar-8394b.png) Delphi's multimode Electronically Scanning RADAR (ESR) combines a wide field of view at mid-range with long-range coverage to provide two measurement modes simultaneously. The mid-range coverage (60m, +/-45 deg) not only allows vehicles cutting in from adjacent lanes to be detected but also identifies vehicles and pedestrians across the width of the equipped vehicle. The long-range coverage (175m, +/-11 deg) provides accurate range and speed data with powerful object discrimination that can identify up to 64 targets in the vehicle's path. Delphi's technologically advanced ESR uses proven solid state technology plus class-leading performance, packaging and durability to offer customers game-changing forward radar detection. The quality of data provided by Delphi's system enables powerful functionality including adaptive cruise control, forward collision warning, brake support and headway alert. -![Radar Detection Cones](assets/DelphiESRRadar-eba02.png) +![Radar Detection Cones](/assets/images/DelphiESRRadar-eba02.png) For more introductory information about the sensor and its state-of-the-art technology, please refer to the [official datasheet released by Delphi.](http://cmumrsdproject.wikispaces.com/file/view/delphi_esr_datasheet.pdf/613230495/delphi_esr_datasheet.pdf) @@ -494,23 +494,23 @@ Position information can be critical for achieving high accuracy localization an - Setting the frame rate for the GPS - Only should need to change the Measurement Period - ![](assets/gps1.png) + ![](/assets/images/gps1.png) - Making the settings permanent on the GPS -![](assets/gps2.png) +![](/assets/images/gps2.png) - Poor connection between the base station and robot GPS -![](assets/gps3.png) +![](/assets/images/gps3.png) - Make sure that all the values match between the base station and robot GPS except for the target - robot should be UART2 and the base station UART1 - Loading a configuration file (You may not need to do this) -![](assets/gps4.png) +![](/assets/images/gps4.png) /wiki/sensing/opencv-stereo.md @@ -549,7 +549,7 @@ Although PCL comes installed with ROS full installation by default, a complete i 1. ## Microsoft Kinect - ![Kinect](assets/kinect.jpg) + ![Kinect](/assets/images/kinect.jpg) ### Overview: Kinect for Xbox 360 is a low-cost vision device equipped with one IR camera, one color camera, and one IR projector to produce RGB images as well as voxel (depth-pixel) images. The RGB video stream gives an 8-bit VGA resolution (640 x 480 pixels) with a Bayer color filter, while the monochrome depth-sensing video stream is in VGA resolution. The sensor has an angular field of view of 57 degrees horizontally and 43 degrees vertically. Kinect has been reverse engineered to a great extent by the open-source community which has revealed many facts on how depth is measured. Kinect uses a structured light approach form in which we can extract the time of return. They use a standard off-the-shelf CMOS sensor for the same. @@ -575,7 +575,7 @@ Although PCL comes installed with ROS full installation by default, a complete i 2. ## Intel Realsense D435i - ![Realsense](assets/realsense.jpg) + ![Realsense](/assets/images/realsense.jpg) ### Overview: The Intel® RealSense™ Depth Camera D400 Series uses stereo vision to calculate depth. The D435 is a USB-powered depth camera and consists of a pair of depth sensors, an RGB sensor, and an infrared projector. It gives a good depth map a well the processed reconstructed 3D point clouds. @@ -626,7 +626,7 @@ Although PCL comes installed with ROS full installation by default, a complete i ``` The function pcl_callback will then be called every time the sensor publishes a new pc2.PointCloud2 message. - ![original](assets/original.png) + ![original](/assets/images/original.png) 3. **Voxel Filter Downsampling** @@ -642,7 +642,7 @@ Although PCL comes installed with ROS full installation by default, a complete i downsampled = vox.filter() ``` - ![downsampled](assets/downsampled.png) + ![downsampled](/assets/images/downsampled.png) 4. **Region cropping** @@ -669,7 +669,7 @@ Although PCL comes installed with ROS full installation by default, a complete i passed = passthrough.filter() ``` - ![cropped](assets/cropped.png) + ![cropped](/assets/images/cropped.png) 5. **RANSAC ground segmentation** @@ -691,9 +691,9 @@ Although PCL comes installed with ROS full installation by default, a complete i cloud_objects = cloud_filtered.extract(inliers, negative=True) ``` - ![ransac1](assets/ransac1.png) + ![ransac1](/assets/images/ransac1.png) - ![ransac2](assets/ransac2.png) + ![ransac2](/assets/images/ransac2.png) Here Inliers are the points that fit a plane equation, therefore, they should belong to the table. On the other hand, outliers are the remaining points that represent the objects over the table. @@ -736,7 +736,7 @@ Although PCL comes installed with ROS full installation by default, a complete i cluster_indices = ec.Extract() ``` - ![cluster](assets/cluster.png) + ![cluster](/assets/images/cluster.png) 8. **Sprinkle some machine learning** @@ -750,7 +750,7 @@ Although PCL comes installed with ROS full installation by default, a complete i Here is a visualization of a sample mapped environment. - ![RTABMAP](assets/slam.png) + ![RTABMAP](/assets/images/slam.png) /wiki/sensing/photometric-calibration.md --- @@ -1026,7 +1026,7 @@ This page will go into detail about to get started with the TS16 Total Station, Total stations have an extended heritage in civil engineering, where they have been used to precisely survey worksites since the 1970s. The total station sends beams of light directly to a glass reflective prism, and uses the time-of-flight properties of the beam to measure distances. The robotic total station tracks it's calibration orientaiton to high precision, such that the measured distance can be converted into a high-precision 3D position mesaurement. Total stations, depending on the prism type and other factors, can accurate track with in millimeter range at up to 3.5km [Leica-Geosystems](file:///home/john/Downloads/Leica_Viva_TS16_DS-2.pdf). -![Example usage of a Total Station in the Field](assets/leica_field_image.jpg) +![Example usage of a Total Station in the Field](/assets/images/assets_leica_field_image.jpg) [Source](https://leica-geosystems.com/) ### Best Use Cases & Expected Quality @@ -1057,7 +1057,7 @@ This method has been tested on a TS16, but it would likely work on a TS15 or oth The other side of the total station is the reflector, which is used to get the high precision ranging. This is an important piece of hardware, especially in this use case. Since the prism will be moving, having high quality glass will reduce the imperfections that could cause the reflected beam to be off-center, resulting in a higher likelihood of losing tracking of the prism. A high quality prism from Leica will cost more than [$1k](https://www.allenprecision.com/360-reflector). -![Leica GRZ122 360 Prism](assets/leica_360_prism.jpeg) +![Leica GRZ122 360 Prism](/assets/images/leica_360_prism.jpeg) [Source](https://leica-geosystems.com/) In order to connect the total station to a compute platform, it's possble to use wired or wireless methods. This wiki only explores the usage of USB connections using Leica's custom (and [expensive](https://www.baselineequipment.com/leica-instrument-to-datacollector-laptop-usb-cable)) cable. @@ -1186,7 +1186,7 @@ If you are using a Raspberry Pi, you can use the [ReSpeaker](https://wiki.seeeds The microphone sensitivity can be adjusted using the `pavucontrol` program. This is available on Ubuntu. You can install it using `sudo apt install pavucontrol`. Once installed, you can run it using `pavucontrol`. This will open a GUI. You can then adjust the microphone gain using the slider: -![pavucontrol](assets/pavucontrol.png) +![pavucontrol](/assets/images/pavucontrol.png) ### Echo Cancellation @@ -1304,7 +1304,7 @@ In informal tests, the STag were able to achieve accuracy within +- 2 centimeter **Exposure**, **ISO sensitivity** and **shutter type** are three camera main parameters which can help greatly improve marker detection. It is highly recommend to use ***global shutter cameras*** instead of rolling shutter cameras to avoid aliasing effects. Exposure and ISO sensitivity parameters are dependent on the application. In our case (TeamJ, MRSD 2021-23), the camera was mounted on a VTOL and the marker was to be detected from at least 12 meters away in outdoor environments. In order to do so, we had to use the lowest exposure (= 1 microsecond) and ISO sensitivity (= 100) settings for our camera. The GIF below shows how exposure and ISO sensitivity affects marker detection output. - ![exposure and iso sensitivity settings affecting marker detection](assets/stag_exposure.gif) + ![exposure and iso sensitivity settings affecting marker detection](/assets/images/stag_exposure.gif) ## Tips @@ -1434,11 +1434,11 @@ title: Tracking vehicles using a static traffic camera Tracking vehicles using static camera is a useful tool for various use cases pertaining to both macro/micro traffic flow. We present a system where we extract vehicle trajectories using a monocular camera mounted at an intersection. We utilize a HD map and precompute homographies between the image plane of the camera and a bird's eye view plane where we finally project our trajectories. -![data_capture](assets/Data_capture.png) +![data_capture](/assets/images/Data_capture.png) 1. ### 2D detection and tracking We use detectron 2 and SORT as preliminary vehicle detection and tracking algorithms in the camera frame. The algorithms give a bounding box on estimate. -![detectron_sort_result](assets/detection_sort_output.png) +![detectron_sort_result](/assets/images/detection_sort_output.png) 2. ### Homography estimation to transform points image plane corresponding to a bird's eye view A ransac based homography is required to be precomputed between 2 image planes in camera and bird's eye view space. OpenCV's `cv::findhomography()` might be handy here. @@ -1450,7 +1450,7 @@ The bird's eye view can capture a fairly large space of the map depending on whe 4. ### HD Map A HD Map for the world is a prerequisite. Since the intersection we captured data from didn't have a prior map available, we ended up creating our own vanilla map. The major requirements for the map are the information containing the lanes, their directions and the corresponding lane center lines. - ![HD_Map](assets/HD_map.png) + ![HD_Map](/assets/images/HD_map.png) 5. ### Tracking in the bird's eye view space For sake of avoiding confusion with the tracker in the camera space (SORT) , we will call this tracker as the BEV tracker throughout the rest of this post. This tracker tracks the position and velocity of the vehicles in the bird's eye view frame. @@ -1474,9 +1474,9 @@ Tracked state of a vehicle - **[x, y, vx, vy]** * #### Data Association - The ID association problem is modeled as a linear sum assignment. We use the Hungarian algorithm to solve this. The cost is defined as the euclidean distance between states of any two vehicles. - ![Cost between two vehicles](assets/distance.png) + ![Cost between two vehicles](/assets/images/distance.png) * This is then formed into a matrix where rows contain ids from bev tracker and columns contain ids from SORT. - ![Linear Sum assignment problem](assets/costmatrix_formation.png) + ![Linear Sum assignment problem](/assets/images/costmatrix_formation.png) * Adding the priors from SORT- The same IDs from tracker and SORT (say i and j), we assign the cost between those vehicles as 0 or Cij = 0. @@ -1501,7 +1501,7 @@ Tracked state of a vehicle - **[x, y, vx, vy]** * Number of consecutive frames they are seen for. * Number of consecutive frames they have not been seen for. -![Tracking Results](assets/tracking_results.png) +![Tracking Results](/assets/images/tracking_results.png) #### References: * [1] Yuxin Wu, Alexander Kirillov, Francisco Massa, Wan-Yen Lo, and Ross Girshick.Detectron2. https://github.com/facebookresearch/detectron2, 2019. @@ -1525,7 +1525,7 @@ Ultrawideband positioning takes advantage of the communication pulses to sense d By using multiple stationary devices, a single or multiple mobile beacons can be tracked by combining ranges through trilateration. -![Example usage of a DWM1001 setup](assets/decawave_example_multi_anchor.png) +![Example usage of a DWM1001 setup](/assets/images/assets_decawave_example_multi_anchor.png) [Source](https://www.researchgate.net/profile/Teijo-Lehtonen/publication/281346001/figure/fig4/AS:284460038803456@1444831966619/DecaWave-UWB-localization-system-SDK-5.png) ### Best Use Cases & Expected Quality @@ -1542,7 +1542,7 @@ Even in the best scenario, it should be expected that a UWB positioning system w In order to setup a DWM1001-Dev UltraWideband positioning system, it's important to have enough DWM1001-Dev modules (`beacons`) for your use case. Each one of the `beacons` can either be configured as a `tag`, `anchor`, or `gateway`. `tag`s represent mobile `beacons` that will be on your robot, `anchors` represent stationary anchors, and `gateways` are modules that sole job are to pipe information over serial to your compute stack. While there are multiple ways to get information from these devices, this guide will describes how to access it over a direct USB serial connection. -![Architecture of a DWM1001-Dev setup with multiple gateways](assets/dwm_arch.png) +![Architecture of a DWM1001-Dev setup with multiple gateways](/assets/images/dwm_arch.png) Before any work can be done on the `beacons`, they must be flashed with the pre-built software provided by the manufacturer for this task. A detailed guide can be found [here](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjNrN-T8OP7AhWTFVkFHRNTCzcQFnoECBMQAQ&url=https%3A%2F%2Fwww.qorvo.com%2Fproducts%2Fd%2Fda007972&usg=AOvVaw2va8gKJNC_mfXq5EQZAO0S) @@ -1550,7 +1550,7 @@ Before any work can be done on the `beacons`, they must be flashed with the pre- Once the beacons have been flashed, they need to be configured and calibrated. This can be one most easily using their provided Android app, [Decawave DRTLS APK](https://apkcombo.com/decawave-drtls-manager-r1/com.decawave.argomanager/). There is also information found [here](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjNrN-T8OP7AhWTFVkFHRNTCzcQFnoECBMQAQ&url=https%3A%2F%2Fwww.qorvo.com%2Fproducts%2Fd%2Fda007972&usg=AOvVaw2va8gKJNC_mfXq5EQZAO0S) about performing this work directly through a command line, but it is less documented. -![DRTLS App Screenshot](assets/drtls_app.png) +![DRTLS App Screenshot](/assets/images/drtls_app.png) In order to use the app, follow the instructions linked [here](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwi-id_G9-P7AhVIGVkFHVIPBZ0QFnoECA0QAQ&url=https%3A%2F%2Fwww.qorvo.com%2Fproducts%2Fd%2Fda007996&usg=AOvVaw09yRMbgwEx7hxTDpJP4G8D). @@ -1562,7 +1562,7 @@ It is possible to change the update rate of all `beacons`. For most real time po During configuration, make note of the `beacon` IDS (eg. from `Tag DW11A1` the tag ID is `11A1`). This should be the ID used in the driver config to identify multiple tags independently. -![DRTLS App - Beacon IDS](assets/drtls_ids.png) +![DRTLS App - Beacon IDS](/assets/images/drtls_ids.png) At this point, the DRTLS app can be used directly to test the 3D positioning. Ensure all modules are powered, and if ther are, enter the "map" page of the app to view all of the `beacons` live, including the dynamic positioning of the `tag`. @@ -1570,7 +1570,7 @@ At this point, the DRTLS app can be used directly to test the 3D positioning. En In most cases, the `anchors` are located around a room, such that they are relatively planar with respect to each other. For 2D localization, this is perfectly acceptable, but it becomes an issue when attempting 3D localization. This is due to the concept of *[dilution of precision](https://en.wikipedia.org/wiki/Dilution_of_precision_(navigation))*, which originated from GPS. For GPS, it means that as GPS satellites attempting to provide a location to a ground side receiver get relatively close to each other, the output precision of the ground side position estimation becomes poorer, as seen below: -![GDOP Example](assets/gdop_example.png) +![GDOP Example](/assets/images/gdop_example.png) For UWB, this means that if the `anchors` are all close to the same Z plane, their Z localization precision will suffer. Ideally, all anchors should be placed at widely different heights to improve this. However, the beacons need to also be placed away from corners (such as the intersection of the floor/ceiling to the wall), leading to a difficulty. diff --git a/wiki/sensing/adafruit-gps.md b/wiki/sensing/adafruit-gps.md index a6807e3e..18c4b370 100644 --- a/wiki/sensing/adafruit-gps.md +++ b/wiki/sensing/adafruit-gps.md @@ -2,7 +2,7 @@ date: 2017-08-15 title: Adafruit GPS --- -![Adafruit GPS Components](assets/AdafruitGPS-c715f.png) ![Adafruit GPS Assembled](assets/AdafruitGPS-69ceb.png) +![Adafruit GPS Components](/assets/images/AdafruitGPS-c715f.png) ![Adafruit GPS Assembled](/assets/images/AdafruitGPS-69ceb.png) The Adafruit Ultimate GPS module is designed for convenient use with Arduino, Raspberry Pi, or other commonly used micro-controllers. The breakout is built around the MTK3339 chipset, a no-nonsense, high-quality GPS module that can track up to 22 satellites on 66 channels, has an excellent high-sensitivity receiver (-165 dB tracking), and a built-in antenna! diff --git a/wiki/sensing/apriltags.md b/wiki/sensing/apriltags.md index 6a64b95e..e350616c 100644 --- a/wiki/sensing/apriltags.md +++ b/wiki/sensing/apriltags.md @@ -4,7 +4,7 @@ title: AprilTags --- AprilTags is a visual fiducial system, useful for a wide variety of tasks including augmented reality, robotics, and camera calibration. The tags provide a means of identification and 3D positioning, even in low visibility conditions. The tags act like barcodes, storing a small amount of information (tag ID), while also enabling simple and accurate 6D (x, y, z, roll, pitch, yaw) pose estimation of the tag. -![AprilTags placed on multiple mobile robots platforms](assets/apriltags-6719c.png) +![AprilTags placed on multiple mobile robots platforms](/assets/images/apriltags-6719c.png) The AprilTags project originates from a team at the University of Michigan, that has a [detailed website dedicated to the research](https://april.eecs.umich.edu/apriltag/), which is a good starting off point for learning how to use all of the software. The team has provided implementations in both Java and C to read AprilTags from a camera and there are additional implementations available online for tag reading. In addition to the software available on their website, a student at MIT has released a [C++ implementation](http://people.csail.mit.edu/kaess/apriltags). This website also has printable AprilTags for several tag families available in PDF format. diff --git a/wiki/sensing/azure-block-detection.md b/wiki/sensing/azure-block-detection.md index e4dfa26f..7ef2d58a 100644 --- a/wiki/sensing/azure-block-detection.md +++ b/wiki/sensing/azure-block-detection.md @@ -16,14 +16,14 @@ This article presents an overview of object detection using the Azure camera wit To identify individual blocks and their respective grasping points, the perception subsystem undergoes a series of five steps. Initially, it crops the Azure Kinect camera image to center on the workspace. Following this, it applies color thresholding to filter out irrelevant objects and discern the blocks. Subsequently, it identifies the contours of these blocks and filters them based on their area and shape characteristics. Once the blocks are recognized, the perception subsystem computes the grasping points for each block. Collectively, these steps facilitate the accurate detection of block locations and their corresponding grasping points on the workstation. -![Pipeline of Block Detection](assets/pipeline.png) +![Pipeline of Block Detection](/assets/images/pipeline.png) ### Image Cropping The initial stage of the perception subsystem involves cropping the raw image. Raw images often contain extraneous details, such as the workspace's supporting platform or the presence of individuals' feet near the robot. By cropping the image to focus solely on the workspace, we eliminate a significant amount of unnecessary information, thereby enhancing the system's efficiency and robustness. Currently, this approach employs hard-coded cropping parameters, requiring manual specification of the rows and columns to retain within the image. -![Cropped Image](assets/cropped.png) +![Cropped Image](/assets/images/cropped.png) ### Color Segmentation Color segmentation can pose challenges in images with prominent shadows. Shadows cause a decrease in RGB pixel values, while light causes an increase, making it challenging to distinguish between different colors. To address this, we employ HSV (Hue, Saturation, Value) thresholding on the image. @@ -34,7 +34,7 @@ To tackle this issue, we employed color meter software to establish the brown co To further refine Jenga block detection and eliminate background noise, we apply a mask to the HSV thresholded image. Initially, we create a mask by contour area thresholding and then fill any holes within the contour to obtain a solid mask. The resulting masked image is shown in Figure 6a. This process ensures the reliable detection of Jenga blocks by removing remaining noise or unwanted objects. -![RGB Vector](assets/rgb_vector.png) +![RGB Vector](/assets/images/rgb_vector.png) ### Block Contours @@ -46,7 +46,7 @@ To simplify contours and reduce points, we apply OpenCV2's 'minAreaRect' functio Subsequently, we identify the two grasp points of the block by detecting its longer sides. To determine these grasp points in the image frame, we align the depth image with the RGB image to acquire the depth value. Utilizing the x, y, and depth values, we transform the 2D pixel points back to the 3D pose in the camera frame using the intrinsic matrix. The grasp point concerning the base frame is then computed by performing a transform tree lookup, thereby completing the entire perception cycle. -![Contours](assets/zoom1.png) +![Contours](/assets/images/zoom1.png) ### Image HSV Thresholding vs. Normalization @@ -59,7 +59,7 @@ Although image normalization showed promise, it proved less effective in clutter Normalized Image | HSV Image :-------------------------:|:-------------------------: -![Norm](assets/norm_img.png) | ![HSV](assets/hsv_img.png) +![Norm](/assets/images/norm_img.png) | ![HSV](/assets/images/hsv_img.png) ## References diff --git a/wiki/sensing/delphi-esr-radar.md b/wiki/sensing/delphi-esr-radar.md index 2bcb2012..2c24090b 100644 --- a/wiki/sensing/delphi-esr-radar.md +++ b/wiki/sensing/delphi-esr-radar.md @@ -3,12 +3,12 @@ date: 2017-08-15 title: Delphi ESR Radar --- -![Delphi ESR Radar](assets/DelphiESRRadar-8394b.png) +![Delphi ESR Radar](/assets/images/DelphiESRRadar-8394b.png) Delphi's multimode Electronically Scanning RADAR (ESR) combines a wide field of view at mid-range with long-range coverage to provide two measurement modes simultaneously. The mid-range coverage (60m, +/-45 deg) not only allows vehicles cutting in from adjacent lanes to be detected but also identifies vehicles and pedestrians across the width of the equipped vehicle. The long-range coverage (175m, +/-11 deg) provides accurate range and speed data with powerful object discrimination that can identify up to 64 targets in the vehicle's path. Delphi's technologically advanced ESR uses proven solid state technology plus class-leading performance, packaging and durability to offer customers game-changing forward radar detection. The quality of data provided by Delphi's system enables powerful functionality including adaptive cruise control, forward collision warning, brake support and headway alert. -![Radar Detection Cones](assets/DelphiESRRadar-eba02.png) +![Radar Detection Cones](/assets/images/DelphiESRRadar-eba02.png) For more introductory information about the sensor and its state-of-the-art technology, please refer to the [official datasheet released by Delphi.](http://cmumrsdproject.wikispaces.com/file/view/delphi_esr_datasheet.pdf/613230495/delphi_esr_datasheet.pdf) diff --git a/wiki/sensing/gps.md b/wiki/sensing/gps.md index d035da78..f1e7f9b5 100644 --- a/wiki/sensing/gps.md +++ b/wiki/sensing/gps.md @@ -42,20 +42,20 @@ Position information can be critical for achieving high accuracy localization an - Setting the frame rate for the GPS - Only should need to change the Measurement Period - ![](assets/gps1.png) + ![](/assets/images/gps1.png) - Making the settings permanent on the GPS -![](assets/gps2.png) +![](/assets/images/gps2.png) - Poor connection between the base station and robot GPS -![](assets/gps3.png) +![](/assets/images/gps3.png) - Make sure that all the values match between the base station and robot GPS except for the target - robot should be UART2 and the base station UART1 - Loading a configuration file (You may not need to do this) -![](assets/gps4.png) +![](/assets/images/gps4.png) diff --git a/wiki/sensing/pcl.md b/wiki/sensing/pcl.md index e843bc2c..71524370 100644 --- a/wiki/sensing/pcl.md +++ b/wiki/sensing/pcl.md @@ -18,7 +18,7 @@ Although PCL comes installed with ROS full installation by default, a complete i 1. ## Microsoft Kinect - ![Kinect](assets/kinect.jpg) + ![Kinect](/assets/images/kinect.jpg) ### Overview: Kinect for Xbox 360 is a low-cost vision device equipped with one IR camera, one color camera, and one IR projector to produce RGB images as well as voxel (depth-pixel) images. The RGB video stream gives an 8-bit VGA resolution (640 x 480 pixels) with a Bayer color filter, while the monochrome depth-sensing video stream is in VGA resolution. The sensor has an angular field of view of 57 degrees horizontally and 43 degrees vertically. Kinect has been reverse engineered to a great extent by the open-source community which has revealed many facts on how depth is measured. Kinect uses a structured light approach form in which we can extract the time of return. They use a standard off-the-shelf CMOS sensor for the same. @@ -44,7 +44,7 @@ Although PCL comes installed with ROS full installation by default, a complete i 2. ## Intel Realsense D435i - ![Realsense](assets/realsense.jpg) + ![Realsense](/assets/images/realsense.jpg) ### Overview: The Intel® RealSense™ Depth Camera D400 Series uses stereo vision to calculate depth. The D435 is a USB-powered depth camera and consists of a pair of depth sensors, an RGB sensor, and an infrared projector. It gives a good depth map a well the processed reconstructed 3D point clouds. @@ -95,7 +95,7 @@ Although PCL comes installed with ROS full installation by default, a complete i ``` The function pcl_callback will then be called every time the sensor publishes a new pc2.PointCloud2 message. - ![original](assets/original.png) + ![original](/assets/images/original.png) 3. **Voxel Filter Downsampling** @@ -111,7 +111,7 @@ Although PCL comes installed with ROS full installation by default, a complete i downsampled = vox.filter() ``` - ![downsampled](assets/downsampled.png) + ![downsampled](/assets/images/downsampled.png) 4. **Region cropping** @@ -138,7 +138,7 @@ Although PCL comes installed with ROS full installation by default, a complete i passed = passthrough.filter() ``` - ![cropped](assets/cropped.png) + ![cropped](/assets/images/cropped.png) 5. **RANSAC ground segmentation** @@ -160,9 +160,9 @@ Although PCL comes installed with ROS full installation by default, a complete i cloud_objects = cloud_filtered.extract(inliers, negative=True) ``` - ![ransac1](assets/ransac1.png) + ![ransac1](/assets/images/ransac1.png) - ![ransac2](assets/ransac2.png) + ![ransac2](/assets/images/ransac2.png) Here Inliers are the points that fit a plane equation, therefore, they should belong to the table. On the other hand, outliers are the remaining points that represent the objects over the table. @@ -205,7 +205,7 @@ Although PCL comes installed with ROS full installation by default, a complete i cluster_indices = ec.Extract() ``` - ![cluster](assets/cluster.png) + ![cluster](/assets/images/cluster.png) 8. **Sprinkle some machine learning** @@ -219,5 +219,5 @@ Although PCL comes installed with ROS full installation by default, a complete i Here is a visualization of a sample mapped environment. - ![RTABMAP](assets/slam.png) + ![RTABMAP](/assets/images/slam.png) diff --git a/wiki/sensing/robotic-total-stations.md b/wiki/sensing/robotic-total-stations.md index 4c7a2a6f..29d7fd21 100644 --- a/wiki/sensing/robotic-total-stations.md +++ b/wiki/sensing/robotic-total-stations.md @@ -8,7 +8,7 @@ This page will go into detail about to get started with the TS16 Total Station, Total stations have an extended heritage in civil engineering, where they have been used to precisely survey worksites since the 1970s. The total station sends beams of light directly to a glass reflective prism, and uses the time-of-flight properties of the beam to measure distances. The robotic total station tracks it's calibration orientaiton to high precision, such that the measured distance can be converted into a high-precision 3D position mesaurement. Total stations, depending on the prism type and other factors, can accurate track with in millimeter range at up to 3.5km [Leica-Geosystems](file:///home/john/Downloads/Leica_Viva_TS16_DS-2.pdf). -![Example usage of a Total Station in the Field](assets/leica_field_image.jpg) +![Example usage of a Total Station in the Field](/assets/images/assets_leica_field_image.jpg) [Source](https://leica-geosystems.com/) ### Best Use Cases & Expected Quality @@ -39,7 +39,7 @@ This method has been tested on a TS16, but it would likely work on a TS15 or oth The other side of the total station is the reflector, which is used to get the high precision ranging. This is an important piece of hardware, especially in this use case. Since the prism will be moving, having high quality glass will reduce the imperfections that could cause the reflected beam to be off-center, resulting in a higher likelihood of losing tracking of the prism. A high quality prism from Leica will cost more than [$1k](https://www.allenprecision.com/360-reflector). -![Leica GRZ122 360 Prism](assets/leica_360_prism.jpeg) +![Leica GRZ122 360 Prism](/assets/images/leica_360_prism.jpeg) [Source](https://leica-geosystems.com/) In order to connect the total station to a compute platform, it's possble to use wired or wireless methods. This wiki only explores the usage of USB connections using Leica's custom (and [expensive](https://www.baselineequipment.com/leica-instrument-to-datacollector-laptop-usb-cable)) cable. diff --git a/wiki/sensing/speech-recognition.md b/wiki/sensing/speech-recognition.md index 50af4aaf..655dc26f 100644 --- a/wiki/sensing/speech-recognition.md +++ b/wiki/sensing/speech-recognition.md @@ -86,7 +86,7 @@ If you are using a Raspberry Pi, you can use the [ReSpeaker](https://wiki.seeeds The microphone sensitivity can be adjusted using the `pavucontrol` program. This is available on Ubuntu. You can install it using `sudo apt install pavucontrol`. Once installed, you can run it using `pavucontrol`. This will open a GUI. You can then adjust the microphone gain using the slider: -![pavucontrol](assets/pavucontrol.png) +![pavucontrol](/assets/images/pavucontrol.png) ### Echo Cancellation diff --git a/wiki/sensing/stag.md b/wiki/sensing/stag.md index 5b98b51e..2a8e43c1 100644 --- a/wiki/sensing/stag.md +++ b/wiki/sensing/stag.md @@ -64,7 +64,7 @@ In informal tests, the STag were able to achieve accuracy within +- 2 centimeter **Exposure**, **ISO sensitivity** and **shutter type** are three camera main parameters which can help greatly improve marker detection. It is highly recommend to use ***global shutter cameras*** instead of rolling shutter cameras to avoid aliasing effects. Exposure and ISO sensitivity parameters are dependent on the application. In our case (TeamJ, MRSD 2021-23), the camera was mounted on a VTOL and the marker was to be detected from at least 12 meters away in outdoor environments. In order to do so, we had to use the lowest exposure (= 1 microsecond) and ISO sensitivity (= 100) settings for our camera. The GIF below shows how exposure and ISO sensitivity affects marker detection output. - ![exposure and iso sensitivity settings affecting marker detection](assets/stag_exposure.gif) + ![exposure and iso sensitivity settings affecting marker detection](/assets/images/stag_exposure.gif) ## Tips diff --git a/wiki/sensing/trajectory_extraction_static_camera.md b/wiki/sensing/trajectory_extraction_static_camera.md index 957e65a8..97a3c797 100644 --- a/wiki/sensing/trajectory_extraction_static_camera.md +++ b/wiki/sensing/trajectory_extraction_static_camera.md @@ -6,11 +6,11 @@ title: Tracking vehicles using a static traffic camera Tracking vehicles using static camera is a useful tool for various use cases pertaining to both macro/micro traffic flow. We present a system where we extract vehicle trajectories using a monocular camera mounted at an intersection. We utilize a HD map and precompute homographies between the image plane of the camera and a bird's eye view plane where we finally project our trajectories. -![data_capture](assets/Data_capture.png) +![data_capture](/assets/images/Data_capture.png) 1. ### 2D detection and tracking We use detectron 2 and SORT as preliminary vehicle detection and tracking algorithms in the camera frame. The algorithms give a bounding box on estimate. -![detectron_sort_result](assets/detection_sort_output.png) +![detectron_sort_result](/assets/images/detection_sort_output.png) 2. ### Homography estimation to transform points image plane corresponding to a bird's eye view A ransac based homography is required to be precomputed between 2 image planes in camera and bird's eye view space. OpenCV's `cv::findhomography()` might be handy here. @@ -22,7 +22,7 @@ The bird's eye view can capture a fairly large space of the map depending on whe 4. ### HD Map A HD Map for the world is a prerequisite. Since the intersection we captured data from didn't have a prior map available, we ended up creating our own vanilla map. The major requirements for the map are the information containing the lanes, their directions and the corresponding lane center lines. - ![HD_Map](assets/HD_map.png) + ![HD_Map](/assets/images/HD_map.png) 5. ### Tracking in the bird's eye view space For sake of avoiding confusion with the tracker in the camera space (SORT) , we will call this tracker as the BEV tracker throughout the rest of this post. This tracker tracks the position and velocity of the vehicles in the bird's eye view frame. @@ -46,9 +46,9 @@ Tracked state of a vehicle - **[x, y, vx, vy]** * #### Data Association - The ID association problem is modeled as a linear sum assignment. We use the Hungarian algorithm to solve this. The cost is defined as the euclidean distance between states of any two vehicles. - ![Cost between two vehicles](assets/distance.png) + ![Cost between two vehicles](/assets/images/distance.png) * This is then formed into a matrix where rows contain ids from bev tracker and columns contain ids from SORT. - ![Linear Sum assignment problem](assets/costmatrix_formation.png) + ![Linear Sum assignment problem](/assets/images/costmatrix_formation.png) * Adding the priors from SORT- The same IDs from tracker and SORT (say i and j), we assign the cost between those vehicles as 0 or Cij = 0. @@ -73,7 +73,7 @@ Tracked state of a vehicle - **[x, y, vx, vy]** * Number of consecutive frames they are seen for. * Number of consecutive frames they have not been seen for. -![Tracking Results](assets/tracking_results.png) +![Tracking Results](/assets/images/tracking_results.png) #### References: * [1] Yuxin Wu, Alexander Kirillov, Francisco Massa, Wan-Yen Lo, and Ross Girshick.Detectron2. https://github.com/facebookresearch/detectron2, 2019. diff --git a/wiki/sensing/ultrawideband-beacon-positioning.md b/wiki/sensing/ultrawideband-beacon-positioning.md index a6735645..a1be1d8e 100644 --- a/wiki/sensing/ultrawideband-beacon-positioning.md +++ b/wiki/sensing/ultrawideband-beacon-positioning.md @@ -12,7 +12,7 @@ Ultrawideband positioning takes advantage of the communication pulses to sense d By using multiple stationary devices, a single or multiple mobile beacons can be tracked by combining ranges through trilateration. -![Example usage of a DWM1001 setup](assets/decawave_example_multi_anchor.png) +![Example usage of a DWM1001 setup](/assets/images/assets_decawave_example_multi_anchor.png) [Source](https://www.researchgate.net/profile/Teijo-Lehtonen/publication/281346001/figure/fig4/AS:284460038803456@1444831966619/DecaWave-UWB-localization-system-SDK-5.png) ### Best Use Cases & Expected Quality @@ -29,7 +29,7 @@ Even in the best scenario, it should be expected that a UWB positioning system w In order to setup a DWM1001-Dev UltraWideband positioning system, it's important to have enough DWM1001-Dev modules (`beacons`) for your use case. Each one of the `beacons` can either be configured as a `tag`, `anchor`, or `gateway`. `tag`s represent mobile `beacons` that will be on your robot, `anchors` represent stationary anchors, and `gateways` are modules that sole job are to pipe information over serial to your compute stack. While there are multiple ways to get information from these devices, this guide will describes how to access it over a direct USB serial connection. -![Architecture of a DWM1001-Dev setup with multiple gateways](assets/dwm_arch.png) +![Architecture of a DWM1001-Dev setup with multiple gateways](/assets/images/dwm_arch.png) Before any work can be done on the `beacons`, they must be flashed with the pre-built software provided by the manufacturer for this task. A detailed guide can be found [here](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjNrN-T8OP7AhWTFVkFHRNTCzcQFnoECBMQAQ&url=https%3A%2F%2Fwww.qorvo.com%2Fproducts%2Fd%2Fda007972&usg=AOvVaw2va8gKJNC_mfXq5EQZAO0S) @@ -37,7 +37,7 @@ Before any work can be done on the `beacons`, they must be flashed with the pre- Once the beacons have been flashed, they need to be configured and calibrated. This can be one most easily using their provided Android app, [Decawave DRTLS APK](https://apkcombo.com/decawave-drtls-manager-r1/com.decawave.argomanager/). There is also information found [here](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjNrN-T8OP7AhWTFVkFHRNTCzcQFnoECBMQAQ&url=https%3A%2F%2Fwww.qorvo.com%2Fproducts%2Fd%2Fda007972&usg=AOvVaw2va8gKJNC_mfXq5EQZAO0S) about performing this work directly through a command line, but it is less documented. -![DRTLS App Screenshot](assets/drtls_app.png) +![DRTLS App Screenshot](/assets/images/drtls_app.png) In order to use the app, follow the instructions linked [here](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwi-id_G9-P7AhVIGVkFHVIPBZ0QFnoECA0QAQ&url=https%3A%2F%2Fwww.qorvo.com%2Fproducts%2Fd%2Fda007996&usg=AOvVaw09yRMbgwEx7hxTDpJP4G8D). @@ -49,7 +49,7 @@ It is possible to change the update rate of all `beacons`. For most real time po During configuration, make note of the `beacon` IDS (eg. from `Tag DW11A1` the tag ID is `11A1`). This should be the ID used in the driver config to identify multiple tags independently. -![DRTLS App - Beacon IDS](assets/drtls_ids.png) +![DRTLS App - Beacon IDS](/assets/images/drtls_ids.png) At this point, the DRTLS app can be used directly to test the 3D positioning. Ensure all modules are powered, and if ther are, enter the "map" page of the app to view all of the `beacons` live, including the dynamic positioning of the `tag`. @@ -57,7 +57,7 @@ At this point, the DRTLS app can be used directly to test the 3D positioning. En In most cases, the `anchors` are located around a room, such that they are relatively planar with respect to each other. For 2D localization, this is perfectly acceptable, but it becomes an issue when attempting 3D localization. This is due to the concept of *[dilution of precision](https://en.wikipedia.org/wiki/Dilution_of_precision_(navigation))*, which originated from GPS. For GPS, it means that as GPS satellites attempting to provide a location to a ground side receiver get relatively close to each other, the output precision of the ground side position estimation becomes poorer, as seen below: -![GDOP Example](assets/gdop_example.png) +![GDOP Example](/assets/images/gdop_example.png) For UWB, this means that if the `anchors` are all close to the same Z plane, their Z localization precision will suffer. Ideally, all anchors should be placed at widely different heights to improve this. However, the beacons need to also be placed away from corners (such as the intersection of the floor/ceiling to the wall), leading to a difficulty. diff --git a/wiki/simulation/Spawning-and-Controlling-Vehicles-in-CARLA.md b/wiki/simulation/Spawning-and-Controlling-Vehicles-in-CARLA.md index e76f1b64..8e2b6c68 100644 --- a/wiki/simulation/Spawning-and-Controlling-Vehicles-in-CARLA.md +++ b/wiki/simulation/Spawning-and-Controlling-Vehicles-in-CARLA.md @@ -19,7 +19,7 @@ First, start the CARLA server: ``` This should open up the CARLA server and you will be greeted with a camera feed: -![Hello CARLA](../../assets/images/carla_opning.png) +![Hello CARLA](/assets/images/carla_opning.png) ## Spawning a vehicle in CARLA Now that we have the CARLA server running, we need to connect a client to it. @@ -49,7 +49,7 @@ draw_waypoints(waypoints, road_id=10, life_time=20) ``` All roads in CARLA have an associated road_id. The code above will query the CARLA server for all the waypoints in the map, and the light up the waypoints that are present on road with road_id 10. You should see something like this: -![CARLA Navigation](../../assets/images/carla2.png) +![CARLA Navigation](/assets/images/carla2.png) This visualization helps us in finding out a good spawn location for a vehicle. Let's spawn a car somewhere on road 10 now. @@ -77,7 +77,7 @@ vehicle = client.get_world().spawn_actor(vehicle_blueprint, spawn_point) The reason for increasing the 'z' coordinate of the spawn point it to avoid any collisions with the road. CARLA does not internally handle these collisions during spawn and not having a 'z' offset can lead to issues. We should now have a car on road 10. -![Spawn Completed](../../assets/images/carla3.png) +![Spawn Completed](/assets/images/carla3.png) ## Controlling the spawned car We will be using CARLA's built-in PID controllers for controlling our spawned model 3. @@ -98,7 +98,7 @@ client.get_world().debug.draw_string(target_waypoint.transform.location, 'O', dr ``` The tracked waypoint should now be red in color. -![Visualizing the tracked waypoint](../../assets/images/carla4.png) +![Visualizing the tracked waypoint](/assets/images/carla4.png) Now, track! @@ -109,7 +109,7 @@ for i in range(ticks_to_track): vehicle.apply_control(control_signal) ``` You should see something like the GIF below: -![Tracking](../../assets/images/carlaTrack.gif) +![Tracking](/assets/images/carlaTrack.gif) diff --git a/wiki/simulation/__all_subsections.md b/wiki/simulation/__all_subsections.md index ae7cd1ae..46ef9b4f 100644 --- a/wiki/simulation/__all_subsections.md +++ b/wiki/simulation/__all_subsections.md @@ -161,14 +161,14 @@ published: true Autoware is based on ROS and uses Gazebo for simulation. The goal of this section is to the the Gazebo simulator with Autoware packages. Autoware can use all the functionalities of ROS, it can be seen as another software layer over ROS. To simulate an ackermann vehicle we need to define an URDF or Xacro model. In this file we can change vehicle models, add actuators and sensors. Autoware offers a default xacro file which can be customized for use, this is all available forin the `vehicle_sim package`. To customize this model we need not change the xacro file. The vehicle dynamics can be changed in the config file `vehicle_model/config/caibration.yaml`. To customize the visual appearance of the vehicle we can use a custom mesh file. Collate (`.dae`) formats can be added to mesh folder and referenced in the vehicle.xacro file. We have later discussed how sensors can be added and customized. -![](assets/images/autoware_models.png)*Figure 1. Different vehicle models* +![](/assets/images/autoware_models.png)*Figure 1. Different vehicle models* The vehicle sim package can be downloaded from [vehicle_sim](https://github.com/yukkysaito/vehicle_sim). ### Available Worlds Gazebo uses an ‘empty world’ which lacks any structures, to simulate the environment we need a world file. Autoware provides three templates of world files which can be downloaded from [car_sim](http://gazebosim.org/blog/car_sim ) -![](assets/images/autoware_worlds.png)*Figure 2. Gazebo worlds developed by autoware* +![](/assets/images/autoware_worlds.png)*Figure 2. Gazebo worlds developed by autoware* All three worlds also have the Point Cloud Maps (PCD files) available for download which are needed for NDT based localization. One can always use other gazebo worlds but the PCD maps have to be manually generated and downsampled, the process can be found on [Autoware Documentation](https://readthedocs.org/projects/autoware/downloads/pdf/feature-documentation_rtd/) @@ -188,7 +188,7 @@ Autoware provides a number of different types of path planning algorithms. These A sample image with waypoints is shown below. - ![](assets/images/autoware_plan.png)*Figure 3. Sample waypoints* + ![](/assets/images/autoware_plan.png)*Figure 3. Sample waypoints* This shows how the waypoints provide a velocity and orientation at every location, and how pure pursuit plans a path that interpolates them, as well as a lookahead target for the vehicle while driving. @@ -198,7 +198,7 @@ This shows how the waypoints provide a velocity and orientation at every locatio - The image below shows a set of lanes and wayareas drawn using Tier IV’s Vector Map Builder online tool. These need to be drawn very precisely and carefully to ensure that they work properly with Autoware. However, once this is done, it can do path planning for arbitrary start and goal locations on the map without requiring a prespecified set of waypoints. -![](assets/images/autoware_map.png)*Figure 4. Vector Map* +![](/assets/images/autoware_map.png)*Figure 4. Vector Map* ## Simulating sensors and placing them in different locations on the vehicle @@ -221,18 +221,18 @@ Additional sensors positions can also be defined in this yaml file and later ref ### Visualizing Sensor Data The Autoware GUI can be used to launch Rviz, this can be seen in the figure below - ![](assets/images/autoware_gui.png) *Figure 5. Autoware GUI* + ![](/assets/images/autoware_gui.png) *Figure 5. Autoware GUI* Once Rviz is launched you can add sensors to visualize -![](assets/images/autoware_rviz.png)*Figure 6. Rviz GUI* +![](/assets/images/autoware_rviz.png)*Figure 6. Rviz GUI* To view all the sensor data in common frames we need to either visualize the base_link frame given that all sensor configurations have been correctly added. To visualize them relative to the world we need to enable localization and publish the `transform map -> odom -> base_link`. This can also be done using `p3d_base_controller` plugin in Gazebo and manually publishing a TF based on the topic assigned to the plugin. ## Integrating and interfacing existing ROS packages with Autoware Autoware contains different submodules entailing a [wide range of capabilities](https://github.com/Autoware-AI/autoware.ai/wiki/Overview) as shown below: -![](assets/images/autoware_pkgs.png)*Figure 7. Packages offered in Autoware* +![](/assets/images/autoware_pkgs.png)*Figure 7. Packages offered in Autoware* Many at times we just need to use a simple functionality of Autoware integrated with the rest of the system built independently. To integrate a ROS package with an existing autoware package/tool, we would need to download, install the corresponding package and simply import it by incorporating it along with the CMakeLists.txt and Package.xml file of our ROS package. An example of this use case is shown below: Various autoware messages are available here. It can be installed with the command @@ -282,7 +282,7 @@ First, start the CARLA server: ``` This should open up the CARLA server and you will be greeted with a camera feed: -![Hello CARLA](../../assets/images/carla_opning.png) +![Hello CARLA](/assets/images/carla_opning.png) ## Spawning a vehicle in CARLA Now that we have the CARLA server running, we need to connect a client to it. @@ -312,7 +312,7 @@ draw_waypoints(waypoints, road_id=10, life_time=20) ``` All roads in CARLA have an associated road_id. The code above will query the CARLA server for all the waypoints in the map, and the light up the waypoints that are present on road with road_id 10. You should see something like this: -![CARLA Navigation](../../assets/images/carla2.png) +![CARLA Navigation](/assets/images/carla2.png) This visualization helps us in finding out a good spawn location for a vehicle. Let's spawn a car somewhere on road 10 now. @@ -340,7 +340,7 @@ vehicle = client.get_world().spawn_actor(vehicle_blueprint, spawn_point) The reason for increasing the 'z' coordinate of the spawn point it to avoid any collisions with the road. CARLA does not internally handle these collisions during spawn and not having a 'z' offset can lead to issues. We should now have a car on road 10. -![Spawn Completed](../../assets/images/carla3.png) +![Spawn Completed](/assets/images/carla3.png) ## Controlling the spawned car We will be using CARLA's built-in PID controllers for controlling our spawned model 3. @@ -361,7 +361,7 @@ client.get_world().debug.draw_string(target_waypoint.transform.location, 'O', dr ``` The tracked waypoint should now be red in color. -![Visualizing the tracked waypoint](../../assets/images/carla4.png) +![Visualizing the tracked waypoint](/assets/images/carla4.png) Now, track! @@ -372,7 +372,7 @@ for i in range(ticks_to_track): vehicle.apply_control(control_signal) ``` You should see something like the GIF below: -![Tracking](../../assets/images/carlaTrack.gif) +![Tracking](/assets/images/carlaTrack.gif) diff --git a/wiki/simulation/simulating-vehicle-using-autoware.md b/wiki/simulation/simulating-vehicle-using-autoware.md index 0aa6c88e..1374bbd4 100644 --- a/wiki/simulation/simulating-vehicle-using-autoware.md +++ b/wiki/simulation/simulating-vehicle-using-autoware.md @@ -12,14 +12,14 @@ published: true Autoware is based on ROS and uses Gazebo for simulation. The goal of this section is to the the Gazebo simulator with Autoware packages. Autoware can use all the functionalities of ROS, it can be seen as another software layer over ROS. To simulate an ackermann vehicle we need to define an URDF or Xacro model. In this file we can change vehicle models, add actuators and sensors. Autoware offers a default xacro file which can be customized for use, this is all available forin the `vehicle_sim package`. To customize this model we need not change the xacro file. The vehicle dynamics can be changed in the config file `vehicle_model/config/caibration.yaml`. To customize the visual appearance of the vehicle we can use a custom mesh file. Collate (`.dae`) formats can be added to mesh folder and referenced in the vehicle.xacro file. We have later discussed how sensors can be added and customized. -![](assets/images/autoware_models.png)*Figure 1. Different vehicle models* +![](/assets/images/autoware_models.png)*Figure 1. Different vehicle models* The vehicle sim package can be downloaded from [vehicle_sim](https://github.com/yukkysaito/vehicle_sim). ### Available Worlds Gazebo uses an ‘empty world’ which lacks any structures, to simulate the environment we need a world file. Autoware provides three templates of world files which can be downloaded from [car_sim](http://gazebosim.org/blog/car_sim ) -![](assets/images/autoware_worlds.png)*Figure 2. Gazebo worlds developed by autoware* +![](/assets/images/autoware_worlds.png)*Figure 2. Gazebo worlds developed by autoware* All three worlds also have the Point Cloud Maps (PCD files) available for download which are needed for NDT based localization. One can always use other gazebo worlds but the PCD maps have to be manually generated and downsampled, the process can be found on [Autoware Documentation](https://readthedocs.org/projects/autoware/downloads/pdf/feature-documentation_rtd/) @@ -39,7 +39,7 @@ Autoware provides a number of different types of path planning algorithms. These A sample image with waypoints is shown below. - ![](assets/images/autoware_plan.png)*Figure 3. Sample waypoints* + ![](/assets/images/autoware_plan.png)*Figure 3. Sample waypoints* This shows how the waypoints provide a velocity and orientation at every location, and how pure pursuit plans a path that interpolates them, as well as a lookahead target for the vehicle while driving. @@ -49,7 +49,7 @@ This shows how the waypoints provide a velocity and orientation at every locatio - The image below shows a set of lanes and wayareas drawn using Tier IV’s Vector Map Builder online tool. These need to be drawn very precisely and carefully to ensure that they work properly with Autoware. However, once this is done, it can do path planning for arbitrary start and goal locations on the map without requiring a prespecified set of waypoints. -![](assets/images/autoware_map.png)*Figure 4. Vector Map* +![](/assets/images/autoware_map.png)*Figure 4. Vector Map* ## Simulating sensors and placing them in different locations on the vehicle @@ -72,18 +72,18 @@ Additional sensors positions can also be defined in this yaml file and later ref ### Visualizing Sensor Data The Autoware GUI can be used to launch Rviz, this can be seen in the figure below - ![](assets/images/autoware_gui.png) *Figure 5. Autoware GUI* + ![](/assets/images/autoware_gui.png) *Figure 5. Autoware GUI* Once Rviz is launched you can add sensors to visualize -![](assets/images/autoware_rviz.png)*Figure 6. Rviz GUI* +![](/assets/images/autoware_rviz.png)*Figure 6. Rviz GUI* To view all the sensor data in common frames we need to either visualize the base_link frame given that all sensor configurations have been correctly added. To visualize them relative to the world we need to enable localization and publish the `transform map -> odom -> base_link`. This can also be done using `p3d_base_controller` plugin in Gazebo and manually publishing a TF based on the topic assigned to the plugin. ## Integrating and interfacing existing ROS packages with Autoware Autoware contains different submodules entailing a [wide range of capabilities](https://github.com/Autoware-AI/autoware.ai/wiki/Overview) as shown below: -![](assets/images/autoware_pkgs.png)*Figure 7. Packages offered in Autoware* +![](/assets/images/autoware_pkgs.png)*Figure 7. Packages offered in Autoware* Many at times we just need to use a simple functionality of Autoware integrated with the rest of the system built independently. To integrate a ROS package with an existing autoware package/tool, we would need to download, install the corresponding package and simply import it by incorporating it along with the CMakeLists.txt and Package.xml file of our ROS package. An example of this use case is shown below: Various autoware messages are available here. It can be installed with the command diff --git a/wiki/simulation/simulation-isaacsim-setup.md b/wiki/simulation/simulation-isaacsim-setup.md index b9e67b59..38004233 100644 --- a/wiki/simulation/simulation-isaacsim-setup.md +++ b/wiki/simulation/simulation-isaacsim-setup.md @@ -89,7 +89,7 @@ Isaac Sim provides several sample scenes such as **industrial warehouses, office ````bash Create → Environment → Simple Room ```` -![simple room](/wiki/simulation/assets/images/isaac_simpleroom.png) +![simple room](/assets/images/isaac_simpleroom.png) You can browse other scene samples in Isaac Sim Asset Browser. It is accessible from the **Window > Browser tab.** @@ -103,7 +103,7 @@ You can browse these robots in Isaac Sim Asset Browser under Robots folder. It is accessible from the **Window > Browser tab.** For example, a popular wheeled robot for navigation is Nova Carter. We can import from the Robots/Carter/nova_carter.usd -![nova carter](/wiki/simulation/assets/images/carter.png) +![nova carter](/assets/images/carter.png) Here are some properties that can be tuned to correct the robot's behavior: @@ -127,7 +127,7 @@ NVIDIA Isaac Sim also supports many realistic sensors modules, such as **stereo For example, creating a Camera Sensor: To create the camera from the menu: **Create>Sensors>Camera and Depth Sensors>Intel>Intel Realsense D455**. The Intel Realsense Depth Camera D455 consists of multiple RGB and depth image sensors and a 6-axis IMU. -![realsense](/wiki/simulation/assets/images/realsense.png) +![realsense](/assets/images/realsense.png) [Camera, RTX, Physics Based Sensors](https://docs.isaacsim.omniverse.nvidia.com/4.5.0/sensors/index.html#sensors) @@ -153,7 +153,7 @@ Simulation time is important because ROS 2 nodes often require synchronized time ### Nav2 Setup This diagram shows the ROS2 messages required for Nav2: -![nav2](/wiki/simulation/assets/images/nav2.png) +![nav2](/assets/images/nav2.png) 1. Install Nav2, refer to the [Nav2 installation page](https://docs.nav2.org/getting_started/index.html#installation). diff --git a/wiki/state-estimation/Cartographer-ROS-Integration.md b/wiki/state-estimation/Cartographer-ROS-Integration.md index 03a6cca7..ced9ef82 100644 --- a/wiki/state-estimation/Cartographer-ROS-Integration.md +++ b/wiki/state-estimation/Cartographer-ROS-Integration.md @@ -20,7 +20,7 @@ The detailed explanation of the Cartographer's algorithm and tuning can be found One of Cartographer's strength is that its 2D SLAM is aware of the 3D world (it will project a titled LiDAR scan to the horizontal axis). This is in contrast to gmapping which requires the LaserScan to always be perfectly level and horizontal. As seen below, the tracking frame (base_link) is not level, causing the LiDAR LaserScan to be tilted, but Cartographer takes the tilt into account. -![](assets/carto-1.png) +![](/assets/images/carto-1.png) # Installation @@ -66,7 +66,7 @@ You need to provide a static TF transform from `base_link` to your imu frame and Example shown below -![](assets/carto-2.png) +![](/assets/images/carto-2.png) An important point is that `base_link` needs to be **coincident** with `imu_link` (both must have the exact same position and orientation). If you need `base_link` for navigational purposes, I recommend creating one more child frame from`base_link`, e.g. `nav_link` that is at the appropriate location on the robot for navigation, e.g. centre of the wheels and at the axis of rotation. diff --git a/wiki/state-estimation/__all_subsections.md b/wiki/state-estimation/__all_subsections.md index e3edf0b3..cb671503 100644 --- a/wiki/state-estimation/__all_subsections.md +++ b/wiki/state-estimation/__all_subsections.md @@ -6,7 +6,7 @@ title: Adaptive Monte Carlo Localization ## What is a particle filter? Particle filter are initialized by a very high number of particles spanning the entire state space. As you get additional measurements, you predict and update your measurements which makes your robot have a multi-modal posterior distribution. This is a big difference from a Kalman Filter which approximates your posterior distribution to be a Gaussian. Over multiple iterations, the particles converge to a unique value in state space. -![Particle Filter in Action over Progressive Time Steps](assets/AdaptiveMonteCarloLocalization-65e37.png) +![Particle Filter in Action over Progressive Time Steps](/assets/images/AdaptiveMonteCarloLocalization-65e37.png) **Figure 1:** Particle Filter in Action over Progressive Time Steps @@ -31,7 +31,7 @@ The key idea is to bound the error introduced by the sample-based representation ## Use of Adaptive Particle Filter for Localization To use adaptive particle filter for localization, we start with a map of our environment and we can either set robot to some position, in which case we are manually localizing it or we could very well make the robot start from no initial estimate of its position. Now as the robot moves forward, we generate new samples that predict the robot's position after the motion command. Sensor readings are incorporated by re-weighting these samples and normalizing the weights. Generally it is good to add few random uniformly distributed samples as it helps the robot recover itself in cases where it has lost track of its position. In those cases, without these random samples, the robot will keep on re-sampling from an incorrect distribution and will never recover. The reason why it takes the filter multiple sensor readings to converge is that within a map, we might have dis-ambiguities due to symmetry in the map, which is what gives us a multi-modal posterior belief. -![Localization Process using Particle Filters](assets/AdaptiveMonteCarloLocalization-0d322.png) +![Localization Process using Particle Filters](/assets/images/AdaptiveMonteCarloLocalization-0d322.png) [Dieter Fox's paper on Monte Carlo Localization for Mobile Robots](https://www.ri.cmu.edu/pub_files/pub1/fox_dieter_1999_1/fox_dieter_1999_1.pdf) gives further details on this topic and also compares this technique to many others such as Kalman Filter based Localization, Grid Based and Topological Markov Localization. @@ -116,7 +116,7 @@ The detailed explanation of the Cartographer's algorithm and tuning can be found One of Cartographer's strength is that its 2D SLAM is aware of the 3D world (it will project a titled LiDAR scan to the horizontal axis). This is in contrast to gmapping which requires the LaserScan to always be perfectly level and horizontal. As seen below, the tracking frame (base_link) is not level, causing the LiDAR LaserScan to be tilted, but Cartographer takes the tilt into account. -![](assets/carto-1.png) +![](/assets/images/carto-1.png) # Installation @@ -162,7 +162,7 @@ You need to provide a static TF transform from `base_link` to your imu frame and Example shown below -![](assets/carto-2.png) +![](/assets/images/carto-2.png) An important point is that `base_link` needs to be **coincident** with `imu_link` (both must have the exact same position and orientation). If you need `base_link` for navigational purposes, I recommend creating one more child frame from`base_link`, e.g. `nav_link` that is at the appropriate location on the robot for navigation, e.g. centre of the wheels and at the axis of rotation. @@ -282,7 +282,7 @@ Ultrawideband positioning takes advantage of the communication pulses to sense d By using multiple stationary devices, a single or multiple mobile beacons can be tracked by combining ranges through trilateration. -![Example usage of a DWM1001 setup](assets/decawave_example_multi_anchor.png) +![Example usage of a DWM1001 setup](/assets/images/decawave_example_multi_anchor.png) [Source](https://www.researchgate.net/profile/Teijo-Lehtonen/publication/281346001/figure/fig4/AS:284460038803456@1444831966619/DecaWave-UWB-localization-system-SDK-5.png) At the time of writing, one of the most common modules for UWB is the DWM1001. Since these modules are mass manufactured, they can be purchased very inexpensively and should be considered one of the most affordable options for positioning systems. @@ -292,7 +292,7 @@ At the time of writing, one of the most common modules for UWB is the DWM1001. S Ultrasonic positioning works in a similar way to UWB, but rather than transitting frequencies at a very high frequency, the products instead rely on a combination of lower frquency communication pulses and beamforming. By using a sensor array on each device, they are able to claim a 2D positioning accuracy of +-2cm. -![Example usage of a DWM1001 setup](assets/marvelmind_example.jpg) +![Example usage of a DWM1001 setup](/assets/images/marvelmind_example.jpg) [Source](https://marvelmind.com/) As an important note, ultrasonic pulses are harmful to human hearing over an extended period of time and should not deployed around humans without ear protection. @@ -301,7 +301,7 @@ As an important note, ultrasonic pulses are harmful to human hearing over an ext Total stations have an extended heritage in civil engineering, where they have been used to precisely survey worksites since the 1970s. The total station sends beams of light directly to a glass reflective prism, and uses the time-of-flight properties of the beam to measure distances. The robotic total station tracks it's calibration orientaiton to high precision, such that the measured distance can be converted into a high-precision 3D position mesaurement. Total stations, depending on the prism type and other factors, can accurate track with in millimeter range at up to 3.5km [Leica-Geosystems](file:///home/john/Downloads/Leica_Viva_TS16_DS-2.pdf). -![Example usage of a Total Station in the Field](assets/leica_field_image.jpg) +![Example usage of a Total Station in the Field](/assets/images/leica_field_image.jpg) [Source](https://leica-geosystems.com/) ## Key Factors to Consider @@ -671,7 +671,7 @@ track_bbs_ids = mot_tracker.update(detections) ... ``` -![SORT Tracker](assets/sort-tracker.jpg) +![SORT Tracker](/assets/images/sort-tracker.jpg) ### Inverse Perspective Mapping Inverse Perspective Mapping is basically a perspective transformation or a homography between two planes in the world. The idea here is to project the camera view (image plane) on to the ground plane in the world to obtain a birds-eye-view of the scene. One way to do this is to directly pick a set of points (minimum 4) in the image corresponding to a rectangular region on the ground plane and then estimate the homography matrix. @@ -680,13 +680,13 @@ In order to estimate the homography, you need a set of correspondences. You need Once the homography is known, pick the bottom center of all the bounding boxes, as this point most closely represents the point on the ground plane, and apply the homography to this image point to obtain an estimate of location in the world frame. -![IPM Calibration](assets/ipm_two.png) +![IPM Calibration](/assets/images/ipm_two.png) There are many pitfalls and assumptions in this technique. As mentioned earlier, the objects to detect must lie on the same ground plane and the relative distance of the camera sensor and orientation with respect to the ground plane must remain constant. If the bounding box detection is inaccurate, a small deviation in the image point might lead to a significant error in the estimated position in the world frame. You can also model the uncertainty in the position estimate to generate an occupancy grid with the mean and covariance of the position of the object. We will later see how to fuse these estimates with another sensor modality such as a Radar to refine our estimate and track these detections as well. -![Occupancy Grid Gaussian](assets/occupancy-grid.png) +![Occupancy Grid Gaussian](/assets/images/occupancy-grid.png) #### Camera Output Camera returns two states for every detections. According to our current camera configuration, state (Ego vehicle frame) of the detections are given as: @@ -706,7 +706,7 @@ Radar provides four states for every detections, moreover depending on the use c Following is the result of camera detection and estimated position in the 3D world. The detection was performed on image stream from Carla simulator and the results are visualized in Rviz. The blue cubes represent estimates from camera and red cubes are the Radar detections. -![Occupancy Grid](assets/camera-radar-targets.png) +![Occupancy Grid](/assets/images/camera-radar-targets.png) ## Tracker Framework The framework has the following major components: @@ -767,7 +767,7 @@ Once you have the motion compensated tracks, you need to follow the same algorit #### Final Results of Tracking and Sensor Fusion -![Tracker Results](assets/Tracker-01.PNG) ![Tracker Results](assets/Tracker-02.PNG) +![Tracker Results](/assets/images/Tracker-01.PNG) ![Tracker Results](/assets/images/Tracker-02.PNG) ### Tracker Evaluation and Metrics @@ -861,10 +861,10 @@ The following tutorial uses a Quadrotor with RGB-D Sensor as the base platform. Here is the setup: Quadrotor (`base_link`): [3DR Iris+](https://store.3dr.com/products/IRIS) -![3DR Iris+](assets/ROSCostMaps-90ce8.png) +![3DR Iris+](/assets/images/ROSCostMaps-90ce8.png) Depth Sensor (`camera_link`): [Xtion Pro Live](https://www.asus.com/us/3D-Sensor/Xtion_PRO_LIVE/) -![Xtion Pro Live](assets/ROSCostMaps-fad65.png) +![Xtion Pro Live](/assets/images/ROSCostMaps-fad65.png) ### Setup of the camera The Xtion Pro Live is a sensor made by Asus. It is a structured light stereo camera that is able to generate 3D point clouds indoors. If you want to read more about structured light cameras, here is a link to [the Wikipedia page](https://en.wikipedia.org/wiki/Structured-light_3D_scanner). [This paper](http://fofi.pagesperso-orange.fr/Downloads/Fofi_EI2004.pdf) that covers the general methods of structured light cameras. The Asus Xtion Pro Live is able to provide RGB and depth data. This data needs to be manipulated by a package that is able to handle point cloud information. OpenNI is a convenient package that is able to handle complicated camera sensor data and suited for this purpose. @@ -935,7 +935,7 @@ The source code for MAVROS, which will be similar to the folder you will find by You will want to find the file named `px4_config.yaml` or `apm_config.yaml` depending on which of the flight controller firmware you are running. If you are running the PX4 firmware, you are going to want to open `px4_config.yaml` and find this section: -![Code Snippet](assets/ROSCostMaps-2dba7.png) +![Code Snippet](/assets/images/ROSCostMaps-2dba7.png) Once you find it, you will want to change: - `frame_id: "local_origin"` to `frame_id: "map"` @@ -1009,7 +1009,7 @@ $ roslaunch column move_base.launch ``` ### Output The output of the costmap is shown here. -![CostMap Output](assets/ROSCostMaps-8c746.png) +![CostMap Output](/assets/images/ROSCostMaps-8c746.png) ## Communications with PIXHAWK The APM firmware stack is not as powerful as the PX4 firmware. In order to get communication from the PIXHAWK flight controller to the onboard computer you need to use the Telem 1 or Telem 2 port to transfer information through UART. More information can be found [here](http://ardupilot.org/copter/docs/common-telemetry-port-setup-for-apm-px4-and-pixhawk.html). You can also transfer through USB, which is often unreliable, however. @@ -1071,11 +1071,11 @@ This will generate a file 'frames.pdf' in the current directory which will conta ### Debugging example An example tf tree with a robot setup with a laser scanner that uses hector mapping for scan matching and visual odometry is shown in the figure below. -![Example TF Tree with Laser Scanner](assets/ROSNavigation-d06e2.png) +![Example TF Tree with Laser Scanner](/assets/images/ROSNavigation-d06e2.png) If someone is expecting their robot to navigate with the above tf configuration, they will have a hard time seeing anything move. As you can guess from the above coordinate transform tree, the tf tree is not complete. The path planner will be happy with the above configuration because it can get the laser scan matching at /laser with respect to the world coordinate frame but the robot base will not be able to command the wheel actuators. The error can be fixed by adding the transform between the world coordinate frame and the wheel odometry frame of the robot and the resulting tf tree is shown below: -![Correct TF Tree with Laser Scanner](assets/ROSNavigation-7d9d1.png) +![Correct TF Tree with Laser Scanner](/assets/images/ROSNavigation-7d9d1.png) Other useful tf tools for debugging are `tf_echo` and `tf_monitor` @@ -1111,7 +1111,7 @@ If you have tried at least once to look at the navigation stack in ROS, you must 4. Robot_Localization: - When to use this? - Use this when `robot_pose_ekf` is not enough for your robot! This package offers all the goodness of robot_pose_ekf and more. It provides non-linear state estimation using the Extended Kalman Filter (EKF) and the Unscented Kalman Filter (UKF) to fuse information from arbitrary number of sensors. It also provides `navsat_transform_node` which helps in integrating GPS data (fixes) for the robot's localization. The following picture from the Wiki is informative: -![Robot_Localization Diagram](assets/ROSNavigation-72039.png) +![Robot_Localization Diagram](/assets/images/ROSNavigation-72039.png) - What does it require? - It requires `/odometry/filtered` topic of type `nav_msgs/Odometry`, `/imu/data` topic of type `sensor_msgs/Imu` and the `/gps/fix` topic of type `sensor_msgs/NavSatFix` @@ -1205,7 +1205,7 @@ For our application for using the quadcopter to servo over a block, the interact ## Visual Servoing Application We used the formulation described above in order to build an application where the drone uses 4 corners of a block as feature points in the image in order to align over the block. The desired coordinates of the feature points were used as input and the servoing system computed the required velocities in order to move towards the desired configuration. We made sure to clip the output velocities to a value of 0.4m/s for safety and we were able to successfully servo over the block. We also needed to make sure that we are servoing at an appropriate height in order to ensure the block stays in the field of view. -| ![Visual Servoing in action](assets/servoing-action.png) | +| ![Visual Servoing in action](/assets/images/servoing-action.png) | |:--:| | *Visual Servoing in action from the onboard camera* | diff --git a/wiki/state-estimation/adaptive-monte-carlo-localization.md b/wiki/state-estimation/adaptive-monte-carlo-localization.md index 1be678c5..dc4c0e5f 100644 --- a/wiki/state-estimation/adaptive-monte-carlo-localization.md +++ b/wiki/state-estimation/adaptive-monte-carlo-localization.md @@ -5,7 +5,7 @@ title: Adaptive Monte Carlo Localization ## What is a particle filter? Particle filter are initialized by a very high number of particles spanning the entire state space. As you get additional measurements, you predict and update your measurements which makes your robot have a multi-modal posterior distribution. This is a big difference from a Kalman Filter which approximates your posterior distribution to be a Gaussian. Over multiple iterations, the particles converge to a unique value in state space. -![Particle Filter in Action over Progressive Time Steps](assets/AdaptiveMonteCarloLocalization-65e37.png) +![Particle Filter in Action over Progressive Time Steps](/assets/images/AdaptiveMonteCarloLocalization-65e37.png) **Figure 1:** Particle Filter in Action over Progressive Time Steps @@ -30,7 +30,7 @@ The key idea is to bound the error introduced by the sample-based representation ## Use of Adaptive Particle Filter for Localization To use adaptive particle filter for localization, we start with a map of our environment and we can either set robot to some position, in which case we are manually localizing it or we could very well make the robot start from no initial estimate of its position. Now as the robot moves forward, we generate new samples that predict the robot's position after the motion command. Sensor readings are incorporated by re-weighting these samples and normalizing the weights. Generally it is good to add few random uniformly distributed samples as it helps the robot recover itself in cases where it has lost track of its position. In those cases, without these random samples, the robot will keep on re-sampling from an incorrect distribution and will never recover. The reason why it takes the filter multiple sensor readings to converge is that within a map, we might have dis-ambiguities due to symmetry in the map, which is what gives us a multi-modal posterior belief. -![Localization Process using Particle Filters](assets/AdaptiveMonteCarloLocalization-0d322.png) +![Localization Process using Particle Filters](/assets/images/AdaptiveMonteCarloLocalization-0d322.png) [Dieter Fox's paper on Monte Carlo Localization for Mobile Robots](https://www.ri.cmu.edu/pub_files/pub1/fox_dieter_1999_1/fox_dieter_1999_1.pdf) gives further details on this topic and also compares this technique to many others such as Kalman Filter based Localization, Grid Based and Topological Markov Localization. diff --git a/wiki/state-estimation/gps-lacking-state-estimation-sensors.md b/wiki/state-estimation/gps-lacking-state-estimation-sensors.md index abe5aa7d..79111011 100644 --- a/wiki/state-estimation/gps-lacking-state-estimation-sensors.md +++ b/wiki/state-estimation/gps-lacking-state-estimation-sensors.md @@ -22,7 +22,7 @@ Ultrawideband positioning takes advantage of the communication pulses to sense d By using multiple stationary devices, a single or multiple mobile beacons can be tracked by combining ranges through trilateration. -![Example usage of a DWM1001 setup](assets/decawave_example_multi_anchor.png) +![Example usage of a DWM1001 setup](/assets/images/decawave_example_multi_anchor.png) [Source](https://www.researchgate.net/profile/Teijo-Lehtonen/publication/281346001/figure/fig4/AS:284460038803456@1444831966619/DecaWave-UWB-localization-system-SDK-5.png) At the time of writing, one of the most common modules for UWB is the DWM1001. Since these modules are mass manufactured, they can be purchased very inexpensively and should be considered one of the most affordable options for positioning systems. @@ -32,7 +32,7 @@ At the time of writing, one of the most common modules for UWB is the DWM1001. S Ultrasonic positioning works in a similar way to UWB, but rather than transitting frequencies at a very high frequency, the products instead rely on a combination of lower frquency communication pulses and beamforming. By using a sensor array on each device, they are able to claim a 2D positioning accuracy of +-2cm. -![Example usage of a DWM1001 setup](assets/marvelmind_example.jpg) +![Example usage of a DWM1001 setup](/assets/images/marvelmind_example.jpg) [Source](https://marvelmind.com/) As an important note, ultrasonic pulses are harmful to human hearing over an extended period of time and should not deployed around humans without ear protection. @@ -41,7 +41,7 @@ As an important note, ultrasonic pulses are harmful to human hearing over an ext Total stations have an extended heritage in civil engineering, where they have been used to precisely survey worksites since the 1970s. The total station sends beams of light directly to a glass reflective prism, and uses the time-of-flight properties of the beam to measure distances. The robotic total station tracks it's calibration orientaiton to high precision, such that the measured distance can be converted into a high-precision 3D position mesaurement. Total stations, depending on the prism type and other factors, can accurate track with in millimeter range at up to 3.5km [Leica-Geosystems](file:///home/john/Downloads/Leica_Viva_TS16_DS-2.pdf). -![Example usage of a Total Station in the Field](assets/leica_field_image.jpg) +![Example usage of a Total Station in the Field](/assets/images/leica_field_image.jpg) [Source](https://leica-geosystems.com/) ## Key Factors to Consider diff --git a/wiki/state-estimation/radar-camera-sensor-fusion.md b/wiki/state-estimation/radar-camera-sensor-fusion.md index e385771f..9ebc6816 100644 --- a/wiki/state-estimation/radar-camera-sensor-fusion.md +++ b/wiki/state-estimation/radar-camera-sensor-fusion.md @@ -54,7 +54,7 @@ track_bbs_ids = mot_tracker.update(detections) ... ``` -![SORT Tracker](assets/sort-tracker.jpg) +![SORT Tracker](/assets/images/sort-tracker.jpg) ### Inverse Perspective Mapping Inverse Perspective Mapping is basically a perspective transformation or a homography between two planes in the world. The idea here is to project the camera view (image plane) on to the ground plane in the world to obtain a birds-eye-view of the scene. One way to do this is to directly pick a set of points (minimum 4) in the image corresponding to a rectangular region on the ground plane and then estimate the homography matrix. @@ -63,13 +63,13 @@ In order to estimate the homography, you need a set of correspondences. You need Once the homography is known, pick the bottom center of all the bounding boxes, as this point most closely represents the point on the ground plane, and apply the homography to this image point to obtain an estimate of location in the world frame. -![IPM Calibration](assets/ipm_two.png) +![IPM Calibration](/assets/images/ipm_two.png) There are many pitfalls and assumptions in this technique. As mentioned earlier, the objects to detect must lie on the same ground plane and the relative distance of the camera sensor and orientation with respect to the ground plane must remain constant. If the bounding box detection is inaccurate, a small deviation in the image point might lead to a significant error in the estimated position in the world frame. You can also model the uncertainty in the position estimate to generate an occupancy grid with the mean and covariance of the position of the object. We will later see how to fuse these estimates with another sensor modality such as a Radar to refine our estimate and track these detections as well. -![Occupancy Grid Gaussian](assets/occupancy-grid.png) +![Occupancy Grid Gaussian](/assets/images/occupancy-grid.png) #### Camera Output Camera returns two states for every detections. According to our current camera configuration, state (Ego vehicle frame) of the detections are given as: @@ -89,7 +89,7 @@ Radar provides four states for every detections, moreover depending on the use c Following is the result of camera detection and estimated position in the 3D world. The detection was performed on image stream from Carla simulator and the results are visualized in Rviz. The blue cubes represent estimates from camera and red cubes are the Radar detections. -![Occupancy Grid](assets/camera-radar-targets.png) +![Occupancy Grid](/assets/images/camera-radar-targets.png) ## Tracker Framework The framework has the following major components: @@ -150,7 +150,7 @@ Once you have the motion compensated tracks, you need to follow the same algorit #### Final Results of Tracking and Sensor Fusion -![Tracker Results](assets/Tracker-01.PNG) ![Tracker Results](assets/Tracker-02.PNG) +![Tracker Results](/assets/images/Tracker-01.PNG) ![Tracker Results](/assets/images/Tracker-02.PNG) ### Tracker Evaluation and Metrics diff --git a/wiki/state-estimation/ros-cost-maps.md b/wiki/state-estimation/ros-cost-maps.md index 191f4c1b..77d6918c 100644 --- a/wiki/state-estimation/ros-cost-maps.md +++ b/wiki/state-estimation/ros-cost-maps.md @@ -60,10 +60,10 @@ The following tutorial uses a Quadrotor with RGB-D Sensor as the base platform. Here is the setup: Quadrotor (`base_link`): [3DR Iris+](https://store.3dr.com/products/IRIS) -![3DR Iris+](assets/ROSCostMaps-90ce8.png) +![3DR Iris+](/assets/images/ROSCostMaps-90ce8.png) Depth Sensor (`camera_link`): [Xtion Pro Live](https://www.asus.com/us/3D-Sensor/Xtion_PRO_LIVE/) -![Xtion Pro Live](assets/ROSCostMaps-fad65.png) +![Xtion Pro Live](/assets/images/ROSCostMaps-fad65.png) ### Setup of the camera The Xtion Pro Live is a sensor made by Asus. It is a structured light stereo camera that is able to generate 3D point clouds indoors. If you want to read more about structured light cameras, here is a link to [the Wikipedia page](https://en.wikipedia.org/wiki/Structured-light_3D_scanner). [This paper](http://fofi.pagesperso-orange.fr/Downloads/Fofi_EI2004.pdf) that covers the general methods of structured light cameras. The Asus Xtion Pro Live is able to provide RGB and depth data. This data needs to be manipulated by a package that is able to handle point cloud information. OpenNI is a convenient package that is able to handle complicated camera sensor data and suited for this purpose. @@ -134,7 +134,7 @@ The source code for MAVROS, which will be similar to the folder you will find by You will want to find the file named `px4_config.yaml` or `apm_config.yaml` depending on which of the flight controller firmware you are running. If you are running the PX4 firmware, you are going to want to open `px4_config.yaml` and find this section: -![Code Snippet](assets/ROSCostMaps-2dba7.png) +![Code Snippet](/assets/images/ROSCostMaps-2dba7.png) Once you find it, you will want to change: - `frame_id: "local_origin"` to `frame_id: "map"` @@ -208,7 +208,7 @@ $ roslaunch column move_base.launch ``` ### Output The output of the costmap is shown here. -![CostMap Output](assets/ROSCostMaps-8c746.png) +![CostMap Output](/assets/images/ROSCostMaps-8c746.png) ## Communications with PIXHAWK The APM firmware stack is not as powerful as the PX4 firmware. In order to get communication from the PIXHAWK flight controller to the onboard computer you need to use the Telem 1 or Telem 2 port to transfer information through UART. More information can be found [here](http://ardupilot.org/copter/docs/common-telemetry-port-setup-for-apm-px4-and-pixhawk.html). You can also transfer through USB, which is often unreliable, however. diff --git a/wiki/state-estimation/ros-navigation.md b/wiki/state-estimation/ros-navigation.md index 79926fa7..53782539 100644 --- a/wiki/state-estimation/ros-navigation.md +++ b/wiki/state-estimation/ros-navigation.md @@ -31,11 +31,11 @@ This will generate a file 'frames.pdf' in the current directory which will conta ### Debugging example An example tf tree with a robot setup with a laser scanner that uses hector mapping for scan matching and visual odometry is shown in the figure below. -![Example TF Tree with Laser Scanner](assets/ROSNavigation-d06e2.png) +![Example TF Tree with Laser Scanner](/assets/images/ROSNavigation-d06e2.png) If someone is expecting their robot to navigate with the above tf configuration, they will have a hard time seeing anything move. As you can guess from the above coordinate transform tree, the tf tree is not complete. The path planner will be happy with the above configuration because it can get the laser scan matching at /laser with respect to the world coordinate frame but the robot base will not be able to command the wheel actuators. The error can be fixed by adding the transform between the world coordinate frame and the wheel odometry frame of the robot and the resulting tf tree is shown below: -![Correct TF Tree with Laser Scanner](assets/ROSNavigation-7d9d1.png) +![Correct TF Tree with Laser Scanner](/assets/images/ROSNavigation-7d9d1.png) Other useful tf tools for debugging are `tf_echo` and `tf_monitor` @@ -71,7 +71,7 @@ If you have tried at least once to look at the navigation stack in ROS, you must 4. Robot_Localization: - When to use this? - Use this when `robot_pose_ekf` is not enough for your robot! This package offers all the goodness of robot_pose_ekf and more. It provides non-linear state estimation using the Extended Kalman Filter (EKF) and the Unscented Kalman Filter (UKF) to fuse information from arbitrary number of sensors. It also provides `navsat_transform_node` which helps in integrating GPS data (fixes) for the robot's localization. The following picture from the Wiki is informative: -![Robot_Localization Diagram](assets/ROSNavigation-72039.png) +![Robot_Localization Diagram](/assets/images/ROSNavigation-72039.png) - What does it require? - It requires `/odometry/filtered` topic of type `nav_msgs/Odometry`, `/imu/data` topic of type `sensor_msgs/Imu` and the `/gps/fix` topic of type `sensor_msgs/NavSatFix` diff --git a/wiki/state-estimation/visual-servoing.md b/wiki/state-estimation/visual-servoing.md index 3ef1a2eb..3883ab9b 100644 --- a/wiki/state-estimation/visual-servoing.md +++ b/wiki/state-estimation/visual-servoing.md @@ -41,7 +41,7 @@ For our application for using the quadcopter to servo over a block, the interact ## Visual Servoing Application We used the formulation described above in order to build an application where the drone uses 4 corners of a block as feature points in the image in order to align over the block. The desired coordinates of the feature points were used as input and the servoing system computed the required velocities in order to move towards the desired configuration. We made sure to clip the output velocities to a value of 0.4m/s for safety and we were able to successfully servo over the block. We also needed to make sure that we are servoing at an appropriate height in order to ensure the block stays in the field of view. -| ![Visual Servoing in action](assets/servoing-action.png) | +| ![Visual Servoing in action](/assets/images/servoing-action.png) | |:--:| | *Visual Servoing in action from the onboard camera* | diff --git a/wiki/system-design-development/__all_subsections.md b/wiki/system-design-development/__all_subsections.md index 4b52d0b2..bfb5b7b0 100644 --- a/wiki/system-design-development/__all_subsections.md +++ b/wiki/system-design-development/__all_subsections.md @@ -11,7 +11,7 @@ To illustrate its importance imagine the following scenario: You are at the final integration steps of your project and something isn't working. You start by checking out the hardware and see Figure 1. -![Cable Management Gone Wrong](assets/CableManagement-c5b3a.png) +![Cable Management Gone Wrong](/assets/images/CableManagement-c5b3a.png) **Figure 1: Cable management gone wrong** @@ -26,7 +26,7 @@ If this is your first time creating a wiring diagram for your system you will pr Note: in systems engineering you will be required to create a cyberphysical architecture for your system. This diagram may be similar, but they are still fundamentally different. Notice how here we are explicitly differentiating cables, and boards. We get more information from a cable management perspective this way. For example notice how, in **Figure 2**, cable 3 only has one plug. This tells us that Sensor 1 has an unremovable cable attached to it. -![Wiring Managment](assets/CableManagement-b3a03.png) +![Wiring Managment](/assets/images/CableManagement-b3a03.png) **Figure 2: Example wiring block diagram of 2 circuit card assembly boards and 1 sensor connected by three cables. Here the JX labels stand for the jacks on the different circuit boards and the PX stand for the plugs of the cables.** @@ -35,7 +35,7 @@ Now that you have outlined all of the different boards and connections it is tim If you are defining your own connections it is time to make some cable wiring diagrams. You can imagine these diagrams as a zoomed in detailed picture of each of the cables in your wiring block diagram. Figure 3 shows an example cable wiring diagram. It is not necessary to get as detailed as Figure 3. In fact, I've used excel to create very effective wiring diagrams before. The most important objective of these diagrams is to understand the signals and wires on each cable. One more crucial detail highlighted in these diagrams is the length of each cable. Make sure you have a rough idea of how long each cable will be, keyword: rough. You may not be able to determine the exact length of your cable, but going through this exercise will make you start thinking about cable routing. At this step it is necessary to sit down with the mechanical designer of your system and discuss how your cables are physically getting from A to B. -![Example Cable Wiring Diagram for a USB Cable](assets/CableManagement-654ae.png) +![Example Cable Wiring Diagram for a USB Cable](/assets/images/CableManagement-654ae.png) **Figure 3: Example Cable wiring diagram for a USB cable** @@ -91,7 +91,7 @@ If you do decide to use connectors that require crimps it is important that you ### Grouping Wires Once you know what connector, wires, and crimps to use it is time to assemble the cable. For the most part this is straightforward, but there are some tricks that will make cable management later on easier. First, if you have any twisted pairs in your cable or want to group wires together without additional hardware, you can use the drill trick to make nice looking cables like **Figure 4**. A video of the Twisted Pair Drill Trick can be viewed [here](https://www.youtube.com/watch?v=uTJhrTTl-EE) -![Twisted Wires Done Using a Drill](assets/CableManagement-6f4d5.png) +![Twisted Wires Done Using a Drill](/assets/images/CableManagement-6f4d5.png) **Figure 4: Twisted wires done using a drill** @@ -302,17 +302,17 @@ title: PCB Design Notes (electrolytic and non­electrolytic) for noise­reduction. - It is important to have proper LED indication on the PCB (as shown in **Figure 1** and **Figure 2**) for testing and accountability. Use LED indicators to ensure proper functioning of the board. -![LED indication in schematic with noise reduction cap](assets/PCBDesignNotes-8fedc.png) +![LED indication in schematic with noise reduction cap](/assets/images/PCBDesignNotes-8fedc.png) **Figure 1: LED indication in schematic with noise reduction cap** -![Labeled Fuse and Zener­diode for Protection](assets/PCBDesignNotes-09baf.png) +![Labeled Fuse and Zener­diode for Protection](/assets/images/PCBDesignNotes-09baf.png) **Figure 2: Labeled Fuse and Zener­diode for Protection** - You can add additional comments on schematic as shown in **Figure 3**, this helps to put information related to board which is otherwise not explicit from the schematic. -![Schematic with comments](assets/PCBDesignNotes-d5ba2.png) +![Schematic with comments](/assets/images/PCBDesignNotes-d5ba2.png) **Figure 3: Schematic with comments** @@ -326,7 +326,7 @@ As you get your board design ready, please keep in mind that you want to have so manufacturing process, some metal is going to be deposited inside each hole. This reduces the diameter of the hole, making it smaller than it was when it was drilled. As a rule of thumb, add 8­12mils to the nominal round lead diameter, and round up if you need to match the diameter to a particular drill size list. Keep in mind that a bit bigger is better than too small; you don't want to find yourself filing a lead that is too big (you cannot make the hole bigger, because it would remove the through­hole metal). Double­check and make sure that none of the holes is smaller than 0.015” diameter, and that neither tracks nor clearances between tracks/pads/planes are smaller than 0.006”. -![Variable Track Width](assets/PCBDesignNotes-05e85.png) +![Variable Track Width](/assets/images/PCBDesignNotes-05e85.png) **Figure 4: Variable Track Width** @@ -420,22 +420,22 @@ One of the most useful views is the operational. In practice, you will rarely go #### Level 1 In this level, one can usually put the Use Case. While technically it belongs in the Capability View or All View, since we're otherwise not using CVs (unless you start modeling at the very beginning and use the CV for requirements). In the Use Case, put the Actors (the user, obviously, and the highest level subsystems you'd normally see in a WBS), and then what information flows between them. This would be the highest level information packet containing all other information flow we see on the level 2 Activity Diagrams. -![SIDD colorless OV 1](assets/SubsystemInterfaceModeling-8748c.png) +![SIDD colorless OV 1](/assets/images/SubsystemInterfaceModeling-8748c.png) #### Level 2 This is the meat of the Interface Design Description, where you can flow out all the things the system might do. Rather than go into a lot of operational or capability viewpoints, go straight into activity diagrams since the system is relatively small. Each box at the first indenture of level 2. >Use "indentures" of activity diagrams since the other "levels" of OV are technically something else, signified by letters like OV-2b or OV-2c) is a high level activity (see below for the highest level view of MRSD 2015 "Dock In Piece" project). -![SIDD colorless OV 2 Dock Quadcopter](assets/SubsystemInterfaceModeling-fb765.png) +![SIDD colorless OV 2 Dock Quadcopter](/assets/images/SubsystemInterfaceModeling-fb765.png) As you can see from this chart, the highest level activities of docking the quadcopter are things like 'take off' and 'rendezvous with docking face', which have lines between to signify the temporal flow, and labels to signify what information needs to pass in order to make it happen. Most important are the labels which cross swimlanes, because that's information that will have to be packaged and sent from one subsystem to another. At this level the swimlanes are the actors and high level subsystems, but if we go a level down, we see subsystems within subsystems (the system-of-systems concept made manifest). -![SIDD-colorless-OV-2b Rendezvous with Docking Face](assets/SubsystemInterfaceModeling-4e816.png) +![SIDD-colorless-OV-2b Rendezvous with Docking Face](/assets/images/SubsystemInterfaceModeling-4e816.png) The first three swimlanes from the left are subsystems of the quadcopter while the final is crossing to/from the Palantir. -![SIDD-colorless-OV-2a Determine Docking Possibility](assets/SubsystemInterfaceModeling-8e94f.png) +![SIDD-colorless-OV-2a Determine Docking Possibility](/assets/images/SubsystemInterfaceModeling-8e94f.png) Here all four swimlanes are different subsystems (though the Palantir is technically part of the dock, it is quite separate physically and informationally), but support the higher level activity of docking) @@ -443,7 +443,7 @@ Here all four swimlanes are different subsystems (though the Palantir is technic #### Level 3 OV-2c is where intrasystem activities show up in the architecture. This indenture shows information flowing and activities that occur entirely on one system, sometimes with a single information flow leaving the internal swimlanes to some external box or all flowing to a single box which has the same name as a box in an indenture above, signifying what information and actions flow inside a system to make that one action occur - similar how how an OV-2b is often the expanded version of a single box in the OV-2a indenture. We cancelled all of our OV-2c diagrams early on and by the time the new system was finalized, we didn't have time to model, but this is what it looked like when we had the quadcopter doing localization with an onboard camera. -![SIDD-colorless-CANCELED OV-2c Localize Quadcopter](assets/SubsystemInterfaceModeling-73d8e.png) +![SIDD-colorless-CANCELED OV-2c Localize Quadcopter](/assets/images/SubsystemInterfaceModeling-73d8e.png) All swimlanes are of systems internal to the quadcopter subsystem, and eventually flow out to it keeping a fixed hover point. @@ -453,7 +453,7 @@ If you were modeling from the very beginning, capability and to some extent acti ### Data and Information View You can always dive straight into DIV-2 rather than DIV-1, but if you start early with modeling a DIV-1 is useful. We'll cover the second level here. Each line in the activity diagram had a name (or should have). That was a data flow, and these data flows naturally have information. In the DIV-2, you show what this information is. -![SIDD-colorless-DIV-2 DockMotionDetails](assets/SubsystemInterfaceModeling-7097d.png) +![SIDD-colorless-DIV-2 DockMotionDetails](/assets/images/SubsystemInterfaceModeling-7097d.png) It may seem trivial at first, but these views show not just information, but their type, names, and what larger information boxes they flow into. This can make integration much easier as everyone knows what every subsystem needs from every other subsystem and if the naming conventions are kept to, there is no confusion in how to get that information. diff --git a/wiki/system-design-development/cable-management.md b/wiki/system-design-development/cable-management.md index d98d3bb2..0e2e0088 100644 --- a/wiki/system-design-development/cable-management.md +++ b/wiki/system-design-development/cable-management.md @@ -10,7 +10,7 @@ To illustrate its importance imagine the following scenario: You are at the final integration steps of your project and something isn't working. You start by checking out the hardware and see Figure 1. -![Cable Management Gone Wrong](assets/CableManagement-c5b3a.png) +![Cable Management Gone Wrong](/assets/images/CableManagement-c5b3a.png) **Figure 1: Cable management gone wrong** @@ -25,7 +25,7 @@ If this is your first time creating a wiring diagram for your system you will pr Note: in systems engineering you will be required to create a cyberphysical architecture for your system. This diagram may be similar, but they are still fundamentally different. Notice how here we are explicitly differentiating cables, and boards. We get more information from a cable management perspective this way. For example notice how, in **Figure 2**, cable 3 only has one plug. This tells us that Sensor 1 has an unremovable cable attached to it. -![Wiring Managment](assets/CableManagement-b3a03.png) +![Wiring Managment](/assets/images/CableManagement-b3a03.png) **Figure 2: Example wiring block diagram of 2 circuit card assembly boards and 1 sensor connected by three cables. Here the JX labels stand for the jacks on the different circuit boards and the PX stand for the plugs of the cables.** @@ -34,7 +34,7 @@ Now that you have outlined all of the different boards and connections it is tim If you are defining your own connections it is time to make some cable wiring diagrams. You can imagine these diagrams as a zoomed in detailed picture of each of the cables in your wiring block diagram. Figure 3 shows an example cable wiring diagram. It is not necessary to get as detailed as Figure 3. In fact, I've used excel to create very effective wiring diagrams before. The most important objective of these diagrams is to understand the signals and wires on each cable. One more crucial detail highlighted in these diagrams is the length of each cable. Make sure you have a rough idea of how long each cable will be, keyword: rough. You may not be able to determine the exact length of your cable, but going through this exercise will make you start thinking about cable routing. At this step it is necessary to sit down with the mechanical designer of your system and discuss how your cables are physically getting from A to B. -![Example Cable Wiring Diagram for a USB Cable](assets/CableManagement-654ae.png) +![Example Cable Wiring Diagram for a USB Cable](/assets/images/CableManagement-654ae.png) **Figure 3: Example Cable wiring diagram for a USB cable** @@ -90,7 +90,7 @@ If you do decide to use connectors that require crimps it is important that you ### Grouping Wires Once you know what connector, wires, and crimps to use it is time to assemble the cable. For the most part this is straightforward, but there are some tricks that will make cable management later on easier. First, if you have any twisted pairs in your cable or want to group wires together without additional hardware, you can use the drill trick to make nice looking cables like **Figure 4**. A video of the Twisted Pair Drill Trick can be viewed [here](https://www.youtube.com/watch?v=uTJhrTTl-EE) -![Twisted Wires Done Using a Drill](assets/CableManagement-6f4d5.png) +![Twisted Wires Done Using a Drill](/assets/images/CableManagement-6f4d5.png) **Figure 4: Twisted wires done using a drill** diff --git a/wiki/system-design-development/pcb-design.md b/wiki/system-design-development/pcb-design.md index 1ece14bf..08c4330b 100644 --- a/wiki/system-design-development/pcb-design.md +++ b/wiki/system-design-development/pcb-design.md @@ -45,17 +45,17 @@ title: PCB Design Notes (electrolytic and non­electrolytic) for noise­reduction. - It is important to have proper LED indication on the PCB (as shown in **Figure 1** and **Figure 2**) for testing and accountability. Use LED indicators to ensure proper functioning of the board. -![LED indication in schematic with noise reduction cap](assets/PCBDesignNotes-8fedc.png) +![LED indication in schematic with noise reduction cap](/assets/images/PCBDesignNotes-8fedc.png) **Figure 1: LED indication in schematic with noise reduction cap** -![Labeled Fuse and Zener­diode for Protection](assets/PCBDesignNotes-09baf.png) +![Labeled Fuse and Zener­diode for Protection](/assets/images/PCBDesignNotes-09baf.png) **Figure 2: Labeled Fuse and Zener­diode for Protection** - You can add additional comments on schematic as shown in **Figure 3**, this helps to put information related to board which is otherwise not explicit from the schematic. -![Schematic with comments](assets/PCBDesignNotes-d5ba2.png) +![Schematic with comments](/assets/images/PCBDesignNotes-d5ba2.png) **Figure 3: Schematic with comments** @@ -69,7 +69,7 @@ As you get your board design ready, please keep in mind that you want to have so manufacturing process, some metal is going to be deposited inside each hole. This reduces the diameter of the hole, making it smaller than it was when it was drilled. As a rule of thumb, add 8­12mils to the nominal round lead diameter, and round up if you need to match the diameter to a particular drill size list. Keep in mind that a bit bigger is better than too small; you don't want to find yourself filing a lead that is too big (you cannot make the hole bigger, because it would remove the through­hole metal). Double­check and make sure that none of the holes is smaller than 0.015” diameter, and that neither tracks nor clearances between tracks/pads/planes are smaller than 0.006”. -![Variable Track Width](assets/PCBDesignNotes-05e85.png) +![Variable Track Width](/assets/images/PCBDesignNotes-05e85.png) **Figure 4: Variable Track Width** diff --git a/wiki/system-design-development/subsystem-interface-modeling.md b/wiki/system-design-development/subsystem-interface-modeling.md index 6544fa66..2a87fb24 100644 --- a/wiki/system-design-development/subsystem-interface-modeling.md +++ b/wiki/system-design-development/subsystem-interface-modeling.md @@ -14,22 +14,22 @@ One of the most useful views is the operational. In practice, you will rarely go #### Level 1 In this level, one can usually put the Use Case. While technically it belongs in the Capability View or All View, since we're otherwise not using CVs (unless you start modeling at the very beginning and use the CV for requirements). In the Use Case, put the Actors (the user, obviously, and the highest level subsystems you'd normally see in a WBS), and then what information flows between them. This would be the highest level information packet containing all other information flow we see on the level 2 Activity Diagrams. -![SIDD colorless OV 1](assets/SubsystemInterfaceModeling-8748c.png) +![SIDD colorless OV 1](/assets/images/SubsystemInterfaceModeling-8748c.png) #### Level 2 This is the meat of the Interface Design Description, where you can flow out all the things the system might do. Rather than go into a lot of operational or capability viewpoints, go straight into activity diagrams since the system is relatively small. Each box at the first indenture of level 2. >Use "indentures" of activity diagrams since the other "levels" of OV are technically something else, signified by letters like OV-2b or OV-2c) is a high level activity (see below for the highest level view of MRSD 2015 "Dock In Piece" project). -![SIDD colorless OV 2 Dock Quadcopter](assets/SubsystemInterfaceModeling-fb765.png) +![SIDD colorless OV 2 Dock Quadcopter](/assets/images/SubsystemInterfaceModeling-fb765.png) As you can see from this chart, the highest level activities of docking the quadcopter are things like 'take off' and 'rendezvous with docking face', which have lines between to signify the temporal flow, and labels to signify what information needs to pass in order to make it happen. Most important are the labels which cross swimlanes, because that's information that will have to be packaged and sent from one subsystem to another. At this level the swimlanes are the actors and high level subsystems, but if we go a level down, we see subsystems within subsystems (the system-of-systems concept made manifest). -![SIDD-colorless-OV-2b Rendezvous with Docking Face](assets/SubsystemInterfaceModeling-4e816.png) +![SIDD-colorless-OV-2b Rendezvous with Docking Face](/assets/images/SubsystemInterfaceModeling-4e816.png) The first three swimlanes from the left are subsystems of the quadcopter while the final is crossing to/from the Palantir. -![SIDD-colorless-OV-2a Determine Docking Possibility](assets/SubsystemInterfaceModeling-8e94f.png) +![SIDD-colorless-OV-2a Determine Docking Possibility](/assets/images/SubsystemInterfaceModeling-8e94f.png) Here all four swimlanes are different subsystems (though the Palantir is technically part of the dock, it is quite separate physically and informationally), but support the higher level activity of docking) @@ -37,7 +37,7 @@ Here all four swimlanes are different subsystems (though the Palantir is technic #### Level 3 OV-2c is where intrasystem activities show up in the architecture. This indenture shows information flowing and activities that occur entirely on one system, sometimes with a single information flow leaving the internal swimlanes to some external box or all flowing to a single box which has the same name as a box in an indenture above, signifying what information and actions flow inside a system to make that one action occur - similar how how an OV-2b is often the expanded version of a single box in the OV-2a indenture. We cancelled all of our OV-2c diagrams early on and by the time the new system was finalized, we didn't have time to model, but this is what it looked like when we had the quadcopter doing localization with an onboard camera. -![SIDD-colorless-CANCELED OV-2c Localize Quadcopter](assets/SubsystemInterfaceModeling-73d8e.png) +![SIDD-colorless-CANCELED OV-2c Localize Quadcopter](/assets/images/SubsystemInterfaceModeling-73d8e.png) All swimlanes are of systems internal to the quadcopter subsystem, and eventually flow out to it keeping a fixed hover point. @@ -47,7 +47,7 @@ If you were modeling from the very beginning, capability and to some extent acti ### Data and Information View You can always dive straight into DIV-2 rather than DIV-1, but if you start early with modeling a DIV-1 is useful. We'll cover the second level here. Each line in the activity diagram had a name (or should have). That was a data flow, and these data flows naturally have information. In the DIV-2, you show what this information is. -![SIDD-colorless-DIV-2 DockMotionDetails](assets/SubsystemInterfaceModeling-7097d.png) +![SIDD-colorless-DIV-2 DockMotionDetails](/assets/images/SubsystemInterfaceModeling-7097d.png) It may seem trivial at first, but these views show not just information, but their type, names, and what larger information boxes they flow into. This can make integration much easier as everyone knows what every subsystem needs from every other subsystem and if the naming conventions are kept to, there is no confusion in how to get that information. diff --git a/wiki/tools/Qtcreator-ros.md b/wiki/tools/Qtcreator-ros.md index f6ce692c..9dfd8977 100644 --- a/wiki/tools/Qtcreator-ros.md +++ b/wiki/tools/Qtcreator-ros.md @@ -70,19 +70,19 @@ This section will guide you to create your first simple Hello-World Qt program 2. Create new project using `File -> New File or Project -> Application -> Qt Widgets Application` - ![](assets/Qtcreator-ros-new-project.png) + ![](/assets/images/Qtcreator-ros-new-project.png) 3. Name your project/application - ![](assets/Qtcreator-ros-new-project-menu.png) + ![](/assets/images/Qtcreator-ros-new-project-menu.png) 4. If you installed correctly, the Kit will be detected automatically, if not this [link](https://stackoverflow.com/questions/26499404/qtcreator-no-valid-kits-found) might be useful - ![](assets/Qtcreator-ros-new-project-kit.png) + ![](/assets/images/Qtcreator-ros-new-project-kit.png) 5. Name your main class. Although this is not the main function, it acts as the entry point of the application - ![](assets/Qtcreator-ros-new-project-class-menu.png) + ![](/assets/images/Qtcreator-ros-new-project-class-menu.png) 6. Select finish @@ -90,11 +90,11 @@ This section will guide you to create your first simple Hello-World Qt program 8. Click the green arrow at the bottom left side or use `Ctrl + R` to build and run. You should see a blank application window like this one - ![](assets/Qtcreator-ros-new-project-run.png) + ![](/assets/images/Qtcreator-ros-new-project-run.png) 9. Close the program by clicking on the red cross on the `MainWindow` window. and navigate to the `mainwindow.ui` file under `Forms` on the left menu. It will automatically switch to the `Design` tab and open this UI editor tool - ![](assets/Qtcreator-ros-new-project-design.png) + ![](/assets/images/Qtcreator-ros-new-project-design.png) 10. The left menu is now switched to the basic UI widgets available. You can put them through drag and drop. Try to drag and drop these 4 types of widgets: @@ -103,23 +103,23 @@ This section will guide you to create your first simple Hello-World Qt program 3. `Display Widgets -> Label` 4. `Display Widgets -> Text Browser` - ![](assets/Qtcreator-ros-new-project-ui-elements.png) + ![](/assets/images/Qtcreator-ros-new-project-ui-elements.png) 11. Some of the widgets have text that is displayed on them such as the `Label` and `Push Button`, you can double-left-click on them and edit the display text - ![](assets/Qtcreator-ros-new-project-edit-text.png) + ![](/assets/images/Qtcreator-ros-new-project-edit-text.png) 12. On the right menu you should see a summary of all the objects and widgets that you have created. Here we can see the 4 widgets we added. An important distinction here is that the left column is the name of the object (unique entity) and the right column is the class name (not unique). Hence, you can have multiple labels, but these are based on `QLabel` class - ![](assets/Qtcreator-ros-new-project-ui-obj.png) + ![](/assets/images/Qtcreator-ros-new-project-ui-obj.png) 13. To drive the point home, try to rename the objects. It is advisable to give it meaningful name as you would name a variable. Also, remember to save often with `Ctrl + S` - ![](assets/Qtcreator-ros-new-project-ui-obj-rename.png) + ![](/assets/images/Qtcreator-ros-new-project-ui-obj-rename.png) 14. Run the program again `Ctrl + R` and you should see your widget. Try to type on the line edit widget - ![](assets/Qtcreator-ros-new-project-run2.png) + ![](/assets/images/Qtcreator-ros-new-project-run2.png) # Qt communication framework diff --git a/wiki/tools/__all_subsections.md b/wiki/tools/__all_subsections.md index 03292359..97f9ea1f 100644 --- a/wiki/tools/__all_subsections.md +++ b/wiki/tools/__all_subsections.md @@ -8,28 +8,28 @@ Altium Circuitmaker is a Community Driven PCB Design Application. Circuitmaker c ## Strengths and Weaknesses ### Benefits 1. Cloud based part library drawn from the Octopart database - - ![Library Menu](assets/AltiumCircuitmaker-8aecd.png) + - ![Library Menu](/assets/images/AltiumCircuitmaker-8aecd.png) 2. Friendlier UI - This is strictly a comparison to EagleCAD. Eagle's UI is a more involved style, which lets the user get deeper into things, but is also not nearly as easy for the casual or new user, or for someone in a hurry. - - ![Part Info Window](assets/AltiumCircuitmaker-78555.png) + - ![Part Info Window](/assets/images/AltiumCircuitmaker-78555.png) 3. Can output STEP files and view the part in 3D in Circuitmaker - - ![3D View](assets/AltiumCircuitmaker-fcf01.png) + - ![3D View](/assets/images/AltiumCircuitmaker-fcf01.png) 4. The autorouter appears somewhat smarter - Partially due to the easier UI, it also feels like it takes it less time and effort to find a good path. You can make multiple profiles of routing schemes and widths, and choose to route only one net at a time. However, by putting in multiple width rules that each cover a single net, you can autoroute every net at once at the correct width. - - ![Rule Menu](assets/AltiumCircuitmaker-4b425.png) + - ![Rule Menu](/assets/images/AltiumCircuitmaker-4b425.png) 5. Collaborative cloud based development method 6. Outputs include an excel BOM 7. No trial version; all functionality provided for free in the open beta. ### Drawbacks 1. No preloaded set of common drill sizes - - ![Hole Menu](assets/AltiumCircuitmaker-f5782.png) + - ![Hole Menu](/assets/images/AltiumCircuitmaker-f5782.png) 2. No board outline by default 3. Poor default wiring options 4. Copper Pours are not intelligent - - ![Pour Plane Cutout](assets/AltiumCircuitmaker-e83b9.png) + - ![Pour Plane Cutout](/assets/images/AltiumCircuitmaker-e83b9.png) 5. Some UI still obviously in need of tweaking - - ![Library Side Menu](assets/AltiumCircuitmaker-1caa4.png) + - ![Library Side Menu](/assets/images/AltiumCircuitmaker-1caa4.png) ### Summary In many ways, Circuitmaker is an improvement over EagleCAD. As an *open beta*, there are occasional stability issues as well as very long periods where it stops to work through an instruction. It's far enough along that the instability issues are a minor nuisance and do not appear to affect better computers. As for the freezes, Circuitmaker is a bit slow to start and to close, to load menus, and there are peak usage periods where it's slow to fetch new part information from the cloud. Otherwise it runs quite well. For projects, it could save a lot of time. In Eagle, the teams all make and remake the same parts, and often do much the same kind of thing throughout their project if they rely on PCBs. With Circuitmaker, all the parts fetch from Octop @@ -74,15 +74,15 @@ Like any other IDE, CLion has countless features. These can also be extended by #### Debugging -![CLion Debugging 1](assets/debug1.jpeg) +![CLion Debugging 1](/assets/images/debug1.jpeg) After opening the project folder in CLion, right-click on the `CMakeLists.txt` and choose Reload CMake Project. The various executable target added in the CMake file will be available in the drop-down menu at the top right as shown in the above image. -![CLion Debug 2](assets/debug2.jpeg) +![CLion Debug 2](/assets/images/debug2.jpeg) Add the breakpoint in the code where you want to pause the code and press the debug button as shown in the image. -![CLion Debug 3](assets/debug3.jpeg) +![CLion Debug 3](/assets/images/debug3.jpeg) CLion will pause the execution at the breakpoint. You can view all the global, local variables and their values in the variable inspector. It also provides the functionality to run the code line by line by using various step in, step over, step out function. You can also press the resume button to continue execution till the next break-point. You can add new breakpoints even when code is paused at a breakpoint. @@ -90,7 +90,7 @@ CLion will pause the execution at the breakpoint. You can view all the global, l Refactoring is one of the most powerful tools in the CLion. Simplest re-factor operation is renaming a variable. -![Refactor 1](assets/refactor1.png) +![Refactor 1](/assets/images/refactor1.png) `right-click -> Refactor -> Rename` @@ -99,7 +99,7 @@ Refactoring is one of the most powerful tools in the CLion. Simplest re-factor o `right-click -> Refactor -> Extract -> Method` -![Refactor 2](assets/refactor2.jpeg) +![Refactor 2](/assets/images/refactor2.jpeg) #### Entity Linking @@ -111,7 +111,7 @@ Entity linking is very useful in efficiently navigating code-base in CLion. The Entity linking works to the imported library as well. If you have imported some C++ library and want to check the source code inside the library, just use entity linking. It will open the source code of the library if it's available. For example, in the below image, definition of `std::vector::push_back()` is opened using entity linking of CLion. -![Refactor 3](assets/refactor3.png) +![Refactor 3](/assets/images/refactor3.png) #### Context-Aware Search @@ -119,7 +119,7 @@ Given a function or a variable, all its usage inside the code can also be search `right-click -> Find Usages` -![Refactor 4](assets/refactor4.png) +![Refactor 4](/assets/images/refactor4.png) Above image shows the various usages CLion found of the private variable `costMap` inside the repository. @@ -192,16 +192,16 @@ A link for [downloading](https://code.visualstudio.com/download). 2. Open VS Code (can use the Linux search/windows button). Source folders into the workspace. 3. The top left tab gives you file explorer. Click it! -![File Explorer](assets/vscode4.png) +![File Explorer](/assets/images/vscode4.png) #### Features 1. **Keyword search**: Right-click inside the file explorer space. Check out “Find in Folder..” and try searching for a keyword and you’d see lightning fast multi-file search (or) click on the search button below the explorer and use the find and replace options. -![Keyword Search](assets/vscode11.png) +![Keyword Search](/assets/images/vscode11.png) 2. **Seek definition**: Open any file and right-click to peek at the definition of functions. Why is this useful? Reading code implies trying to figure out what each function is doing. Super useful in projects. Works for variables, classes, functions. You name it. VS-code can define it. -![Seek Definition](assets/vscode5.png) +![Seek Definition](/assets/images/vscode5.png) 3. **Open the file by name**: Ctrl+P, and type file name. 4. **Shortcuts**: I use sublime shortcuts on VS Code. That’s the cool thing. You can configure it to work for your style. How to configure? You can install a sublime text key-bindings plugin. More on plugins later. But this specific one is called: ms-vscode.sublime-keybindings. @@ -217,15 +217,15 @@ Add all custom shortcuts in preferences, keyboard shortcuts. Do ctrl+shift+P and 5. **Integrated terminal**: Click on terminal and open a new terminal. -![Open terminal](assets/vscode2.png) +![Open terminal](/assets/images/vscode2.png) Now you can run programs without rotating between terminal and editor. Reduces a lot of strain on the eyes. You can also create multiple screens in the terminal. 6. **Python debugger**: You can put breakpoints and run python programs and look into the state of the program for faster debugging. Click next to the line number and that should drop a BP. Now start debugging. Choose whichever option makes sense (for trials go for current file). -![Python Breakpoint - 1](assets/vscode10.png) -![Python Breakpoint - 2](assets/vscode8.png) -![Python Breakpoint - 3](assets/vscode3.png) +![Python Breakpoint - 1](/assets/images/vscode10.png) +![Python Breakpoint - 2](/assets/images/vscode8.png) +![Python Breakpoint - 3](/assets/images/vscode3.png) You can step through the lines or move to the next BP or let the program run till the end. @@ -233,7 +233,7 @@ Drawback: Image data cannot be displayed. Spyder offers that option. You cannot 7. **Language support**: What we MRSD people use? It supports all of it. Python, C++, Markdown, JSON, YAML, XML, CMake. How to change? Click on python/whatever there is. -![Language Support](assets/vscode6.png) +![Language Support](/assets/images/vscode6.png) Random thoughts: Spaces to tabs, the right-hand small screen helps find easy chunks of code, terminal focus shortcuts, file explorer shows modified files, tracked/untracked files, squiggles show if invalid syntax, auto-complete, function argument list displays. @@ -241,15 +241,15 @@ Random thoughts: Spaces to tabs, the right-hand small screen helps find easy chu 1. **Git graph**: I think git support is auto existing on baseline VS Code but this just ups it. Why good? -![tracking/modification status](assets/vscode9.png) +![tracking/modification status](/assets/images/vscode9.png) When you do a git rebase/merge, conflicts show up in nice blocks which you can just choose. No more million backspaces to remove code. -![git rebase/merge](assets/vscode12.png) +![git rebase/merge](/assets/images/vscode12.png) If you use it with the integrated terminal, you can just choose a file from the terminal output, choose a block of code to stay, and continue rebasing. -![The graph: click on the git graph button on the bottom toolbar and voila](assets/vscode13.png) +![The graph: click on the git graph button on the bottom toolbar and voila](/assets/images/vscode13.png) 2. **Python**: This covers all the python debugging tools + module search functionality. @@ -549,7 +549,7 @@ whoami # Success!! ## Mitigation of Privilege Escalation -![images/privesc.png](../../assets/images/privesc.png) +![images/privesc.png](/assets/images/privesc.png) ## Exposed Docker Socket @@ -1395,19 +1395,19 @@ This section will guide you to create your first simple Hello-World Qt program 2. Create new project using `File -> New File or Project -> Application -> Qt Widgets Application` - ![](assets/Qtcreator-ros-new-project.png) + ![](/assets/images/Qtcreator-ros-new-project.png) 3. Name your project/application - ![](assets/Qtcreator-ros-new-project-menu.png) + ![](/assets/images/Qtcreator-ros-new-project-menu.png) 4. If you installed correctly, the Kit will be detected automatically, if not this [link](https://stackoverflow.com/questions/26499404/qtcreator-no-valid-kits-found) might be useful - ![](assets/Qtcreator-ros-new-project-kit.png) + ![](/assets/images/Qtcreator-ros-new-project-kit.png) 5. Name your main class. Although this is not the main function, it acts as the entry point of the application - ![](assets/Qtcreator-ros-new-project-class-menu.png) + ![](/assets/images/Qtcreator-ros-new-project-class-menu.png) 6. Select finish @@ -1415,11 +1415,11 @@ This section will guide you to create your first simple Hello-World Qt program 8. Click the green arrow at the bottom left side or use `Ctrl + R` to build and run. You should see a blank application window like this one - ![](assets/Qtcreator-ros-new-project-run.png) + ![](/assets/images/Qtcreator-ros-new-project-run.png) 9. Close the program by clicking on the red cross on the `MainWindow` window. and navigate to the `mainwindow.ui` file under `Forms` on the left menu. It will automatically switch to the `Design` tab and open this UI editor tool - ![](assets/Qtcreator-ros-new-project-design.png) + ![](/assets/images/Qtcreator-ros-new-project-design.png) 10. The left menu is now switched to the basic UI widgets available. You can put them through drag and drop. Try to drag and drop these 4 types of widgets: @@ -1428,15 +1428,15 @@ This section will guide you to create your first simple Hello-World Qt program 3. `Display Widgets -> Label` 4. `Display Widgets -> Text Browser` - ![](assets/Qtcreator-ros-new-project-ui-elements.png) + ![](/assets/images/Qtcreator-ros-new-project-ui-elements.png) 11. Some of the widgets have text that is displayed on them such as the `Label` and `Push Button`, you can double-left-click on them and edit the display text - ![](assets/Qtcreator-ros-new-project-edit-text.png) + ![](/assets/images/Qtcreator-ros-new-project-edit-text.png) 12. On the right menu you should see a summary of all the objects and widgets that you have created. Here we can see the 4 widgets we added. An important distinction here is that the left column is the name of the object (unique entity) and the right column is the class name (not unique). Hence, you can have multiple labels, but these are based on `QLabel` class - ![](assets/Qtcreator-ros-new-project-ui-obj.png) + ![](/assets/images/Qtcreator-ros-new-project-ui-obj.png) 13. To drive the point home, try to rename the objects. It is advisable to give it mear a new message is received. @@ -1650,7 +1650,7 @@ $ pip install PyQt5 This is the final application you can get by following this tutorial. Blocks that require customization will be explained in the documentation. -![Final QT](assets/PyQt-final.png) +![Final QT](/assets/images/PyQt-final.png) ## Application Walkthrough @@ -1669,13 +1669,13 @@ The system level timer captures the time taken between the start and the end of The color change for the timers are as follows: Green Button -![Green Button](assets/PyQt-green.png) +![Green Button](/assets/images/PyQt-green.png) Yellow Button -![Yellow Button](assets/PyQt-yellow.png) +![Yellow Button](/assets/images/PyQt-yellow.png) Orange Button -![Orange Button](assets/PyQt-orange.png) +![Orange Button](/assets/images/PyQt-orange.png) Red Button -![Red Button](assets/PyQt-red.png) +![Red Button](/assets/images/PyQt-red.png) The code block for this is given here: ```python @@ -1700,7 +1700,7 @@ The task level timer captures the time taken between the start and the end of on One additional feature of the task level timer is it saves the task logs. These are outputted in the `Task Times` block that is directly below the button. -![Red Button](assets/PyQt-logs.png) +![Red Button](/assets/images/PyQt-logs.png) ``` def TaskTimerBlock(self): diff --git a/wiki/tools/altium-circuitmaker.md b/wiki/tools/altium-circuitmaker.md index cbae357b..593b809c 100644 --- a/wiki/tools/altium-circuitmaker.md +++ b/wiki/tools/altium-circuitmaker.md @@ -9,20 +9,20 @@ Altium Circuitmaker is a Community Driven PCB Design Application. Circuitmaker c 1. Cloud based part library drawn from the Octopart database - Users can search keywords to find a matching part in the Octopart database. The ones that show up first are the ones that are immediately ready to be used in Circuitmaker. - If you need something that isn't made yet, building the part is not difficult and users can import existing symbols and footprints to make it easier. It even includes a list of where you can buy parts and prices. However, it tries to open web pages in the UI -- this is slow, inefficient. - - ![Library Menu](assets/AltiumCircuitmaker-8aecd.png) + - ![Library Menu](/assets/images/AltiumCircuitmaker-8aecd.png) 2. Friendlier UI - This is strictly a comparison to EagleCAD. Eagle's UI is a more involved style, which lets the user get deeper into things, but is also not nearly as easy for the casual or new user, or for someone in a hurry. - There are also some common sense updates that likely haven't happened because Eagle is more interested in improving functionality than usability. For example, double clicking things in Circuitmaker opens property windows so you can adjust lengths, widths, names, etc. - Circuitmaker also displays part purchasing information if you hover over them (though this is still buggy and may require multiple attempts). - - ![Buying Tooltip](assets/AltiumCircuitmaker-3f756.png) + - ![Buying Tooltip](/assets/images/AltiumCircuitmaker-3f756.png) - There are also more keyboard shortcuts that can be used during actions like placing and wiring, as well as naming nets to make it easier in routing. Even making new library entries is simple since you can almost always find a symbol that matches and usually a footprint that is either close or the same form factor as your part. - - ![Part Info Window](assets/AltiumCircuitmaker-78555.png) + - ![Part Info Window](/assets/images/AltiumCircuitmaker-78555.png) 3. Can output STEP files and view the part in 3D in Circuitmaker - This feature allows users to see parts in 3D while they were placed on the board. This has the added benefits of identifying items placed in the wrong direction and getting a feel for sizes. However, not all parts have a 3D model and they're a bit harder to find currently in the 'existing parts' library. Making a new 3D view is harder than drawing symbols and footprints. That said, when there is a model, it's helpful to have. Additionally, you can output your board to a STEP file and put it in your Solidworks model. This allows users to see where you want to place the board on the assembly. - - ![3D View](assets/AltiumCircuitmaker-fcf01.png) + - ![3D View](/assets/images/AltiumCircuitmaker-fcf01.png) 4. The autorouter appears somewhat smarter - Partially due to the easier UI, it also feels like it takes it less time and effort to find a good path. You can make multiple profiles of routing schemes and widths, and choose to route only one net at a time. However, by putting in multiple width rules that each cover a single net, you can autoroute every net at once at the correct width. - - ![Rule Menu](assets/AltiumCircuitmaker-4b425.png) + - ![Rule Menu](/assets/images/AltiumCircuitmaker-4b425.png) 5. Collaborative cloud based development method - Teams can build their system without all being on the same computer doing it. Other teams can comment on things on the schematic if they want. This allows teams to edit and fork PCB designs rather than trying to put it all through one person (or trying to contribute separate files). Commenting on schematics is another distinct advantage. 6. Outputs include an excel BOM @@ -33,17 +33,17 @@ Altium Circuitmaker is a Community Driven PCB Design Application. Circuitmaker c ### Drawbacks 1. No preloaded set of common drill sizes - Users have to have a chart of sizes handy to avoid inputting a diameter that doesn't exist. This is a minor but surprising oversight given that common drill sizes should be an easy thing to include in a dropdown. It may be because there is no actual 'drill' button, just an option to place a generic 'pad' which shows up as a through hole like all the others, but without being attached to a larger part. As you can see, there are a lot of options, but it doesn't have a dropdown for standard drills. - - ![Hole Menu](assets/AltiumCircuitmaker-f5782.png) + - ![Hole Menu](/assets/images/AltiumCircuitmaker-f5782.png) 2. No board outline by default - Users have to draw an outline on a different layer. Some companies don't like keepout layers, so users may put it both there and on the silkscreen layer. 3. Poor default wiring options - If users don't put the elbow in the right place, they will end up with your net spanning every pin on one side of a part. On the other hand, there are lots of keyboard shortcuts for changing wiring routes. You can even place wire at different angles. 4. Copper Pours are not intelligent - Copper pours automatically make cutouts even for traces on their defined net. This only happens at first pour or when you 'repour' to fix problems. However, if a repour is necessary then you have to fix the cutouts manually. If found a rule to change the way it connects to pins inside the plane that are on its target net, but not for traces. If users play with that rule, they might figure it out, but that's the status right now. - - ![Pour Plane Cutout](assets/AltiumCircuitmaker-e83b9.png) + - ![Pour Plane Cutout](/assets/images/AltiumCircuitmaker-e83b9.png) 5. Some UI still obviously in need of tweaking - It seems to be quite stable now, but there are key features and UI windows that need to be made more friendly. The worst is the library search box. The screenshot in the library UI section is the full screen version, and usually it's best used as a sidebar. - - ![Library Side Menu](assets/AltiumCircuitmaker-1caa4.png) + - ![Library Side Menu](/assets/images/AltiumCircuitmaker-1caa4.png) - It needs to be laid out better so that it can fit more into the window. I think eliminating the pricing and editions segments might help, or turning it into two columns. Either way, this is a minor nuisance compared to having to make your own library or hunt around for ones that already exist. ### Summary diff --git a/wiki/tools/clion.md b/wiki/tools/clion.md index d4cdfda0..40c1ae23 100644 --- a/wiki/tools/clion.md +++ b/wiki/tools/clion.md @@ -41,15 +41,15 @@ Like any other IDE, CLion has countless features. These can also be extended by #### Debugging -![CLion Debugging 1](assets/debug1.jpeg) +![CLion Debugging 1](/assets/images/debug1.jpeg) After opening the project folder in CLion, right-click on the `CMakeLists.txt` and choose Reload CMake Project. The various executable target added in the CMake file will be available in the drop-down menu at the top right as shown in the above image. -![CLion Debug 2](assets/debug2.jpeg) +![CLion Debug 2](/assets/images/debug2.jpeg) Add the breakpoint in the code where you want to pause the code and press the debug button as shown in the image. -![CLion Debug 3](assets/debug3.jpeg) +![CLion Debug 3](/assets/images/debug3.jpeg) CLion will pause the execution at the breakpoint. You can view all the global, local variables and their values in the variable inspector. It also provides the functionality to run the code line by line by using various step in, step over, step out function. You can also press the resume button to continue execution till the next break-point. You can add new breakpoints even when code is paused at a breakpoint. @@ -57,7 +57,7 @@ CLion will pause the execution at the breakpoint. You can view all the global, l Refactoring is one of the most powerful tools in the CLion. Simplest re-factor operation is renaming a variable. -![Refactor 1](assets/refactor1.png) +![Refactor 1](/assets/images/refactor1.png) While simple text-editor can do find and replace, it is not context-aware. CLion re-factor is context-aware meaning renaming of the variable will only happen inside the scope of that variable. To rename variable using refactor select the variable: @@ -68,7 +68,7 @@ A more useful refactoring tool is to extract the method or extract the function `right-click -> Refactor -> Extract -> Method` -![Refactor 2](assets/refactor2.jpeg) +![Refactor 2](/assets/images/refactor2.jpeg) Refactor will analyze the selected text and identify the variables that need to be passed to the new function. It will show those variables in the GUI form as shown in the above image. Will GUI interface, user can add, rename, delete variables that are being passed as well change the name of the function. After verifying the function signature, the user can press the `Extract` button. It will cut the code from the original place and will put it inside a new function along with all the necessary changes in the header file to add that function/method. @@ -84,7 +84,7 @@ Entity linking is very useful in efficiently navigating code-base in CLion. The Entity linking works to the imported library as well. If you have imported some C++ library and want to check the source code inside the library, just use entity linking. It will open the source code of the library if it's available. For example, in the below image, definition of `std::vector::push_back()` is opened using entity linking of CLion. -![Refactor 3](assets/refactor3.png) +![Refactor 3](/assets/images/refactor3.png) #### Context-Aware Search @@ -92,7 +92,7 @@ Given a function or a variable, all its usage inside the code can also be search `right-click -> Find Usages` -![Refactor 4](assets/refactor4.png) +![Refactor 4](/assets/images/refactor4.png) Above image shows the various usages CLion found of the private variable `costMap` inside the repository. diff --git a/wiki/tools/code-editors-introduction-to-vs-code-and-vim.md b/wiki/tools/code-editors-introduction-to-vs-code-and-vim.md index db83ca83..72fe0133 100644 --- a/wiki/tools/code-editors-introduction-to-vs-code-and-vim.md +++ b/wiki/tools/code-editors-introduction-to-vs-code-and-vim.md @@ -51,16 +51,16 @@ A link for [downloading](https://code.visualstudio.com/download). 2. Open VS Code (can use the Linux search/windows button). Source folders into the workspace. 3. The top left tab gives you file explorer. Click it! -![File Explorer](assets/vscode4.png) +![File Explorer](/assets/images/vscode4.png) #### Features 1. **Keyword search**: Right-click inside the file explorer space. Check out “Find in Folder..” and try searching for a keyword and you’d see lightning fast multi-file search (or) click on the search button below the explorer and use the find and replace options. -![Keyword Search](assets/vscode11.png) +![Keyword Search](/assets/images/vscode11.png) 2. **Seek definition**: Open any file and right-click to peek at the definition of functions. Why is this useful? Reading code implies trying to figure out what each function is doing. Super useful in projects. Works for variables, classes, functions. You name it. VS-code can define it. -![Seek Definition](assets/vscode5.png) +![Seek Definition](/assets/images/vscode5.png) 3. **Open the file by name**: Ctrl+P, and type file name. 4. **Shortcuts**: I use sublime shortcuts on VS Code. That’s the cool thing. You can configure it to work for your style. How to configure? You can install a sublime text key-bindings plugin. More on plugins later. But this specific one is called: ms-vscode.sublime-keybindings. @@ -76,15 +76,15 @@ Add all custom shortcuts in preferences, keyboard shortcuts. Do ctrl+shift+P and 5. **Integrated terminal**: Click on terminal and open a new terminal. -![Open terminal](assets/vscode2.png) +![Open terminal](/assets/images/vscode2.png) Now you can run programs without rotating between terminal and editor. Reduces a lot of strain on the eyes. You can also create multiple screens in the terminal. 6. **Python debugger**: You can put breakpoints and run python programs and look into the state of the program for faster debugging. Click next to the line number and that should drop a BP. Now start debugging. Choose whichever option makes sense (for trials go for current file). -![Python Breakpoint - 1](assets/vscode10.png) -![Python Breakpoint - 2](assets/vscode8.png) -![Python Breakpoint - 3](assets/vscode3.png) +![Python Breakpoint - 1](/assets/images/vscode10.png) +![Python Breakpoint - 2](/assets/images/vscode8.png) +![Python Breakpoint - 3](/assets/images/vscode3.png) You can step through the lines or move to the next BP or let the program run till the end. @@ -92,7 +92,7 @@ Drawback: Image data cannot be displayed. Spyder offers that option. You cannot 7. **Language support**: What we MRSD people use? It supports all of it. Python, C++, Markdown, JSON, YAML, XML, CMake. How to change? Click on python/whatever there is. -![Language Support](assets/vscode6.png) +![Language Support](/assets/images/vscode6.png) Random thoughts: Spaces to tabs, the right-hand small screen helps find easy chunks of code, terminal focus shortcuts, file explorer shows modified files, tracked/untracked files, squiggles show if invalid syntax, auto-complete, function argument list displays. @@ -100,15 +100,15 @@ Random thoughts: Spaces to tabs, the right-hand small screen helps find easy chu 1. **Git graph**: I think git support is auto existing on baseline VS Code but this just ups it. Why good? -![tracking/modification status](assets/vscode9.png) +![tracking/modification status](/assets/images/vscode9.png) When you do a git rebase/merge, conflicts show up in nice blocks which you can just choose. No more million backspaces to remove code. -![git rebase/merge](assets/vscode12.png) +![git rebase/merge](/assets/images/vscode12.png) If you use it with the integrated terminal, you can just choose a file from the terminal output, choose a block of code to stay, and continue rebasing. -![The graph: click on the git graph button on the bottom toolbar and voila](assets/vscode13.png) +![The graph: click on the git graph button on the bottom toolbar and voila](/assets/images/vscode13.png) 2. **Python**: This covers all the python debugging tools + module search functionality. diff --git a/wiki/tools/docker-security.md b/wiki/tools/docker-security.md index 0c723d81..1204c066 100644 --- a/wiki/tools/docker-security.md +++ b/wiki/tools/docker-security.md @@ -88,7 +88,7 @@ whoami # Success!! ## Mitigation of Privilege Escalation -![images/privesc.png](../../assets/images/privesc.png) +![images/privesc.png](/assets/images/privesc.png) ## Exposed Docker Socket diff --git a/wiki/tools/ros-gui.md b/wiki/tools/ros-gui.md index 8bcf77f0..7dd99ad1 100644 --- a/wiki/tools/ros-gui.md +++ b/wiki/tools/ros-gui.md @@ -32,7 +32,7 @@ $ pip install PyQt5 This is the final application you can get by following this tutorial. Blocks that require customization will be explained in the documentation. -![Final QT](assets/PyQt-final.png) +![Final QT](/assets/images/PyQt-final.png) ## Application Walkthrough @@ -51,13 +51,13 @@ The system level timer captures the time taken between the start and the end of The color change for the timers are as follows: Green Button -![Green Button](assets/PyQt-green.png) +![Green Button](/assets/images/PyQt-green.png) Yellow Button -![Yellow Button](assets/PyQt-yellow.png) +![Yellow Button](/assets/images/PyQt-yellow.png) Orange Button -![Orange Button](assets/PyQt-orange.png) +![Orange Button](/assets/images/PyQt-orange.png) Red Button -![Red Button](assets/PyQt-red.png) +![Red Button](/assets/images/PyQt-red.png) The code block for this is given here: ```python @@ -82,7 +82,7 @@ The task level timer captures the time taken between the start and the end of on One additional feature of the task level timer is it saves the task logs. These are outputted in the `Task Times` block that is directly below the button. -![Red Button](assets/PyQt-logs.png) +![Red Button](/assets/images/PyQt-logs.png) ``` def TaskTimerBlock(self): From 93e8c78a02f8cf78cc30090ef6f60b564d07aaa8 Mon Sep 17 00:00:00 2001 From: Nevin Valsaraj Date: Tue, 10 Mar 2026 23:49:01 -0700 Subject: [PATCH 2/6] docs(wiki): fix remaining image and asset paths across all articles --- ...e-Pursuit-Controller-for-Skid-Steering-Robot.md | 2 +- wiki/actuation/__all_subsections.md | 6 +++--- wiki/actuation/moveit-and-HEBI-integration.md | 2 +- .../vedder-electronic-speed-controller.md | 2 +- wiki/common-platforms/ros/ros-cost-maps.md | 8 ++++---- wiki/common-platforms/ros/ros-navigation.md | 6 +++--- wiki/computing/__all_subsections.md | 4 ++-- wiki/computing/setup-gpus-for-computer-vision.md | 4 ++-- wiki/fabrication/__all_subsections.md | 4 ++-- wiki/fabrication/makerbot-replicator-2x.md | 2 +- wiki/fabrication/series-A-pro.md | 2 +- wiki/machine-learning/__all_subsections.md | 8 ++++---- .../machine-learning/mediapipe-live-ml-anywhere.md | 4 ++-- wiki/machine-learning/yolov5-tensorrt.md | 4 ++-- wiki/networking/__all_subsections.md | 2 +- wiki/networking/ros-distributed.md | 2 +- wiki/planning/__all_subsections.md | 14 +++++++------- wiki/planning/frenet-frame-planning.md | 2 +- wiki/planning/planning-overview.md | 12 ++++++------ wiki/project-management/__all_subsections.md | 2 +- wiki/project-management/index.md | 2 +- wiki/project-management/risk-management.md | 2 +- wiki/sensing/___all_subsections.md | 4 ++-- .../sensing/trajectory_extraction_static_camera.md | 2 +- wiki/simulation/NDT-Matching-with-Autoware.md | 4 ++-- wiki/simulation/__all_subsections.md | 4 ++-- .../Cartographer-ROS-Integration.md | 8 ++++---- wiki/state-estimation/__all_subsections.md | 8 ++++---- wiki/tools/__all_subsections.md | 6 +++--- wiki/tools/rosbags-matlab.md | 2 +- wiki/tools/roslibjs.md | 3 +-- 31 files changed, 68 insertions(+), 69 deletions(-) diff --git a/wiki/actuation/Pure-Pursuit-Controller-for-Skid-Steering-Robot.md b/wiki/actuation/Pure-Pursuit-Controller-for-Skid-Steering-Robot.md index 3c6b7394..85dee2c1 100644 --- a/wiki/actuation/Pure-Pursuit-Controller-for-Skid-Steering-Robot.md +++ b/wiki/actuation/Pure-Pursuit-Controller-for-Skid-Steering-Robot.md @@ -25,7 +25,7 @@ This goal position keeps on changing and is a point on the trajectory to be foll The following image explains the concept of lookahead distance and the arc to follow. -![Geometry of Pure Pursuit Algorithm [1]](assets/images/pure_pursuit_geometry.png) +![Geometry of Pure Pursuit Algorithm [1]](/assets/images/pure_pursuit_geometry.png) In the image above, we see that given a point at a particular location from the robot say at location (x,y) in the robot's frame (the frame fixed on the robot). The point is at a distance l from the current location of the robot. Using a geometrical derivation, we can derive the radius of curvature of this arc as - diff --git a/wiki/actuation/__all_subsections.md b/wiki/actuation/__all_subsections.md index 99b4b892..3a95d8fb 100644 --- a/wiki/actuation/__all_subsections.md +++ b/wiki/actuation/__all_subsections.md @@ -500,7 +500,7 @@ rosrun moveit_setup_assistant setup_assistant.launch From here, you will be launched into a MoveIt setup assistant menu, as shown below: -![moveit_setup_assistant_start[(assets/moveit_setup_assistant_start.png) +![moveit_setup_assistant_start](/assets/images/moveit_setup_assistant_start.png) Select “Create New MoveIt Configuration Package” then select the URDF model file created earlier. Select “Load Files” to load the URDF file. @@ -737,7 +737,7 @@ This goal position keeps on changing and is a point on the trajectory to be foll The following image explains the concept of lookahead distance and the arc to follow. -![Geometry of Pure Pursuit Algorithm [1]](assets/images/pure_pursuit_geometry.png) +![Geometry of Pure Pursuit Algorithm [1]](/assets/images/pure_pursuit_geometry.png) In the image above, we see that given a point at a particular location from the robot say at location (x,y) in the robot's frame (the frame fixed on the robot). The point is at a distance l from the current location of the robot. Using a geometrical derivation, we can derive the radius of curvature of this arc as - @@ -1074,4 +1074,4 @@ The main webpage of the Vedder Esc project is [found here](http://vedder.se/2015 The speed controller can be built from scratch, but it is far more time-effective to purchase a model from a supplier. These can be purchased for between $80 - $150 with various design modifications. A proven model is the VESC-X from Enertion. Despite being an Australian company, the controllers are produced and distributed in the US with a 3-5 day lead time. There is a quantity discount for 4+ controllers and if you place the controllers in your cart after registering and wait a bit, you'll get a 10% off coupon code by e-mail. The current code as of 3/5/2017 was *"pushingsucks".* ## Sample Arduino Code -The [code in this zip file](assets/DriveCharacterization.zip) interfaces an Arduino Mega 2560 to a VESC-X over serial. The sketch runs an open loop characterization routine that drives the motor in each direction. Motor braking is applied when a duty cycle command is set to 0. Motor freewheeling occurs when a current command is set to 0. +The [code in this zip file](/wiki/actuation/assets/DriveCharacterization.zip) interfaces an Arduino Mega 2560 to a VESC-X over serial. The sketch runs an open loop characterization routine that drives the motor in each direction. Motor braking is applied when a duty cycle command is set to 0. Motor freewheeling occurs when a current command is set to 0. diff --git a/wiki/actuation/moveit-and-HEBI-integration.md b/wiki/actuation/moveit-and-HEBI-integration.md index f2d6977a..61ea777d 100644 --- a/wiki/actuation/moveit-and-HEBI-integration.md +++ b/wiki/actuation/moveit-and-HEBI-integration.md @@ -58,7 +58,7 @@ rosrun moveit_setup_assistant setup_assistant.launch From here, you will be launched into a MoveIt setup assistant menu, as shown below: -![moveit_setup_assistant_start[(assets/moveit_setup_assistant_start.png) +![moveit_setup_assistant_start](/assets/images/moveit_setup_assistant_start.png) Select “Create New MoveIt Configuration Package” then select the URDF model file created earlier. Select “Load Files” to load the URDF file. diff --git a/wiki/actuation/vedder-electronic-speed-controller.md b/wiki/actuation/vedder-electronic-speed-controller.md index 2752c786..c9905e9a 100644 --- a/wiki/actuation/vedder-electronic-speed-controller.md +++ b/wiki/actuation/vedder-electronic-speed-controller.md @@ -34,4 +34,4 @@ The main webpage of the Vedder Esc project is [found here](http://vedder.se/2015 The speed controller can be built from scratch, but it is far more time-effective to purchase a model from a supplier. These can be purchased for between $80 - $150 with various design modifications. A proven model is the VESC-X from Enertion. Despite being an Australian company, the controllers are produced and distributed in the US with a 3-5 day lead time. There is a quantity discount for 4+ controllers and if you place the controllers in your cart after registering and wait a bit, you'll get a 10% off coupon code by e-mail. The current code as of 3/5/2017 was *"pushingsucks".* ## Sample Arduino Code -The [code in this zip file](assets/DriveCharacterization.zip) interfaces an Arduino Mega 2560 to a VESC-X over serial. The sketch runs an open loop characterization routine that drives the motor in each direction. Motor braking is applied when a duty cycle command is set to 0. Motor freewheeling occurs when a current command is set to 0. +The [code in this zip file](/wiki/actuation/assets/DriveCharacterization.zip) interfaces an Arduino Mega 2560 to a VESC-X over serial. The sketch runs an open loop characterization routine that drives the motor in each direction. Motor braking is applied when a duty cycle command is set to 0. Motor freewheeling occurs when a current command is set to 0. diff --git a/wiki/common-platforms/ros/ros-cost-maps.md b/wiki/common-platforms/ros/ros-cost-maps.md index 75347551..6a793a24 100644 --- a/wiki/common-platforms/ros/ros-cost-maps.md +++ b/wiki/common-platforms/ros/ros-cost-maps.md @@ -74,10 +74,10 @@ The following tutorial uses a Quadrotor with RGB-D Sensor as the base platform. Here is the setup: Quadrotor (`base_link`): [3DR Iris+](https://store.3dr.com/products/IRIS) -![3DR Iris+](assets/ROSCostMaps-90ce8.png) +![3DR Iris+](/assets/images/ROSCostMaps-90ce8.png) Depth Sensor (`camera_link`): [Xtion Pro Live](https://www.asus.com/us/3D-Sensor/Xtion_PRO_LIVE/) -![Xtion Pro Live](assets/ROSCostMaps-fad65.png) +![Xtion Pro Live](/assets/images/ROSCostMaps-fad65.png) ### Setup of the camera @@ -162,7 +162,7 @@ The source code for MAVROS, which will be similar to the folder you will find by You will want to find the file named `px4_config.yaml` or `apm_config.yaml` depending on which of the flight controller firmware you are running. If you are running the PX4 firmware, you are going to want to open `px4_config.yaml` and find this section: -![Code Snippet](assets/ROSCostMaps-2dba7.png) +![Code Snippet](/assets/images/ROSCostMaps-2dba7.png) Once you find it, you will want to change: @@ -253,7 +253,7 @@ Our setup can be run by issuing the following commands in separate terminals or ### Output The output of the costmap is shown here. -![CostMap Output](assets/ROSCostMaps-8c746.png) +![CostMap Output](/assets/images/ROSCostMaps-8c746.png) ## Communications with PIXHAWK diff --git a/wiki/common-platforms/ros/ros-navigation.md b/wiki/common-platforms/ros/ros-navigation.md index d00bd8fa..47353b4c 100644 --- a/wiki/common-platforms/ros/ros-navigation.md +++ b/wiki/common-platforms/ros/ros-navigation.md @@ -31,11 +31,11 @@ This will generate a file 'frames.pdf' in the current directory which will conta ### Debugging example An example tf tree with a robot setup with a laser scanner that uses hector mapping for scan matching and visual odometry is shown in the figure below. -![Example TF Tree with Laser Scanner](assets/ROSNavigation-d06e2.png) +![Example TF Tree with Laser Scanner](/assets/images/ROSNavigation-d06e2.png) If someone is expecting their robot to navigate with the above tf configuration, they will have a hard time seeing anything move. As you can guess from the above coordinate transform tree, the tf tree is not complete. The path planner will be happy with the above configuration because it can get the laser scan matching at /laser with respect to the world coordinate frame but the robot base will not be able to command the wheel actuators. The error can be fixed by adding the transform between the world coordinate frame and the wheel odometry frame of the robot and the resulting tf tree is shown below: -![Correct TF Tree with Laser Scanner](assets/ROSNavigation-7d9d1.png) +![Correct TF Tree with Laser Scanner](/assets/images/ROSNavigation-7d9d1.png) Other useful tf tools for debugging are `tf_echo` and `tf_monitor` @@ -71,7 +71,7 @@ If you have tried at least once to look at the navigation stack in ROS, you must 4. Robot_Localization: - When to use this? - Use this when `robot_pose_ekf` is not enough for your robot! This package offers all the goodness of robot_pose_ekf and more. It provides non-linear state estimation using the Extended Kalman Filter (EKF) and the Unscented Kalman Filter (UKF) to fuse information from arbitrary number of sensors. It also provides `navsat_transform_node` which helps in integrating GPS data (fixes) for the robot's localization. The following picture from the Wiki is informative: -![Robot_Localization Diagram](assets/ROSNavigation-72039.png) +![Robot_Localization Diagram](/assets/images/ROSNavigation-72039.png) - What does it require? - It requires `/odometry/filtered` topic of type `nav_msgs/Odometry`, `/imu/data` topic of type `sensor_msgs/Imu` and the `/gps/fix` topic of type `sensor_msgs/NavSatFix` diff --git a/wiki/computing/__all_subsections.md b/wiki/computing/__all_subsections.md index 20205634..5185c9f8 100644 --- a/wiki/computing/__all_subsections.md +++ b/wiki/computing/__all_subsections.md @@ -285,7 +285,7 @@ Download the CUDA driver from the [official nvidia website here](https://develop *At the time of writing this document, the latest stable version is CUDA 10.0*. -![](https://roboticsknowledgebase.com/wiki/computing/assets/nvidia-cuda.png) +![](/assets/images/nvidia-cuda.png) After downloading the file, go to the folder where you have downloaded the file and run the following commands from the terminal to install the CUDA drivers. Please make sure that the filename used in the command below is the same as the downloaded file and replace the `` number. @@ -314,7 +314,7 @@ Go to official cuDNN website [official cuDNN website](https://developer.nvidia.c **Make sure you download the correct cuDNN version which matches with you CUDA version.** -![](https://roboticsknowledgebase.com/wiki/computing/assets/nvidia-cudnn.png) +![](/assets/images/nvidia-cudnn.png) ### Installing from TAR file (Recommended Method) For cuDNN downloaded using _cuDNN Library for Linux_ method, go to the folder where you have downloaded the “.tgz” file and from the command line execute the following (update the filename). diff --git a/wiki/computing/setup-gpus-for-computer-vision.md b/wiki/computing/setup-gpus-for-computer-vision.md index 381be0ad..f4e0f61c 100644 --- a/wiki/computing/setup-gpus-for-computer-vision.md +++ b/wiki/computing/setup-gpus-for-computer-vision.md @@ -94,7 +94,7 @@ Download the CUDA driver from the [official nvidia website here](https://develop *At the time of writing this document, the latest stable version is CUDA 10.0*. -![](https://roboticsknowledgebase.com/wiki/computing/assets/nvidia-cuda.png) +![](/assets/images/nvidia-cuda.png) After downloading the file, go to the folder where you have downloaded the file and run the following commands from the terminal to install the CUDA drivers. Please make sure that the filename used in the command below is the same as the downloaded file and replace the `` number. @@ -123,7 +123,7 @@ Go to official cuDNN website [official cuDNN website](https://developer.nvidia.c **Make sure you download the correct cuDNN version which matches with you CUDA version.** -![](https://roboticsknowledgebase.com/wiki/computing/assets/nvidia-cudnn.png) +![](/assets/images/nvidia-cudnn.png) ### Installing from TAR file (Recommended Method) For cuDNN downloaded using _cuDNN Library for Linux_ method, go to the folder where you have downloaded the “.tgz” file and from the command line execute the following (update the filename). diff --git a/wiki/fabrication/__all_subsections.md b/wiki/fabrication/__all_subsections.md index 764accd3..158bef3d 100644 --- a/wiki/fabrication/__all_subsections.md +++ b/wiki/fabrication/__all_subsections.md @@ -337,7 +337,7 @@ This is a good starting points for anyone looking to convert files from their So ### Space Jockey Custom Profile This is 2013-14 Team B's Makerbot slicer profile designed for faster, stronger parts (faster infill, 3 shells), with the temperature settings already tweaked for the MRSD MakerBot. Download and unzip to User/My Things/Profiles, and then select "Space Jockey Hull Parts" in your print settings in Makerware. -[Download Space_Jockey_Profile.zip](assets/Space_Jockey_Profile.zip) +[Download Space_Jockey_Profile.zip](/wiki/fabrication/assets/Space_Jockey_Profile.zip) ## Issues Log 1. **Issue:** Large objects would start peeling off the left side of the plate. @@ -434,7 +434,7 @@ The Series A Pro printer generally uses PLA (as opposed to ABS). PLA requires ve ### Print Profiles The standard profile is a good compromise between speed and print quality for PLA on the Series A Pro. -[Download SeriesA_Standard_Profile.zip](assets/SeriesA_Standard_Profile.zip) +[Download SeriesA_Standard_Profile.zip](/wiki/fabrication/assets/SeriesA_Standard_Profile.zip) ![Print Quality of Standard Profile](/assets/images/SeriesA_PLA_SP.jpg) ## Tips diff --git a/wiki/fabrication/makerbot-replicator-2x.md b/wiki/fabrication/makerbot-replicator-2x.md index 077f21d4..e8d372f5 100644 --- a/wiki/fabrication/makerbot-replicator-2x.md +++ b/wiki/fabrication/makerbot-replicator-2x.md @@ -34,7 +34,7 @@ This is a good starting points for anyone looking to convert files from their So ### Space Jockey Custom Profile This is 2013-14 Team B's Makerbot slicer profile designed for faster, stronger parts (faster infill, 3 shells), with the temperature settings already tweaked for the MRSD MakerBot. Download and unzip to User/My Things/Profiles, and then select "Space Jockey Hull Parts" in your print settings in Makerware. -[Download Space_Jockey_Profile.zip](assets/Space_Jockey_Profile.zip) +[Download Space_Jockey_Profile.zip](/wiki/fabrication/assets/Space_Jockey_Profile.zip) ## Issues Log 1. **Issue:** Large objects would start peeling off the left side of the plate. diff --git a/wiki/fabrication/series-A-pro.md b/wiki/fabrication/series-A-pro.md index ca78e247..a1b41568 100644 --- a/wiki/fabrication/series-A-pro.md +++ b/wiki/fabrication/series-A-pro.md @@ -31,7 +31,7 @@ The Series A Pro printer generally uses PLA (as opposed to ABS). PLA requires ve ### Print Profiles The standard profile is a good compromise between speed and print quality for PLA on the Series A Pro. -[Download SeriesA_Standard_Profile.zip](assets/SeriesA_Standard_Profile.zip) +[Download SeriesA_Standard_Profile.zip](/wiki/fabrication/assets/SeriesA_Standard_Profile.zip) ![Print Quality of Standard Profile](/assets/images/SeriesA_PLA_SP.jpg) ## Tips diff --git a/wiki/machine-learning/__all_subsections.md b/wiki/machine-learning/__all_subsections.md index e5f6f40b..3484085e 100644 --- a/wiki/machine-learning/__all_subsections.md +++ b/wiki/machine-learning/__all_subsections.md @@ -201,7 +201,7 @@ MediaPipe offers cross-platform, customizable ML solutions for live and streamin ## Solutions offered -![Figure 1. Mediapipe Solutions](../assets/mediapipe_solutions.png) +![Figure 1. Mediapipe Solutions](/assets/images/mediapipe_solutions.png) The image above summarizes the solutions offered by mediapipe. The solutions below have been classified into 2 categories based on the use cases: @@ -241,7 +241,7 @@ MediaPipe Objectron is a mobile real-time 3D object detection solution for every MediaPipe KNIFT is a template-based feature matching solution using KNIFT (Keypoint Neural Invariant Feature Transform). KNIFT is a strong feature descriptor robust not only to affine distortions, but to some degree of perspective distortions as well. This can be a crucial building block to establish reliable correspondences between different views of an object or scene, forming the foundation for approaches like template matching, image retrieval and structure from motion. The table below describes the support of the above models for currently available platforms: -![Figure 1. Mediapipe supported platforms](../assets/mediapipe_platforms.png) +![Figure 1. Mediapipe supported platforms](/assets/images/mediapipe_platforms.png) ## Quickstart Guide Mediapipe solutions are available for various platforms viz. Android, iOS, Python, JavaScript, C++. The guide at [Getting Started](https://google.github.io/mediapipe/getting_started/getting_started.html) comprises instructions for various platforms. @@ -1209,9 +1209,9 @@ After training is finished, the training script will save the model weights to a YOLOv5's official repository provides an exporting script, and to simplify the post-processing steps, please checkout a newer commit, eg. “070af88108e5675358fd783aae9d91e927717322”. At the root folder of the repository, run `python export.py --weights WEIGHT_PATH/WEIGHT_FILE_NAME.pt --img IMAGE_LENGTH --batch-size 1 --device cpu --include onnx --simplify --opset 11`. There’ll be a .onnx file generated next to the .pt file, and [netron](https://netron.app/) provides a tool to easily visualize and verify the onnx file. For example, if the image size is 416x416, the model is YOLOv5s and the class number is 2, you should see the following input and output structures: -![Figure 1. YOLOv5 onnx visualization (the input part)](../assets/yolov5_onnx_input.png) +![Figure 1. YOLOv5 onnx visualization (the input part)](/assets/images/yolov5_onnx_input.png) -![Figure 2. YOLOv5 onnx visualization (the output part)](../assets/yolov5_onnx_output.png) +![Figure 2. YOLOv5 onnx visualization (the output part)](/assets/images/yolov5_onnx_output.png) After moving the .onnx file to your Jetson, run `trtexec --onnx=ONNX_FILE.onnx --workspace=4096 --saveEngine=ENGINE_NAME.engine --verbose` to obtain the final TensorRT engine file. The 4096 is the upper bound of the memory usage and should be adapted according to the platform. Besides, if there’s no trtexec command while TensorRT was installed, add `export PATH=$PATH:/usr/src/tensorrt/bin` to your `~/.bashrc` or `~/.zshrc`, depending on your default shell. diff --git a/wiki/machine-learning/mediapipe-live-ml-anywhere.md b/wiki/machine-learning/mediapipe-live-ml-anywhere.md index 42fd1fa5..413ab758 100644 --- a/wiki/machine-learning/mediapipe-live-ml-anywhere.md +++ b/wiki/machine-learning/mediapipe-live-ml-anywhere.md @@ -16,7 +16,7 @@ MediaPipe offers cross-platform, customizable ML solutions for live and streamin ## Solutions offered -![Figure 1. Mediapipe Solutions](../assets/mediapipe_solutions.png) +![Figure 1. Mediapipe Solutions](/assets/images/mediapipe_solutions.png) The image above summarizes the solutions offered by mediapipe. The solutions below have been classified into 2 categories based on the use cases: @@ -56,7 +56,7 @@ MediaPipe Objectron is a mobile real-time 3D object detection solution for every MediaPipe KNIFT is a template-based feature matching solution using KNIFT (Keypoint Neural Invariant Feature Transform). KNIFT is a strong feature descriptor robust not only to affine distortions, but to some degree of perspective distortions as well. This can be a crucial building block to establish reliable correspondences between different views of an object or scene, forming the foundation for approaches like template matching, image retrieval and structure from motion. The table below describes the support of the above models for currently available platforms: -![Figure 1. Mediapipe supported platforms](../assets/mediapipe_platforms.png) +![Figure 1. Mediapipe supported platforms](/assets/images/mediapipe_platforms.png) ## Quickstart Guide Mediapipe solutions are available for various platforms viz. Android, iOS, Python, JavaScript, C++. The guide at [Getting Started](https://google.github.io/mediapipe/getting_started/getting_started.html) comprises instructions for various platforms. diff --git a/wiki/machine-learning/yolov5-tensorrt.md b/wiki/machine-learning/yolov5-tensorrt.md index 33a28589..746c7d22 100644 --- a/wiki/machine-learning/yolov5-tensorrt.md +++ b/wiki/machine-learning/yolov5-tensorrt.md @@ -34,9 +34,9 @@ After training is finished, the training script will save the model weights to a YOLOv5's official repository provides an exporting script, and to simplify the post-processing steps, please checkout a newer commit, eg. “070af88108e5675358fd783aae9d91e927717322”. At the root folder of the repository, run `python export.py --weights WEIGHT_PATH/WEIGHT_FILE_NAME.pt --img IMAGE_LENGTH --batch-size 1 --device cpu --include onnx --simplify --opset 11`. There’ll be a .onnx file generated next to the .pt file, and [netron](https://netron.app/) provides a tool to easily visualize and verify the onnx file. For example, if the image size is 416x416, the model is YOLOv5s and the class number is 2, you should see the following input and output structures: -![Figure 1. YOLOv5 onnx visualization (the input part)](../assets/yolov5_onnx_input.png) +![Figure 1. YOLOv5 onnx visualization (the input part)](/assets/images/yolov5_onnx_input.png) -![Figure 2. YOLOv5 onnx visualization (the output part)](../assets/yolov5_onnx_output.png) +![Figure 2. YOLOv5 onnx visualization (the output part)](/assets/images/yolov5_onnx_output.png) After moving the .onnx file to your Jetson, run `trtexec --onnx=ONNX_FILE.onnx --workspace=4096 --saveEngine=ENGINE_NAME.engine --verbose` to obtain the final TensorRT engine file. The 4096 is the upper bound of the memory usage and should be adapted according to the platform. Besides, if there’s no trtexec command while TensorRT was installed, add `export PATH=$PATH:/usr/src/tensorrt/bin` to your `~/.bashrc` or `~/.zshrc`, depending on your default shell. diff --git a/wiki/networking/__all_subsections.md b/wiki/networking/__all_subsections.md index 1dd87138..49058c93 100644 --- a/wiki/networking/__all_subsections.md +++ b/wiki/networking/__all_subsections.md @@ -157,7 +157,7 @@ sudo /etc/init.d/chrony start 1. If clients communicating to the same ROS master are publishing/subscribing to the same topics, there may be a namespace clash and the computers will not be able to distinguish one topic from the other. Link: http://nootrix.com/2013/08/ros­namespaces/ Hence, make the topics specific to that particular machine. For example, `/cmd_vel` topic for robot 1 should now become `/robot1/cmd_vel` and for robot 2, it should be `/robot2/cmd_vel`. Also, namespaces should be added to the frames also. For three robots, transformation tree should look like this: -![Transofromation Tree for Three Robots](assets/ROSDistributed-1b70c.png) +![Transofromation Tree for Three Robots](/assets/images/ROSDistributed-1b70c.png) - Similarly, there may also be clashing transforms that may cause problems and they need to be fixed in the same way. 2. Try not to run any graphics such as Rviz or RQt on the clients while communicating as they consume a lot of bandwidth and may cause the system to slow down. All the computers can be controlled from the server laptop for any commands that need to run on them by performing ‘ssh’ into the client laptop from the server laptop. diff --git a/wiki/networking/ros-distributed.md b/wiki/networking/ros-distributed.md index ae732603..dc26f9b1 100644 --- a/wiki/networking/ros-distributed.md +++ b/wiki/networking/ros-distributed.md @@ -52,7 +52,7 @@ sudo /etc/init.d/chrony start 1. If clients communicating to the same ROS master are publishing/subscribing to the same topics, there may be a namespace clash and the computers will not be able to distinguish one topic from the other. Link: http://nootrix.com/2013/08/ros­namespaces/ Hence, make the topics specific to that particular machine. For example, `/cmd_vel` topic for robot 1 should now become `/robot1/cmd_vel` and for robot 2, it should be `/robot2/cmd_vel`. Also, namespaces should be added to the frames also. For three robots, transformation tree should look like this: -![Transofromation Tree for Three Robots](assets/ROSDistributed-1b70c.png) +![Transofromation Tree for Three Robots](/assets/images/ROSDistributed-1b70c.png) - Similarly, there may also be clashing transforms that may cause problems and they need to be fixed in the same way. 2. Try not to run any graphics such as Rviz or RQt on the clients while communicating as they consume a lot of bandwidth and may cause the system to slow down. All the computers can be controlled from the server laptop for any commands that need to run on them by performing ‘ssh’ into the client laptop from the server laptop. diff --git a/wiki/planning/__all_subsections.md b/wiki/planning/__all_subsections.md index 8ce137e7..780603af 100644 --- a/wiki/planning/__all_subsections.md +++ b/wiki/planning/__all_subsections.md @@ -320,7 +320,7 @@ from Frenet coordinates to the local vehicle frame in Cartesian coordinates is a #### Images and Video Images and embedded video are supported. -![Path planning in frenet coordinates](assets/path_planning.jpg) +![Path planning in frenet coordinates](/assets/images/path_planning.png) ![frenet path](/assets/images/ref_path.png) ![f_path](/assets/images/f_path.png) ## Summary @@ -705,7 +705,7 @@ a desired goal pose a geometric description of the robot a geometric description of the world -![Figure 1. Role of motion planning in a robotic system [1]](/assets/planning_intro.png) +![Figure 1. Role of motion planning in a robotic system [1]](/assets/images/planning_intro.png) This Wiki details the different types of motion planning algorithms that are available and the key differences between them. Knowing this will make choosing between them easier, depending on the types of projects these algorithms are implemented in. @@ -746,7 +746,7 @@ References that may be useful (including those that include pseudo-code) for exp ### Sampling-Based Planners Sampling-Based algorithms sample possible states in continuous space and try to connect them to find a path from the start to the goal state. These algorithms are suitable in solving high-dimensional problems because the size of the graph they construct is not explicitly exponential in the number of dimensions. Although more rapid and less expensive than Search-Based algorithms, there is difficulty in finding optimal paths and results lack repeatability. Sampling based methods can be divided into two categories – multi-query, where multiple start and goal configurations can be connected without reconstructing the graph structure, and single-query, where the tree is built from scratch for every set of start and goal configurations. A summary of the two categories is shown in Table 1. -![Table 1. Multi-query vs. Single-query [3]](/assets/multi_vs_single_query.png) +![Table 1. Multi-query vs. Single-query [3]](/assets/images/multi_vs_single_query.png) Probabilistic Road Map (PRM) is the most popular multi-query algorithm. In the learning phase, free configurations are randomly sampled to become the nodes of a graph. Connections are made between the nodes to form the edges, representing feasible paths of the roadmap. Additional nodes are then created to expand the roadmap and improve its connectivity. In the query phase, the planner tries to find a path that connects start and goal configurations using the graph created in the learning phase. @@ -758,19 +758,19 @@ For single-query methods, Rapidly-exploring Random Trees (RRT) is the most preva Nonholonomic systems are characterized by constraint equations involving the time derivatives of the system configuration variables. These equations are non-integrable; they typically arise when the system has less controls than configuration variables. For instance a car-like robot has two controls (linear and angular velocities) while it moves in a 3-dimensional configuration space. As a consequence, any path in the configuration space does not necessarily correspond to a feasible path for the system. Let us consider two systems: a two-driving wheel mobile robot and a car-like robot. **Two-driving wheel robots**: The general dynamic model is given as: -![](/assets/2dwr1.png) +![](/assets/images/2dwr1.png) The reference point of the robot is the midpoint of the two wheels; its coordinates, with respect to a fixed frame, are denoted by (x,y) and θ is the direction of the driving wheels and ℓ is the distance between the driving wheels. By setting v=½\*(v1+v2) and ω= 1/ℓ * (v1−v2) we get the kinematic model which is expressed as the following 3-dimensional system: -![](/assets/clr2.png) +![](/assets/images/clr2.png) **Car-like robots**: The reference point with coordinates (x,y) is the midpoint of the rear wheels. We assume that the distance between both rear and front axles is unit length. We denote w as the speed of the front wheels of the car and ζ as the angle between the front wheels and the main direction θ of the car. Moreover a mechanical constraint imposes |ζ| ≤ ζmax and consequently a minimum turning radius. The general dynamic model is given as: -![](/assets/clr1.png) +![](/assets/images/clr1.png) A first simplification consists in controlling w; it gives a 4-dimensional system. Let us assume that we do not care about the direction of the front wheels. We may still simplify the model. By setting v=wcosζ and ω=wsinζ we get a 3-dimensional system. -![](/assets/clr2.png) +![](/assets/images/clr2.png) ### Sampling- vs Search-based Methods: With constraints come some restrictions on the kinds of planners that will be effective. Grid-based graphs, for example, do not allow fluid motions to be planned but may work fine if a motion consisting of turn-in-place and drive straight maneuvers are acceptable. There are planners that incorporate simple fluid motions such as lattice planners, and Dubins and Reeds-Shepp state-space planners. The former of these can offer cheap planning for non-holonomic systems, so long as the number of extensions is kept low. The latter two present the space of options as arc and straight motions. These are typically for vehicles that use Ackerman steering. One alternative to all those above is a shooting RRT based on motion primitives. Where all of the others tend to work better at slower speeds, shooting RRTs can also work well at high speeds so long as the shooting is done using the vehicle dynamics. It may be possible to combine search-based with sampling-based planners in order to get optimality and feasibility benefits from both, respectively. diff --git a/wiki/planning/frenet-frame-planning.md b/wiki/planning/frenet-frame-planning.md index b1bf16eb..53026de2 100644 --- a/wiki/planning/frenet-frame-planning.md +++ b/wiki/planning/frenet-frame-planning.md @@ -97,7 +97,7 @@ from Frenet coordinates to the local vehicle frame in Cartesian coordinates is a #### Images and Video Images and embedded video are supported. -![Path planning in frenet coordinates](assets/path_planning.jpg) +![Path planning in frenet coordinates](/assets/images/path_planning.png) ![frenet path](/assets/images/ref_path.png) ![f_path](/assets/images/f_path.png) ## Summary diff --git a/wiki/planning/planning-overview.md b/wiki/planning/planning-overview.md index 9c4e2d48..a18a491d 100644 --- a/wiki/planning/planning-overview.md +++ b/wiki/planning/planning-overview.md @@ -8,7 +8,7 @@ a desired goal pose a geometric description of the robot a geometric description of the world -![Figure 1. Role of motion planning in a robotic system [1]](/assets/planning_intro.png) +![Figure 1. Role of motion planning in a robotic system [1]](/assets/images/planning_intro.png) This Wiki details the different types of motion planning algorithms that are available and the key differences between them. Knowing this will make choosing between them easier, depending on the types of projects these algorithms are implemented in. @@ -49,7 +49,7 @@ References that may be useful (including those that include pseudo-code) for exp ### Sampling-Based Planners Sampling-Based algorithms sample possible states in continuous space and try to connect them to find a path from the start to the goal state. These algorithms are suitable in solving high-dimensional problems because the size of the graph they construct is not explicitly exponential in the number of dimensions. Although more rapid and less expensive than Search-Based algorithms, there is difficulty in finding optimal paths and results lack repeatability. Sampling based methods can be divided into two categories – multi-query, where multiple start and goal configurations can be connected without reconstructing the graph structure, and single-query, where the tree is built from scratch for every set of start and goal configurations. A summary of the two categories is shown in Table 1. -![Table 1. Multi-query vs. Single-query [3]](/assets/multi_vs_single_query.png) +![Table 1. Multi-query vs. Single-query [3]](/assets/images/multi_vs_single_query.png) Probabilistic Road Map (PRM) is the most popular multi-query algorithm. In the learning phase, free configurations are randomly sampled to become the nodes of a graph. Connections are made between the nodes to form the edges, representing feasible paths of the roadmap. Additional nodes are then created to expand the roadmap and improve its connectivity. In the query phase, the planner tries to find a path that connects start and goal configurations using the graph created in the learning phase. @@ -61,19 +61,19 @@ For single-query methods, Rapidly-exploring Random Trees (RRT) is the most preva Nonholonomic systems are characterized by constraint equations involving the time derivatives of the system configuration variables. These equations are non-integrable; they typically arise when the system has less controls than configuration variables. For instance a car-like robot has two controls (linear and angular velocities) while it moves in a 3-dimensional configuration space. As a consequence, any path in the configuration space does not necessarily correspond to a feasible path for the system. Let us consider two systems: a two-driving wheel mobile robot and a car-like robot. **Two-driving wheel robots**: The general dynamic model is given as: -![](/assets/2dwr1.png) +![](/assets/images/2dwr1.png) The reference point of the robot is the midpoint of the two wheels; its coordinates, with respect to a fixed frame, are denoted by (x,y) and θ is the direction of the driving wheels and ℓ is the distance between the driving wheels. By setting v=½\*(v1+v2) and ω= 1/ℓ * (v1−v2) we get the kinematic model which is expressed as the following 3-dimensional system: -![](/assets/clr2.png) +![](/assets/images/clr2.png) **Car-like robots**: The reference point with coordinates (x,y) is the midpoint of the rear wheels. We assume that the distance between both rear and front axles is unit length. We denote w as the speed of the front wheels of the car and ζ as the angle between the front wheels and the main direction θ of the car. Moreover a mechanical constraint imposes |ζ| ≤ ζmax and consequently a minimum turning radius. The general dynamic model is given as: -![](/assets/clr1.png) +![](/assets/images/clr1.png) A first simplification consists in controlling w; it gives a 4-dimensional system. Let us assume that we do not care about the direction of the front wheels. We may still simplify the model. By setting v=wcosζ and ω=wsinζ we get a 3-dimensional system. -![](/assets/clr2.png) +![](/assets/images/clr2.png) ### Sampling- vs Search-based Methods: With constraints come some restrictions on the kinds of planners that will be effective. Grid-based graphs, for example, do not allow fluid motions to be planned but may work fine if a motion consisting of turn-in-place and drive straight maneuvers are acceptable. There are planners that incorporate simple fluid motions such as lattice planners, and Dubins and Reeds-Shepp state-space planners. The former of these can offer cheap planning for non-holonomic systems, so long as the number of extensions is kept low. The latter two present the space of options as arc and straight motions. These are typically for vehicles that use Ackerman steering. One alternative to all those above is a shooting RRT based on motion primitives. Where all of the others tend to work better at slower speeds, shooting RRTs can also work well at high speeds so long as the shooting is done using the vehicle dynamics. It may be possible to combine search-based with sampling-based planners in order to get optimality and feasibility benefits from both, respectively. diff --git a/wiki/project-management/__all_subsections.md b/wiki/project-management/__all_subsections.md index 9100de9b..3e0f86b2 100644 --- a/wiki/project-management/__all_subsections.md +++ b/wiki/project-management/__all_subsections.md @@ -408,7 +408,7 @@ Tracking the date increases accountability. When a project knows how long a risk **Impact Type/Location** is what kind of risk it is (schedule, cost, physical, cybersecurity, etc), and what phase, subsystem, or operational requirement it affects. These can be tracked as separate categories if there's a lot to say, and can even be linked to the WBS/SSS or Gantt chart to show where risks are showing up. The tools to do so are a bit more involved and I haven't implemented them myself yet. Below is a risk matrix and tracker made with some of the risks identified early in a Carnegie Mellon MRSD Project. It will take risks and display their overall values automatically in the second sheet, and output an aggregate risk matrix to the first sheet. After-mitigation risk level is not implemented, but can be kept in the comments section, and the original risk updated once mitigation has been implemented with a note as to how the mitigation affected the risk. -- [MRSD Risk Matrix & Tracker](assets/MRSD_Risk.xlsx) +- [MRSD Risk Matrix & Tracker](/wiki/project-management/assets/MRSD_Risk.xlsx) /wiki/project-management/using-notion-for-project-management/ diff --git a/wiki/project-management/index.md b/wiki/project-management/index.md index 6394c182..62ab7bee 100644 --- a/wiki/project-management/index.md +++ b/wiki/project-management/index.md @@ -47,7 +47,7 @@ Here is a consolidated list of external resources and templates referenced in th - [Creating Breakthrough Products](https://www.pearson.com/) 4. **Risk Management** - - [MRSD Risk Matrix & Tracker](assets/MRSD_Risk.xlsx) + - [MRSD Risk Matrix & Tracker](/wiki/project-management/assets/MRSD_Risk.xlsx) 5. **Using Notion** - [Notion for Education](https://www.notion.so/product) diff --git a/wiki/project-management/risk-management.md b/wiki/project-management/risk-management.md index a451b88c..6a590d06 100644 --- a/wiki/project-management/risk-management.md +++ b/wiki/project-management/risk-management.md @@ -44,4 +44,4 @@ Tracking the date increases accountability. When a project knows how long a risk **Impact Type/Location** is what kind of risk it is (schedule, cost, physical, cybersecurity, etc), and what phase, subsystem, or operational requirement it affects. These can be tracked as separate categories if there's a lot to say, and can even be linked to the WBS/SSS or Gantt chart to show where risks are showing up. The tools to do so are a bit more involved and I haven't implemented them myself yet. Below is a risk matrix and tracker made with some of the risks identified early in a Carnegie Mellon MRSD Project. It will take risks and display their overall values automatically in the second sheet, and output an aggregate risk matrix to the first sheet. After-mitigation risk level is not implemented, but can be kept in the comments section, and the original risk updated once mitigation has been implemented with a note as to how the mitigation affected the risk. -- [MRSD Risk Matrix & Tracker](assets/MRSD_Risk.xlsx) +- [MRSD Risk Matrix & Tracker](/wiki/project-management/assets/MRSD_Risk.xlsx) diff --git a/wiki/sensing/___all_subsections.md b/wiki/sensing/___all_subsections.md index 5e8421bb..acf0d2f6 100644 --- a/wiki/sensing/___all_subsections.md +++ b/wiki/sensing/___all_subsections.md @@ -799,7 +799,7 @@ Method II is the most desirable way to go about solving the problem at hand. ## References Use these for choosing the type of validation of photometric calibration: -1. https://www.labsphere.com/site/assets/files/2928/pb-13089-000_rev_00_waf.pdf +1. https://www.labsphere.com/site/assets/images/files/2928/pb-13089-000_rev_00_waf.pdf - http://ericfossum.com/Publications/Papers/1999%20Program%20Test%20Methodologies%20for%20Digital%20Camera%20on%20a%20Chip%20Image%20Sensors.pdf - http://sensing.konicaminolta.us/2013/10/measuring-light-intensity-using-a-lux-meter/ - http://tmi.yokogawa.com/products/portable-and-bench-instruments/luxmeters/digital-lux-meters/ @@ -1446,7 +1446,7 @@ A ransac based homography is required to be precomputed between 2 image planes i 3. ### Bird's eye view and region of interest For getting a bird's eye view of an The bird's eye view can capture a fairly large space of the map depending on where the view is taken from. However the homography estimate is not good at the points far away from the camera origin. For this case we predefine a region of interest in the bird's eye view space and any vehicle out of this region is ignored. -![Bev_frame](assets/bev_fifthcraig.jpg) +![Bev_frame](/assets/images/bev_fifthcraig.jpg) 4. ### HD Map A HD Map for the world is a prerequisite. Since the intersection we captured data from didn't have a prior map available, we ended up creating our own vanilla map. The major requirements for the map are the information containing the lanes, their directions and the corresponding lane center lines. diff --git a/wiki/sensing/trajectory_extraction_static_camera.md b/wiki/sensing/trajectory_extraction_static_camera.md index 97a3c797..4a406878 100644 --- a/wiki/sensing/trajectory_extraction_static_camera.md +++ b/wiki/sensing/trajectory_extraction_static_camera.md @@ -18,7 +18,7 @@ A ransac based homography is required to be precomputed between 2 image planes i 3. ### Bird's eye view and region of interest For getting a bird's eye view of an The bird's eye view can capture a fairly large space of the map depending on where the view is taken from. However the homography estimate is not good at the points far away from the camera origin. For this case we predefine a region of interest in the bird's eye view space and any vehicle out of this region is ignored. -![Bev_frame](assets/bev_fifthcraig.jpg) +![Bev_frame](/assets/images/bev_fifthcraig.jpg) 4. ### HD Map A HD Map for the world is a prerequisite. Since the intersection we captured data from didn't have a prior map available, we ended up creating our own vanilla map. The major requirements for the map are the information containing the lanes, their directions and the corresponding lane center lines. diff --git a/wiki/simulation/NDT-Matching-with-Autoware.md b/wiki/simulation/NDT-Matching-with-Autoware.md index bdd63e18..20ef1c08 100644 --- a/wiki/simulation/NDT-Matching-with-Autoware.md +++ b/wiki/simulation/NDT-Matching-with-Autoware.md @@ -8,7 +8,7 @@ published: true 3D maps enable self driving cars to localize themselves in the environment. To localize using a map and Lidar data one needs to find a way to associate the point cloud from the sensor with the point cloud from the map. This is also known as scan matching in robotics. One of the common ways to do this is Iterative Closest Point, it uses 6 degrees of freedom to find the closest point to the geometric entity from a given 3D point cloud. There exist a lot of geometric variants of ICP such as point-to-plane etc. One of the downfalls of ICP is that it needs a good approximation and a good starting point as it works on non-linear optimization and has tendencies to get stuck in local minima. In real world scenarios our points will probably be a little off from the map. Measurement errors will cause points to be slightly mis-aligned, plus the world might change a little between when we record the map and when we make our new scan. NDT matching provides a solution for these minor errors. Instead of trying to match points from our current scan to point on the map, we try to match points from our current scan to a grid of probability functions created from the map. -![Probability Density Function](assets/images/pdf.png) +![Probability Density Function](/assets/images/pdf.png) Following are the two tasks performed @@ -50,5 +50,5 @@ Then you will see the mapping running really quickly in one terminal and the num Once you have finished creating the map, save it in your desired location with either a downsampling (to reduce the file size), or full/original quality output, by using the “app” tab in the NDT_Mapping node in the Computing tab. It will save as a .pcd file that can either be viewed using PCL_Viewer (a PCL tool) or RViz with Autoware. The image below shows a map we made of NSH B-level on 29th January, 2020. To view a map in RViz, load Autoware, initialize the point cloud in the Mapping tab, and click on the TF button for a default TF. Then you should be able to launch RViz and visualize the point_map as shown below. You can change the point colours and axis colours to “intensity” and the sizes/transparencies as well. -![PCD of B-Level RI](assets/images/autpware_blevel.png) +![PCD of B-Level RI](/assets/images/autoware_blevel.png) diff --git a/wiki/simulation/__all_subsections.md b/wiki/simulation/__all_subsections.md index 46ef9b4f..339ae1ac 100644 --- a/wiki/simulation/__all_subsections.md +++ b/wiki/simulation/__all_subsections.md @@ -101,7 +101,7 @@ published: true 3D maps enable self driving cars to localize themselves in the environment. To localize using a map and Lidar data one needs to find a way to associate the point cloud from the sensor with the point cloud from the map. This is also known as scan matching in robotics. One of the common ways to do this is Iterative Closest Point, it uses 6 degrees of freedom to find the closest point to the geometric entity from a given 3D point cloud. There exist a lot of geometric variants of ICP such as point-to-plane etc. One of the downfalls of ICP is that it needs a good approximation and a good starting point as it works on non-linear optimization and has tendencies to get stuck in local minima. In real world scenarios our points will probably be a little off from the map. Measurement errors will cause points to be slightly mis-aligned, plus the world might change a little between when we record the map and when we make our new scan. NDT matching provides a solution for these minor errors. Instead of trying to match points from our current scan to point on the map, we try to match points from our current scan to a grid of probability functions created from the map. -![Probability Density Function](assets/images/pdf.png) +![Probability Density Function](/assets/images/pdf.png) Following are the two tasks performed @@ -143,7 +143,7 @@ Then you will see the mapping running really quickly in one terminal and the num Once you have finished creating the map, save it in your desired location with either a downsampling (to reduce the file size), or full/original quality output, by using the “app” tab in the NDT_Mapping node in the Computing tab. It will save as a .pcd file that can either be viewed using PCL_Viewer (a PCL tool) or RViz with Autoware. The image below shows a map we made of NSH B-level on 29th January, 2020. To view a map in RViz, load Autoware, initialize the point cloud in the Mapping tab, and click on the TF button for a default TF. Then you should be able to launch RViz and visualize the point_map as shown below. You can change the point colours and axis colours to “intensity” and the sizes/transparencies as well. -![PCD of B-Level RI](assets/images/autpware_blevel.png) +![PCD of B-Level RI](/assets/images/autoware_blevel.png) /wiki/simulation/simulating-vehicle-using-autoware/ diff --git a/wiki/state-estimation/Cartographer-ROS-Integration.md b/wiki/state-estimation/Cartographer-ROS-Integration.md index ced9ef82..fa9f44cb 100644 --- a/wiki/state-estimation/Cartographer-ROS-Integration.md +++ b/wiki/state-estimation/Cartographer-ROS-Integration.md @@ -80,7 +80,7 @@ Requirements: - The IMU should be fast, at around 100 Hz - The IMU should have the correct timestamps, errors in this will cause errors in the SLAM -![](/home/kelvin/hw_ws/roboticsknowledgebase.github.io/wiki/state-estimation/assets/carto-3.jpeg) +![](/assets/images/carto-3.jpeg) ## 3. Prepare LiDAR LaserScan data @@ -121,7 +121,7 @@ You can refer to a sample config file [here](https://github.com/howde-robotics/d Cartographer will output TF for robot pose in the map frame and an [OccupancyGrid](http://docs.ros.org/en/noetic/api/nav_msgs/html/msg/OccupancyGrid.html). However, if you want to use the provided OccupancyGrid with other navigation modules, such as move_base, the standard Cartographer OccupancyGrid will not work. This is because most navigation apps require the costmap to only have either of 3 values, FREE (0), OBSTACLES (100), or UNKNOWN (-1). Cartographer instead has a range of values depending on the confidence that the algorithms have about the state of the cells. For example, at first detection, a cell can have a value of around ~40, but as more data is collected that cell's value can go to 0 (if it is FREE) or 100 (if it is OBSTACLES). If you try to use this map as a global costmap for move_base, you will get a costmap that looks like the image below. -![](/home/kelvin/hw_ws/roboticsknowledgebase.github.io/wiki/state-estimation/assets/carto-4.png) +![](/assets/images/carto-4.png) The workaround is to change the way Cartographer looks at obstacles. Refer to the commit [here](https://github.com/howde-robotics/cartographer/commit/93eee6e207bcbeccdbd696f2ea2f5a00234665f1) for the changes necessary. You need to change a line in `cartographer/io/submap_painter.cc` in line `209` from: @@ -142,11 +142,11 @@ This will immediately make an obstacle in Cartographer's OccupancyGrid to be at However, if you now try to use it as a costmap, you will get something like the image below: -![](/home/kelvin/hw_ws/roboticsknowledgebase.github.io/wiki/state-estimation/assets/carto-5.png) +![](/assets/images/carto-5.png) As you can see, it now has obstacles and walls, but they are very sparse with gaps in between. The solution is to add `inflation_layer` using the costmap package. See more [here](http://wiki.ros.org/costmap_2d/hydro/inflation). Now once you inflate the walls and obstacles you will get a costmap that looks like this: -![](/home/kelvin/hw_ws/roboticsknowledgebase.github.io/wiki/state-estimation/assets/carto-6.png) +![](/assets/images/carto-6.png) Now that is a usable costmap for navigation. diff --git a/wiki/state-estimation/__all_subsections.md b/wiki/state-estimation/__all_subsections.md index cb671503..26f000f8 100644 --- a/wiki/state-estimation/__all_subsections.md +++ b/wiki/state-estimation/__all_subsections.md @@ -176,7 +176,7 @@ Requirements: - The IMU should be fast, at around 100 Hz - The IMU should have the correct timestamps, errors in this will cause errors in the SLAM -![](/home/kelvin/hw_ws/roboticsknowledgebase.github.io/wiki/state-estimation/assets/carto-3.jpeg) +![](/assets/images/carto-3.jpeg) ## 3. Prepare LiDAR LaserScan data @@ -217,7 +217,7 @@ You can refer to a sample config file [here](https://github.com/howde-robotics/d Cartographer will output TF for robot pose in the map frame and an [OccupancyGrid](http://docs.ros.org/en/noetic/api/nav_msgs/html/msg/OccupancyGrid.html). However, if you want to use the provided OccupancyGrid with other navigation modules, such as move_base, the standard Cartographer OccupancyGrid will not work. This is because most navigation apps require the costmap to only have either of 3 values, FREE (0), OBSTACLES (100), or UNKNOWN (-1). Cartographer instead has a range of values depending on the confidence that the algorithms have about the state of the cells. For example, at first detection, a cell can have a value of around ~40, but as more data is collected that cell's value can go to 0 (if it is FREE) or 100 (if it is OBSTACLES). If you try to use this map as a global costmap for move_base, you will get a costmap that looks like the image below. -![](/home/kelvin/hw_ws/roboticsknowledgebase.github.io/wiki/state-estimation/assets/carto-4.png) +![](/assets/images/carto-4.png) The workaround is to change the way Cartographer looks at obstacles. Refer to the commit [here](https://github.com/howde-robotics/cartographer/commit/93eee6e207bcbeccdbd696f2ea2f5a00234665f1) for the changes necessary. You need to change a line in `cartographer/io/submap_painter.cc` in line `209` from: @@ -238,11 +238,11 @@ This will immediately make an obstacle in Cartographer's OccupancyGrid to be at However, if you now try to use it as a costmap, you will get something like the image below: -![](/home/kelvin/hw_ws/roboticsknowledgebase.github.io/wiki/state-estimation/assets/carto-5.png) +![](/assets/images/carto-5.png) As you can see, it now has obstacles and walls, but they are very sparse with gaps in between. The solution is to add `inflation_layer` using the costmap package. See more [here](http://wiki.ros.org/costmap_2d/hydro/inflation). Now once you inflate the walls and obstacles you will get a costmap that looks like this: -![](/home/kelvin/hw_ws/roboticsknowledgebase.github.io/wiki/state-estimation/assets/carto-6.png) +![](/assets/images/carto-6.png) Now that is a usable costmap for navigation. diff --git a/wiki/tools/__all_subsections.md b/wiki/tools/__all_subsections.md index 97f9ea1f..4626c888 100644 --- a/wiki/tools/__all_subsections.md +++ b/wiki/tools/__all_subsections.md @@ -1829,7 +1829,7 @@ Basic rosbag parsing is as follows: 3. For straightforward values in a message, run `timeseries(bag_select,'')` 4. For more complicated messages, run `readMessages` -[This script](assets/parseRosbag.m) parses Rosbags and creates a `.mat` and `.csv` file from it given a custom definition. The particular message referenced is an aggregation of multiple messages, hence the recursive structure. +[This script](/wiki/tools/assets/parseRosbag.m) parses Rosbags and creates a `.mat` and `.csv` file from it given a custom definition. The particular message referenced is an aggregation of multiple messages, hence the recursive structure. /wiki/tools/roslibjs/ @@ -1980,7 +1980,7 @@ You can do more advanced stuff such as subscribing to images, Rviz visualization To visualize and update an image stream live within your web app, first you need a placeholder in HTML for your image. Define it as follows within the `body` tag with an unique ID to update it later via JavaScript. ``` - + ``` Now, you can create a topic handler and subscribe to your image from ROS. Note that, if you want to integrate image streams with `roslibjs`, the ROS socket bridge expects images in compressed format. See this section [here](https://roboticsknowledgebase.com/wiki/tools/stream-rviz/compressing-image-streams) for more details on setting up image compression for your topics. @@ -2001,7 +2001,7 @@ image_topic.subscribe(function(message) { }); ```epository [here](https://github.com/deltaautonomy/delta_viz/blob/master/delta_viz_app/index.html). -![](https://roboticsknowledgebase.com/wiki/tools/assets/deltaviz.jpg) +![](/assets/images/deltaviz.jpg) ## See Also - A [tutorial](https://roboticsknowledgebase.com/wiki/tools/stream-rviz) on setting up virtual cameras and lighting in Rviz and stream these images which can be used in your GUI or for other applications within ROS. diff --git a/wiki/tools/rosbags-matlab.md b/wiki/tools/rosbags-matlab.md index 0feb8cd0..e6feb040 100644 --- a/wiki/tools/rosbags-matlab.md +++ b/wiki/tools/rosbags-matlab.md @@ -17,4 +17,4 @@ Basic rosbag parsing is as follows: 3. For straightforward values in a message, run `timeseries(bag_select,'')` 4. For more complicated messages, run `readMessages` -[This script](assets/parseRosbag.m) parses Rosbags and creates a `.mat` and `.csv` file from it given a custom definition. The particular message referenced is an aggregation of multiple messages, hence the recursive structure. +[This script](/wiki/tools/assets/parseRosbag.m) parses Rosbags and creates a `.mat` and `.csv` file from it given a custom definition. The particular message referenced is an aggregation of multiple messages, hence the recursive structure. diff --git a/wiki/tools/roslibjs.md b/wiki/tools/roslibjs.md index 180bf052..b4c4a428 100644 --- a/wiki/tools/roslibjs.md +++ b/wiki/tools/roslibjs.md @@ -145,7 +145,6 @@ You can do more advanced stuff such as subscribing to images, Rviz visualization To visualize and update an image stream live within your web app, first you need a placeholder in HTML for your image. Define it as follows within the `body` tag with an unique ID to update it later via JavaScript. ``` - ``` Now, you can create a topic handler and subscribe to your image from ROS. Note that, if you want to integrate image streams with `roslibjs`, the ROS socket bridge expects images in compressed format. See this section [here](https://roboticsknowledgebase.com/wiki/tools/stream-rviz/compressing-image-streams) for more details on setting up image compression for your topics. @@ -168,7 +167,7 @@ image_topic.subscribe(function(message) { Here is an example of a dashboard (DeltaViz) for Delta Autonomy developed by [me](mailto:heethesh@gmail.com). The GUI makes use of ROS diagnostic message to monitor FPS of different nodes in the pipeline, subscribes to images and virtual camera stream from Rviz, and also has sound alerts and flashes to notify the users (developed for their specific use-case). The source code is available on our repository [here](https://github.com/deltaautonomy/delta_viz/blob/master/delta_viz_app/index.html). -![](https://roboticsknowledgebase.com/wiki/tools/assets/deltaviz.jpg) +![](/assets/images/deltaviz.jpg) ## See Also - A [tutorial](https://roboticsknowledgebase.com/wiki/tools/stream-rviz) on setting up virtual cameras and lighting in Rviz and stream these images which can be used in your GUI or for other applications within ROS. From 107c5942931851ccc781d8b42180b0f8716e7c16 Mon Sep 17 00:00:00 2001 From: Nevin Valsaraj Date: Wed, 11 Mar 2026 00:01:45 -0700 Subject: [PATCH 3/6] refactor(assets): categorize images into subfolders based on wiki categories --- .../ULN2003AMotorController-8ee22.png | Bin ...eit_setup_assistant_author_information.png | Bin ...moveit_setup_assistant_collision_check.png | Bin .../moveit_setup_assistant_controllers.png | Bin .../moveit_setup_assistant_end.png | Bin .../moveit_setup_assistant_end_effectors.png | Bin .../moveit_setup_assistant_passive_joints.png | Bin .../moveit_setup_assistant_perception.png | Bin ...sistant_planning_group_kinematic_chain.png | Bin ...moveit_setup_assistant_planning_groups.png | Bin .../moveit_setup_assistant_robot_poses.png | Bin .../moveit_setup_assistant_simulation.png | Bin .../moveit_setup_assistant_start.png | Bin .../moveit_setup_assistant_virtual_joints.png | Bin .../{ => actuation}/pure_pursuit_geometry.png | Bin .../images/{ => actuation}/steer-by-wire.png | Bin .../{ => actuation}/throttle-by-wire.png | Bin assets/images/{ => common-platforms}/DJI.png | Bin .../images/{ => common-platforms}/DjiM100.png | Bin .../{ => common-platforms}/KHEPERA4.png | Bin .../{ => common-platforms}/form_factor.png | Bin .../{ => common-platforms}/moveit_1.png | Bin .../{ => common-platforms}/moveit_2.png | Bin .../{ => common-platforms}/moveit_3.png | Bin .../{ => common-platforms}/moveit_4.png | Bin .../{ => common-platforms}/power-module.png | Bin .../{ => common-platforms}/px4-ardupilot.png | Bin .../{ => common-platforms}/unitree_top.png | Bin .../images/{ => common-platforms}/wire.webp | Bin .../images/{ => common-platforms}/wired.png | Bin .../{ => common-platforms}/wiring-diagram.jpg | Bin .../images/{ => computing}/Arduino-2369d.png | Bin .../images/{ => computing}/Arduino-c30e6.png | Bin .../images/{ => computing}/Arduino-d9b3f.png | Bin .../images/{ => computing}/Arduino-de522.png | Bin assets/images/{ => computing}/nvidia-cuda.png | Bin .../images/{ => computing}/nvidia-cudnn.png | Bin .../{ => fabrication}/3DPrinters-10477.png | Bin .../{ => fabrication}/3DPrinters-a3389.png | Bin .../{ => fabrication}/SeriesA_APIKey.jpg | Bin .../{ => fabrication}/SeriesA_PLA_SP.jpg | Bin .../micro-ros-architecture.png | Bin .../{ => interfacing}/micro-ros-docker.png | Bin .../images/{ => interfacing}/ros-bridge.png | Bin .../images/{ => machine-learning}/Gr00t.png | Bin .../{ => machine-learning}/NLP_image1.png | Bin .../{ => machine-learning}/NLP_image2.png | Bin .../{ => machine-learning}/NLP_image3.png | Bin .../{ => machine-learning}/NLP_image4.png | Bin .../{ => machine-learning}/bucket_fill.png | Bin .../diffusion_policy_diagram.png | Bin .../{ => machine-learning}/manage_layers.png | Bin .../mask_annotation.png | Bin .../mediapipe_platforms.png | Bin .../mediapipe_solutions.png | Bin .../{ => machine-learning}/new_layer.png | Bin .../{ => machine-learning}/select_tool.png | Bin .../{ => machine-learning}/system1system2.png | Bin .../{ => machine-learning}/yolo_demo.png | Bin .../yolov5_onnx_input.png | Bin .../yolov5_onnx_output.png | Bin assets/images/{ => math}/gpConnection.png | Bin assets/images/{ => math}/mixedGaussian.jpg | Bin assets/images/{ => math}/uncertainty.png | Bin .../{ => networking}/ROSDistributed-1b70c.png | Bin .../XbeeProDigiMesh900-1fc56.png | Bin assets/images/{ => planning}/2dwr1.png | Bin .../abstract_execution_classes.png | Bin .../abstract_navigation_server.png | Bin .../abstract_plugin_classes.png | Bin assets/images/{ => planning}/astar_h_viz.png | Bin assets/images/{ => planning}/cartesian.png | Bin .../images/{ => planning}/cell_traversal.png | Bin .../images/{ => planning}/central_planner.png | Bin assets/images/{ => planning}/clr1.png | Bin assets/images/{ => planning}/clr2.png | Bin .../coverage_planner_event_types.png | Bin .../{ => planning}/coverage_planner_steps.png | Bin assets/images/{ => planning}/f_path.png | Bin .../images/{ => planning}/lt_controller.png | Bin assets/images/{ => planning}/mission_exec.png | Bin .../{ => planning}/move_base_flex_full.png | Bin .../{ => planning}/multi_vs_single_query.png | Bin .../images/{ => planning}/path_planning.png | Bin .../images/{ => planning}/planning_intro.png | Bin .../{ => planning}/prioritised_astar.png | Bin assets/images/{ => planning}/ref_path.png | Bin assets/images/{ => planning}/rrtstar.png | Bin .../{ => planning}/simulation_testing.png | Bin .../trapezoid_decomposition.png | Bin .../{ => planning}/vader_planning_seq.png | Bin .../{ => planning}/velocity_obstacles.png | Bin .../{ => programming}/BoostLibrary-f962f.png | Bin .../{ => programming}/EigenLibrary-35715.png | Bin .../cmake_file_structure.png | Bin .../{ => programming}/state_machine.png | Bin .../{ => project-management}/card-system.png | Bin .../jira_burndown_chart.png | Bin .../meeting-notes.png | Bin .../{ => project-management}/milestones.png | Bin .../{ => project-management}/office-hours.png | Bin .../project-schedule.png | Bin .../{ => project-management}/task-list.png | Bin .../CoppeliaSim_sim.jpg | Bin .../airsim_sim.png | Bin .../{ => robotics-project-guide}/all_sim.png | Bin .../drone_image.png | Bin .../gazebo_sim.png | Bin .../go2_image.jpg | Bin .../go2_package.png | Bin .../isaaclab_sim.jpg | Bin .../manipulators_all.png | Bin .../mujoco_sim.jpg | Bin .../openaigym_sim.png | Bin .../pybullet_sim.png | Bin .../quadrotors_all.png | Bin .../quadrupeds_all.png | Bin .../robot_overview.png | Bin .../unity_sim.png | Bin .../urdf_to_sim.png | Bin .../wheeled_robot_image.png | Bin .../wheeled_robots_all.png | Bin .../{ => sensing}/AdafruitGPS-69ceb.png | Bin .../{ => sensing}/AdafruitGPS-c715f.png | Bin assets/images/{ => sensing}/Data_capture.png | Bin .../{ => sensing}/DelphiESRRadar-8394b.png | Bin .../{ => sensing}/DelphiESRRadar-eba02.png | Bin assets/images/{ => sensing}/HD_map.png | Bin .../images/{ => sensing}/apriltags-6719c.png | Bin .../assets_decawave_example_multi_anchor.png | Bin .../assets_leica_field_image.jpg | Bin .../images/{ => sensing}/bev_fifthcraig.jpg | Bin assets/images/{ => sensing}/cluster.png | Bin .../{ => sensing}/costmatrix_formation.png | Bin assets/images/{ => sensing}/cropped.png | Bin .../{ => sensing}/detection_sort_output.png | Bin assets/images/{ => sensing}/distance.png | Bin assets/images/{ => sensing}/downsampled.png | Bin assets/images/{ => sensing}/drtls_app.png | Bin assets/images/{ => sensing}/drtls_ids.png | Bin assets/images/{ => sensing}/dwm_arch.png | Bin assets/images/{ => sensing}/gdop_example.png | Bin assets/images/{ => sensing}/gps1.png | Bin assets/images/{ => sensing}/gps2.png | Bin assets/images/{ => sensing}/gps3.png | Bin assets/images/{ => sensing}/gps4.png | Bin assets/images/{ => sensing}/hsv_img.png | Bin assets/images/{ => sensing}/kinect.jpg | Bin .../images/{ => sensing}/leica_360_prism.jpeg | Bin assets/images/{ => sensing}/norm_img.png | Bin assets/images/{ => sensing}/original.png | Bin assets/images/{ => sensing}/pavucontrol.png | Bin assets/images/{ => sensing}/pipeline.png | Bin assets/images/{ => sensing}/ransac1.png | Bin assets/images/{ => sensing}/ransac2.png | Bin assets/images/{ => sensing}/realsense.jpg | Bin assets/images/{ => sensing}/rgb_vector.png | Bin assets/images/{ => sensing}/slam.png | Bin assets/images/{ => sensing}/stag_exposure.gif | Bin .../images/{ => sensing}/tracking_results.png | Bin assets/images/{ => sensing}/zoom1.png | Bin .../images/{ => simulation}/autoware_gui.png | Bin .../images/{ => simulation}/autoware_map.png | Bin .../{ => simulation}/autoware_models.png | Bin .../images/{ => simulation}/autoware_pkgs.png | Bin .../images/{ => simulation}/autoware_plan.png | Bin .../images/{ => simulation}/autoware_rviz.png | Bin .../{ => simulation}/autoware_worlds.png | Bin assets/images/{ => simulation}/carla2.png | Bin assets/images/{ => simulation}/carla3.png | Bin assets/images/{ => simulation}/carla4.png | Bin assets/images/{ => simulation}/carlaTrack.gif | Bin .../images/{ => simulation}/carla_opning.png | Bin assets/images/{ => simulation}/carter.png | Bin .../{ => simulation}/isaac_simpleroom.png | Bin assets/images/{ => simulation}/nav2.png | Bin assets/images/{ => simulation}/pdf.png | Bin assets/images/{ => simulation}/realsense.png | Bin .../AdaptiveMonteCarloLocalization-0d322.png | Bin .../AdaptiveMonteCarloLocalization-65e37.png | Bin .../{ => state-estimation}/Tracker-01.PNG | Bin .../{ => state-estimation}/Tracker-02.PNG | Bin .../camera-radar-targets.png | Bin .../images/{ => state-estimation}/carto-1.png | Bin .../images/{ => state-estimation}/carto-2.png | Bin .../{ => state-estimation}/carto-3.jpeg | Bin .../images/{ => state-estimation}/carto-4.png | Bin .../images/{ => state-estimation}/carto-5.png | Bin .../images/{ => state-estimation}/carto-6.png | Bin .../decawave_example_multi_anchor.png | Bin .../images/{ => state-estimation}/ipm_two.png | Bin .../leica_field_image.jpg | Bin .../marvelmind_example.jpg | Bin .../{ => state-estimation}/occupancy-grid.png | Bin .../servoing-action.png | Bin .../{ => state-estimation}/sort-tracker.jpg | Bin .../CableManagement-654ae.png | Bin .../CableManagement-6f4d5.png | Bin .../CableManagement-b3a03.png | Bin .../CableManagement-c5b3a.png | Bin .../PCBDesignNotes-05e85.png | Bin .../PCBDesignNotes-09baf.png | Bin .../PCBDesignNotes-8fedc.png | Bin .../PCBDesignNotes-d5ba2.png | Bin .../SubsystemInterfaceModeling-4e816.png | Bin .../SubsystemInterfaceModeling-7097d.png | Bin .../SubsystemInterfaceModeling-73d8e.png | Bin .../SubsystemInterfaceModeling-8748c.png | Bin .../SubsystemInterfaceModeling-8e94f.png | Bin .../SubsystemInterfaceModeling-fb765.png | Bin .../{ => tools}/AltiumCircuitmaker-1caa4.png | Bin .../{ => tools}/AltiumCircuitmaker-3f756.png | Bin .../{ => tools}/AltiumCircuitmaker-4b425.png | Bin .../{ => tools}/AltiumCircuitmaker-78555.png | Bin .../{ => tools}/AltiumCircuitmaker-8aecd.png | Bin .../{ => tools}/AltiumCircuitmaker-e83b9.png | Bin .../{ => tools}/AltiumCircuitmaker-f5782.png | Bin .../{ => tools}/AltiumCircuitmaker-fcf01.png | Bin assets/images/{ => tools}/PyQt-final.png | Bin assets/images/{ => tools}/PyQt-green.png | Bin assets/images/{ => tools}/PyQt-logs.png | Bin assets/images/{ => tools}/PyQt-orange.png | Bin assets/images/{ => tools}/PyQt-red.png | Bin assets/images/{ => tools}/PyQt-yellow.png | Bin .../Qtcreator-ros-new-project-class-menu.png | Bin .../Qtcreator-ros-new-project-design.png | Bin .../Qtcreator-ros-new-project-edit-text.png | Bin .../Qtcreator-ros-new-project-kit.png | Bin .../Qtcreator-ros-new-project-menu.png | Bin .../Qtcreator-ros-new-project-run.png | Bin .../Qtcreator-ros-new-project-run2.png | Bin .../Qtcreator-ros-new-project-ui-elements.png | Bin ...tcreator-ros-new-project-ui-obj-rename.png | Bin .../Qtcreator-ros-new-project-ui-obj.png | Bin .../{ => tools}/Qtcreator-ros-new-project.png | Bin assets/images/{ => tools}/debug1.jpeg | Bin assets/images/{ => tools}/debug2.jpeg | Bin assets/images/{ => tools}/debug3.jpeg | Bin assets/images/{ => tools}/deltaviz.jpg | Bin assets/images/{ => tools}/docker_socket.png | Bin assets/images/{ => tools}/privesc.png | Bin assets/images/{ => tools}/refactor1.png | Bin assets/images/{ => tools}/refactor2.jpeg | Bin assets/images/{ => tools}/refactor3.png | Bin assets/images/{ => tools}/refactor4.png | Bin assets/images/{ => tools}/vscode10.png | Bin assets/images/{ => tools}/vscode11.png | Bin assets/images/{ => tools}/vscode12.png | Bin assets/images/{ => tools}/vscode13.png | Bin assets/images/{ => tools}/vscode2.png | Bin assets/images/{ => tools}/vscode3.png | Bin assets/images/{ => tools}/vscode4.png | Bin assets/images/{ => tools}/vscode5.png | Bin assets/images/{ => tools}/vscode6.png | Bin assets/images/{ => tools}/vscode8.png | Bin assets/images/{ => tools}/vscode9.png | Bin ...suit-Controller-for-Skid-Steering-Robot.md | 2 +- wiki/actuation/__all_subsections.md | 34 +++---- wiki/actuation/drive-by-wire.md | 4 +- wiki/actuation/moveit-and-HEBI-integration.md | 26 +++--- wiki/actuation/uln2003a-motor-controller.md | 2 +- wiki/common-platforms/__all_subsections.md | 18 ++-- ...custom-drone-for-darpa-triage-challenge.md | 10 +- ...-drone-breakdown-for-technical-projects.md | 2 +- wiki/common-platforms/khepera4.md | 2 +- wiki/common-platforms/unitree-go1.md | 6 +- wiki/common-platforms/ur5e.md | 8 +- wiki/computing/__all_subsections.md | 12 +-- wiki/computing/arduino.md | 8 +- .../setup-gpus-for-computer-vision.md | 4 +- wiki/fabrication/3d-printers.md | 4 +- wiki/fabrication/__all_subsections.md | 8 +- wiki/fabrication/series-A-pro.md | 4 +- wiki/interfacing/__all_subsections.md | 6 +- .../microros-for-ros2-on-microcontrollers.md | 4 +- wiki/interfacing/ros1_ros2_bridge.md | 2 +- wiki/machine-learning/__all_subsections.md | 28 +++--- wiki/machine-learning/custom-semantic-data.md | 10 +- wiki/machine-learning/imitation-learning.md | 8 +- .../mediapipe-live-ml-anywhere.md | 4 +- wiki/machine-learning/nlp-for-robotics.md | 8 +- wiki/machine-learning/ros-yolo-gpu.md | 2 +- wiki/machine-learning/yolov5-tensorrt.md | 4 +- wiki/math/__all_subsections.md | 6 +- ...gaussian-process-gaussian-mixture-model.md | 6 +- wiki/networking/__all_subsections.md | 4 +- wiki/networking/ros-distributed.md | 2 +- wiki/networking/xbee-pro-digimesh-900.md | 2 +- wiki/planning/__all_subsections.md | 46 +++++----- .../advanced-moveit-manipulator-planning.md | 6 +- .../astar_planning_implementation_guide.md | 2 +- .../coverage-planning-implementation-guide.md | 8 +- wiki/planning/frenet-frame-planning.md | 6 +- wiki/planning/move_base_flex.md | 8 +- wiki/planning/multi-robot-planning.md | 10 +- wiki/planning/planning-overview.md | 12 +-- wiki/programming/__all_subsections.md | 6 +- wiki/programming/boost-library.md | 2 +- wiki/programming/cmake.md | 2 +- wiki/programming/eigen-library.md | 2 +- wiki/programming/yasmin-ros2-state-machine.md | 2 +- wiki/project-management/__all_subsections.md | 14 +-- wiki/project-management/jira.md | 2 +- .../using-notion-for-project-management.md | 12 +-- wiki/robotics-project-guide/choose-a-robot.md | 10 +- wiki/robotics-project-guide/choose-a-sim.md | 20 ++-- .../define-your-goals-and-requirements.md | 4 +- wiki/sensing/___all_subsections.md | 76 ++++++++-------- wiki/sensing/adafruit-gps.md | 2 +- wiki/sensing/apriltags.md | 2 +- wiki/sensing/azure-block-detection.md | 10 +- wiki/sensing/delphi-esr-radar.md | 4 +- wiki/sensing/gps.md | 8 +- wiki/sensing/pcl.md | 18 ++-- wiki/sensing/robotic-total-stations.md | 4 +- wiki/sensing/speech-recognition.md | 2 +- wiki/sensing/stag.md | 2 +- .../trajectory_extraction_static_camera.md | 14 +-- .../ultrawideband-beacon-positioning.md | 10 +- wiki/simulation/NDT-Matching-with-Autoware.md | 2 +- ...wning-and-Controlling-Vehicles-in-CARLA.md | 10 +- wiki/simulation/__all_subsections.md | 26 +++--- .../simulating-vehicle-using-autoware.md | 14 +-- wiki/simulation/simulation-isaacsim-setup.md | 8 +- .../Cartographer-ROS-Integration.md | 12 +-- wiki/state-estimation/__all_subsections.md | 34 +++---- .../adaptive-monte-carlo-localization.md | 4 +- .../gps-lacking-state-estimation-sensors.md | 6 +- .../radar-camera-sensor-fusion.md | 10 +- wiki/state-estimation/visual-servoing.md | 2 +- .../__all_subsections.md | 28 +++--- .../cable-management.md | 8 +- wiki/system-design-development/pcb-design.md | 8 +- .../subsystem-interface-modeling.md | 12 +-- wiki/tools/Qtcreator-ros.md | 22 ++--- wiki/tools/__all_subsections.md | 86 +++++++++--------- wiki/tools/altium-circuitmaker.md | 16 ++-- wiki/tools/clion.md | 14 +-- ...editors-introduction-to-vs-code-and-vim.md | 22 ++--- wiki/tools/docker-security.md | 4 +- wiki/tools/ros-gui.md | 12 +-- wiki/tools/roslibjs.md | 2 +- 342 files changed, 469 insertions(+), 469 deletions(-) rename assets/images/{ => actuation}/ULN2003AMotorController-8ee22.png (100%) rename assets/images/{ => actuation}/moveit_setup_assistant_author_information.png (100%) rename assets/images/{ => actuation}/moveit_setup_assistant_collision_check.png (100%) rename assets/images/{ => actuation}/moveit_setup_assistant_controllers.png (100%) rename assets/images/{ => actuation}/moveit_setup_assistant_end.png (100%) rename assets/images/{ => actuation}/moveit_setup_assistant_end_effectors.png (100%) rename assets/images/{ => actuation}/moveit_setup_assistant_passive_joints.png (100%) rename assets/images/{ => actuation}/moveit_setup_assistant_perception.png (100%) rename assets/images/{ => actuation}/moveit_setup_assistant_planning_group_kinematic_chain.png (100%) rename assets/images/{ => actuation}/moveit_setup_assistant_planning_groups.png (100%) rename assets/images/{ => actuation}/moveit_setup_assistant_robot_poses.png (100%) rename assets/images/{ => actuation}/moveit_setup_assistant_simulation.png (100%) rename assets/images/{ => actuation}/moveit_setup_assistant_start.png (100%) rename assets/images/{ => actuation}/moveit_setup_assistant_virtual_joints.png (100%) rename assets/images/{ => actuation}/pure_pursuit_geometry.png (100%) rename assets/images/{ => actuation}/steer-by-wire.png (100%) rename assets/images/{ => actuation}/throttle-by-wire.png (100%) rename assets/images/{ => common-platforms}/DJI.png (100%) rename assets/images/{ => common-platforms}/DjiM100.png (100%) rename assets/images/{ => common-platforms}/KHEPERA4.png (100%) rename assets/images/{ => common-platforms}/form_factor.png (100%) rename assets/images/{ => common-platforms}/moveit_1.png (100%) rename assets/images/{ => common-platforms}/moveit_2.png (100%) rename assets/images/{ => common-platforms}/moveit_3.png (100%) rename assets/images/{ => common-platforms}/moveit_4.png (100%) rename assets/images/{ => common-platforms}/power-module.png (100%) rename assets/images/{ => common-platforms}/px4-ardupilot.png (100%) rename assets/images/{ => common-platforms}/unitree_top.png (100%) rename assets/images/{ => common-platforms}/wire.webp (100%) rename assets/images/{ => common-platforms}/wired.png (100%) rename assets/images/{ => common-platforms}/wiring-diagram.jpg (100%) rename assets/images/{ => computing}/Arduino-2369d.png (100%) rename assets/images/{ => computing}/Arduino-c30e6.png (100%) rename assets/images/{ => computing}/Arduino-d9b3f.png (100%) rename assets/images/{ => computing}/Arduino-de522.png (100%) rename assets/images/{ => computing}/nvidia-cuda.png (100%) rename assets/images/{ => computing}/nvidia-cudnn.png (100%) rename assets/images/{ => fabrication}/3DPrinters-10477.png (100%) rename assets/images/{ => fabrication}/3DPrinters-a3389.png (100%) rename assets/images/{ => fabrication}/SeriesA_APIKey.jpg (100%) rename assets/images/{ => fabrication}/SeriesA_PLA_SP.jpg (100%) rename assets/images/{ => interfacing}/micro-ros-architecture.png (100%) rename assets/images/{ => interfacing}/micro-ros-docker.png (100%) rename assets/images/{ => interfacing}/ros-bridge.png (100%) rename assets/images/{ => machine-learning}/Gr00t.png (100%) rename assets/images/{ => machine-learning}/NLP_image1.png (100%) rename assets/images/{ => machine-learning}/NLP_image2.png (100%) rename assets/images/{ => machine-learning}/NLP_image3.png (100%) rename assets/images/{ => machine-learning}/NLP_image4.png (100%) rename assets/images/{ => machine-learning}/bucket_fill.png (100%) rename assets/images/{ => machine-learning}/diffusion_policy_diagram.png (100%) rename assets/images/{ => machine-learning}/manage_layers.png (100%) rename assets/images/{ => machine-learning}/mask_annotation.png (100%) rename assets/images/{ => machine-learning}/mediapipe_platforms.png (100%) rename assets/images/{ => machine-learning}/mediapipe_solutions.png (100%) rename assets/images/{ => machine-learning}/new_layer.png (100%) rename assets/images/{ => machine-learning}/select_tool.png (100%) rename assets/images/{ => machine-learning}/system1system2.png (100%) rename assets/images/{ => machine-learning}/yolo_demo.png (100%) rename assets/images/{ => machine-learning}/yolov5_onnx_input.png (100%) rename assets/images/{ => machine-learning}/yolov5_onnx_output.png (100%) rename assets/images/{ => math}/gpConnection.png (100%) rename assets/images/{ => math}/mixedGaussian.jpg (100%) rename assets/images/{ => math}/uncertainty.png (100%) rename assets/images/{ => networking}/ROSDistributed-1b70c.png (100%) rename assets/images/{ => networking}/XbeeProDigiMesh900-1fc56.png (100%) rename assets/images/{ => planning}/2dwr1.png (100%) rename assets/images/{ => planning}/abstract_execution_classes.png (100%) rename assets/images/{ => planning}/abstract_navigation_server.png (100%) rename assets/images/{ => planning}/abstract_plugin_classes.png (100%) rename assets/images/{ => planning}/astar_h_viz.png (100%) rename assets/images/{ => planning}/cartesian.png (100%) rename assets/images/{ => planning}/cell_traversal.png (100%) rename assets/images/{ => planning}/central_planner.png (100%) rename assets/images/{ => planning}/clr1.png (100%) rename assets/images/{ => planning}/clr2.png (100%) rename assets/images/{ => planning}/coverage_planner_event_types.png (100%) rename assets/images/{ => planning}/coverage_planner_steps.png (100%) rename assets/images/{ => planning}/f_path.png (100%) rename assets/images/{ => planning}/lt_controller.png (100%) rename assets/images/{ => planning}/mission_exec.png (100%) rename assets/images/{ => planning}/move_base_flex_full.png (100%) rename assets/images/{ => planning}/multi_vs_single_query.png (100%) rename assets/images/{ => planning}/path_planning.png (100%) rename assets/images/{ => planning}/planning_intro.png (100%) rename assets/images/{ => planning}/prioritised_astar.png (100%) rename assets/images/{ => planning}/ref_path.png (100%) rename assets/images/{ => planning}/rrtstar.png (100%) rename assets/images/{ => planning}/simulation_testing.png (100%) rename assets/images/{ => planning}/trapezoid_decomposition.png (100%) rename assets/images/{ => planning}/vader_planning_seq.png (100%) rename assets/images/{ => planning}/velocity_obstacles.png (100%) rename assets/images/{ => programming}/BoostLibrary-f962f.png (100%) rename assets/images/{ => programming}/EigenLibrary-35715.png (100%) rename assets/images/{ => programming}/cmake_file_structure.png (100%) rename assets/images/{ => programming}/state_machine.png (100%) rename assets/images/{ => project-management}/card-system.png (100%) rename assets/images/{ => project-management}/jira_burndown_chart.png (100%) rename assets/images/{ => project-management}/meeting-notes.png (100%) rename assets/images/{ => project-management}/milestones.png (100%) rename assets/images/{ => project-management}/office-hours.png (100%) rename assets/images/{ => project-management}/project-schedule.png (100%) rename assets/images/{ => project-management}/task-list.png (100%) rename assets/images/{ => robotics-project-guide}/CoppeliaSim_sim.jpg (100%) rename assets/images/{ => robotics-project-guide}/airsim_sim.png (100%) rename assets/images/{ => robotics-project-guide}/all_sim.png (100%) rename assets/images/{ => robotics-project-guide}/drone_image.png (100%) rename assets/images/{ => robotics-project-guide}/gazebo_sim.png (100%) rename assets/images/{ => robotics-project-guide}/go2_image.jpg (100%) rename assets/images/{ => robotics-project-guide}/go2_package.png (100%) rename assets/images/{ => robotics-project-guide}/isaaclab_sim.jpg (100%) rename assets/images/{ => robotics-project-guide}/manipulators_all.png (100%) rename assets/images/{ => robotics-project-guide}/mujoco_sim.jpg (100%) rename assets/images/{ => robotics-project-guide}/openaigym_sim.png (100%) rename assets/images/{ => robotics-project-guide}/pybullet_sim.png (100%) rename assets/images/{ => robotics-project-guide}/quadrotors_all.png (100%) rename assets/images/{ => robotics-project-guide}/quadrupeds_all.png (100%) rename assets/images/{ => robotics-project-guide}/robot_overview.png (100%) rename assets/images/{ => robotics-project-guide}/unity_sim.png (100%) rename assets/images/{ => robotics-project-guide}/urdf_to_sim.png (100%) rename assets/images/{ => robotics-project-guide}/wheeled_robot_image.png (100%) rename assets/images/{ => robotics-project-guide}/wheeled_robots_all.png (100%) rename assets/images/{ => sensing}/AdafruitGPS-69ceb.png (100%) rename assets/images/{ => sensing}/AdafruitGPS-c715f.png (100%) rename assets/images/{ => sensing}/Data_capture.png (100%) rename assets/images/{ => sensing}/DelphiESRRadar-8394b.png (100%) rename assets/images/{ => sensing}/DelphiESRRadar-eba02.png (100%) rename assets/images/{ => sensing}/HD_map.png (100%) rename assets/images/{ => sensing}/apriltags-6719c.png (100%) rename assets/images/{ => sensing}/assets_decawave_example_multi_anchor.png (100%) rename assets/images/{ => sensing}/assets_leica_field_image.jpg (100%) rename assets/images/{ => sensing}/bev_fifthcraig.jpg (100%) rename assets/images/{ => sensing}/cluster.png (100%) rename assets/images/{ => sensing}/costmatrix_formation.png (100%) rename assets/images/{ => sensing}/cropped.png (100%) rename assets/images/{ => sensing}/detection_sort_output.png (100%) rename assets/images/{ => sensing}/distance.png (100%) rename assets/images/{ => sensing}/downsampled.png (100%) rename assets/images/{ => sensing}/drtls_app.png (100%) rename assets/images/{ => sensing}/drtls_ids.png (100%) rename assets/images/{ => sensing}/dwm_arch.png (100%) rename assets/images/{ => sensing}/gdop_example.png (100%) rename assets/images/{ => sensing}/gps1.png (100%) rename assets/images/{ => sensing}/gps2.png (100%) rename assets/images/{ => sensing}/gps3.png (100%) rename assets/images/{ => sensing}/gps4.png (100%) rename assets/images/{ => sensing}/hsv_img.png (100%) rename assets/images/{ => sensing}/kinect.jpg (100%) rename assets/images/{ => sensing}/leica_360_prism.jpeg (100%) rename assets/images/{ => sensing}/norm_img.png (100%) rename assets/images/{ => sensing}/original.png (100%) rename assets/images/{ => sensing}/pavucontrol.png (100%) rename assets/images/{ => sensing}/pipeline.png (100%) rename assets/images/{ => sensing}/ransac1.png (100%) rename assets/images/{ => sensing}/ransac2.png (100%) rename assets/images/{ => sensing}/realsense.jpg (100%) rename assets/images/{ => sensing}/rgb_vector.png (100%) rename assets/images/{ => sensing}/slam.png (100%) rename assets/images/{ => sensing}/stag_exposure.gif (100%) rename assets/images/{ => sensing}/tracking_results.png (100%) rename assets/images/{ => sensing}/zoom1.png (100%) rename assets/images/{ => simulation}/autoware_gui.png (100%) rename assets/images/{ => simulation}/autoware_map.png (100%) rename assets/images/{ => simulation}/autoware_models.png (100%) rename assets/images/{ => simulation}/autoware_pkgs.png (100%) rename assets/images/{ => simulation}/autoware_plan.png (100%) rename assets/images/{ => simulation}/autoware_rviz.png (100%) rename assets/images/{ => simulation}/autoware_worlds.png (100%) rename assets/images/{ => simulation}/carla2.png (100%) rename assets/images/{ => simulation}/carla3.png (100%) rename assets/images/{ => simulation}/carla4.png (100%) rename assets/images/{ => simulation}/carlaTrack.gif (100%) rename assets/images/{ => simulation}/carla_opning.png (100%) rename assets/images/{ => simulation}/carter.png (100%) rename assets/images/{ => simulation}/isaac_simpleroom.png (100%) rename assets/images/{ => simulation}/nav2.png (100%) rename assets/images/{ => simulation}/pdf.png (100%) rename assets/images/{ => simulation}/realsense.png (100%) rename assets/images/{ => state-estimation}/AdaptiveMonteCarloLocalization-0d322.png (100%) rename assets/images/{ => state-estimation}/AdaptiveMonteCarloLocalization-65e37.png (100%) rename assets/images/{ => state-estimation}/Tracker-01.PNG (100%) rename assets/images/{ => state-estimation}/Tracker-02.PNG (100%) rename assets/images/{ => state-estimation}/camera-radar-targets.png (100%) rename assets/images/{ => state-estimation}/carto-1.png (100%) rename assets/images/{ => state-estimation}/carto-2.png (100%) rename assets/images/{ => state-estimation}/carto-3.jpeg (100%) rename assets/images/{ => state-estimation}/carto-4.png (100%) rename assets/images/{ => state-estimation}/carto-5.png (100%) rename assets/images/{ => state-estimation}/carto-6.png (100%) rename assets/images/{ => state-estimation}/decawave_example_multi_anchor.png (100%) rename assets/images/{ => state-estimation}/ipm_two.png (100%) rename assets/images/{ => state-estimation}/leica_field_image.jpg (100%) rename assets/images/{ => state-estimation}/marvelmind_example.jpg (100%) rename assets/images/{ => state-estimation}/occupancy-grid.png (100%) rename assets/images/{ => state-estimation}/servoing-action.png (100%) rename assets/images/{ => state-estimation}/sort-tracker.jpg (100%) rename assets/images/{ => system-design-development}/CableManagement-654ae.png (100%) rename assets/images/{ => system-design-development}/CableManagement-6f4d5.png (100%) rename assets/images/{ => system-design-development}/CableManagement-b3a03.png (100%) rename assets/images/{ => system-design-development}/CableManagement-c5b3a.png (100%) rename assets/images/{ => system-design-development}/PCBDesignNotes-05e85.png (100%) rename assets/images/{ => system-design-development}/PCBDesignNotes-09baf.png (100%) rename assets/images/{ => system-design-development}/PCBDesignNotes-8fedc.png (100%) rename assets/images/{ => system-design-development}/PCBDesignNotes-d5ba2.png (100%) rename assets/images/{ => system-design-development}/SubsystemInterfaceModeling-4e816.png (100%) rename assets/images/{ => system-design-development}/SubsystemInterfaceModeling-7097d.png (100%) rename assets/images/{ => system-design-development}/SubsystemInterfaceModeling-73d8e.png (100%) rename assets/images/{ => system-design-development}/SubsystemInterfaceModeling-8748c.png (100%) rename assets/images/{ => system-design-development}/SubsystemInterfaceModeling-8e94f.png (100%) rename assets/images/{ => system-design-development}/SubsystemInterfaceModeling-fb765.png (100%) rename assets/images/{ => tools}/AltiumCircuitmaker-1caa4.png (100%) rename assets/images/{ => tools}/AltiumCircuitmaker-3f756.png (100%) rename assets/images/{ => tools}/AltiumCircuitmaker-4b425.png (100%) rename assets/images/{ => tools}/AltiumCircuitmaker-78555.png (100%) rename assets/images/{ => tools}/AltiumCircuitmaker-8aecd.png (100%) rename assets/images/{ => tools}/AltiumCircuitmaker-e83b9.png (100%) rename assets/images/{ => tools}/AltiumCircuitmaker-f5782.png (100%) rename assets/images/{ => tools}/AltiumCircuitmaker-fcf01.png (100%) rename assets/images/{ => tools}/PyQt-final.png (100%) rename assets/images/{ => tools}/PyQt-green.png (100%) rename assets/images/{ => tools}/PyQt-logs.png (100%) rename assets/images/{ => tools}/PyQt-orange.png (100%) rename assets/images/{ => tools}/PyQt-red.png (100%) rename assets/images/{ => tools}/PyQt-yellow.png (100%) rename assets/images/{ => tools}/Qtcreator-ros-new-project-class-menu.png (100%) rename assets/images/{ => tools}/Qtcreator-ros-new-project-design.png (100%) rename assets/images/{ => tools}/Qtcreator-ros-new-project-edit-text.png (100%) rename assets/images/{ => tools}/Qtcreator-ros-new-project-kit.png (100%) rename assets/images/{ => tools}/Qtcreator-ros-new-project-menu.png (100%) rename assets/images/{ => tools}/Qtcreator-ros-new-project-run.png (100%) rename assets/images/{ => tools}/Qtcreator-ros-new-project-run2.png (100%) rename assets/images/{ => tools}/Qtcreator-ros-new-project-ui-elements.png (100%) rename assets/images/{ => tools}/Qtcreator-ros-new-project-ui-obj-rename.png (100%) rename assets/images/{ => tools}/Qtcreator-ros-new-project-ui-obj.png (100%) rename assets/images/{ => tools}/Qtcreator-ros-new-project.png (100%) rename assets/images/{ => tools}/debug1.jpeg (100%) rename assets/images/{ => tools}/debug2.jpeg (100%) rename assets/images/{ => tools}/debug3.jpeg (100%) rename assets/images/{ => tools}/deltaviz.jpg (100%) rename assets/images/{ => tools}/docker_socket.png (100%) rename assets/images/{ => tools}/privesc.png (100%) rename assets/images/{ => tools}/refactor1.png (100%) rename assets/images/{ => tools}/refactor2.jpeg (100%) rename assets/images/{ => tools}/refactor3.png (100%) rename assets/images/{ => tools}/refactor4.png (100%) rename assets/images/{ => tools}/vscode10.png (100%) rename assets/images/{ => tools}/vscode11.png (100%) rename assets/images/{ => tools}/vscode12.png (100%) rename assets/images/{ => tools}/vscode13.png (100%) rename assets/images/{ => tools}/vscode2.png (100%) rename assets/images/{ => tools}/vscode3.png (100%) rename assets/images/{ => tools}/vscode4.png (100%) rename assets/images/{ => tools}/vscode5.png (100%) rename assets/images/{ => tools}/vscode6.png (100%) rename assets/images/{ => tools}/vscode8.png (100%) rename assets/images/{ => tools}/vscode9.png (100%) diff --git a/assets/images/ULN2003AMotorController-8ee22.png b/assets/images/actuation/ULN2003AMotorController-8ee22.png similarity index 100% rename from assets/images/ULN2003AMotorController-8ee22.png rename to assets/images/actuation/ULN2003AMotorController-8ee22.png diff --git a/assets/images/moveit_setup_assistant_author_information.png b/assets/images/actuation/moveit_setup_assistant_author_information.png similarity index 100% rename from assets/images/moveit_setup_assistant_author_information.png rename to assets/images/actuation/moveit_setup_assistant_author_information.png diff --git a/assets/images/moveit_setup_assistant_collision_check.png b/assets/images/actuation/moveit_setup_assistant_collision_check.png similarity index 100% rename from assets/images/moveit_setup_assistant_collision_check.png rename to assets/images/actuation/moveit_setup_assistant_collision_check.png diff --git a/assets/images/moveit_setup_assistant_controllers.png b/assets/images/actuation/moveit_setup_assistant_controllers.png similarity index 100% rename from assets/images/moveit_setup_assistant_controllers.png rename to assets/images/actuation/moveit_setup_assistant_controllers.png diff --git a/assets/images/moveit_setup_assistant_end.png b/assets/images/actuation/moveit_setup_assistant_end.png similarity index 100% rename from assets/images/moveit_setup_assistant_end.png rename to assets/images/actuation/moveit_setup_assistant_end.png diff --git a/assets/images/moveit_setup_assistant_end_effectors.png b/assets/images/actuation/moveit_setup_assistant_end_effectors.png similarity index 100% rename from assets/images/moveit_setup_assistant_end_effectors.png rename to assets/images/actuation/moveit_setup_assistant_end_effectors.png diff --git a/assets/images/moveit_setup_assistant_passive_joints.png b/assets/images/actuation/moveit_setup_assistant_passive_joints.png similarity index 100% rename from assets/images/moveit_setup_assistant_passive_joints.png rename to assets/images/actuation/moveit_setup_assistant_passive_joints.png diff --git a/assets/images/moveit_setup_assistant_perception.png b/assets/images/actuation/moveit_setup_assistant_perception.png similarity index 100% rename from assets/images/moveit_setup_assistant_perception.png rename to assets/images/actuation/moveit_setup_assistant_perception.png diff --git a/assets/images/moveit_setup_assistant_planning_group_kinematic_chain.png b/assets/images/actuation/moveit_setup_assistant_planning_group_kinematic_chain.png similarity index 100% rename from assets/images/moveit_setup_assistant_planning_group_kinematic_chain.png rename to assets/images/actuation/moveit_setup_assistant_planning_group_kinematic_chain.png diff --git a/assets/images/moveit_setup_assistant_planning_groups.png b/assets/images/actuation/moveit_setup_assistant_planning_groups.png similarity index 100% rename from assets/images/moveit_setup_assistant_planning_groups.png rename to assets/images/actuation/moveit_setup_assistant_planning_groups.png diff --git a/assets/images/moveit_setup_assistant_robot_poses.png b/assets/images/actuation/moveit_setup_assistant_robot_poses.png similarity index 100% rename from assets/images/moveit_setup_assistant_robot_poses.png rename to assets/images/actuation/moveit_setup_assistant_robot_poses.png diff --git a/assets/images/moveit_setup_assistant_simulation.png b/assets/images/actuation/moveit_setup_assistant_simulation.png similarity index 100% rename from assets/images/moveit_setup_assistant_simulation.png rename to assets/images/actuation/moveit_setup_assistant_simulation.png diff --git a/assets/images/moveit_setup_assistant_start.png b/assets/images/actuation/moveit_setup_assistant_start.png similarity index 100% rename from assets/images/moveit_setup_assistant_start.png rename to assets/images/actuation/moveit_setup_assistant_start.png diff --git a/assets/images/moveit_setup_assistant_virtual_joints.png b/assets/images/actuation/moveit_setup_assistant_virtual_joints.png similarity index 100% rename from assets/images/moveit_setup_assistant_virtual_joints.png rename to assets/images/actuation/moveit_setup_assistant_virtual_joints.png diff --git a/assets/images/pure_pursuit_geometry.png b/assets/images/actuation/pure_pursuit_geometry.png similarity index 100% rename from assets/images/pure_pursuit_geometry.png rename to assets/images/actuation/pure_pursuit_geometry.png diff --git a/assets/images/steer-by-wire.png b/assets/images/actuation/steer-by-wire.png similarity index 100% rename from assets/images/steer-by-wire.png rename to assets/images/actuation/steer-by-wire.png diff --git a/assets/images/throttle-by-wire.png b/assets/images/actuation/throttle-by-wire.png similarity index 100% rename from assets/images/throttle-by-wire.png rename to assets/images/actuation/throttle-by-wire.png diff --git a/assets/images/DJI.png b/assets/images/common-platforms/DJI.png similarity index 100% rename from assets/images/DJI.png rename to assets/images/common-platforms/DJI.png diff --git a/assets/images/DjiM100.png b/assets/images/common-platforms/DjiM100.png similarity index 100% rename from assets/images/DjiM100.png rename to assets/images/common-platforms/DjiM100.png diff --git a/assets/images/KHEPERA4.png b/assets/images/common-platforms/KHEPERA4.png similarity index 100% rename from assets/images/KHEPERA4.png rename to assets/images/common-platforms/KHEPERA4.png diff --git a/assets/images/form_factor.png b/assets/images/common-platforms/form_factor.png similarity index 100% rename from assets/images/form_factor.png rename to assets/images/common-platforms/form_factor.png diff --git a/assets/images/moveit_1.png b/assets/images/common-platforms/moveit_1.png similarity index 100% rename from assets/images/moveit_1.png rename to assets/images/common-platforms/moveit_1.png diff --git a/assets/images/moveit_2.png b/assets/images/common-platforms/moveit_2.png similarity index 100% rename from assets/images/moveit_2.png rename to assets/images/common-platforms/moveit_2.png diff --git a/assets/images/moveit_3.png b/assets/images/common-platforms/moveit_3.png similarity index 100% rename from assets/images/moveit_3.png rename to assets/images/common-platforms/moveit_3.png diff --git a/assets/images/moveit_4.png b/assets/images/common-platforms/moveit_4.png similarity index 100% rename from assets/images/moveit_4.png rename to assets/images/common-platforms/moveit_4.png diff --git a/assets/images/power-module.png b/assets/images/common-platforms/power-module.png similarity index 100% rename from assets/images/power-module.png rename to assets/images/common-platforms/power-module.png diff --git a/assets/images/px4-ardupilot.png b/assets/images/common-platforms/px4-ardupilot.png similarity index 100% rename from assets/images/px4-ardupilot.png rename to assets/images/common-platforms/px4-ardupilot.png diff --git a/assets/images/unitree_top.png b/assets/images/common-platforms/unitree_top.png similarity index 100% rename from assets/images/unitree_top.png rename to assets/images/common-platforms/unitree_top.png diff --git a/assets/images/wire.webp b/assets/images/common-platforms/wire.webp similarity index 100% rename from assets/images/wire.webp rename to assets/images/common-platforms/wire.webp diff --git a/assets/images/wired.png b/assets/images/common-platforms/wired.png similarity index 100% rename from assets/images/wired.png rename to assets/images/common-platforms/wired.png diff --git a/assets/images/wiring-diagram.jpg b/assets/images/common-platforms/wiring-diagram.jpg similarity index 100% rename from assets/images/wiring-diagram.jpg rename to assets/images/common-platforms/wiring-diagram.jpg diff --git a/assets/images/Arduino-2369d.png b/assets/images/computing/Arduino-2369d.png similarity index 100% rename from assets/images/Arduino-2369d.png rename to assets/images/computing/Arduino-2369d.png diff --git a/assets/images/Arduino-c30e6.png b/assets/images/computing/Arduino-c30e6.png similarity index 100% rename from assets/images/Arduino-c30e6.png rename to assets/images/computing/Arduino-c30e6.png diff --git a/assets/images/Arduino-d9b3f.png b/assets/images/computing/Arduino-d9b3f.png similarity index 100% rename from assets/images/Arduino-d9b3f.png rename to assets/images/computing/Arduino-d9b3f.png diff --git a/assets/images/Arduino-de522.png b/assets/images/computing/Arduino-de522.png similarity index 100% rename from assets/images/Arduino-de522.png rename to assets/images/computing/Arduino-de522.png diff --git a/assets/images/nvidia-cuda.png b/assets/images/computing/nvidia-cuda.png similarity index 100% rename from assets/images/nvidia-cuda.png rename to assets/images/computing/nvidia-cuda.png diff --git a/assets/images/nvidia-cudnn.png b/assets/images/computing/nvidia-cudnn.png similarity index 100% rename from assets/images/nvidia-cudnn.png rename to assets/images/computing/nvidia-cudnn.png diff --git a/assets/images/3DPrinters-10477.png b/assets/images/fabrication/3DPrinters-10477.png similarity index 100% rename from assets/images/3DPrinters-10477.png rename to assets/images/fabrication/3DPrinters-10477.png diff --git a/assets/images/3DPrinters-a3389.png b/assets/images/fabrication/3DPrinters-a3389.png similarity index 100% rename from assets/images/3DPrinters-a3389.png rename to assets/images/fabrication/3DPrinters-a3389.png diff --git a/assets/images/SeriesA_APIKey.jpg b/assets/images/fabrication/SeriesA_APIKey.jpg similarity index 100% rename from assets/images/SeriesA_APIKey.jpg rename to assets/images/fabrication/SeriesA_APIKey.jpg diff --git a/assets/images/SeriesA_PLA_SP.jpg b/assets/images/fabrication/SeriesA_PLA_SP.jpg similarity index 100% rename from assets/images/SeriesA_PLA_SP.jpg rename to assets/images/fabrication/SeriesA_PLA_SP.jpg diff --git a/assets/images/micro-ros-architecture.png b/assets/images/interfacing/micro-ros-architecture.png similarity index 100% rename from assets/images/micro-ros-architecture.png rename to assets/images/interfacing/micro-ros-architecture.png diff --git a/assets/images/micro-ros-docker.png b/assets/images/interfacing/micro-ros-docker.png similarity index 100% rename from assets/images/micro-ros-docker.png rename to assets/images/interfacing/micro-ros-docker.png diff --git a/assets/images/ros-bridge.png b/assets/images/interfacing/ros-bridge.png similarity index 100% rename from assets/images/ros-bridge.png rename to assets/images/interfacing/ros-bridge.png diff --git a/assets/images/Gr00t.png b/assets/images/machine-learning/Gr00t.png similarity index 100% rename from assets/images/Gr00t.png rename to assets/images/machine-learning/Gr00t.png diff --git a/assets/images/NLP_image1.png b/assets/images/machine-learning/NLP_image1.png similarity index 100% rename from assets/images/NLP_image1.png rename to assets/images/machine-learning/NLP_image1.png diff --git a/assets/images/NLP_image2.png b/assets/images/machine-learning/NLP_image2.png similarity index 100% rename from assets/images/NLP_image2.png rename to assets/images/machine-learning/NLP_image2.png diff --git a/assets/images/NLP_image3.png b/assets/images/machine-learning/NLP_image3.png similarity index 100% rename from assets/images/NLP_image3.png rename to assets/images/machine-learning/NLP_image3.png diff --git a/assets/images/NLP_image4.png b/assets/images/machine-learning/NLP_image4.png similarity index 100% rename from assets/images/NLP_image4.png rename to assets/images/machine-learning/NLP_image4.png diff --git a/assets/images/bucket_fill.png b/assets/images/machine-learning/bucket_fill.png similarity index 100% rename from assets/images/bucket_fill.png rename to assets/images/machine-learning/bucket_fill.png diff --git a/assets/images/diffusion_policy_diagram.png b/assets/images/machine-learning/diffusion_policy_diagram.png similarity index 100% rename from assets/images/diffusion_policy_diagram.png rename to assets/images/machine-learning/diffusion_policy_diagram.png diff --git a/assets/images/manage_layers.png b/assets/images/machine-learning/manage_layers.png similarity index 100% rename from assets/images/manage_layers.png rename to assets/images/machine-learning/manage_layers.png diff --git a/assets/images/mask_annotation.png b/assets/images/machine-learning/mask_annotation.png similarity index 100% rename from assets/images/mask_annotation.png rename to assets/images/machine-learning/mask_annotation.png diff --git a/assets/images/mediapipe_platforms.png b/assets/images/machine-learning/mediapipe_platforms.png similarity index 100% rename from assets/images/mediapipe_platforms.png rename to assets/images/machine-learning/mediapipe_platforms.png diff --git a/assets/images/mediapipe_solutions.png b/assets/images/machine-learning/mediapipe_solutions.png similarity index 100% rename from assets/images/mediapipe_solutions.png rename to assets/images/machine-learning/mediapipe_solutions.png diff --git a/assets/images/new_layer.png b/assets/images/machine-learning/new_layer.png similarity index 100% rename from assets/images/new_layer.png rename to assets/images/machine-learning/new_layer.png diff --git a/assets/images/select_tool.png b/assets/images/machine-learning/select_tool.png similarity index 100% rename from assets/images/select_tool.png rename to assets/images/machine-learning/select_tool.png diff --git a/assets/images/system1system2.png b/assets/images/machine-learning/system1system2.png similarity index 100% rename from assets/images/system1system2.png rename to assets/images/machine-learning/system1system2.png diff --git a/assets/images/yolo_demo.png b/assets/images/machine-learning/yolo_demo.png similarity index 100% rename from assets/images/yolo_demo.png rename to assets/images/machine-learning/yolo_demo.png diff --git a/assets/images/yolov5_onnx_input.png b/assets/images/machine-learning/yolov5_onnx_input.png similarity index 100% rename from assets/images/yolov5_onnx_input.png rename to assets/images/machine-learning/yolov5_onnx_input.png diff --git a/assets/images/yolov5_onnx_output.png b/assets/images/machine-learning/yolov5_onnx_output.png similarity index 100% rename from assets/images/yolov5_onnx_output.png rename to assets/images/machine-learning/yolov5_onnx_output.png diff --git a/assets/images/gpConnection.png b/assets/images/math/gpConnection.png similarity index 100% rename from assets/images/gpConnection.png rename to assets/images/math/gpConnection.png diff --git a/assets/images/mixedGaussian.jpg b/assets/images/math/mixedGaussian.jpg similarity index 100% rename from assets/images/mixedGaussian.jpg rename to assets/images/math/mixedGaussian.jpg diff --git a/assets/images/uncertainty.png b/assets/images/math/uncertainty.png similarity index 100% rename from assets/images/uncertainty.png rename to assets/images/math/uncertainty.png diff --git a/assets/images/ROSDistributed-1b70c.png b/assets/images/networking/ROSDistributed-1b70c.png similarity index 100% rename from assets/images/ROSDistributed-1b70c.png rename to assets/images/networking/ROSDistributed-1b70c.png diff --git a/assets/images/XbeeProDigiMesh900-1fc56.png b/assets/images/networking/XbeeProDigiMesh900-1fc56.png similarity index 100% rename from assets/images/XbeeProDigiMesh900-1fc56.png rename to assets/images/networking/XbeeProDigiMesh900-1fc56.png diff --git a/assets/images/2dwr1.png b/assets/images/planning/2dwr1.png similarity index 100% rename from assets/images/2dwr1.png rename to assets/images/planning/2dwr1.png diff --git a/assets/images/abstract_execution_classes.png b/assets/images/planning/abstract_execution_classes.png similarity index 100% rename from assets/images/abstract_execution_classes.png rename to assets/images/planning/abstract_execution_classes.png diff --git a/assets/images/abstract_navigation_server.png b/assets/images/planning/abstract_navigation_server.png similarity index 100% rename from assets/images/abstract_navigation_server.png rename to assets/images/planning/abstract_navigation_server.png diff --git a/assets/images/abstract_plugin_classes.png b/assets/images/planning/abstract_plugin_classes.png similarity index 100% rename from assets/images/abstract_plugin_classes.png rename to assets/images/planning/abstract_plugin_classes.png diff --git a/assets/images/astar_h_viz.png b/assets/images/planning/astar_h_viz.png similarity index 100% rename from assets/images/astar_h_viz.png rename to assets/images/planning/astar_h_viz.png diff --git a/assets/images/cartesian.png b/assets/images/planning/cartesian.png similarity index 100% rename from assets/images/cartesian.png rename to assets/images/planning/cartesian.png diff --git a/assets/images/cell_traversal.png b/assets/images/planning/cell_traversal.png similarity index 100% rename from assets/images/cell_traversal.png rename to assets/images/planning/cell_traversal.png diff --git a/assets/images/central_planner.png b/assets/images/planning/central_planner.png similarity index 100% rename from assets/images/central_planner.png rename to assets/images/planning/central_planner.png diff --git a/assets/images/clr1.png b/assets/images/planning/clr1.png similarity index 100% rename from assets/images/clr1.png rename to assets/images/planning/clr1.png diff --git a/assets/images/clr2.png b/assets/images/planning/clr2.png similarity index 100% rename from assets/images/clr2.png rename to assets/images/planning/clr2.png diff --git a/assets/images/coverage_planner_event_types.png b/assets/images/planning/coverage_planner_event_types.png similarity index 100% rename from assets/images/coverage_planner_event_types.png rename to assets/images/planning/coverage_planner_event_types.png diff --git a/assets/images/coverage_planner_steps.png b/assets/images/planning/coverage_planner_steps.png similarity index 100% rename from assets/images/coverage_planner_steps.png rename to assets/images/planning/coverage_planner_steps.png diff --git a/assets/images/f_path.png b/assets/images/planning/f_path.png similarity index 100% rename from assets/images/f_path.png rename to assets/images/planning/f_path.png diff --git a/assets/images/lt_controller.png b/assets/images/planning/lt_controller.png similarity index 100% rename from assets/images/lt_controller.png rename to assets/images/planning/lt_controller.png diff --git a/assets/images/mission_exec.png b/assets/images/planning/mission_exec.png similarity index 100% rename from assets/images/mission_exec.png rename to assets/images/planning/mission_exec.png diff --git a/assets/images/move_base_flex_full.png b/assets/images/planning/move_base_flex_full.png similarity index 100% rename from assets/images/move_base_flex_full.png rename to assets/images/planning/move_base_flex_full.png diff --git a/assets/images/multi_vs_single_query.png b/assets/images/planning/multi_vs_single_query.png similarity index 100% rename from assets/images/multi_vs_single_query.png rename to assets/images/planning/multi_vs_single_query.png diff --git a/assets/images/path_planning.png b/assets/images/planning/path_planning.png similarity index 100% rename from assets/images/path_planning.png rename to assets/images/planning/path_planning.png diff --git a/assets/images/planning_intro.png b/assets/images/planning/planning_intro.png similarity index 100% rename from assets/images/planning_intro.png rename to assets/images/planning/planning_intro.png diff --git a/assets/images/prioritised_astar.png b/assets/images/planning/prioritised_astar.png similarity index 100% rename from assets/images/prioritised_astar.png rename to assets/images/planning/prioritised_astar.png diff --git a/assets/images/ref_path.png b/assets/images/planning/ref_path.png similarity index 100% rename from assets/images/ref_path.png rename to assets/images/planning/ref_path.png diff --git a/assets/images/rrtstar.png b/assets/images/planning/rrtstar.png similarity index 100% rename from assets/images/rrtstar.png rename to assets/images/planning/rrtstar.png diff --git a/assets/images/simulation_testing.png b/assets/images/planning/simulation_testing.png similarity index 100% rename from assets/images/simulation_testing.png rename to assets/images/planning/simulation_testing.png diff --git a/assets/images/trapezoid_decomposition.png b/assets/images/planning/trapezoid_decomposition.png similarity index 100% rename from assets/images/trapezoid_decomposition.png rename to assets/images/planning/trapezoid_decomposition.png diff --git a/assets/images/vader_planning_seq.png b/assets/images/planning/vader_planning_seq.png similarity index 100% rename from assets/images/vader_planning_seq.png rename to assets/images/planning/vader_planning_seq.png diff --git a/assets/images/velocity_obstacles.png b/assets/images/planning/velocity_obstacles.png similarity index 100% rename from assets/images/velocity_obstacles.png rename to assets/images/planning/velocity_obstacles.png diff --git a/assets/images/BoostLibrary-f962f.png b/assets/images/programming/BoostLibrary-f962f.png similarity index 100% rename from assets/images/BoostLibrary-f962f.png rename to assets/images/programming/BoostLibrary-f962f.png diff --git a/assets/images/EigenLibrary-35715.png b/assets/images/programming/EigenLibrary-35715.png similarity index 100% rename from assets/images/EigenLibrary-35715.png rename to assets/images/programming/EigenLibrary-35715.png diff --git a/assets/images/cmake_file_structure.png b/assets/images/programming/cmake_file_structure.png similarity index 100% rename from assets/images/cmake_file_structure.png rename to assets/images/programming/cmake_file_structure.png diff --git a/assets/images/state_machine.png b/assets/images/programming/state_machine.png similarity index 100% rename from assets/images/state_machine.png rename to assets/images/programming/state_machine.png diff --git a/assets/images/card-system.png b/assets/images/project-management/card-system.png similarity index 100% rename from assets/images/card-system.png rename to assets/images/project-management/card-system.png diff --git a/assets/images/jira_burndown_chart.png b/assets/images/project-management/jira_burndown_chart.png similarity index 100% rename from assets/images/jira_burndown_chart.png rename to assets/images/project-management/jira_burndown_chart.png diff --git a/assets/images/meeting-notes.png b/assets/images/project-management/meeting-notes.png similarity index 100% rename from assets/images/meeting-notes.png rename to assets/images/project-management/meeting-notes.png diff --git a/assets/images/milestones.png b/assets/images/project-management/milestones.png similarity index 100% rename from assets/images/milestones.png rename to assets/images/project-management/milestones.png diff --git a/assets/images/office-hours.png b/assets/images/project-management/office-hours.png similarity index 100% rename from assets/images/office-hours.png rename to assets/images/project-management/office-hours.png diff --git a/assets/images/project-schedule.png b/assets/images/project-management/project-schedule.png similarity index 100% rename from assets/images/project-schedule.png rename to assets/images/project-management/project-schedule.png diff --git a/assets/images/task-list.png b/assets/images/project-management/task-list.png similarity index 100% rename from assets/images/task-list.png rename to assets/images/project-management/task-list.png diff --git a/assets/images/CoppeliaSim_sim.jpg b/assets/images/robotics-project-guide/CoppeliaSim_sim.jpg similarity index 100% rename from assets/images/CoppeliaSim_sim.jpg rename to assets/images/robotics-project-guide/CoppeliaSim_sim.jpg diff --git a/assets/images/airsim_sim.png b/assets/images/robotics-project-guide/airsim_sim.png similarity index 100% rename from assets/images/airsim_sim.png rename to assets/images/robotics-project-guide/airsim_sim.png diff --git a/assets/images/all_sim.png b/assets/images/robotics-project-guide/all_sim.png similarity index 100% rename from assets/images/all_sim.png rename to assets/images/robotics-project-guide/all_sim.png diff --git a/assets/images/drone_image.png b/assets/images/robotics-project-guide/drone_image.png similarity index 100% rename from assets/images/drone_image.png rename to assets/images/robotics-project-guide/drone_image.png diff --git a/assets/images/gazebo_sim.png b/assets/images/robotics-project-guide/gazebo_sim.png similarity index 100% rename from assets/images/gazebo_sim.png rename to assets/images/robotics-project-guide/gazebo_sim.png diff --git a/assets/images/go2_image.jpg b/assets/images/robotics-project-guide/go2_image.jpg similarity index 100% rename from assets/images/go2_image.jpg rename to assets/images/robotics-project-guide/go2_image.jpg diff --git a/assets/images/go2_package.png b/assets/images/robotics-project-guide/go2_package.png similarity index 100% rename from assets/images/go2_package.png rename to assets/images/robotics-project-guide/go2_package.png diff --git a/assets/images/isaaclab_sim.jpg b/assets/images/robotics-project-guide/isaaclab_sim.jpg similarity index 100% rename from assets/images/isaaclab_sim.jpg rename to assets/images/robotics-project-guide/isaaclab_sim.jpg diff --git a/assets/images/manipulators_all.png b/assets/images/robotics-project-guide/manipulators_all.png similarity index 100% rename from assets/images/manipulators_all.png rename to assets/images/robotics-project-guide/manipulators_all.png diff --git a/assets/images/mujoco_sim.jpg b/assets/images/robotics-project-guide/mujoco_sim.jpg similarity index 100% rename from assets/images/mujoco_sim.jpg rename to assets/images/robotics-project-guide/mujoco_sim.jpg diff --git a/assets/images/openaigym_sim.png b/assets/images/robotics-project-guide/openaigym_sim.png similarity index 100% rename from assets/images/openaigym_sim.png rename to assets/images/robotics-project-guide/openaigym_sim.png diff --git a/assets/images/pybullet_sim.png b/assets/images/robotics-project-guide/pybullet_sim.png similarity index 100% rename from assets/images/pybullet_sim.png rename to assets/images/robotics-project-guide/pybullet_sim.png diff --git a/assets/images/quadrotors_all.png b/assets/images/robotics-project-guide/quadrotors_all.png similarity index 100% rename from assets/images/quadrotors_all.png rename to assets/images/robotics-project-guide/quadrotors_all.png diff --git a/assets/images/quadrupeds_all.png b/assets/images/robotics-project-guide/quadrupeds_all.png similarity index 100% rename from assets/images/quadrupeds_all.png rename to assets/images/robotics-project-guide/quadrupeds_all.png diff --git a/assets/images/robot_overview.png b/assets/images/robotics-project-guide/robot_overview.png similarity index 100% rename from assets/images/robot_overview.png rename to assets/images/robotics-project-guide/robot_overview.png diff --git a/assets/images/unity_sim.png b/assets/images/robotics-project-guide/unity_sim.png similarity index 100% rename from assets/images/unity_sim.png rename to assets/images/robotics-project-guide/unity_sim.png diff --git a/assets/images/urdf_to_sim.png b/assets/images/robotics-project-guide/urdf_to_sim.png similarity index 100% rename from assets/images/urdf_to_sim.png rename to assets/images/robotics-project-guide/urdf_to_sim.png diff --git a/assets/images/wheeled_robot_image.png b/assets/images/robotics-project-guide/wheeled_robot_image.png similarity index 100% rename from assets/images/wheeled_robot_image.png rename to assets/images/robotics-project-guide/wheeled_robot_image.png diff --git a/assets/images/wheeled_robots_all.png b/assets/images/robotics-project-guide/wheeled_robots_all.png similarity index 100% rename from assets/images/wheeled_robots_all.png rename to assets/images/robotics-project-guide/wheeled_robots_all.png diff --git a/assets/images/AdafruitGPS-69ceb.png b/assets/images/sensing/AdafruitGPS-69ceb.png similarity index 100% rename from assets/images/AdafruitGPS-69ceb.png rename to assets/images/sensing/AdafruitGPS-69ceb.png diff --git a/assets/images/AdafruitGPS-c715f.png b/assets/images/sensing/AdafruitGPS-c715f.png similarity index 100% rename from assets/images/AdafruitGPS-c715f.png rename to assets/images/sensing/AdafruitGPS-c715f.png diff --git a/assets/images/Data_capture.png b/assets/images/sensing/Data_capture.png similarity index 100% rename from assets/images/Data_capture.png rename to assets/images/sensing/Data_capture.png diff --git a/assets/images/DelphiESRRadar-8394b.png b/assets/images/sensing/DelphiESRRadar-8394b.png similarity index 100% rename from assets/images/DelphiESRRadar-8394b.png rename to assets/images/sensing/DelphiESRRadar-8394b.png diff --git a/assets/images/DelphiESRRadar-eba02.png b/assets/images/sensing/DelphiESRRadar-eba02.png similarity index 100% rename from assets/images/DelphiESRRadar-eba02.png rename to assets/images/sensing/DelphiESRRadar-eba02.png diff --git a/assets/images/HD_map.png b/assets/images/sensing/HD_map.png similarity index 100% rename from assets/images/HD_map.png rename to assets/images/sensing/HD_map.png diff --git a/assets/images/apriltags-6719c.png b/assets/images/sensing/apriltags-6719c.png similarity index 100% rename from assets/images/apriltags-6719c.png rename to assets/images/sensing/apriltags-6719c.png diff --git a/assets/images/assets_decawave_example_multi_anchor.png b/assets/images/sensing/assets_decawave_example_multi_anchor.png similarity index 100% rename from assets/images/assets_decawave_example_multi_anchor.png rename to assets/images/sensing/assets_decawave_example_multi_anchor.png diff --git a/assets/images/assets_leica_field_image.jpg b/assets/images/sensing/assets_leica_field_image.jpg similarity index 100% rename from assets/images/assets_leica_field_image.jpg rename to assets/images/sensing/assets_leica_field_image.jpg diff --git a/assets/images/bev_fifthcraig.jpg b/assets/images/sensing/bev_fifthcraig.jpg similarity index 100% rename from assets/images/bev_fifthcraig.jpg rename to assets/images/sensing/bev_fifthcraig.jpg diff --git a/assets/images/cluster.png b/assets/images/sensing/cluster.png similarity index 100% rename from assets/images/cluster.png rename to assets/images/sensing/cluster.png diff --git a/assets/images/costmatrix_formation.png b/assets/images/sensing/costmatrix_formation.png similarity index 100% rename from assets/images/costmatrix_formation.png rename to assets/images/sensing/costmatrix_formation.png diff --git a/assets/images/cropped.png b/assets/images/sensing/cropped.png similarity index 100% rename from assets/images/cropped.png rename to assets/images/sensing/cropped.png diff --git a/assets/images/detection_sort_output.png b/assets/images/sensing/detection_sort_output.png similarity index 100% rename from assets/images/detection_sort_output.png rename to assets/images/sensing/detection_sort_output.png diff --git a/assets/images/distance.png b/assets/images/sensing/distance.png similarity index 100% rename from assets/images/distance.png rename to assets/images/sensing/distance.png diff --git a/assets/images/downsampled.png b/assets/images/sensing/downsampled.png similarity index 100% rename from assets/images/downsampled.png rename to assets/images/sensing/downsampled.png diff --git a/assets/images/drtls_app.png b/assets/images/sensing/drtls_app.png similarity index 100% rename from assets/images/drtls_app.png rename to assets/images/sensing/drtls_app.png diff --git a/assets/images/drtls_ids.png b/assets/images/sensing/drtls_ids.png similarity index 100% rename from assets/images/drtls_ids.png rename to assets/images/sensing/drtls_ids.png diff --git a/assets/images/dwm_arch.png b/assets/images/sensing/dwm_arch.png similarity index 100% rename from assets/images/dwm_arch.png rename to assets/images/sensing/dwm_arch.png diff --git a/assets/images/gdop_example.png b/assets/images/sensing/gdop_example.png similarity index 100% rename from assets/images/gdop_example.png rename to assets/images/sensing/gdop_example.png diff --git a/assets/images/gps1.png b/assets/images/sensing/gps1.png similarity index 100% rename from assets/images/gps1.png rename to assets/images/sensing/gps1.png diff --git a/assets/images/gps2.png b/assets/images/sensing/gps2.png similarity index 100% rename from assets/images/gps2.png rename to assets/images/sensing/gps2.png diff --git a/assets/images/gps3.png b/assets/images/sensing/gps3.png similarity index 100% rename from assets/images/gps3.png rename to assets/images/sensing/gps3.png diff --git a/assets/images/gps4.png b/assets/images/sensing/gps4.png similarity index 100% rename from assets/images/gps4.png rename to assets/images/sensing/gps4.png diff --git a/assets/images/hsv_img.png b/assets/images/sensing/hsv_img.png similarity index 100% rename from assets/images/hsv_img.png rename to assets/images/sensing/hsv_img.png diff --git a/assets/images/kinect.jpg b/assets/images/sensing/kinect.jpg similarity index 100% rename from assets/images/kinect.jpg rename to assets/images/sensing/kinect.jpg diff --git a/assets/images/leica_360_prism.jpeg b/assets/images/sensing/leica_360_prism.jpeg similarity index 100% rename from assets/images/leica_360_prism.jpeg rename to assets/images/sensing/leica_360_prism.jpeg diff --git a/assets/images/norm_img.png b/assets/images/sensing/norm_img.png similarity index 100% rename from assets/images/norm_img.png rename to assets/images/sensing/norm_img.png diff --git a/assets/images/original.png b/assets/images/sensing/original.png similarity index 100% rename from assets/images/original.png rename to assets/images/sensing/original.png diff --git a/assets/images/pavucontrol.png b/assets/images/sensing/pavucontrol.png similarity index 100% rename from assets/images/pavucontrol.png rename to assets/images/sensing/pavucontrol.png diff --git a/assets/images/pipeline.png b/assets/images/sensing/pipeline.png similarity index 100% rename from assets/images/pipeline.png rename to assets/images/sensing/pipeline.png diff --git a/assets/images/ransac1.png b/assets/images/sensing/ransac1.png similarity index 100% rename from assets/images/ransac1.png rename to assets/images/sensing/ransac1.png diff --git a/assets/images/ransac2.png b/assets/images/sensing/ransac2.png similarity index 100% rename from assets/images/ransac2.png rename to assets/images/sensing/ransac2.png diff --git a/assets/images/realsense.jpg b/assets/images/sensing/realsense.jpg similarity index 100% rename from assets/images/realsense.jpg rename to assets/images/sensing/realsense.jpg diff --git a/assets/images/rgb_vector.png b/assets/images/sensing/rgb_vector.png similarity index 100% rename from assets/images/rgb_vector.png rename to assets/images/sensing/rgb_vector.png diff --git a/assets/images/slam.png b/assets/images/sensing/slam.png similarity index 100% rename from assets/images/slam.png rename to assets/images/sensing/slam.png diff --git a/assets/images/stag_exposure.gif b/assets/images/sensing/stag_exposure.gif similarity index 100% rename from assets/images/stag_exposure.gif rename to assets/images/sensing/stag_exposure.gif diff --git a/assets/images/tracking_results.png b/assets/images/sensing/tracking_results.png similarity index 100% rename from assets/images/tracking_results.png rename to assets/images/sensing/tracking_results.png diff --git a/assets/images/zoom1.png b/assets/images/sensing/zoom1.png similarity index 100% rename from assets/images/zoom1.png rename to assets/images/sensing/zoom1.png diff --git a/assets/images/autoware_gui.png b/assets/images/simulation/autoware_gui.png similarity index 100% rename from assets/images/autoware_gui.png rename to assets/images/simulation/autoware_gui.png diff --git a/assets/images/autoware_map.png b/assets/images/simulation/autoware_map.png similarity index 100% rename from assets/images/autoware_map.png rename to assets/images/simulation/autoware_map.png diff --git a/assets/images/autoware_models.png b/assets/images/simulation/autoware_models.png similarity index 100% rename from assets/images/autoware_models.png rename to assets/images/simulation/autoware_models.png diff --git a/assets/images/autoware_pkgs.png b/assets/images/simulation/autoware_pkgs.png similarity index 100% rename from assets/images/autoware_pkgs.png rename to assets/images/simulation/autoware_pkgs.png diff --git a/assets/images/autoware_plan.png b/assets/images/simulation/autoware_plan.png similarity index 100% rename from assets/images/autoware_plan.png rename to assets/images/simulation/autoware_plan.png diff --git a/assets/images/autoware_rviz.png b/assets/images/simulation/autoware_rviz.png similarity index 100% rename from assets/images/autoware_rviz.png rename to assets/images/simulation/autoware_rviz.png diff --git a/assets/images/autoware_worlds.png b/assets/images/simulation/autoware_worlds.png similarity index 100% rename from assets/images/autoware_worlds.png rename to assets/images/simulation/autoware_worlds.png diff --git a/assets/images/carla2.png b/assets/images/simulation/carla2.png similarity index 100% rename from assets/images/carla2.png rename to assets/images/simulation/carla2.png diff --git a/assets/images/carla3.png b/assets/images/simulation/carla3.png similarity index 100% rename from assets/images/carla3.png rename to assets/images/simulation/carla3.png diff --git a/assets/images/carla4.png b/assets/images/simulation/carla4.png similarity index 100% rename from assets/images/carla4.png rename to assets/images/simulation/carla4.png diff --git a/assets/images/carlaTrack.gif b/assets/images/simulation/carlaTrack.gif similarity index 100% rename from assets/images/carlaTrack.gif rename to assets/images/simulation/carlaTrack.gif diff --git a/assets/images/carla_opning.png b/assets/images/simulation/carla_opning.png similarity index 100% rename from assets/images/carla_opning.png rename to assets/images/simulation/carla_opning.png diff --git a/assets/images/carter.png b/assets/images/simulation/carter.png similarity index 100% rename from assets/images/carter.png rename to assets/images/simulation/carter.png diff --git a/assets/images/isaac_simpleroom.png b/assets/images/simulation/isaac_simpleroom.png similarity index 100% rename from assets/images/isaac_simpleroom.png rename to assets/images/simulation/isaac_simpleroom.png diff --git a/assets/images/nav2.png b/assets/images/simulation/nav2.png similarity index 100% rename from assets/images/nav2.png rename to assets/images/simulation/nav2.png diff --git a/assets/images/pdf.png b/assets/images/simulation/pdf.png similarity index 100% rename from assets/images/pdf.png rename to assets/images/simulation/pdf.png diff --git a/assets/images/realsense.png b/assets/images/simulation/realsense.png similarity index 100% rename from assets/images/realsense.png rename to assets/images/simulation/realsense.png diff --git a/assets/images/AdaptiveMonteCarloLocalization-0d322.png b/assets/images/state-estimation/AdaptiveMonteCarloLocalization-0d322.png similarity index 100% rename from assets/images/AdaptiveMonteCarloLocalization-0d322.png rename to assets/images/state-estimation/AdaptiveMonteCarloLocalization-0d322.png diff --git a/assets/images/AdaptiveMonteCarloLocalization-65e37.png b/assets/images/state-estimation/AdaptiveMonteCarloLocalization-65e37.png similarity index 100% rename from assets/images/AdaptiveMonteCarloLocalization-65e37.png rename to assets/images/state-estimation/AdaptiveMonteCarloLocalization-65e37.png diff --git a/assets/images/Tracker-01.PNG b/assets/images/state-estimation/Tracker-01.PNG similarity index 100% rename from assets/images/Tracker-01.PNG rename to assets/images/state-estimation/Tracker-01.PNG diff --git a/assets/images/Tracker-02.PNG b/assets/images/state-estimation/Tracker-02.PNG similarity index 100% rename from assets/images/Tracker-02.PNG rename to assets/images/state-estimation/Tracker-02.PNG diff --git a/assets/images/camera-radar-targets.png b/assets/images/state-estimation/camera-radar-targets.png similarity index 100% rename from assets/images/camera-radar-targets.png rename to assets/images/state-estimation/camera-radar-targets.png diff --git a/assets/images/carto-1.png b/assets/images/state-estimation/carto-1.png similarity index 100% rename from assets/images/carto-1.png rename to assets/images/state-estimation/carto-1.png diff --git a/assets/images/carto-2.png b/assets/images/state-estimation/carto-2.png similarity index 100% rename from assets/images/carto-2.png rename to assets/images/state-estimation/carto-2.png diff --git a/assets/images/carto-3.jpeg b/assets/images/state-estimation/carto-3.jpeg similarity index 100% rename from assets/images/carto-3.jpeg rename to assets/images/state-estimation/carto-3.jpeg diff --git a/assets/images/carto-4.png b/assets/images/state-estimation/carto-4.png similarity index 100% rename from assets/images/carto-4.png rename to assets/images/state-estimation/carto-4.png diff --git a/assets/images/carto-5.png b/assets/images/state-estimation/carto-5.png similarity index 100% rename from assets/images/carto-5.png rename to assets/images/state-estimation/carto-5.png diff --git a/assets/images/carto-6.png b/assets/images/state-estimation/carto-6.png similarity index 100% rename from assets/images/carto-6.png rename to assets/images/state-estimation/carto-6.png diff --git a/assets/images/decawave_example_multi_anchor.png b/assets/images/state-estimation/decawave_example_multi_anchor.png similarity index 100% rename from assets/images/decawave_example_multi_anchor.png rename to assets/images/state-estimation/decawave_example_multi_anchor.png diff --git a/assets/images/ipm_two.png b/assets/images/state-estimation/ipm_two.png similarity index 100% rename from assets/images/ipm_two.png rename to assets/images/state-estimation/ipm_two.png diff --git a/assets/images/leica_field_image.jpg b/assets/images/state-estimation/leica_field_image.jpg similarity index 100% rename from assets/images/leica_field_image.jpg rename to assets/images/state-estimation/leica_field_image.jpg diff --git a/assets/images/marvelmind_example.jpg b/assets/images/state-estimation/marvelmind_example.jpg similarity index 100% rename from assets/images/marvelmind_example.jpg rename to assets/images/state-estimation/marvelmind_example.jpg diff --git a/assets/images/occupancy-grid.png b/assets/images/state-estimation/occupancy-grid.png similarity index 100% rename from assets/images/occupancy-grid.png rename to assets/images/state-estimation/occupancy-grid.png diff --git a/assets/images/servoing-action.png b/assets/images/state-estimation/servoing-action.png similarity index 100% rename from assets/images/servoing-action.png rename to assets/images/state-estimation/servoing-action.png diff --git a/assets/images/sort-tracker.jpg b/assets/images/state-estimation/sort-tracker.jpg similarity index 100% rename from assets/images/sort-tracker.jpg rename to assets/images/state-estimation/sort-tracker.jpg diff --git a/assets/images/CableManagement-654ae.png b/assets/images/system-design-development/CableManagement-654ae.png similarity index 100% rename from assets/images/CableManagement-654ae.png rename to assets/images/system-design-development/CableManagement-654ae.png diff --git a/assets/images/CableManagement-6f4d5.png b/assets/images/system-design-development/CableManagement-6f4d5.png similarity index 100% rename from assets/images/CableManagement-6f4d5.png rename to assets/images/system-design-development/CableManagement-6f4d5.png diff --git a/assets/images/CableManagement-b3a03.png b/assets/images/system-design-development/CableManagement-b3a03.png similarity index 100% rename from assets/images/CableManagement-b3a03.png rename to assets/images/system-design-development/CableManagement-b3a03.png diff --git a/assets/images/CableManagement-c5b3a.png b/assets/images/system-design-development/CableManagement-c5b3a.png similarity index 100% rename from assets/images/CableManagement-c5b3a.png rename to assets/images/system-design-development/CableManagement-c5b3a.png diff --git a/assets/images/PCBDesignNotes-05e85.png b/assets/images/system-design-development/PCBDesignNotes-05e85.png similarity index 100% rename from assets/images/PCBDesignNotes-05e85.png rename to assets/images/system-design-development/PCBDesignNotes-05e85.png diff --git a/assets/images/PCBDesignNotes-09baf.png b/assets/images/system-design-development/PCBDesignNotes-09baf.png similarity index 100% rename from assets/images/PCBDesignNotes-09baf.png rename to assets/images/system-design-development/PCBDesignNotes-09baf.png diff --git a/assets/images/PCBDesignNotes-8fedc.png b/assets/images/system-design-development/PCBDesignNotes-8fedc.png similarity index 100% rename from assets/images/PCBDesignNotes-8fedc.png rename to assets/images/system-design-development/PCBDesignNotes-8fedc.png diff --git a/assets/images/PCBDesignNotes-d5ba2.png b/assets/images/system-design-development/PCBDesignNotes-d5ba2.png similarity index 100% rename from assets/images/PCBDesignNotes-d5ba2.png rename to assets/images/system-design-development/PCBDesignNotes-d5ba2.png diff --git a/assets/images/SubsystemInterfaceModeling-4e816.png b/assets/images/system-design-development/SubsystemInterfaceModeling-4e816.png similarity index 100% rename from assets/images/SubsystemInterfaceModeling-4e816.png rename to assets/images/system-design-development/SubsystemInterfaceModeling-4e816.png diff --git a/assets/images/SubsystemInterfaceModeling-7097d.png b/assets/images/system-design-development/SubsystemInterfaceModeling-7097d.png similarity index 100% rename from assets/images/SubsystemInterfaceModeling-7097d.png rename to assets/images/system-design-development/SubsystemInterfaceModeling-7097d.png diff --git a/assets/images/SubsystemInterfaceModeling-73d8e.png b/assets/images/system-design-development/SubsystemInterfaceModeling-73d8e.png similarity index 100% rename from assets/images/SubsystemInterfaceModeling-73d8e.png rename to assets/images/system-design-development/SubsystemInterfaceModeling-73d8e.png diff --git a/assets/images/SubsystemInterfaceModeling-8748c.png b/assets/images/system-design-development/SubsystemInterfaceModeling-8748c.png similarity index 100% rename from assets/images/SubsystemInterfaceModeling-8748c.png rename to assets/images/system-design-development/SubsystemInterfaceModeling-8748c.png diff --git a/assets/images/SubsystemInterfaceModeling-8e94f.png b/assets/images/system-design-development/SubsystemInterfaceModeling-8e94f.png similarity index 100% rename from assets/images/SubsystemInterfaceModeling-8e94f.png rename to assets/images/system-design-development/SubsystemInterfaceModeling-8e94f.png diff --git a/assets/images/SubsystemInterfaceModeling-fb765.png b/assets/images/system-design-development/SubsystemInterfaceModeling-fb765.png similarity index 100% rename from assets/images/SubsystemInterfaceModeling-fb765.png rename to assets/images/system-design-development/SubsystemInterfaceModeling-fb765.png diff --git a/assets/images/AltiumCircuitmaker-1caa4.png b/assets/images/tools/AltiumCircuitmaker-1caa4.png similarity index 100% rename from assets/images/AltiumCircuitmaker-1caa4.png rename to assets/images/tools/AltiumCircuitmaker-1caa4.png diff --git a/assets/images/AltiumCircuitmaker-3f756.png b/assets/images/tools/AltiumCircuitmaker-3f756.png similarity index 100% rename from assets/images/AltiumCircuitmaker-3f756.png rename to assets/images/tools/AltiumCircuitmaker-3f756.png diff --git a/assets/images/AltiumCircuitmaker-4b425.png b/assets/images/tools/AltiumCircuitmaker-4b425.png similarity index 100% rename from assets/images/AltiumCircuitmaker-4b425.png rename to assets/images/tools/AltiumCircuitmaker-4b425.png diff --git a/assets/images/AltiumCircuitmaker-78555.png b/assets/images/tools/AltiumCircuitmaker-78555.png similarity index 100% rename from assets/images/AltiumCircuitmaker-78555.png rename to assets/images/tools/AltiumCircuitmaker-78555.png diff --git a/assets/images/AltiumCircuitmaker-8aecd.png b/assets/images/tools/AltiumCircuitmaker-8aecd.png similarity index 100% rename from assets/images/AltiumCircuitmaker-8aecd.png rename to assets/images/tools/AltiumCircuitmaker-8aecd.png diff --git a/assets/images/AltiumCircuitmaker-e83b9.png b/assets/images/tools/AltiumCircuitmaker-e83b9.png similarity index 100% rename from assets/images/AltiumCircuitmaker-e83b9.png rename to assets/images/tools/AltiumCircuitmaker-e83b9.png diff --git a/assets/images/AltiumCircuitmaker-f5782.png b/assets/images/tools/AltiumCircuitmaker-f5782.png similarity index 100% rename from assets/images/AltiumCircuitmaker-f5782.png rename to assets/images/tools/AltiumCircuitmaker-f5782.png diff --git a/assets/images/AltiumCircuitmaker-fcf01.png b/assets/images/tools/AltiumCircuitmaker-fcf01.png similarity index 100% rename from assets/images/AltiumCircuitmaker-fcf01.png rename to assets/images/tools/AltiumCircuitmaker-fcf01.png diff --git a/assets/images/PyQt-final.png b/assets/images/tools/PyQt-final.png similarity index 100% rename from assets/images/PyQt-final.png rename to assets/images/tools/PyQt-final.png diff --git a/assets/images/PyQt-green.png b/assets/images/tools/PyQt-green.png similarity index 100% rename from assets/images/PyQt-green.png rename to assets/images/tools/PyQt-green.png diff --git a/assets/images/PyQt-logs.png b/assets/images/tools/PyQt-logs.png similarity index 100% rename from assets/images/PyQt-logs.png rename to assets/images/tools/PyQt-logs.png diff --git a/assets/images/PyQt-orange.png b/assets/images/tools/PyQt-orange.png similarity index 100% rename from assets/images/PyQt-orange.png rename to assets/images/tools/PyQt-orange.png diff --git a/assets/images/PyQt-red.png b/assets/images/tools/PyQt-red.png similarity index 100% rename from assets/images/PyQt-red.png rename to assets/images/tools/PyQt-red.png diff --git a/assets/images/PyQt-yellow.png b/assets/images/tools/PyQt-yellow.png similarity index 100% rename from assets/images/PyQt-yellow.png rename to assets/images/tools/PyQt-yellow.png diff --git a/assets/images/Qtcreator-ros-new-project-class-menu.png b/assets/images/tools/Qtcreator-ros-new-project-class-menu.png similarity index 100% rename from assets/images/Qtcreator-ros-new-project-class-menu.png rename to assets/images/tools/Qtcreator-ros-new-project-class-menu.png diff --git a/assets/images/Qtcreator-ros-new-project-design.png b/assets/images/tools/Qtcreator-ros-new-project-design.png similarity index 100% rename from assets/images/Qtcreator-ros-new-project-design.png rename to assets/images/tools/Qtcreator-ros-new-project-design.png diff --git a/assets/images/Qtcreator-ros-new-project-edit-text.png b/assets/images/tools/Qtcreator-ros-new-project-edit-text.png similarity index 100% rename from assets/images/Qtcreator-ros-new-project-edit-text.png rename to assets/images/tools/Qtcreator-ros-new-project-edit-text.png diff --git a/assets/images/Qtcreator-ros-new-project-kit.png b/assets/images/tools/Qtcreator-ros-new-project-kit.png similarity index 100% rename from assets/images/Qtcreator-ros-new-project-kit.png rename to assets/images/tools/Qtcreator-ros-new-project-kit.png diff --git a/assets/images/Qtcreator-ros-new-project-menu.png b/assets/images/tools/Qtcreator-ros-new-project-menu.png similarity index 100% rename from assets/images/Qtcreator-ros-new-project-menu.png rename to assets/images/tools/Qtcreator-ros-new-project-menu.png diff --git a/assets/images/Qtcreator-ros-new-project-run.png b/assets/images/tools/Qtcreator-ros-new-project-run.png similarity index 100% rename from assets/images/Qtcreator-ros-new-project-run.png rename to assets/images/tools/Qtcreator-ros-new-project-run.png diff --git a/assets/images/Qtcreator-ros-new-project-run2.png b/assets/images/tools/Qtcreator-ros-new-project-run2.png similarity index 100% rename from assets/images/Qtcreator-ros-new-project-run2.png rename to assets/images/tools/Qtcreator-ros-new-project-run2.png diff --git a/assets/images/Qtcreator-ros-new-project-ui-elements.png b/assets/images/tools/Qtcreator-ros-new-project-ui-elements.png similarity index 100% rename from assets/images/Qtcreator-ros-new-project-ui-elements.png rename to assets/images/tools/Qtcreator-ros-new-project-ui-elements.png diff --git a/assets/images/Qtcreator-ros-new-project-ui-obj-rename.png b/assets/images/tools/Qtcreator-ros-new-project-ui-obj-rename.png similarity index 100% rename from assets/images/Qtcreator-ros-new-project-ui-obj-rename.png rename to assets/images/tools/Qtcreator-ros-new-project-ui-obj-rename.png diff --git a/assets/images/Qtcreator-ros-new-project-ui-obj.png b/assets/images/tools/Qtcreator-ros-new-project-ui-obj.png similarity index 100% rename from assets/images/Qtcreator-ros-new-project-ui-obj.png rename to assets/images/tools/Qtcreator-ros-new-project-ui-obj.png diff --git a/assets/images/Qtcreator-ros-new-project.png b/assets/images/tools/Qtcreator-ros-new-project.png similarity index 100% rename from assets/images/Qtcreator-ros-new-project.png rename to assets/images/tools/Qtcreator-ros-new-project.png diff --git a/assets/images/debug1.jpeg b/assets/images/tools/debug1.jpeg similarity index 100% rename from assets/images/debug1.jpeg rename to assets/images/tools/debug1.jpeg diff --git a/assets/images/debug2.jpeg b/assets/images/tools/debug2.jpeg similarity index 100% rename from assets/images/debug2.jpeg rename to assets/images/tools/debug2.jpeg diff --git a/assets/images/debug3.jpeg b/assets/images/tools/debug3.jpeg similarity index 100% rename from assets/images/debug3.jpeg rename to assets/images/tools/debug3.jpeg diff --git a/assets/images/deltaviz.jpg b/assets/images/tools/deltaviz.jpg similarity index 100% rename from assets/images/deltaviz.jpg rename to assets/images/tools/deltaviz.jpg diff --git a/assets/images/docker_socket.png b/assets/images/tools/docker_socket.png similarity index 100% rename from assets/images/docker_socket.png rename to assets/images/tools/docker_socket.png diff --git a/assets/images/privesc.png b/assets/images/tools/privesc.png similarity index 100% rename from assets/images/privesc.png rename to assets/images/tools/privesc.png diff --git a/assets/images/refactor1.png b/assets/images/tools/refactor1.png similarity index 100% rename from assets/images/refactor1.png rename to assets/images/tools/refactor1.png diff --git a/assets/images/refactor2.jpeg b/assets/images/tools/refactor2.jpeg similarity index 100% rename from assets/images/refactor2.jpeg rename to assets/images/tools/refactor2.jpeg diff --git a/assets/images/refactor3.png b/assets/images/tools/refactor3.png similarity index 100% rename from assets/images/refactor3.png rename to assets/images/tools/refactor3.png diff --git a/assets/images/refactor4.png b/assets/images/tools/refactor4.png similarity index 100% rename from assets/images/refactor4.png rename to assets/images/tools/refactor4.png diff --git a/assets/images/vscode10.png b/assets/images/tools/vscode10.png similarity index 100% rename from assets/images/vscode10.png rename to assets/images/tools/vscode10.png diff --git a/assets/images/vscode11.png b/assets/images/tools/vscode11.png similarity index 100% rename from assets/images/vscode11.png rename to assets/images/tools/vscode11.png diff --git a/assets/images/vscode12.png b/assets/images/tools/vscode12.png similarity index 100% rename from assets/images/vscode12.png rename to assets/images/tools/vscode12.png diff --git a/assets/images/vscode13.png b/assets/images/tools/vscode13.png similarity index 100% rename from assets/images/vscode13.png rename to assets/images/tools/vscode13.png diff --git a/assets/images/vscode2.png b/assets/images/tools/vscode2.png similarity index 100% rename from assets/images/vscode2.png rename to assets/images/tools/vscode2.png diff --git a/assets/images/vscode3.png b/assets/images/tools/vscode3.png similarity index 100% rename from assets/images/vscode3.png rename to assets/images/tools/vscode3.png diff --git a/assets/images/vscode4.png b/assets/images/tools/vscode4.png similarity index 100% rename from assets/images/vscode4.png rename to assets/images/tools/vscode4.png diff --git a/assets/images/vscode5.png b/assets/images/tools/vscode5.png similarity index 100% rename from assets/images/vscode5.png rename to assets/images/tools/vscode5.png diff --git a/assets/images/vscode6.png b/assets/images/tools/vscode6.png similarity index 100% rename from assets/images/vscode6.png rename to assets/images/tools/vscode6.png diff --git a/assets/images/vscode8.png b/assets/images/tools/vscode8.png similarity index 100% rename from assets/images/vscode8.png rename to assets/images/tools/vscode8.png diff --git a/assets/images/vscode9.png b/assets/images/tools/vscode9.png similarity index 100% rename from assets/images/vscode9.png rename to assets/images/tools/vscode9.png diff --git a/wiki/actuation/Pure-Pursuit-Controller-for-Skid-Steering-Robot.md b/wiki/actuation/Pure-Pursuit-Controller-for-Skid-Steering-Robot.md index 85dee2c1..9a22fade 100644 --- a/wiki/actuation/Pure-Pursuit-Controller-for-Skid-Steering-Robot.md +++ b/wiki/actuation/Pure-Pursuit-Controller-for-Skid-Steering-Robot.md @@ -25,7 +25,7 @@ This goal position keeps on changing and is a point on the trajectory to be foll The following image explains the concept of lookahead distance and the arc to follow. -![Geometry of Pure Pursuit Algorithm [1]](/assets/images/pure_pursuit_geometry.png) +![Geometry of Pure Pursuit Algorithm [1]](/assets/images/actuation/pure_pursuit_geometry.png) In the image above, we see that given a point at a particular location from the robot say at location (x,y) in the robot's frame (the frame fixed on the robot). The point is at a distance l from the current location of the robot. Using a geometrical derivation, we can derive the radius of curvature of this arc as - diff --git a/wiki/actuation/__all_subsections.md b/wiki/actuation/__all_subsections.md index 3a95d8fb..fc9d9f2e 100644 --- a/wiki/actuation/__all_subsections.md +++ b/wiki/actuation/__all_subsections.md @@ -26,7 +26,7 @@ Throttle-by-wire, or accelerate-by-wire, was the first type of drive-by-wire sys As shown in the figure below, With throttle by wire a sensor is attached to the gas pedal and detects how far it has been pressed. This information is then sent down a wire to the car's computer. The computer analyzes the information and commands a motor to open the butterfly in the throttle body. Since the computer is in control of the throttle opening things like idle speed control, cruise control, and traction control can easily be integrated. Because automatic transmissions are also usually controlled by the computer it can adjust the throttle during gear changes. It also allows the addition of eco or sport buttons to change the way the throttle reacts when pressed, increasing fuel economy or throttle response. -![Throttle-by-wire Outline](/assets/images/throttle-by-wire.png) +![Throttle-by-wire Outline](/assets/images/actuation/throttle-by-wire.png) ### Brake-by-wire There are two types of brake-by-wire systems. Hydraulic, or "wet," brake-by-wire uses additional hydraulic parts to create pressure on the brakes. Electric, or "dry," brake-by-wire, on the other hand, simply uses an electric motor and no hydraulic brake fluid. @@ -49,7 +49,7 @@ Most vehicles use a rack-and-pinion unit or worm-and-sector steering gear that i As shown in the figure below, in vehicles that are equipped with steer-by-wire technology, there is no physical connection between the steering wheel and the tires. Steer-by-wire systems don't technically need to use steering wheels at all. When a steering wheel is used, some type of steering feel emulator is typically used to provide the driver with feedback. -![Steer-by-wire Outline](/assets/images/steer-by-wire.png) +![Steer-by-wire Outline](/assets/images/actuation/steer-by-wire.png) ## Benefits and Drawbacks of Drive-by-wire Systems Some people are excited about the prospect of more drive-by-wire systems in cars. By replacing conventional throttle systems, drive-by-wire systems can significantly reduce the number of moving parts in a vehicle. This reduces weight, increases operational accuracy and stretches out the time between service visits for things like mechanical maintenance and other adjustments. Some by-wire systems wouldn't even require service at all. Less weight and better accuracy would equal better fuel efficiency and fewer emissions, too. @@ -500,61 +500,61 @@ rosrun moveit_setup_assistant setup_assistant.launch From here, you will be launched into a MoveIt setup assistant menu, as shown below: -![moveit_setup_assistant_start](/assets/images/moveit_setup_assistant_start.png) +![moveit_setup_assistant_start](/assets/images/actuation/moveit_setup_assistant_start.png) Select “Create New MoveIt Configuration Package” then select the URDF model file created earlier. Select “Load Files” to load the URDF file. Once the URDF model is loaded, you will go through the various steps to configure and set up the MoveIt model. Select “Self-Collisions”. You should see the following: -![moveit_setup_assistant_collision](/assets/images/moveit_setup_assistant_collision_check.png) +![moveit_setup_assistant_collision](/assets/images/actuation/moveit_setup_assistant_collision_check.png) The best option to choose here is to slide the “Sampling Density” slider all the way to the right to the highest density setting. With this setting, the GUI will compute all pairs of geometries that can collide with each other and pairs that will definitely not. Select “Generate Collision Matrix” to compute the non-colliding geometry pairs of the model. The next option window is the virtual joints window. Here, you would configure a robot link with an external frame of reference that is fixed. In this particular case you can configure the world frame to the world frame as a virtual joint if you want the origin point of the robot arm to be the same as the URDF file. -![moveit_setup_assistant_virtual_joints](/assets/images/moveit_setup_assistant_virtual_joints.png) +![moveit_setup_assistant_virtual_joints](/assets/images/actuation/moveit_setup_assistant_virtual_joints.png) The next window is the “Planning Groups” window. Here, you would configure the joint groups of the robot model. There are many ways to go about this, but one method is to create a kinetic chain of joints, given you are working with a serial manipulator arm. -![moveit_setup_assistant_planning_groups](/assets/images/moveit_setup_assistant_planning_groups.png) +![moveit_setup_assistant_planning_groups](/assets/images/actuation/moveit_setup_assistant_planning_groups.png) Select “Add Group”. Fill in a name for the planning group you are using. Next, select “Kinematic Solver”. The most common solver is the “kdl_kinematics_plugin/KDLKinematicsPlugin” option. Next, select the “Group Default Planner”. The most common planner is “RRTConnect”. The next step is to define your kinematic chain. Select “Add Kin. Chain” option. Given how you set up your URDF model, the chain of joints and linkages should be created and shown for you. All you have to do is to select the base link, which is the “world” link, and the tip link which is the “end_link/INPUT_INTERFACE” in this case. Afterwards, select “Save”. NOTE: There are tutorials available online that go through the “Add Joints” method to create the planning group, which can be another viable configuration option to explore. -![moveit_setup_assistant_kinematic_chain](/assets/images/moveit_setup_assistant_planning_group_kinematic_chain.png) +![moveit_setup_assistant_kinematic_chain](/assets/images/actuation/moveit_setup_assistant_planning_group_kinematic_chain.png) Moving onto “Robot Poses”, you can configure different preset positions of the robot. In the screenshot below, preset positions were made for when the serial manipulator arm is stretched out, compacted in, and in an intermediate position. Create however many preset poses you desire. -![moveit_setup_assistant_robot_poses](/assets/images/moveit_setup_assistant_robot_poses.png) +![moveit_setup_assistant_robot_poses](/assets/images/actuation/moveit_setup_assistant_robot_poses.png) The next window is the “End Effectors” window. For this particular article, I will not go into the details of configuring an actuated end effector. Instead, this particular project opted to go for a simple end effector and as such configured a simple one through MoveIt. Essentially, the tip link configured in the kinetic chain portion of the setup was selected as the “Parent Link” of the end effector. -![moveit_setup_assistant_end_effectors](/assets/images/moveit_setup_assistant_end_effectors.png) +![moveit_setup_assistant_end_effectors](/assets/images/actuation/moveit_setup_assistant_end_effectors.png) The “Passive Joints” section of the setup was autofilled, so we can skip the details of this window. -![moveit_setup_assistant_passive_joints](/assets/images/moveit_setup_assistant_passive_joints.png) +![moveit_setup_assistant_passive_joints](/assets/images/actuation/moveit_setup_assistant_passive_joints.png) The next window “ROS Control” can be an important one. Here, you can configure a ROS controller to control the physical hardware of your robot. This can be important if you want the MoveIt pipeline to directly interface with your motors and actuators using different control schemes such as effort, velocity, or position controllers. In our case, we opted to use the simulation portion of the ROS controller, which is essentially a fake joint controller. -![moveit_setup_assistant_controllers](/assets/images/moveit_setup_assistant_controllers.png) +![moveit_setup_assistant_controllers](/assets/images/actuation/moveit_setup_assistant_controllers.png) The next window is the “Simulation” window. By selecting the “Generate URDF” option, you can generate replacement URDF code to input to your URDF file in order to have the model working on Gazebo, which is the ROS simulation environment. Simply copy and paste the selected code over to your URDF file code. -![moveit_setup_assistant_simulation](/assets/images/moveit_setup_assistant_simulation.png) +![moveit_setup_assistant_simulation](/assets/images/actuation/moveit_setup_assistant_simulation.png) In the “3D perception” window, you can configure a point cloud or depth map topic to interface with MoveIt. Here, the Octomap plugin for MoveIt will look at this topic and configure obstacles within the environment, as shown in RViz. This is an important window if you want to configure dynamic obstacles for the robot to be aware of and avoid. -![moveit_setup_assistant_perception](/assets/images/moveit_setup_assistant_perception.png) +![moveit_setup_assistant_perception](/assets/images/actuation/moveit_setup_assistant_perception.png) The next window is “Author Information” within which you would fill in your name and the email of the maintainer of this ROS MoveIt node. -![moveit_setup_assistant_author_information](/assets/images/moveit_setup_assistant_author_information.png) +![moveit_setup_assistant_author_information](/assets/images/actuation/moveit_setup_assistant_author_information.png) Finally, within the “Configuration File” portion of the setup assistant, the GUI will drop all the configured files to a set folder location. If this is a first-time setup, normally you would like to check off all the selected file options. Otherwise, you may want to only drop the files that you have changed since the last setup instance. Specify a “Configuration Package Save Path” location and select “Generate Package”. Once that is completed, you can select “Exit Setup Assistant”. -![moveit_setup_assistant_configuration_file](/assets/images/moveit_setup_assistant_end.png) +![moveit_setup_assistant_configuration_file](/assets/images/actuation/moveit_setup_assistant_end.png) ### Simulate URDF model through Rviz @@ -737,7 +737,7 @@ This goal position keeps on changing and is a point on the trajectory to be foll The following image explains the concept of lookahead distance and the arc to follow. -![Geometry of Pure Pursuit Algorithm [1]](/assets/images/pure_pursuit_geometry.png) +![Geometry of Pure Pursuit Algorithm [1]](/assets/images/actuation/pure_pursuit_geometry.png) In the image above, we see that given a point at a particular location from the robot say at location (x,y) in the robot's frame (the frame fixed on the robot). The point is at a distance l from the current location of the robot. Using a geometrical derivation, we can derive the radius of curvature of this arc as - @@ -1025,7 +1025,7 @@ https://www.sv-jme.eu/article/a-weighted-gradient-projection-method-for-inverse- date: 2017-08-21 title: Using ULN 2003A as a motor controller --- -![Using ULN 2003A as a stepper motor controller](/assets/images/ULN2003AMotorController-8ee22.png) +![Using ULN 2003A as a stepper motor controller](/assets/images/actuation/ULN2003AMotorController-8ee22.png) ## ULN 2003A - Darlington Array ULN 2003A or otherwise known as Darlington array is a way to use signals from a microcontroller or any device that can only withstand low currents to control high current drawing devices such as relays, motors, bulbs etc. diff --git a/wiki/actuation/drive-by-wire.md b/wiki/actuation/drive-by-wire.md index 849c5d9f..1508c325 100644 --- a/wiki/actuation/drive-by-wire.md +++ b/wiki/actuation/drive-by-wire.md @@ -24,7 +24,7 @@ Throttle-by-wire, or accelerate-by-wire, was the first type of drive-by-wire sys As shown in the figure below, With throttle by wire a sensor is attached to the gas pedal and detects how far it has been pressed. This information is then sent down a wire to the car's computer. The computer analyzes the information and commands a motor to open the butterfly in the throttle body. Since the computer is in control of the throttle opening things like idle speed control, cruise control, and traction control can easily be integrated. Because automatic transmissions are also usually controlled by the computer it can adjust the throttle during gear changes. It also allows the addition of eco or sport buttons to change the way the throttle reacts when pressed, increasing fuel economy or throttle response. -![Throttle-by-wire Outline](/assets/images/throttle-by-wire.png) +![Throttle-by-wire Outline](/assets/images/actuation/throttle-by-wire.png) ### Brake-by-wire There are two types of brake-by-wire systems. Hydraulic, or "wet," brake-by-wire uses additional hydraulic parts to create pressure on the brakes. Electric, or "dry," brake-by-wire, on the other hand, simply uses an electric motor and no hydraulic brake fluid. @@ -47,7 +47,7 @@ Most vehicles use a rack-and-pinion unit or worm-and-sector steering gear that i As shown in the figure below, in vehicles that are equipped with steer-by-wire technology, there is no physical connection between the steering wheel and the tires. Steer-by-wire systems don't technically need to use steering wheels at all. When a steering wheel is used, some type of steering feel emulator is typically used to provide the driver with feedback. -![Steer-by-wire Outline](/assets/images/steer-by-wire.png) +![Steer-by-wire Outline](/assets/images/actuation/steer-by-wire.png) ## Benefits and Drawbacks of Drive-by-wire Systems Some people are excited about the prospect of more drive-by-wire systems in cars. By replacing conventional throttle systems, drive-by-wire systems can significantly reduce the number of moving parts in a vehicle. This reduces weight, increases operational accuracy and stretches out the time between service visits for things like mechanical maintenance and other adjustments. Some by-wire systems wouldn't even require service at all. Less weight and better accuracy would equal better fuel efficiency and fewer emissions, too. diff --git a/wiki/actuation/moveit-and-HEBI-integration.md b/wiki/actuation/moveit-and-HEBI-integration.md index 61ea777d..1535e7fa 100644 --- a/wiki/actuation/moveit-and-HEBI-integration.md +++ b/wiki/actuation/moveit-and-HEBI-integration.md @@ -58,61 +58,61 @@ rosrun moveit_setup_assistant setup_assistant.launch From here, you will be launched into a MoveIt setup assistant menu, as shown below: -![moveit_setup_assistant_start](/assets/images/moveit_setup_assistant_start.png) +![moveit_setup_assistant_start](/assets/images/actuation/moveit_setup_assistant_start.png) Select “Create New MoveIt Configuration Package” then select the URDF model file created earlier. Select “Load Files” to load the URDF file. Once the URDF model is loaded, you will go through the various steps to configure and set up the MoveIt model. Select “Self-Collisions”. You should see the following: -![moveit_setup_assistant_collision](/assets/images/moveit_setup_assistant_collision_check.png) +![moveit_setup_assistant_collision](/assets/images/actuation/moveit_setup_assistant_collision_check.png) The best option to choose here is to slide the “Sampling Density” slider all the way to the right to the highest density setting. With this setting, the GUI will compute all pairs of geometries that can collide with each other and pairs that will definitely not. Select “Generate Collision Matrix” to compute the non-colliding geometry pairs of the model. The next option window is the virtual joints window. Here, you would configure a robot link with an external frame of reference that is fixed. In this particular case you can configure the world frame to the world frame as a virtual joint if you want the origin point of the robot arm to be the same as the URDF file. -![moveit_setup_assistant_virtual_joints](/assets/images/moveit_setup_assistant_virtual_joints.png) +![moveit_setup_assistant_virtual_joints](/assets/images/actuation/moveit_setup_assistant_virtual_joints.png) The next window is the “Planning Groups” window. Here, you would configure the joint groups of the robot model. There are many ways to go about this, but one method is to create a kinetic chain of joints, given you are working with a serial manipulator arm. -![moveit_setup_assistant_planning_groups](/assets/images/moveit_setup_assistant_planning_groups.png) +![moveit_setup_assistant_planning_groups](/assets/images/actuation/moveit_setup_assistant_planning_groups.png) Select “Add Group”. Fill in a name for the planning group you are using. Next, select “Kinematic Solver”. The most common solver is the “kdl_kinematics_plugin/KDLKinematicsPlugin” option. Next, select the “Group Default Planner”. The most common planner is “RRTConnect”. The next step is to define your kinematic chain. Select “Add Kin. Chain” option. Given how you set up your URDF model, the chain of joints and linkages should be created and shown for you. All you have to do is to select the base link, which is the “world” link, and the tip link which is the “end_link/INPUT_INTERFACE” in this case. Afterwards, select “Save”. NOTE: There are tutorials available online that go through the “Add Joints” method to create the planning group, which can be another viable configuration option to explore. -![moveit_setup_assistant_kinematic_chain](/assets/images/moveit_setup_assistant_planning_group_kinematic_chain.png) +![moveit_setup_assistant_kinematic_chain](/assets/images/actuation/moveit_setup_assistant_planning_group_kinematic_chain.png) Moving onto “Robot Poses”, you can configure different preset positions of the robot. In the screenshot below, preset positions were made for when the serial manipulator arm is stretched out, compacted in, and in an intermediate position. Create however many preset poses you desire. -![moveit_setup_assistant_robot_poses](/assets/images/moveit_setup_assistant_robot_poses.png) +![moveit_setup_assistant_robot_poses](/assets/images/actuation/moveit_setup_assistant_robot_poses.png) The next window is the “End Effectors” window. For this particular article, I will not go into the details of configuring an actuated end effector. Instead, this particular project opted to go for a simple end effector and as such configured a simple one through MoveIt. Essentially, the tip link configured in the kinetic chain portion of the setup was selected as the “Parent Link” of the end effector. -![moveit_setup_assistant_end_effectors](/assets/images/moveit_setup_assistant_end_effectors.png) +![moveit_setup_assistant_end_effectors](/assets/images/actuation/moveit_setup_assistant_end_effectors.png) The “Passive Joints” section of the setup was autofilled, so we can skip the details of this window. -![moveit_setup_assistant_passive_joints](/assets/images/moveit_setup_assistant_passive_joints.png) +![moveit_setup_assistant_passive_joints](/assets/images/actuation/moveit_setup_assistant_passive_joints.png) The next window “ROS Control” can be an important one. Here, you can configure a ROS controller to control the physical hardware of your robot. This can be important if you want the MoveIt pipeline to directly interface with your motors and actuators using different control schemes such as effort, velocity, or position controllers. In our case, we opted to use the simulation portion of the ROS controller, which is essentially a fake joint controller. -![moveit_setup_assistant_controllers](/assets/images/moveit_setup_assistant_controllers.png) +![moveit_setup_assistant_controllers](/assets/images/actuation/moveit_setup_assistant_controllers.png) The next window is the “Simulation” window. By selecting the “Generate URDF” option, you can generate replacement URDF code to input to your URDF file in order to have the model working on Gazebo, which is the ROS simulation environment. Simply copy and paste the selected code over to your URDF file code. -![moveit_setup_assistant_simulation](/assets/images/moveit_setup_assistant_simulation.png) +![moveit_setup_assistant_simulation](/assets/images/actuation/moveit_setup_assistant_simulation.png) In the “3D perception” window, you can configure a point cloud or depth map topic to interface with MoveIt. Here, the Octomap plugin for MoveIt will look at this topic and configure obstacles within the environment, as shown in RViz. This is an important window if you want to configure dynamic obstacles for the robot to be aware of and avoid. -![moveit_setup_assistant_perception](/assets/images/moveit_setup_assistant_perception.png) +![moveit_setup_assistant_perception](/assets/images/actuation/moveit_setup_assistant_perception.png) The next window is “Author Information” within which you would fill in your name and the email of the maintainer of this ROS MoveIt node. -![moveit_setup_assistant_author_information](/assets/images/moveit_setup_assistant_author_information.png) +![moveit_setup_assistant_author_information](/assets/images/actuation/moveit_setup_assistant_author_information.png) Finally, within the “Configuration File” portion of the setup assistant, the GUI will drop all the configured files to a set folder location. If this is a first-time setup, normally you would like to check off all the selected file options. Otherwise, you may want to only drop the files that you have changed since the last setup instance. Specify a “Configuration Package Save Path” location and select “Generate Package”. Once that is completed, you can select “Exit Setup Assistant”. -![moveit_setup_assistant_configuration_file](/assets/images/moveit_setup_assistant_end.png) +![moveit_setup_assistant_configuration_file](/assets/images/actuation/moveit_setup_assistant_end.png) ### Simulate URDF model through Rviz diff --git a/wiki/actuation/uln2003a-motor-controller.md b/wiki/actuation/uln2003a-motor-controller.md index a99edda4..83b7718d 100644 --- a/wiki/actuation/uln2003a-motor-controller.md +++ b/wiki/actuation/uln2003a-motor-controller.md @@ -2,7 +2,7 @@ date: 2017-08-21 title: Using ULN 2003A as a motor controller --- -![Using ULN 2003A as a stepper motor controller](/assets/images/ULN2003AMotorController-8ee22.png) +![Using ULN 2003A as a stepper motor controller](/assets/images/actuation/ULN2003AMotorController-8ee22.png) ## ULN 2003A - Darlington Array ULN 2003A or otherwise known as Darlington array is a way to use signals from a microcontroller or any device that can only withstand low currents to control high current drawing devices such as relays, motors, bulbs etc. diff --git a/wiki/common-platforms/__all_subsections.md b/wiki/common-platforms/__all_subsections.md index 2d994762..7a0a9ec1 100644 --- a/wiki/common-platforms/__all_subsections.md +++ b/wiki/common-platforms/__all_subsections.md @@ -334,7 +334,7 @@ DJI drones have one of the best commercially available PID controllers along wit To be more specific, below we will look at the components involved in controlling a DJI drone. -![DJI Control Scheme](/assets/images/DJI.png) +![DJI Control Scheme](/assets/images/common-platforms/DJI.png) The keypoint is: > DJI drones *need to read from its own GPS* to satisfy its EKF needs in order to produce proper state estimations for Position and Velocity Controls. @@ -610,7 +610,7 @@ published: true --- This article with serve as an introduction, overview, and quick-start guide to K-Team's Khepera 4 robots. -![Put a relevant caption here](/assets/images/KHEPERA4.png) +![Put a relevant caption here](/assets/images/common-platforms/KHEPERA4.png) The Khepera 4 is a robot platform designed for indoor applications, meant to operate on tables and floor of labs. They are meant to provide a way to test algorithms developed in simulations or on paper in the real world. They're most often used to test navigation, swarm, and artificial intelligence applications, providing researchers an easy way to see how their code runs on an actual robot. @@ -1305,7 +1305,7 @@ This is an article that provides an overview of the Unitree Go1 Edu robot, inclu There are three versions of the Unitree Go1: Air, Pro, and Edu. The Edu model is designed for educational purposes and provides developers with access to the platform. In this article, we will focus on the capabilities of the Go1 Edu, which is a popular choice for students and researchers due to its affordability and ease of use. ## Form Factor -![Form_Factor](/assets/images/form_factor.png) +![Form_Factor](/assets/images/common-platforms/form_factor.png) The Unitree Go1 Edu has compact dimensions of 645 x 280 x 400 mm and weighs 12 kg. It boasts a top speed of 3.7-5 m/s and a maximum load capacity of 10 kg, although it's recommended to keep the payload under 5 kg. By default, the robot can traverse steps up to 10 cm high, but with programming, it's possible to overcome larger obstacles. @@ -1313,7 +1313,7 @@ The Go1 Edu features 12 degrees of freedom, including HAA (hip abduction/adducti The Body/Thigh Joint Motor design is highly adaptable to various mechanical equipment, with an instantaneous torque of 23.7 N·m, while the Knee Joint has a torque of 35.55 N·m. ## Power and Interface -![Unitree_TOP](/assets/images/unitree_top.png) +![Unitree_TOP](/assets/images/common-platforms/unitree_top.png) The Unitree Go1 Edu robot is equipped with a reliable lithium-ion power cell with a 6000mAh capacity that provides an endurance time of 1-2.5 hours. The robot's battery management system (BMS) closely monitors the battery status, ensuring safe and stable operation during use. The batteries themselves feature overcharge protection, providing an additional layer of safety. @@ -1331,7 +1331,7 @@ Moreover, Unitree provides customization options for processors and additional s * Raspberry Pi also has an extra Wi-Fi card, which is used as a hotspot 192.168.12.1. * User laptop connects to the robot hotspot, with a static IP 192.168.12.18. * Users can connect to all four devices via Ethernet cable, with a static IP 192.168.123.123. -![Wired](/assets/images/wired.png) +![Wired](/assets/images/common-platforms/wired.png) * Each Nano controls and processes a pair of fisheye cameras. The Unitree camera SDK provides an API that captures and rectifies skewed fisheye camera stream and sends out the UDP packets. * `./bins/example_putImagetrans` sends camera streams with udp packets @@ -1511,19 +1511,19 @@ roslaunch ur5e_moveit_config moveit_rviz.launch rviz_config:=$(rospack find ur5e This should launch a Rviz window with a robot model. -![](/assets/images/moveit_1.png) +![](/assets/images/common-platforms/moveit_1.png) You can change the tcp target by dragging around the blue ball. The orange robot will show the configuration used to reach the target pose. -![](/assets/images/moveit_2.png) +![](/assets/images/common-platforms/moveit_2.png) By clicking on the "Plan" button in the left panel a path from the current pose to the target pose is calculated. On success, it gets animated using a semi-transparent version of the robot. -![](/assets/images/moveit_3.png) +![](/assets/images/common-platforms/moveit_3.png) By clicking on the Execute button in the left panel the robot executes the planned motion. -![](/assets/images/moveit_4.png) +![](/assets/images/common-platforms/moveit_4.png) In a real-world application you would not use the ur5e_moveit_config package but create your own moveit configuration matching your actual workcell with all obstacles and sensors. diff --git a/wiki/common-platforms/building-custom-drone-for-darpa-triage-challenge.md b/wiki/common-platforms/building-custom-drone-for-darpa-triage-challenge.md index 5e3ad3c4..ce2cc3db 100644 --- a/wiki/common-platforms/building-custom-drone-for-darpa-triage-challenge.md +++ b/wiki/common-platforms/building-custom-drone-for-darpa-triage-challenge.md @@ -15,7 +15,7 @@ This tutorial will guide you through two implementation approaches - starting wi ## Part 1: Rapid Prototyping with DJI Matrice 100 + PX4 -![DJI Matrice 100](/assets/images/DjiM100.png) +![DJI Matrice 100](/assets/images/common-platforms/DjiM100.png) {: .notice--info} ### 1.1 System Architecture @@ -39,7 +39,7 @@ Refer to this [full list of drone components](https://umilesgroup.com/en/what-ar #### 1.2.2 Flight Controller Installation -![Pixhawk Flight Controller](/assets/images/px4-ardupilot.png) +![Pixhawk Flight Controller](/assets/images/common-platforms/px4-ardupilot.png) {: .notice--info} 1. **Mount the Pixhawk** securely to the center plate of the M100 using vibration-dampening foam to isolate it from motor vibrations. @@ -58,7 +58,7 @@ Refer to this [full list of drone components](https://umilesgroup.com/en/what-ar #### 1.2.3 Power System Configuration -![Power Module](/assets/images/power-module.png) +![Power Module](/assets/images/common-platforms/power-module.png) {: .notice--info} The power module is critical for proper operation: @@ -157,7 +157,7 @@ For a 5kg total weight target: - BLHeli_32 or KISS firmware for precise control - Consider 4-in-1 ESC as shown in the image below for cleaner wiring -![4-in-1 ESC](/assets/images/wire.webp) +![4-in-1 ESC](/assets/images/common-platforms/wire.webp) {: .notice--info} 4. **Propellers**: @@ -215,7 +215,7 @@ A well-designed frame includes: Following the wiring diagram: -![Drone Wiring Diagram](/assets/images/wiring-diagram.jpg) +![Drone Wiring Diagram](/assets/images/common-platforms/wiring-diagram.jpg) {: .notice--info} 1. **Power flow**: diff --git a/wiki/common-platforms/dji-drone-breakdown-for-technical-projects.md b/wiki/common-platforms/dji-drone-breakdown-for-technical-projects.md index aa1bc244..2f4734f8 100644 --- a/wiki/common-platforms/dji-drone-breakdown-for-technical-projects.md +++ b/wiki/common-platforms/dji-drone-breakdown-for-technical-projects.md @@ -13,7 +13,7 @@ DJI drones have one of the best commercially available PID controllers along wit To be more specific, below we will look at the components involved in controlling a DJI drone. -![DJI Control Scheme](/assets/images/DJI.png) +![DJI Control Scheme](/assets/images/common-platforms/DJI.png) The keypoint is: > DJI drones *need to read from its own GPS* to satisfy its EKF needs in order to produce proper state estimations for Position and Velocity Controls. diff --git a/wiki/common-platforms/khepera4.md b/wiki/common-platforms/khepera4.md index aca2ef4c..61927726 100644 --- a/wiki/common-platforms/khepera4.md +++ b/wiki/common-platforms/khepera4.md @@ -5,7 +5,7 @@ published: true --- This article with serve as an introduction, overview, and quick-start guide to K-Team's Khepera 4 robots. -![Put a relevant caption here](/assets/images/KHEPERA4.png) +![Put a relevant caption here](/assets/images/common-platforms/KHEPERA4.png) The Khepera 4 is a robot platform designed for indoor applications, meant to operate on tables and floor of labs. They are meant to provide a way to test algorithms developed in simulations or on paper in the real world. They're most often used to test navigation, swarm, and artificial intelligence applications, providing researchers an easy way to see how their code runs on an actual robot. diff --git a/wiki/common-platforms/unitree-go1.md b/wiki/common-platforms/unitree-go1.md index 668959a3..92553c90 100644 --- a/wiki/common-platforms/unitree-go1.md +++ b/wiki/common-platforms/unitree-go1.md @@ -14,7 +14,7 @@ This is an article that provides an overview of the Unitree Go1 Edu robot, inclu There are three versions of the Unitree Go1: Air, Pro, and Edu. The Edu model is designed for educational purposes and provides developers with access to the platform. In this article, we will focus on the capabilities of the Go1 Edu, which is a popular choice for students and researchers due to its affordability and ease of use. ## Form Factor -![Form_Factor](/assets/images/form_factor.png) +![Form_Factor](/assets/images/common-platforms/form_factor.png) The Unitree Go1 Edu has compact dimensions of 645 x 280 x 400 mm and weighs 12 kg. It boasts a top speed of 3.7-5 m/s and a maximum load capacity of 10 kg, although it's recommended to keep the payload under 5 kg. By default, the robot can traverse steps up to 10 cm high, but with programming, it's possible to overcome larger obstacles. @@ -22,7 +22,7 @@ The Go1 Edu features 12 degrees of freedom, including HAA (hip abduction/adducti The Body/Thigh Joint Motor design is highly adaptable to various mechanical equipment, with an instantaneous torque of 23.7 N·m, while the Knee Joint has a torque of 35.55 N·m. ## Power and Interface -![Unitree_TOP](/assets/images/unitree_top.png) +![Unitree_TOP](/assets/images/common-platforms/unitree_top.png) The Unitree Go1 Edu robot is equipped with a reliable lithium-ion power cell with a 6000mAh capacity that provides an endurance time of 1-2.5 hours. The robot's battery management system (BMS) closely monitors the battery status, ensuring safe and stable operation during use. The batteries themselves feature overcharge protection, providing an additional layer of safety. @@ -40,7 +40,7 @@ Moreover, Unitree provides customization options for processors and additional s * Raspberry Pi also has an extra Wi-Fi card, which is used as a hotspot 192.168.12.1. * User laptop connects to the robot hotspot, with a static IP 192.168.12.18. * Users can connect to all four devices via Ethernet cable, with a static IP 192.168.123.123. -![Wired](/assets/images/wired.png) +![Wired](/assets/images/common-platforms/wired.png) * Each Nano controls and processes a pair of fisheye cameras. The Unitree camera SDK provides an API that captures and rectifies skewed fisheye camera stream and sends out the UDP packets. * `./bins/example_putImagetrans` sends camera streams with udp packets diff --git a/wiki/common-platforms/ur5e.md b/wiki/common-platforms/ur5e.md index 0d445603..20ac0453 100644 --- a/wiki/common-platforms/ur5e.md +++ b/wiki/common-platforms/ur5e.md @@ -114,19 +114,19 @@ roslaunch ur5e_moveit_config moveit_rviz.launch rviz_config:=$(rospack find ur5e This should launch a Rviz window with a robot model. -![](/assets/images/moveit_1.png) +![](/assets/images/common-platforms/moveit_1.png) You can change the tcp target by dragging around the blue ball. The orange robot will show the configuration used to reach the target pose. -![](/assets/images/moveit_2.png) +![](/assets/images/common-platforms/moveit_2.png) By clicking on the "Plan" button in the left panel a path from the current pose to the target pose is calculated. On success, it gets animated using a semi-transparent version of the robot. -![](/assets/images/moveit_3.png) +![](/assets/images/common-platforms/moveit_3.png) By clicking on the Execute button in the left panel the robot executes the planned motion. -![](/assets/images/moveit_4.png) +![](/assets/images/common-platforms/moveit_4.png) In a real-world application you would not use the ur5e_moveit_config package but create your own moveit configuration matching your actual workcell with all obstacles and sensors. diff --git a/wiki/computing/__all_subsections.md b/wiki/computing/__all_subsections.md index 5185c9f8..a71f9982 100644 --- a/wiki/computing/__all_subsections.md +++ b/wiki/computing/__all_subsections.md @@ -9,7 +9,7 @@ This tutorial covers the basics of different Arduinos, and how to implement comm The main Arduino boards witnessed being used in these applications are the Arduino Uno and Arduino Mega. ## The Uno -![Arduino Uno R3 Front](/assets/images/Arduino-d9b3f.png) +![Arduino Uno R3 Front](/assets/images/computing/Arduino-d9b3f.png) Good for smaller projects - Has 14 digital input/output pins, 6 analog inputs (which can also be used as digital input/output pins), and a 5v as well as a 3.3v regulator @@ -19,7 +19,7 @@ Good for smaller projects - If you are going to power it externally, you have to use between 7 and 12 volts on the Vin pin, and the ground of your power source has to go to a GND pin. A 9 volt battery works well for this. Make sure you connect the hot to Vin and the ground/negative terminal to ground of the power supply, or else you can fry the board. ## The Mega -![Arduino Mega R3](/assets/images/Arduino-c30e6.png) +![Arduino Mega R3](/assets/images/computing/Arduino-c30e6.png) Good for bigger projects - Has 54 digital input/output pins, 16 analog inputs (which can also be used as digital input/output pins), and a 5v as well as a 3.3v regulator @@ -32,7 +32,7 @@ Good for bigger projects ## Wiring: ### Limit Switch: #### Example: -![Limit Switch Wiring](/assets/images/Arduino-2369d.png) +![Limit Switch Wiring](/assets/images/computing/Arduino-2369d.png) Whatever pin that is connected to the Normally Open pin of the limit switch, needs to be setup by using ``pinMode(pin#, INPUT_PULLUP);`` @@ -48,7 +48,7 @@ So to use this intuitively, use ``!digitalRead(pin#);`` this will return HIGH wh ## Motor Driver: Example with L298 Compact Motor Driver available in Mechatronics Lab: -![Motor Driver Wiring](/assets/images/Arduino-de522.png) +![Motor Driver Wiring](/assets/images/computing/Arduino-de522.png) With this example, the yellow lines connected to pins 10 and 11 (which are PWM) are the enables for the motors. When the enable is HIGH, the motor is turned on. For PWM lines, you use ``analogWrite(pin#, pwmValue);``, where ``pwmValue`` is an integer between 0-255, with 0 being off, and 255 being always HIGH, with inbetween values able to control speed if your motor is capable of that. @@ -285,7 +285,7 @@ Download the CUDA driver from the [official nvidia website here](https://develop *At the time of writing this document, the latest stable version is CUDA 10.0*. -![](/assets/images/nvidia-cuda.png) +![](/assets/images/computing/nvidia-cuda.png) After downloading the file, go to the folder where you have downloaded the file and run the following commands from the terminal to install the CUDA drivers. Please make sure that the filename used in the command below is the same as the downloaded file and replace the `` number. @@ -314,7 +314,7 @@ Go to official cuDNN website [official cuDNN website](https://developer.nvidia.c **Make sure you download the correct cuDNN version which matches with you CUDA version.** -![](/assets/images/nvidia-cudnn.png) +![](/assets/images/computing/nvidia-cudnn.png) ### Installing from TAR file (Recommended Method) For cuDNN downloaded using _cuDNN Library for Linux_ method, go to the folder where you have downloaded the “.tgz” file and from the command line execute the following (update the filename). diff --git a/wiki/computing/arduino.md b/wiki/computing/arduino.md index 0e6a3352..3468a982 100644 --- a/wiki/computing/arduino.md +++ b/wiki/computing/arduino.md @@ -8,7 +8,7 @@ This tutorial covers the basics of different Arduinos, and how to implement comm The main Arduino boards witnessed being used in these applications are the Arduino Uno and Arduino Mega. ## The Uno -![Arduino Uno R3 Front](/assets/images/Arduino-d9b3f.png) +![Arduino Uno R3 Front](/assets/images/computing/Arduino-d9b3f.png) Good for smaller projects - Has 14 digital input/output pins, 6 analog inputs (which can also be used as digital input/output pins), and a 5v as well as a 3.3v regulator @@ -18,7 +18,7 @@ Good for smaller projects - If you are going to power it externally, you have to use between 7 and 12 volts on the Vin pin, and the ground of your power source has to go to a GND pin. A 9 volt battery works well for this. Make sure you connect the hot to Vin and the ground/negative terminal to ground of the power supply, or else you can fry the board. ## The Mega -![Arduino Mega R3](/assets/images/Arduino-c30e6.png) +![Arduino Mega R3](/assets/images/computing/Arduino-c30e6.png) Good for bigger projects - Has 54 digital input/output pins, 16 analog inputs (which can also be used as digital input/output pins), and a 5v as well as a 3.3v regulator @@ -31,7 +31,7 @@ Good for bigger projects ## Wiring: ### Limit Switch: #### Example: -![Limit Switch Wiring](/assets/images/Arduino-2369d.png) +![Limit Switch Wiring](/assets/images/computing/Arduino-2369d.png) Whatever pin that is connected to the Normally Open pin of the limit switch, needs to be setup by using ``pinMode(pin#, INPUT_PULLUP);`` @@ -47,7 +47,7 @@ So to use this intuitively, use ``!digitalRead(pin#);`` this will return HIGH wh ## Motor Driver: Example with L298 Compact Motor Driver available in Mechatronics Lab: -![Motor Driver Wiring](/assets/images/Arduino-de522.png) +![Motor Driver Wiring](/assets/images/computing/Arduino-de522.png) With this example, the yellow lines connected to pins 10 and 11 (which are PWM) are the enables for the motors. When the enable is HIGH, the motor is turned on. For PWM lines, you use ``analogWrite(pin#, pwmValue);``, where ``pwmValue`` is an integer between 0-255, with 0 being off, and 255 being always HIGH, with inbetween values able to control speed if your motor is capable of that. diff --git a/wiki/computing/setup-gpus-for-computer-vision.md b/wiki/computing/setup-gpus-for-computer-vision.md index f4e0f61c..2e52ac01 100644 --- a/wiki/computing/setup-gpus-for-computer-vision.md +++ b/wiki/computing/setup-gpus-for-computer-vision.md @@ -94,7 +94,7 @@ Download the CUDA driver from the [official nvidia website here](https://develop *At the time of writing this document, the latest stable version is CUDA 10.0*. -![](/assets/images/nvidia-cuda.png) +![](/assets/images/computing/nvidia-cuda.png) After downloading the file, go to the folder where you have downloaded the file and run the following commands from the terminal to install the CUDA drivers. Please make sure that the filename used in the command below is the same as the downloaded file and replace the `` number. @@ -123,7 +123,7 @@ Go to official cuDNN website [official cuDNN website](https://developer.nvidia.c **Make sure you download the correct cuDNN version which matches with you CUDA version.** -![](/assets/images/nvidia-cudnn.png) +![](/assets/images/computing/nvidia-cudnn.png) ### Installing from TAR file (Recommended Method) For cuDNN downloaded using _cuDNN Library for Linux_ method, go to the folder where you have downloaded the “.tgz” file and from the command line execute the following (update the filename). diff --git a/wiki/fabrication/3d-printers.md b/wiki/fabrication/3d-printers.md index 4d70e78b..339752f4 100644 --- a/wiki/fabrication/3d-printers.md +++ b/wiki/fabrication/3d-printers.md @@ -8,7 +8,7 @@ title: 3D Printers ### What is 3D printing? Fundamentally, 3D Printing is the concept of additively producing a physical part from a 3D part file. Typically, this done by breaking a 3D part into horizontal layers and then printing each layer as a planar part of constant thickness. However, there are other methods. For example, [Carbon3D](http://carbon3d.com/), uses an alternative approach known as Digital Light Synthesis which is a two step process of printing with a support resin then melting the support structure away. -![Layering of Material to Create a Shape used in 3D Printing](/assets/images/3DPrinters-10477.png) +![Layering of Material to Create a Shape used in 3D Printing](/assets/images/fabrication/3DPrinters-10477.png) Recently 3D printing has become somewhat of a revolution for three reasons: @@ -58,7 +58,7 @@ Material jetting machines are known to produce parts with good surface finishes ## Industry Segmentation [IBISWorld](http://clients1.ibisworld.com/?u=XTrdcEUxGT9ofTiep6uaiw==&p=Evn+48Pl8G+/5sICIXpGHA==) provides a overview of the 3D printer manufacturing industry. This is focused on large high volume companies such as Straysis and [3D Systems](http://www.3dsystems.com/) and does not include many of the effects of smaller volume 'maker' targeted companies. It shows a roughly equal breakdown between SLA, SLS, and FDM technologies. -![Industry Segmentation by 3D Printing Technologies](/assets/images/3DPrinters-a3389.png) +![Industry Segmentation by 3D Printing Technologies](/assets/images/fabrication/3DPrinters-a3389.png) diff --git a/wiki/fabrication/__all_subsections.md b/wiki/fabrication/__all_subsections.md index 158bef3d..0a90162c 100644 --- a/wiki/fabrication/__all_subsections.md +++ b/wiki/fabrication/__all_subsections.md @@ -9,7 +9,7 @@ title: 3D Printers ### What is 3D printing? Fundamentally, 3D Printing is the concept of additively producing a physical part from a 3D part file. Typically, this done by breaking a 3D part into horizontal layers and then printing each layer as a planar part of constant thickness. However, there are other methods. For example, [Carbon3D](http://carbon3d.com/), uses an alternative approach known as Digital Light Synthesis which is a two step process of printing with a support resin then melting the support structure away. -![Layering of Material to Create a Shape used in 3D Printing](/assets/images/3DPrinters-10477.png) +![Layering of Material to Create a Shape used in 3D Printing](/assets/images/fabrication/3DPrinters-10477.png) Recently 3D printing has become somewhat of a revolution for three reasons: @@ -59,7 +59,7 @@ Material jetting machines are known to produce parts with good surface finishes ## Industry Segmentation [IBISWorld](http://clients1.ibisworld.com/?u=XTrdcEUxGT9ofTiep6uaiw==&p=Evn+48Pl8G+/5sICIXpGHA==) provides a overview of the 3D printer manufacturing industry. This is focused on large high volume companies such as Straysis and [3D Systems](http://www.3dsystems.com/) and does not include many of the effects of smaller volume 'maker' targeted companies. It shows a roughly equal breakdown between SLA, SLS, and FDM technologies. -![Industry Segmentation by 3D Printing Technologies](/assets/images/3DPrinters-a3389.png) +![Industry Segmentation by 3D Printing Technologies](/assets/images/fabrication/3DPrinters-a3389.png) @@ -421,7 +421,7 @@ In a bowser window, go to . This should load th Once you are connected, open Cura Type A. When prompted, type in our printer's serial number and API key: - Serial number: 10610 - API Key: Click on the wrench icon in the upper right hand corner of the Series A webpage and go to the API tab. Copy and paste the API key. -![Find your API Key here](/assets/images/SeriesA_APIKey.jpg) +![Find your API Key here](/assets/images/fabrication/SeriesA_APIKey.jpg) Click the "Configure" button to prepare your printer. Cura Type A should open. @@ -435,7 +435,7 @@ The Series A Pro printer generally uses PLA (as opposed to ABS). PLA requires ve ### Print Profiles The standard profile is a good compromise between speed and print quality for PLA on the Series A Pro. [Download SeriesA_Standard_Profile.zip](/wiki/fabrication/assets/SeriesA_Standard_Profile.zip) -![Print Quality of Standard Profile](/assets/images/SeriesA_PLA_SP.jpg) +![Print Quality of Standard Profile](/assets/images/fabrication/SeriesA_PLA_SP.jpg) ## Tips #### Changing Fillament diff --git a/wiki/fabrication/series-A-pro.md b/wiki/fabrication/series-A-pro.md index a1b41568..e0ef2d66 100644 --- a/wiki/fabrication/series-A-pro.md +++ b/wiki/fabrication/series-A-pro.md @@ -18,7 +18,7 @@ In a bowser window, go to . This should load th Once you are connected, open Cura Type A. When prompted, type in our printer's serial number and API key: - Serial number: 10610 - API Key: Click on the wrench icon in the upper right hand corner of the Series A webpage and go to the API tab. Copy and paste the API key. -![Find your API Key here](/assets/images/SeriesA_APIKey.jpg) +![Find your API Key here](/assets/images/fabrication/SeriesA_APIKey.jpg) Click the "Configure" button to prepare your printer. Cura Type A should open. @@ -32,7 +32,7 @@ The Series A Pro printer generally uses PLA (as opposed to ABS). PLA requires ve ### Print Profiles The standard profile is a good compromise between speed and print quality for PLA on the Series A Pro. [Download SeriesA_Standard_Profile.zip](/wiki/fabrication/assets/SeriesA_Standard_Profile.zip) -![Print Quality of Standard Profile](/assets/images/SeriesA_PLA_SP.jpg) +![Print Quality of Standard Profile](/assets/images/fabrication/SeriesA_PLA_SP.jpg) ## Tips #### Changing Fillament diff --git a/wiki/interfacing/__all_subsections.md b/wiki/interfacing/__all_subsections.md index 9813d4ef..d5fa2e25 100644 --- a/wiki/interfacing/__all_subsections.md +++ b/wiki/interfacing/__all_subsections.md @@ -74,7 +74,7 @@ title: micro-ROS for ROS2 on Microcontrollers ## Conceptual Overview micro-ROS consists of a `node` running on the microcontroller and an `agent` running on the host computer. The `agent` handles the interface between the `node` and the rest of the ROS2 stack. This allows the ROS2 stack and microcontroller `node` to publish and subscribe to each other as if the `node` was like any other ROS2 node. Great! The hardware interface is most commonly a serial connection, such as USB. This tutorial will walk through how to prepare the microcontroller and host computer environments for the `node` and `agent` respectively, and then show some examples for how to test the connection and make a first `node` on the microcontroller. -![Simplified micro-ROS architecture](/assets/images/micro-ros-architecture.png) +![Simplified micro-ROS architecture](/assets/images/interfacing/micro-ros-architecture.png) ## Installation Overview @@ -214,7 +214,7 @@ This container should be some variant of Linux OS with a ROS2 installation. You exit ``` -![Example steps of running micro-ROS Docker image](/assets/images/micro-ros-docker.png) +![Example steps of running micro-ROS Docker image](/assets/images/interfacing/micro-ros-docker.png) 7. Finally, don't forget to stop the container and remove any unnecessary build cache. You can do so by: @@ -609,7 +609,7 @@ ROS 2 is widely used nowadays due to its better security features and code organ ### ROS 1 - ROS 2 Bridge The [ROS 1 bridge](https://github.com/ros2/ros1_bridge) is a ROS 2 package that provides nodes to bridge topics between ROS 1 and ROS 2. A point to be noted here is that bridging is only available on Ubuntu 20.04, as this distribution is the only one that supports both ROS 1 Noetic and ROS 2 Foxy. This package is capable of bridging the stantard ROS interfaces (messages/services) listed in the [ros2/common_interfaces](https://github.com/ros2/common_interfaces) repository. To use the bridge with custom message types, the package needs to be build from source, and the custom types should also be sourced in seperate ROS 1 and ROS 2 workspaces. Services need to be bridged explicitly between ROS 2 and ROS 1, and ROS 1 and ROS 2. -![ROS 1 - ROS 2 Bridge Setup](/assets/images/ros-bridge.png) +![ROS 1 - ROS 2 Bridge Setup](/assets/images/interfacing/ros-bridge.png) ### Installation: Installation instructions are provided in the [ROS 1 bridge](https://github.com/ros2/common_interfaces) repository README. Note that you need to have both ROS 1 Noetic and ROS 2 Foxy installed in the system. There are 2 main ways to install the bridge: diff --git a/wiki/interfacing/microros-for-ros2-on-microcontrollers.md b/wiki/interfacing/microros-for-ros2-on-microcontrollers.md index aa1c4642..4cae7061 100644 --- a/wiki/interfacing/microros-for-ros2-on-microcontrollers.md +++ b/wiki/interfacing/microros-for-ros2-on-microcontrollers.md @@ -14,7 +14,7 @@ title: micro-ROS for ROS2 on Microcontrollers ## Conceptual Overview micro-ROS consists of a `node` running on the microcontroller and an `agent` running on the host computer. The `agent` handles the interface between the `node` and the rest of the ROS2 stack. This allows the ROS2 stack and microcontroller `node` to publish and subscribe to each other as if the `node` was like any other ROS2 node. Great! The hardware interface is most commonly a serial connection, such as USB. This tutorial will walk through how to prepare the microcontroller and host computer environments for the `node` and `agent` respectively, and then show some examples for how to test the connection and make a first `node` on the microcontroller. -![Simplified micro-ROS architecture](/assets/images/micro-ros-architecture.png) +![Simplified micro-ROS architecture](/assets/images/interfacing/micro-ros-architecture.png) ## Installation Overview @@ -154,7 +154,7 @@ This container should be some variant of Linux OS with a ROS2 installation. You exit ``` -![Example steps of running micro-ROS Docker image](/assets/images/micro-ros-docker.png) +![Example steps of running micro-ROS Docker image](/assets/images/interfacing/micro-ros-docker.png) 7. Finally, don't forget to stop the container and remove any unnecessary build cache. You can do so by: diff --git a/wiki/interfacing/ros1_ros2_bridge.md b/wiki/interfacing/ros1_ros2_bridge.md index 4b081a02..852dad88 100644 --- a/wiki/interfacing/ros1_ros2_bridge.md +++ b/wiki/interfacing/ros1_ros2_bridge.md @@ -15,7 +15,7 @@ ROS 2 is widely used nowadays due to its better security features and code organ ### ROS 1 - ROS 2 Bridge The [ROS 1 bridge](https://github.com/ros2/ros1_bridge) is a ROS 2 package that provides nodes to bridge topics between ROS 1 and ROS 2. A point to be noted here is that bridging is only available on Ubuntu 20.04, as this distribution is the only one that supports both ROS 1 Noetic and ROS 2 Foxy. This package is capable of bridging the stantard ROS interfaces (messages/services) listed in the [ros2/common_interfaces](https://github.com/ros2/common_interfaces) repository. To use the bridge with custom message types, the package needs to be build from source, and the custom types should also be sourced in seperate ROS 1 and ROS 2 workspaces. Services need to be bridged explicitly between ROS 2 and ROS 1, and ROS 1 and ROS 2. -![ROS 1 - ROS 2 Bridge Setup](/assets/images/ros-bridge.png) +![ROS 1 - ROS 2 Bridge Setup](/assets/images/interfacing/ros-bridge.png) ### Installation: Installation instructions are provided in the [ROS 1 bridge](https://github.com/ros2/common_interfaces) repository README. Note that you need to have both ROS 1 Noetic and ROS 2 Foxy installed in the system. There are 2 main ways to install the bridge: diff --git a/wiki/machine-learning/__all_subsections.md b/wiki/machine-learning/__all_subsections.md index 3484085e..0a025aed 100644 --- a/wiki/machine-learning/__all_subsections.md +++ b/wiki/machine-learning/__all_subsections.md @@ -25,7 +25,7 @@ def encode_segmap(self, mask): return mask[:, :, 0] # target should be h x w, no depth ``` -![mask annotation](/assets/images/mask_annotation.png) +![mask annotation](/assets/images/machine-learning/mask_annotation.png) ## Installing gimp copy and paste the following command in your terminal to install gimp @@ -41,17 +41,17 @@ Navigate to file->open botton on the top left to open a rgb image that you'd li ### Step 2 Create mask Navigate to layer->new layer to create a mask over your image. Choose Foreground color will create a black layer over your image. You can also change the foreground color on the left panel before you create a new layer, this will give you a layer with different color (which would corresponds to background in this tutorial) -![mask annotation](/assets/images/new_layer.png) +![mask annotation](/assets/images/machine-learning/new_layer.png) After creating new layer, you will see your newly created layer on the right panel. Click on the eye symbol and make the layer invisible. -![manage layers](/assets/images/manage_layers.png) +![manage layers](/assets/images/machine-learning/manage_layers.png) ### Step 3 Creating annotations Select the free select tool on the left panel. **IMPORTANT:** Uncheck the anti-aliasing option, otherwise non-solid colors will appear at the edge of your annotations. Select the region of interest, and then use bucket fill tool to fill in color annotation. Click on the eye symbol again on the right panel will show you the annotated layer. -![free select tool](/assets/images/select_tool.png) -![create annotation](/assets/images/bucket_fill.png) +![free select tool](/assets/images/machine-learning/select_tool.png) +![create annotation](/assets/images/machine-learning/bucket_fill.png) ### Step 4 Saving files Hit ctrl+E to export your layer as an png image, which is your label for this image. Hit ctrl+S to save the gimp file as .xcf file. This step is important if you want to modify your annotation in the future. @@ -201,7 +201,7 @@ MediaPipe offers cross-platform, customizable ML solutions for live and streamin ## Solutions offered -![Figure 1. Mediapipe Solutions](/assets/images/mediapipe_solutions.png) +![Figure 1. Mediapipe Solutions](/assets/images/machine-learning/mediapipe_solutions.png) The image above summarizes the solutions offered by mediapipe. The solutions below have been classified into 2 categories based on the use cases: @@ -241,7 +241,7 @@ MediaPipe Objectron is a mobile real-time 3D object detection solution for every MediaPipe KNIFT is a template-based feature matching solution using KNIFT (Keypoint Neural Invariant Feature Transform). KNIFT is a strong feature descriptor robust not only to affine distortions, but to some degree of perspective distortions as well. This can be a crucial building block to establish reliable correspondences between different views of an object or scene, forming the foundation for approaches like template matching, image retrieval and structure from motion. The table below describes the support of the above models for currently available platforms: -![Figure 1. Mediapipe supported platforms](/assets/images/mediapipe_platforms.png) +![Figure 1. Mediapipe supported platforms](/assets/images/machine-learning/mediapipe_platforms.png) ## Quickstart Guide Mediapipe solutions are available for various platforms viz. Android, iOS, Python, JavaScript, C++. The guide at [Getting Started](https://google.github.io/mediapipe/getting_started/getting_started.html) comprises instructions for various platforms. @@ -354,9 +354,9 @@ Transformers have become increasingly popular in NLP due to their ability to cap Transformers are a powerful tool for NLP and have revolutionized the field. They have enabled researchers to create models that can accurately capture the meaning of text and make accurate predictions. -![Transformer Architecture simplified](/assets/images/NLP_image1.png) +![Transformer Architecture simplified](/assets/images/machine-learning/NLP_image1.png) -![Transformer Architecture](/assets/images/NLP_image2.png) +![Transformer Architecture](/assets/images/machine-learning/NLP_image2.png) Encoder (left): The encoder receives an input and builds a representation of it (its features). This means that the model is optimized to acquire understanding from the input. @@ -470,7 +470,7 @@ preds = vqa(image=image, question=question) preds = [{"score": round(pred["score"], 4), "answer": pred["answer"]} for pred in preds] ``` -![Input Image](/assets/images/NLP_image3.png) +![Input Image](/assets/images/machine-learning/NLP_image3.png) @@ -496,7 +496,7 @@ OUTPUT: [ Below is a table describing some of the basic pipeline identifiers and their use. -![List of different pipelines](/assets/images/NLP_image4.png) +![List of different pipelines](/assets/images/machine-learning/NLP_image4.png) # Fine-tuning a pretrained model @@ -676,7 +676,7 @@ This article serves as a step-by-step tutorial of how to integrate YOLO in ROS a --- ## Integrating YOLO with ROS -![YOLO Demo](/assets/images/yolo_demo.png) +![YOLO Demo](/assets/images/machine-learning/yolo_demo.png) To install YOLO in ROS, we will use a YOLO ROS wrapper GitHub repository [darknet_ros](https://github.com/leggedrobotics/darknet_ros). You can simply follow their instructions in the README or follow the instructions below. @@ -1209,9 +1209,9 @@ After training is finished, the training script will save the model weights to a YOLOv5's official repository provides an exporting script, and to simplify the post-processing steps, please checkout a newer commit, eg. “070af88108e5675358fd783aae9d91e927717322”. At the root folder of the repository, run `python export.py --weights WEIGHT_PATH/WEIGHT_FILE_NAME.pt --img IMAGE_LENGTH --batch-size 1 --device cpu --include onnx --simplify --opset 11`. There’ll be a .onnx file generated next to the .pt file, and [netron](https://netron.app/) provides a tool to easily visualize and verify the onnx file. For example, if the image size is 416x416, the model is YOLOv5s and the class number is 2, you should see the following input and output structures: -![Figure 1. YOLOv5 onnx visualization (the input part)](/assets/images/yolov5_onnx_input.png) +![Figure 1. YOLOv5 onnx visualization (the input part)](/assets/images/machine-learning/yolov5_onnx_input.png) -![Figure 2. YOLOv5 onnx visualization (the output part)](/assets/images/yolov5_onnx_output.png) +![Figure 2. YOLOv5 onnx visualization (the output part)](/assets/images/machine-learning/yolov5_onnx_output.png) After moving the .onnx file to your Jetson, run `trtexec --onnx=ONNX_FILE.onnx --workspace=4096 --saveEngine=ENGINE_NAME.engine --verbose` to obtain the final TensorRT engine file. The 4096 is the upper bound of the memory usage and should be adapted according to the platform. Besides, if there’s no trtexec command while TensorRT was installed, add `export PATH=$PATH:/usr/src/tensorrt/bin` to your `~/.bashrc` or `~/.zshrc`, depending on your default shell. diff --git a/wiki/machine-learning/custom-semantic-data.md b/wiki/machine-learning/custom-semantic-data.md index 8d9e1456..83a0f38d 100644 --- a/wiki/machine-learning/custom-semantic-data.md +++ b/wiki/machine-learning/custom-semantic-data.md @@ -24,7 +24,7 @@ def encode_segmap(self, mask): return mask[:, :, 0] # target should be h x w, no depth ``` -![mask annotation](/assets/images/mask_annotation.png) +![mask annotation](/assets/images/machine-learning/mask_annotation.png) ## Installing gimp copy and paste the following command in your terminal to install gimp @@ -40,17 +40,17 @@ Navigate to file->open botton on the top left to open a rgb image that you'd li ### Step 2 Create mask Navigate to layer->new layer to create a mask over your image. Choose Foreground color will create a black layer over your image. You can also change the foreground color on the left panel before you create a new layer, this will give you a layer with different color (which would corresponds to background in this tutorial) -![mask annotation](/assets/images/new_layer.png) +![mask annotation](/assets/images/machine-learning/new_layer.png) After creating new layer, you will see your newly created layer on the right panel. Click on the eye symbol and make the layer invisible. -![manage layers](/assets/images/manage_layers.png) +![manage layers](/assets/images/machine-learning/manage_layers.png) ### Step 3 Creating annotations Select the free select tool on the left panel. **IMPORTANT:** Uncheck the anti-aliasing option, otherwise non-solid colors will appear at the edge of your annotations. Select the region of interest, and then use bucket fill tool to fill in color annotation. Click on the eye symbol again on the right panel will show you the annotated layer. -![free select tool](/assets/images/select_tool.png) -![create annotation](/assets/images/bucket_fill.png) +![free select tool](/assets/images/machine-learning/select_tool.png) +![create annotation](/assets/images/machine-learning/bucket_fill.png) ### Step 4 Saving files Hit ctrl+E to export your layer as an png image, which is your label for this image. Hit ctrl+S to save the gimp file as .xcf file. This step is important if you want to modify your annotation in the future. diff --git a/wiki/machine-learning/imitation-learning.md b/wiki/machine-learning/imitation-learning.md index 2231f649..8b687bc8 100644 --- a/wiki/machine-learning/imitation-learning.md +++ b/wiki/machine-learning/imitation-learning.md @@ -26,7 +26,7 @@ The most foundational IL method is Behavior Cloning (BC). In BC, a supervised le To address this limitation, DAgger-style iterative methods expand the dataset by repeatedly allowing the robot to act, querying the expert for corrections, and aggregating these new samples. This produces a training distribution that more closely matches what the robot will encounter at deployment time, significantly improving robustness. Modern IL for humanoid robots also relies on rich, multi-modal representations. -![The workings of Diffusion Policy](/assets/images/diffusion_policy_diagram.png) +![The workings of Diffusion Policy](/assets/images/machine-learning/diffusion_policy_diagram.png) image [source](https://arxiv.org/pdf/2303.04137) @@ -204,7 +204,7 @@ A useful conceptual framing of this pipeline is the **System-1 / System-2 hierar The ability to process large volumes of data and generate responses swiftly mirrors a type of human cognition described by psychologist Daniel Kahneman in his book “Thinking, Fast and Slow”. Kahneman identifies two types of thinking systems in human cognition: System 1 and System 2 (see Figure below). -![Concept of thinking systems in human cognition](/assets/images/system1system2.png) +![Concept of thinking systems in human cognition](/assets/images/machine-learning/system1system2.png) image source: Nguyen Ha Thanh Bridging Generative Models and System 1 with System 2: [link](https://blog.nguyenthanh.asia/bridging-generative-models-and-system-1-with-system-2-the-role-of-logical-programming-in-ai-58ca105c2f) @@ -214,7 +214,7 @@ Whereas System-1 executes moment-to-moment motor control, System-2 provides **pl The figure below demonstrates NVIDIA GR00T’s System1-System2 architecture: -![NVIDIA Isaac GR00T N1 Model Architecture](/assets/images/Gr00t.png) +![NVIDIA Isaac GR00T N1 Model Architecture](/assets/images/machine-learning/Gr00t.png) image source: [GR00T paper](https://arxiv.org/pdf/2503.14734) @@ -257,7 +257,7 @@ For deployment guidance, we recommend examining FALCON's sim2real pipeline. Toge ## Further Reading -1. [Concept of thinking systems in human cognition](/assets/images/system1system2.png) +1. [Concept of thinking systems in human cognition](/assets/images/machine-learning/system1system2.png) 2. Figure AI's robot sorting packages [youtube](https://www.youtube.com/watch?v=lkc2y0yb89U&t=70s) 3. 1X performing human-like long-horizon tasks [youtube](https://www.youtube.com/watch?v=uVcBa6NXAbk) 4. Sunday Robotics performing distinct household tasks [youtube](https://www.youtube.com/watch?v=jjOfpsMRhL4) diff --git a/wiki/machine-learning/mediapipe-live-ml-anywhere.md b/wiki/machine-learning/mediapipe-live-ml-anywhere.md index 413ab758..cc9ea4d1 100644 --- a/wiki/machine-learning/mediapipe-live-ml-anywhere.md +++ b/wiki/machine-learning/mediapipe-live-ml-anywhere.md @@ -16,7 +16,7 @@ MediaPipe offers cross-platform, customizable ML solutions for live and streamin ## Solutions offered -![Figure 1. Mediapipe Solutions](/assets/images/mediapipe_solutions.png) +![Figure 1. Mediapipe Solutions](/assets/images/machine-learning/mediapipe_solutions.png) The image above summarizes the solutions offered by mediapipe. The solutions below have been classified into 2 categories based on the use cases: @@ -56,7 +56,7 @@ MediaPipe Objectron is a mobile real-time 3D object detection solution for every MediaPipe KNIFT is a template-based feature matching solution using KNIFT (Keypoint Neural Invariant Feature Transform). KNIFT is a strong feature descriptor robust not only to affine distortions, but to some degree of perspective distortions as well. This can be a crucial building block to establish reliable correspondences between different views of an object or scene, forming the foundation for approaches like template matching, image retrieval and structure from motion. The table below describes the support of the above models for currently available platforms: -![Figure 1. Mediapipe supported platforms](/assets/images/mediapipe_platforms.png) +![Figure 1. Mediapipe supported platforms](/assets/images/machine-learning/mediapipe_platforms.png) ## Quickstart Guide Mediapipe solutions are available for various platforms viz. Android, iOS, Python, JavaScript, C++. The guide at [Getting Started](https://google.github.io/mediapipe/getting_started/getting_started.html) comprises instructions for various platforms. diff --git a/wiki/machine-learning/nlp-for-robotics.md b/wiki/machine-learning/nlp-for-robotics.md index ca355537..4c1906a6 100644 --- a/wiki/machine-learning/nlp-for-robotics.md +++ b/wiki/machine-learning/nlp-for-robotics.md @@ -19,9 +19,9 @@ Transformers have become increasingly popular in NLP due to their ability to cap Transformers are a powerful tool for NLP and have revolutionized the field. They have enabled researchers to create models that can accurately capture the meaning of text and make accurate predictions. -![Transformer Architecture simplified](/assets/images/NLP_image1.png) +![Transformer Architecture simplified](/assets/images/machine-learning/NLP_image1.png) -![Transformer Architecture](/assets/images/NLP_image2.png) +![Transformer Architecture](/assets/images/machine-learning/NLP_image2.png) Encoder (left): The encoder receives an input and builds a representation of it (its features). This means that the model is optimized to acquire understanding from the input. @@ -135,7 +135,7 @@ preds = vqa(image=image, question=question) preds = [{"score": round(pred["score"], 4), "answer": pred["answer"]} for pred in preds] ``` -![Input Image](/assets/images/NLP_image3.png) +![Input Image](/assets/images/machine-learning/NLP_image3.png) @@ -161,7 +161,7 @@ OUTPUT: [ Below is a table describing some of the basic pipeline identifiers and their use. -![List of different pipelines](/assets/images/NLP_image4.png) +![List of different pipelines](/assets/images/machine-learning/NLP_image4.png) # Fine-tuning a pretrained model diff --git a/wiki/machine-learning/ros-yolo-gpu.md b/wiki/machine-learning/ros-yolo-gpu.md index a310fa76..d50ede4c 100644 --- a/wiki/machine-learning/ros-yolo-gpu.md +++ b/wiki/machine-learning/ros-yolo-gpu.md @@ -16,7 +16,7 @@ This article serves as a step-by-step tutorial of how to integrate YOLO in ROS a --- ## Integrating YOLO with ROS -![YOLO Demo](/assets/images/yolo_demo.png) +![YOLO Demo](/assets/images/machine-learning/yolo_demo.png) To install YOLO in ROS, we will use a YOLO ROS wrapper GitHub repository [darknet_ros](https://github.com/leggedrobotics/darknet_ros). You can simply follow their instructions in the README or follow the instructions below. diff --git a/wiki/machine-learning/yolov5-tensorrt.md b/wiki/machine-learning/yolov5-tensorrt.md index 746c7d22..c4790f81 100644 --- a/wiki/machine-learning/yolov5-tensorrt.md +++ b/wiki/machine-learning/yolov5-tensorrt.md @@ -34,9 +34,9 @@ After training is finished, the training script will save the model weights to a YOLOv5's official repository provides an exporting script, and to simplify the post-processing steps, please checkout a newer commit, eg. “070af88108e5675358fd783aae9d91e927717322”. At the root folder of the repository, run `python export.py --weights WEIGHT_PATH/WEIGHT_FILE_NAME.pt --img IMAGE_LENGTH --batch-size 1 --device cpu --include onnx --simplify --opset 11`. There’ll be a .onnx file generated next to the .pt file, and [netron](https://netron.app/) provides a tool to easily visualize and verify the onnx file. For example, if the image size is 416x416, the model is YOLOv5s and the class number is 2, you should see the following input and output structures: -![Figure 1. YOLOv5 onnx visualization (the input part)](/assets/images/yolov5_onnx_input.png) +![Figure 1. YOLOv5 onnx visualization (the input part)](/assets/images/machine-learning/yolov5_onnx_input.png) -![Figure 2. YOLOv5 onnx visualization (the output part)](/assets/images/yolov5_onnx_output.png) +![Figure 2. YOLOv5 onnx visualization (the output part)](/assets/images/machine-learning/yolov5_onnx_output.png) After moving the .onnx file to your Jetson, run `trtexec --onnx=ONNX_FILE.onnx --workspace=4096 --saveEngine=ENGINE_NAME.engine --verbose` to obtain the final TensorRT engine file. The 4096 is the upper bound of the memory usage and should be adapted according to the platform. Besides, if there’s no trtexec command while TensorRT was installed, add `export PATH=$PATH:/usr/src/tensorrt/bin` to your `~/.bashrc` or `~/.zshrc`, depending on your default shell. diff --git a/wiki/math/__all_subsections.md b/wiki/math/__all_subsections.md index 4a57cd2b..e5399ca2 100644 --- a/wiki/math/__all_subsections.md +++ b/wiki/math/__all_subsections.md @@ -25,7 +25,7 @@ You will be able to have a basic understanding on Gaussian Process (what is it a A Gaussian Process(GP) is a probability distribution over functions \\( p(\textbf{f}) \\) , where the functions are defined by a set of random function variables \\(\textbf{f} = \{f_1, f_2, . . . , f_N\}\\). For a GP, any finite linear combination of those function variables has a joint (zero mean) Gaussian distribution. It can be used for nonlinear regression, classification, ranking, preference learning, ordinal regression. In robotics, it can be applied to state estimation, motion planning and in our case environment modeling. GPs are closely related to other models and can be derived using bayesian kernel machines, linear regression with basis functions, infinite multi-layer perceptron neural networks (it becomes a GP if there are infinitely many hidden units and Gaussian priors on the weights), spline models. A simple connections between different methods can be found in the following figure. -![](/assets/images/gpConnection.png) +![](/assets/images/math/gpConnection.png) @@ -36,7 +36,7 @@ GPs are closely related to other models and can be derived using bayesian kernel Before all the equations, lets have a look at why do we want to use GP? ### Why do we want to use GP? The major reasons why GP is popular includes: -1. It can handle uncertainty in unknown function by averaging, not minimizing as GP is rooted in probability and bayesian inference.![](/assets/images/uncertainty.png) +1. It can handle uncertainty in unknown function by averaging, not minimizing as GP is rooted in probability and bayesian inference.![](/assets/images/math/uncertainty.png) Classifier comparison(https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) This property is not commonly shared by other methods. For example, in the above classification method comparison. Neural nets and random forests are confident about the points that are far from the training data. 2. We can incorporate prior knowledge by choosing different kernels 3. GP can learn the kernel and regularization parameters automatically during the learning process. (GP is a non-parametric model, but all data are needed to generate the model. In other words, it need finite but unbounded number of parameters that grows with data.) @@ -104,7 +104,7 @@ While \\( \mu \\) is the average value of the data (Expectations), \\( \Sigma \\ The Gaussian mixture model can be regarded as a model composed of K single Gaussian models, which are hidden variables of the hybrid model. In general, a mixed model can use any probability distribution. The Gaussian mixture model is used here because the Gaussian distribution has good mathematical properties and good computational performance. For example, we now have a bunch of samples of dogs. Different types of dogs have different body types, colors, and looks, but they all belong to the dog category. At this time, the single Gaussian model may not describe the distribution very well since the sample data distribution is not a single ellipse. However, a mixed Gaussian distribution can better describe the problem, as shown in the following figure: -![](/assets/images/mixedGaussian.jpg) +![](/assets/images/math/mixedGaussian.jpg) Define: * \\( x_j \\) is the number \\( j \\) of the observed data, \\( j = 1, 2, ..., N \\) diff --git a/wiki/math/gaussian-process-gaussian-mixture-model.md b/wiki/math/gaussian-process-gaussian-mixture-model.md index dab07a3d..ec2a6290 100644 --- a/wiki/math/gaussian-process-gaussian-mixture-model.md +++ b/wiki/math/gaussian-process-gaussian-mixture-model.md @@ -24,7 +24,7 @@ You will be able to have a basic understanding on Gaussian Process (what is it a A Gaussian Process(GP) is a probability distribution over functions \\( p(\textbf{f}) \\) , where the functions are defined by a set of random function variables \\(\textbf{f} = \{f_1, f_2, . . . , f_N\}\\). For a GP, any finite linear combination of those function variables has a joint (zero mean) Gaussian distribution. It can be used for nonlinear regression, classification, ranking, preference learning, ordinal regression. In robotics, it can be applied to state estimation, motion planning and in our case environment modeling. GPs are closely related to other models and can be derived using bayesian kernel machines, linear regression with basis functions, infinite multi-layer perceptron neural networks (it becomes a GP if there are infinitely many hidden units and Gaussian priors on the weights), spline models. A simple connections between different methods can be found in the following figure. -![](/assets/images/gpConnection.png) +![](/assets/images/math/gpConnection.png) @@ -35,7 +35,7 @@ GPs are closely related to other models and can be derived using bayesian kernel Before all the equations, lets have a look at why do we want to use GP? ### Why do we want to use GP? The major reasons why GP is popular includes: -1. It can handle uncertainty in unknown function by averaging, not minimizing as GP is rooted in probability and bayesian inference.![](/assets/images/uncertainty.png) +1. It can handle uncertainty in unknown function by averaging, not minimizing as GP is rooted in probability and bayesian inference.![](/assets/images/math/uncertainty.png) Classifier comparison(https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) This property is not commonly shared by other methods. For example, in the above classification method comparison. Neural nets and random forests are confident about the points that are far from the training data. 2. We can incorporate prior knowledge by choosing different kernels 3. GP can learn the kernel and regularization parameters automatically during the learning process. (GP is a non-parametric model, but all data are needed to generate the model. In other words, it need finite but unbounded number of parameters that grows with data.) @@ -103,7 +103,7 @@ While \\( \mu \\) is the average value of the data (Expectations), \\( \Sigma \\ The Gaussian mixture model can be regarded as a model composed of K single Gaussian models, which are hidden variables of the hybrid model. In general, a mixed model can use any probability distribution. The Gaussian mixture model is used here because the Gaussian distribution has good mathematical properties and good computational performance. For example, we now have a bunch of samples of dogs. Different types of dogs have different body types, colors, and looks, but they all belong to the dog category. At this time, the single Gaussian model may not describe the distribution very well since the sample data distribution is not a single ellipse. However, a mixed Gaussian distribution can better describe the problem, as shown in the following figure: -![](/assets/images/mixedGaussian.jpg) +![](/assets/images/math/mixedGaussian.jpg) Define: * \\( x_j \\) is the number \\( j \\) of the observed data, \\( j = 1, 2, ..., N \\) diff --git a/wiki/networking/__all_subsections.md b/wiki/networking/__all_subsections.md index 49058c93..84704199 100644 --- a/wiki/networking/__all_subsections.md +++ b/wiki/networking/__all_subsections.md @@ -157,7 +157,7 @@ sudo /etc/init.d/chrony start 1. If clients communicating to the same ROS master are publishing/subscribing to the same topics, there may be a namespace clash and the computers will not be able to distinguish one topic from the other. Link: http://nootrix.com/2013/08/ros­namespaces/ Hence, make the topics specific to that particular machine. For example, `/cmd_vel` topic for robot 1 should now become `/robot1/cmd_vel` and for robot 2, it should be `/robot2/cmd_vel`. Also, namespaces should be added to the frames also. For three robots, transformation tree should look like this: -![Transofromation Tree for Three Robots](/assets/images/ROSDistributed-1b70c.png) +![Transofromation Tree for Three Robots](/assets/images/networking/ROSDistributed-1b70c.png) - Similarly, there may also be clashing transforms that may cause problems and they need to be fixed in the same way. 2. Try not to run any graphics such as Rviz or RQt on the clients while communicating as they consume a lot of bandwidth and may cause the system to slow down. All the computers can be controlled from the server laptop for any commands that need to run on them by performing ‘ssh’ into the client laptop from the server laptop. @@ -241,7 +241,7 @@ XBee-PRO 900 DigiMesh is useful for setting up your own low bandwidth mesh netwo Firstly, download and install X-CTU. [The official guide from DIGI](https://docs.digi.com/display/XCTU/Download+and+install+XCTU) will walk you through this process. Once you are done with this, plug in your XBee adapter and launch X-CTU. The device should get detected automatically and you'll be presented with a screen similar to the one seen below. -![X-CTU Screen](/assets/images/XbeeProDigiMesh900-1fc56.png) +![X-CTU Screen](/assets/images/networking/XbeeProDigiMesh900-1fc56.png) Now it is important to note that this is not an ordinary XBee adapter which is why you'll see many more options than usual. Firstly, all your devices should be have same Modem VID (ID) and Hopping Channel (HP) for them to communicate. Now, further settings will depend on your individual requirements but just to explain some important parameters: - **Multi-Transmit (MT):** To set/read number of additional broadcast re-transmissions. All broadcast packets are transmitted MT+1 times to ensure it is received. diff --git a/wiki/networking/ros-distributed.md b/wiki/networking/ros-distributed.md index dc26f9b1..d326a7f1 100644 --- a/wiki/networking/ros-distributed.md +++ b/wiki/networking/ros-distributed.md @@ -52,7 +52,7 @@ sudo /etc/init.d/chrony start 1. If clients communicating to the same ROS master are publishing/subscribing to the same topics, there may be a namespace clash and the computers will not be able to distinguish one topic from the other. Link: http://nootrix.com/2013/08/ros­namespaces/ Hence, make the topics specific to that particular machine. For example, `/cmd_vel` topic for robot 1 should now become `/robot1/cmd_vel` and for robot 2, it should be `/robot2/cmd_vel`. Also, namespaces should be added to the frames also. For three robots, transformation tree should look like this: -![Transofromation Tree for Three Robots](/assets/images/ROSDistributed-1b70c.png) +![Transofromation Tree for Three Robots](/assets/images/networking/ROSDistributed-1b70c.png) - Similarly, there may also be clashing transforms that may cause problems and they need to be fixed in the same way. 2. Try not to run any graphics such as Rviz or RQt on the clients while communicating as they consume a lot of bandwidth and may cause the system to slow down. All the computers can be controlled from the server laptop for any commands that need to run on them by performing ‘ssh’ into the client laptop from the server laptop. diff --git a/wiki/networking/xbee-pro-digimesh-900.md b/wiki/networking/xbee-pro-digimesh-900.md index 4cc0f7cb..b5b268d4 100644 --- a/wiki/networking/xbee-pro-digimesh-900.md +++ b/wiki/networking/xbee-pro-digimesh-900.md @@ -11,7 +11,7 @@ XBee-PRO 900 DigiMesh is useful for setting up your own low bandwidth mesh netwo Firstly, download and install X-CTU. [The official guide from DIGI](https://docs.digi.com/display/XCTU/Download+and+install+XCTU) will walk you through this process. Once you are done with this, plug in your XBee adapter and launch X-CTU. The device should get detected automatically and you'll be presented with a screen similar to the one seen below. -![X-CTU Screen](/assets/images/XbeeProDigiMesh900-1fc56.png) +![X-CTU Screen](/assets/images/networking/XbeeProDigiMesh900-1fc56.png) Now it is important to note that this is not an ordinary XBee adapter which is why you'll see many more options than usual. Firstly, all your devices should be have same Modem VID (ID) and Hopping Channel (HP) for them to communicate. Now, further settings will depend on your individual requirements but just to explain some important parameters: - **Multi-Transmit (MT):** To set/read number of additional broadcast re-transmissions. All broadcast packets are transmitted MT+1 times to ensure it is received. diff --git a/wiki/planning/__all_subsections.md b/wiki/planning/__all_subsections.md index 780603af..a1dfc2a0 100644 --- a/wiki/planning/__all_subsections.md +++ b/wiki/planning/__all_subsections.md @@ -30,7 +30,7 @@ A* is a popular search algorithm that is guaranteed to return an optimal path, a A* works by computing optimal g-values for all states along the search at any point in time. -![](/assets/images/astar_h_viz.png) +![](/assets/images/planning/astar_h_viz.png) ## Planning Representation When designing a planner, you first need to decide a few things about how your problem will be represented. Key questions: @@ -132,7 +132,7 @@ This wiki details how to implement a basic coverage planner, which can be used f ## High Level Architecture of Coverage Planner Before we dive into the small details of this coverage planner, we will first look at the high level architecture of the coverage planner we will be designing. The image below shows the three main steps. - ![Coverage Planner Steps](/assets/images/coverage_planner_steps.png) + ![Coverage Planner Steps](/assets/images/planning/coverage_planner_steps.png) The input to the coverage planner is the region we want to generate the coverage plan for. We will represent our region of interest as an outer polygon with a set of polygonal holes. The holes represent areas within the overall outer polygon that we don't want to cover. For instance, in a robotic lawnmowing application, holes could represent gardens in the middle of the lawn that we don't want to mow. Similarly, in a drone wildfire-monitoring application, holes might represent lakes, which would not have any fire, and so you would not want to spend time monitoring them. The outer polygon as well as polygonal holes each are represented as lists of vertices, with each vertex being an x,y coordinate pair. @@ -144,7 +144,7 @@ This wiki details how to implement a basic coverage planner, which can be used f As mentioned above, the first step to our coverage planner will be decomposing the region of interest into simpler trapezoids. To perform this trapezoidal decomposition, we will use a vertical sweep line method. This involves "sweeping" a vertical line from left to right across the region. As the sweep line encounters events, which correspond to vertices, it processes them. We maintain a list of trapezoidal cells that are currently open, meaning that their right edge is unknown. Processing an event involves closing some open cells and opening new cells. Once the sweep line has made it past the right-most event, there should be no more open cells and the closed cells represent the full trapezoidal decomposition of the region. An example of such a trapezoidal decomposition from section 6.1 of the Principles of Robot Motion textbook is shown in the image below. - ![Trapezoidal Decomposition](/assets/images/trapezoid_decomposition.png) + ![Trapezoidal Decomposition](/assets/images/planning/trapezoid_decomposition.png) Diving into more detail, the first step of trapezoidal decomposition is to convert the outer boundary and holes into a list of events. To do this, we need to discuss what an event is. Events correspond to vertices of the region of interest, but they also contain some additional information. In addition to the current vertex (the vertex that the event corresponds to), an event contains the previous vertex, the next vertex, and the event type. The previous vertex and next vertex refer to the two vertices directly connected to the current vertex via edges. In order to distinguish between the next and previous vertex, we will use the convention that as you traverse the edges of the outer boundary or a hole, the region of interest (area you care about covering) will be to your left. Thus, we will traverse the outer boundary in counter-clockwise order and traverse holes in clockwise order. @@ -154,7 +154,7 @@ This wiki details how to implement a basic coverage planner, which can be used f This classification into different event types will be useful later as we process events, since each type will need to be processed differently. - ![Coverage Planner Event Types](/assets/images/coverage_planner_event_types.png) + ![Coverage Planner Event Types](/assets/images/planning/coverage_planner_event_types.png) To generate the list of events, loop through the vertices of the outer boundary in CCW order and loop through the vertices of each hole in CW order. At each vertex, add a new event with its previous, current, and next vertex. To determine the event type, you need to examine the x and y components of the previous and next vertex. For example, if both the previous and next vertex have an x component to the left of the current vertex, the event is either an OUT or CLOSE event. Comparing the y coordinate of the previous and next vertex can then distinguish between these two event types. Similarly, if the previous and next vertex are both to the right of the current vertex, the event type is either OPEN or IN. Again, you can then compare the y coordinate of the previous and next vertex to distinguish them. If the previous vertex is to the left of the current vertex and the next vertex is to the right of the current vertex, the event type is FLOOR. Finally, if the previous vertex is to the right while the next vertex is to the left, the event type is CEILING. @@ -182,7 +182,7 @@ This wiki details how to implement a basic coverage planner, which can be used f The trapezoidal cells define an implicit graph via their neighbor lists. Once we have the trapezoidal cells, we need to determine a cell traversal. This is an order in which to visit each cell. An example (incomplete) cell traversal from section 6.1 of the Principles of Robot Motion textbook is shown below. - ![Cell Traversal](/assets/images/cell_traversal.png) + ![Cell Traversal](/assets/images/planning/cell_traversal.png) There are lots of different ways to generate a cell traversal. For example, you could start from some random cell and perform depth-first search. You could use a greedy method where, from each cell, you go to the nearest unvisited cell. You could also use a more complex method such as using a TSP solver. @@ -320,9 +320,9 @@ from Frenet coordinates to the local vehicle frame in Cartesian coordinates is a #### Images and Video Images and embedded video are supported. -![Path planning in frenet coordinates](/assets/images/path_planning.png) -![frenet path](/assets/images/ref_path.png) -![f_path](/assets/images/f_path.png) +![Path planning in frenet coordinates](/assets/images/planning/path_planning.png) +![frenet path](/assets/images/planning/ref_path.png) +![f_path](/assets/images/planning/f_path.png) ## Summary The given article describes in detail what is Frenet Frame and how robot motion planning is done. The importance and relevance of frenet frame with path planning in systems engineering is also highlighted in the given article. @@ -373,23 +373,23 @@ This package handles all the interactions between the planner, the controller (w This is what the architecture of MBF looks like: -![MBF Architecture](/assets/images/move_base_flex_full.png) +![MBF Architecture](/assets/images/planning/move_base_flex_full.png) The parts above the dotted line are the abstract classes and their interactions between them. These abstract classes are what you have to implement to get MBF to work. After doing this, you can write a simple node that instantiates the navigation server class you implemented, and your navigation stack is ready to be used on the robot. ### Plugin classes -![MBF Architecture](/assets/images/abstract_plugin_classes.png) +![MBF Architecture](/assets/images/planning/abstract_plugin_classes.png) These classes are dynamically loaded at runtime by the navigation server (detailed below) using ROS pluginlib, and do the high-level planning, low-level planning, and recovery behaviors. These classes are purely abstract. You have to make your global planner, local planner, and recovery classes inherit from these classes and implement the pure virtual functions of these classes. You can look at the header files in the *mbf_abstract_core* package in the MBF repository to find more information on the methods that you must implement. ### The abstract navigation server class -![MBF Architecture](/assets/images/abstract_navigation_server.png) +![MBF Architecture](/assets/images/planning/abstract_navigation_server.png) This class is the main class that runs the entire navigation stack and handles the loading, initialization, and interaction of the plugin classes mentioned above. The abstract_navigation_server is also a pure abstract class. You have to make your navigation server class inherit from the abstract_navigation_server and implement the pure virtual functions of these classes. You can look at `abstract_navigation_server.h` in the *mbf_abstraction_nav* package to get more information on what methods you must implement. Note here that, unlike the plugin classes, you don't need to re-implement all the functions of the abstract navigation server, just the pure virtual ones. However, you can re-implement any of those functions as well if you want to change the execution of those functions. ### The abstract execution classes -![MBF Architecture](/assets/images/abstract_execution_classes.png) +![MBF Architecture](/assets/images/planning/abstract_execution_classes.png) There are abstract classes for controlling the planner, controller, and recovery execution, but these are not pure abstract classes, and MBF has already implemented their functions. However, you may want to change how your planner, controller, and recovery behaviors execute and tie in with your navigation server. In that case, you can inherit from these classes and implement the functions you want to change. You can look at the `abstract_planner_execution.h`, `abstract_controller_execution.h`, and `abstract_recovery_execution.h` in the *mbf_abstract_nav* package to get more information on the functions. @@ -588,7 +588,7 @@ Centralised family of algorithms can be further subdivided into two classes of a ## Navigation Stack Design 1 : [Planning based approach](https://www.youtube.com/watch?v=K1_bagcw8Gc&themeRefresh=1) In a planning based approach, we design and implement a centralised multi robot planner which calculates collision free trajectories for each robot in the fleet and then these are executed by each robot with a decentralised controller. -![](/assets/images/central_planner.png) +![](/assets/images/planning/central_planner.png) ### Centralised Planner : [Prioritised Collaborative A*](https://github.com/MRSD-Team-RoboSAR/robosar_navigation) @@ -608,7 +608,7 @@ At a high level the prioritized multi A* performs these steps in a loop to perfo The planner is built on top of a 3D graph which consists of nodes in x,y and time. The graph handles all the nearest neighbor searches, collision checks, distance queries and other utility functions for the planner. The graph uses a cost map of the environment to do its collision checks. The costmap inflates all the obstacles in the occupancy grid map and also assigns some cost to neutral motion to encourage planner to take the shortest paths. It also uses cached trajectories of other robots while doing the collision checks so that robots have collision free trajectories in time. The planner currently uses a manhattan distance heuristic to estimate the cost to goal. All set and map data structures are optimized using a custom 3D hash function and have an O(1) lookup time. Priorities are currently assigned to the robots arbitrary before planning and then planning is done sequentially. This is something that can be improved! An interesting finding is about relative cost of waiting in time as against moving. We found that if both moving as well as waiting have the same cost, then A* almost always prefer moving than waiting which can lead to suboptimal behavior. So as of now we have lower cost to waiting than moving which gives us better paths leads to increased search times which is undesirable. We found the paths to be very suboptimal in a 4 connected grid so we use an 8 connected grid which gives very good results but obviously also contributes to our increased search times. -![](/assets/images/prioritised_astar.png) +![](/assets/images/planning/prioritised_astar.png) ### Decentralised controller : [LGController](https://github.com/MRSD-Team-RoboSAR/robosar_controller) @@ -627,7 +627,7 @@ Our trajectories in time include some pauses/stops along the way for avoiding co We wrote a ROS action server to wrap this controller and use it with the rest of the subsystems. So during operation we have a LGController action server running per robot. So we can say that the planning is centralized but the control is completely decentralised. -![](/assets/images/mission_exec.png) +![](/assets/images/planning/mission_exec.png) Once the planner and the controller were ready, there was a need to integrate them with the rest of the system. For this we wrote the Mission Executive class. Mission Executive does a lot of things during the operation. The first thing it is incharge of is asking the latest fleet information from the fleet management system and then setting up the controller servers for each robot in the fleet. It also listens for any changes in the fleet from the FMS and takes appropriate action based on it. It listens to tasks from the task allocation subsystem and is in charge of executing this mission. It first runs the planner on the tasks received from the task allocation. If planning was successful then the mission executive creates a ROS action client for each successful plan and then sends the planned trajectory to the appropriate controller server for execution. Then the mission executive also monitors the execution of the controller and gets ready for a new mission as soon as the controllers are done executing. @@ -656,7 +656,7 @@ The Lazy Traffic controller takes in the paths from the decentralised planner an At high level the basic principle is to not do extensive collision checking or planning unless explicitly required due to an immediate impending collision. How we do this is by enforcing a narrow neighborhood around each robot and doing local collision avoidance to avoid collisions in this neighborhood. This gives the controller its ‘laziness’. This local collision avoidance is implemented using the velocity obstacles algorithm. For each agent, all other agents act as obstacles in the velocity space and hence invalidate a set of velocities that this agent can execute. Velocity obstacles tries to select the best velocity as close to the preferred velocity as possible from the set of valid velocities. Preferred velocity is calculated for each agent from the global A* path found by the planner. Staying on this A* path is the preferred thing to do unless otherwise ruled out due to obstacles. -![](/assets/images/velocity_obstacles.png) +![](/assets/images/planning/velocity_obstacles.png) The lazy traffic controller has many interfaces with a lot of subsystems. The LT controller talks to the fleet management system to receive updates on the status of the fleet. It talks to the SLAM subsystem to receive the latest map of the environment. It also takes the pose for each agent from the transformation tree. It advertises a controller service which is used by the Mission Executive to actually send the list of agents and their planned paths for execution by the controller. Last but not least, it advertises the controller status of each robot, so that the task allocator can assign new tasks once old ones are completed! Pseudocode for the LT controller can be written as : @@ -672,7 +672,7 @@ Pseudocode for the LT controller can be written as : - Modify velocity using interrobot repulsion if another neighbour within repulsion radius -![](/assets/images/lt_controller.png) +![](/assets/images/planning/lt_controller.png) ### Takeaways 1. This design works really well when robots have unconstrained motion around each other in 2D and robots are small in size compared to the free space around them! @@ -705,7 +705,7 @@ a desired goal pose a geometric description of the robot a geometric description of the world -![Figure 1. Role of motion planning in a robotic system [1]](/assets/images/planning_intro.png) +![Figure 1. Role of motion planning in a robotic system [1]](/assets/images/planning/planning_intro.png) This Wiki details the different types of motion planning algorithms that are available and the key differences between them. Knowing this will make choosing between them easier, depending on the types of projects these algorithms are implemented in. @@ -746,7 +746,7 @@ References that may be useful (including those that include pseudo-code) for exp ### Sampling-Based Planners Sampling-Based algorithms sample possible states in continuous space and try to connect them to find a path from the start to the goal state. These algorithms are suitable in solving high-dimensional problems because the size of the graph they construct is not explicitly exponential in the number of dimensions. Although more rapid and less expensive than Search-Based algorithms, there is difficulty in finding optimal paths and results lack repeatability. Sampling based methods can be divided into two categories – multi-query, where multiple start and goal configurations can be connected without reconstructing the graph structure, and single-query, where the tree is built from scratch for every set of start and goal configurations. A summary of the two categories is shown in Table 1. -![Table 1. Multi-query vs. Single-query [3]](/assets/images/multi_vs_single_query.png) +![Table 1. Multi-query vs. Single-query [3]](/assets/images/planning/multi_vs_single_query.png) Probabilistic Road Map (PRM) is the most popular multi-query algorithm. In the learning phase, free configurations are randomly sampled to become the nodes of a graph. Connections are made between the nodes to form the edges, representing feasible paths of the roadmap. Additional nodes are then created to expand the roadmap and improve its connectivity. In the query phase, the planner tries to find a path that connects start and goal configurations using the graph created in the learning phase. @@ -758,19 +758,19 @@ For single-query methods, Rapidly-exploring Random Trees (RRT) is the most preva Nonholonomic systems are characterized by constraint equations involving the time derivatives of the system configuration variables. These equations are non-integrable; they typically arise when the system has less controls than configuration variables. For instance a car-like robot has two controls (linear and angular velocities) while it moves in a 3-dimensional configuration space. As a consequence, any path in the configuration space does not necessarily correspond to a feasible path for the system. Let us consider two systems: a two-driving wheel mobile robot and a car-like robot. **Two-driving wheel robots**: The general dynamic model is given as: -![](/assets/images/2dwr1.png) +![](/assets/images/planning/2dwr1.png) The reference point of the robot is the midpoint of the two wheels; its coordinates, with respect to a fixed frame, are denoted by (x,y) and θ is the direction of the driving wheels and ℓ is the distance between the driving wheels. By setting v=½\*(v1+v2) and ω= 1/ℓ * (v1−v2) we get the kinematic model which is expressed as the following 3-dimensional system: -![](/assets/images/clr2.png) +![](/assets/images/planning/clr2.png) **Car-like robots**: The reference point with coordinates (x,y) is the midpoint of the rear wheels. We assume that the distance between both rear and front axles is unit length. We denote w as the speed of the front wheels of the car and ζ as the angle between the front wheels and the main direction θ of the car. Moreover a mechanical constraint imposes |ζ| ≤ ζmax and consequently a minimum turning radius. The general dynamic model is given as: -![](/assets/images/clr1.png) +![](/assets/images/planning/clr1.png) A first simplification consists in controlling w; it gives a 4-dimensional system. Let us assume that we do not care about the direction of the front wheels. We may still simplify the model. By setting v=wcosζ and ω=wsinζ we get a 3-dimensional system. -![](/assets/images/clr2.png) +![](/assets/images/planning/clr2.png) ### Sampling- vs Search-based Methods: With constraints come some restrictions on the kinds of planners that will be effective. Grid-based graphs, for example, do not allow fluid motions to be planned but may work fine if a motion consisting of turn-in-place and drive straight maneuvers are acceptable. There are planners that incorporate simple fluid motions such as lattice planners, and Dubins and Reeds-Shepp state-space planners. The former of these can offer cheap planning for non-holonomic systems, so long as the number of extensions is kept low. The latter two present the space of options as arc and straight motions. These are typically for vehicles that use Ackerman steering. One alternative to all those above is a shooting RRT based on motion primitives. Where all of the others tend to work better at slower speeds, shooting RRTs can also work well at high speeds so long as the shooting is done using the vehicle dynamics. It may be possible to combine search-based with sampling-based planners in order to get optimality and feasibility benefits from both, respectively. diff --git a/wiki/planning/advanced-moveit-manipulator-planning.md b/wiki/planning/advanced-moveit-manipulator-planning.md index bae11b23..7682c74d 100644 --- a/wiki/planning/advanced-moveit-manipulator-planning.md +++ b/wiki/planning/advanced-moveit-manipulator-planning.md @@ -30,7 +30,7 @@ The primary task of our dual-manipulator project is to harvest and store green p * Move cutter fully into grasp position, * After harvest, the cutter goes to home pose while the gripper moves the pepper to a storage bin. -![VADER planning sequence](/assets/images/vader_planning_seq.png) +![VADER planning sequence](/assets/images/planning/vader_planning_seq.png) The home pose of both arms, as well as the gripper pose when storing the pepper, are fixed. The coarse and fine pose estimates of the target pepper depends on the placement of the system, and are therefore fairly variable. @@ -47,7 +47,7 @@ The Cartesian planner plans in a straight line from A to B, and computes the joi | Advantages | Consistently finds a viable solution, especially if using joint goals. Maneuvers freely in obstacle-rich environment to disentangle arms. | Very fast to compute & execute. Path deterministic and predictable. | | Drawbacks | Solution not deterministic and can travel too far in free space. Requires careful placement of collision objects to discourage winding paths. Slower to compute & execute. | Solution could cause singularities and controller error if running into joint limits. This means the solution success is dependent on the starting joint configuration. | | Usage | This is used in our Homing motions as well as the gripper move-to-storage motion. | This is used in our pregrasp, final grasp, retraction (after harvest), and lowering the pepper down to the final storage location. | -| Example Path | ![RRTStar example path](/assets/images/rrtstar.png) | ![Cartesian example path](/assets/images/cartesian.png) | +| Example Path | ![RRTStar example path](/assets/images/planning/rrtstar.png) | ![Cartesian example path](/assets/images/planning/cartesian.png) | We will talk about each of these planners in greater detail below. @@ -102,7 +102,7 @@ To help in testing the robustness and failure modes of our planning and state ma For each simulated run, a randomized pepper ground truth pose is generated, and noise added. We run the entire system given this pose estimate, and watch how the RRT and Cartesian planners fail in which circumstances (due to reachability, planner failure, etc.). An example result of 100 aggregated runs is shown below, and higher failure rates at either ends of the horizontal workspace are observed. -![Simulation testing results](/assets/images/simulation_testing.png) +![Simulation testing results](/assets/images/planning/simulation_testing.png) This helped us quantify exactly how the overall system may fail due to lack of reachability for either arms, and how to position our platform in front of peppers during the Fall Validation Demo. diff --git a/wiki/planning/astar_planning_implementation_guide.md b/wiki/planning/astar_planning_implementation_guide.md index 1a8a222d..d4c89774 100644 --- a/wiki/planning/astar_planning_implementation_guide.md +++ b/wiki/planning/astar_planning_implementation_guide.md @@ -29,7 +29,7 @@ A* is a popular search algorithm that is guaranteed to return an optimal path, a A* works by computing optimal g-values for all states along the search at any point in time. -![](/assets/images/astar_h_viz.png) +![](/assets/images/planning/astar_h_viz.png) ## Planning Representation When designing a planner, you first need to decide a few things about how your problem will be represented. Key questions: diff --git a/wiki/planning/coverage-planning-implementation-guide.md b/wiki/planning/coverage-planning-implementation-guide.md index 2267eeff..f817e352 100644 --- a/wiki/planning/coverage-planning-implementation-guide.md +++ b/wiki/planning/coverage-planning-implementation-guide.md @@ -19,7 +19,7 @@ This wiki details how to implement a basic coverage planner, which can be used f ## High Level Architecture of Coverage Planner Before we dive into the small details of this coverage planner, we will first look at the high level architecture of the coverage planner we will be designing. The image below shows the three main steps. - ![Coverage Planner Steps](/assets/images/coverage_planner_steps.png) + ![Coverage Planner Steps](/assets/images/planning/coverage_planner_steps.png) The input to the coverage planner is the region we want to generate the coverage plan for. We will represent our region of interest as an outer polygon with a set of polygonal holes. The holes represent areas within the overall outer polygon that we don't want to cover. For instance, in a robotic lawnmowing application, holes could represent gardens in the middle of the lawn that we don't want to mow. Similarly, in a drone wildfire-monitoring application, holes might represent lakes, which would not have any fire, and so you would not want to spend time monitoring them. The outer polygon as well as polygonal holes each are represented as lists of vertices, with each vertex being an x,y coordinate pair. @@ -31,7 +31,7 @@ This wiki details how to implement a basic coverage planner, which can be used f As mentioned above, the first step to our coverage planner will be decomposing the region of interest into simpler trapezoids. To perform this trapezoidal decomposition, we will use a vertical sweep line method. This involves "sweeping" a vertical line from left to right across the region. As the sweep line encounters events, which correspond to vertices, it processes them. We maintain a list of trapezoidal cells that are currently open, meaning that their right edge is unknown. Processing an event involves closing some open cells and opening new cells. Once the sweep line has made it past the right-most event, there should be no more open cells and the closed cells represent the full trapezoidal decomposition of the region. An example of such a trapezoidal decomposition from section 6.1 of the Principles of Robot Motion textbook is shown in the image below. - ![Trapezoidal Decomposition](/assets/images/trapezoid_decomposition.png) + ![Trapezoidal Decomposition](/assets/images/planning/trapezoid_decomposition.png) Diving into more detail, the first step of trapezoidal decomposition is to convert the outer boundary and holes into a list of events. To do this, we need to discuss what an event is. Events correspond to vertices of the region of interest, but they also contain some additional information. In addition to the current vertex (the vertex that the event corresponds to), an event contains the previous vertex, the next vertex, and the event type. The previous vertex and next vertex refer to the two vertices directly connected to the current vertex via edges. In order to distinguish between the next and previous vertex, we will use the convention that as you traverse the edges of the outer boundary or a hole, the region of interest (area you care about covering) will be to your left. Thus, we will traverse the outer boundary in counter-clockwise order and traverse holes in clockwise order. @@ -41,7 +41,7 @@ This wiki details how to implement a basic coverage planner, which can be used f This classification into different event types will be useful later as we process events, since each type will need to be processed differently. - ![Coverage Planner Event Types](/assets/images/coverage_planner_event_types.png) + ![Coverage Planner Event Types](/assets/images/planning/coverage_planner_event_types.png) To generate the list of events, loop through the vertices of the outer boundary in CCW order and loop through the vertices of each hole in CW order. At each vertex, add a new event with its previous, current, and next vertex. To determine the event type, you need to examine the x and y components of the previous and next vertex. For example, if both the previous and next vertex have an x component to the left of the current vertex, the event is either an OUT or CLOSE event. Comparing the y coordinate of the previous and next vertex can then distinguish between these two event types. Similarly, if the previous and next vertex are both to the right of the current vertex, the event type is either OPEN or IN. Again, you can then compare the y coordinate of the previous and next vertex to distinguish them. If the previous vertex is to the left of the current vertex and the next vertex is to the right of the current vertex, the event type is FLOOR. Finally, if the previous vertex is to the right while the next vertex is to the left, the event type is CEILING. @@ -69,7 +69,7 @@ This wiki details how to implement a basic coverage planner, which can be used f The trapezoidal cells define an implicit graph via their neighbor lists. Once we have the trapezoidal cells, we need to determine a cell traversal. This is an order in which to visit each cell. An example (incomplete) cell traversal from section 6.1 of the Principles of Robot Motion textbook is shown below. - ![Cell Traversal](/assets/images/cell_traversal.png) + ![Cell Traversal](/assets/images/planning/cell_traversal.png) There are lots of different ways to generate a cell traversal. For example, you could start from some random cell and perform depth-first search. You could use a greedy method where, from each cell, you go to the nearest unvisited cell. You could also use a more complex method such as using a TSP solver. diff --git a/wiki/planning/frenet-frame-planning.md b/wiki/planning/frenet-frame-planning.md index 53026de2..30e5e407 100644 --- a/wiki/planning/frenet-frame-planning.md +++ b/wiki/planning/frenet-frame-planning.md @@ -97,9 +97,9 @@ from Frenet coordinates to the local vehicle frame in Cartesian coordinates is a #### Images and Video Images and embedded video are supported. -![Path planning in frenet coordinates](/assets/images/path_planning.png) -![frenet path](/assets/images/ref_path.png) -![f_path](/assets/images/f_path.png) +![Path planning in frenet coordinates](/assets/images/planning/path_planning.png) +![frenet path](/assets/images/planning/ref_path.png) +![f_path](/assets/images/planning/f_path.png) ## Summary The given article describes in detail what is Frenet Frame and how robot motion planning is done. The importance and relevance of frenet frame with path planning in systems engineering is also highlighted in the given article. diff --git a/wiki/planning/move_base_flex.md b/wiki/planning/move_base_flex.md index 0c0a87d4..0716953c 100644 --- a/wiki/planning/move_base_flex.md +++ b/wiki/planning/move_base_flex.md @@ -29,23 +29,23 @@ This package handles all the interactions between the planner, the controller (w This is what the architecture of MBF looks like: -![MBF Architecture](/assets/images/move_base_flex_full.png) +![MBF Architecture](/assets/images/planning/move_base_flex_full.png) The parts above the dotted line are the abstract classes and their interactions between them. These abstract classes are what you have to implement to get MBF to work. After doing this, you can write a simple node that instantiates the navigation server class you implemented, and your navigation stack is ready to be used on the robot. ### Plugin classes -![MBF Architecture](/assets/images/abstract_plugin_classes.png) +![MBF Architecture](/assets/images/planning/abstract_plugin_classes.png) These classes are dynamically loaded at runtime by the navigation server (detailed below) using ROS pluginlib, and do the high-level planning, low-level planning, and recovery behaviors. These classes are purely abstract. You have to make your global planner, local planner, and recovery classes inherit from these classes and implement the pure virtual functions of these classes. You can look at the header files in the *mbf_abstract_core* package in the MBF repository to find more information on the methods that you must implement. ### The abstract navigation server class -![MBF Architecture](/assets/images/abstract_navigation_server.png) +![MBF Architecture](/assets/images/planning/abstract_navigation_server.png) This class is the main class that runs the entire navigation stack and handles the loading, initialization, and interaction of the plugin classes mentioned above. The abstract_navigation_server is also a pure abstract class. You have to make your navigation server class inherit from the abstract_navigation_server and implement the pure virtual functions of these classes. You can look at `abstract_navigation_server.h` in the *mbf_abstraction_nav* package to get more information on what methods you must implement. Note here that, unlike the plugin classes, you don't need to re-implement all the functions of the abstract navigation server, just the pure virtual ones. However, you can re-implement any of those functions as well if you want to change the execution of those functions. ### The abstract execution classes -![MBF Architecture](/assets/images/abstract_execution_classes.png) +![MBF Architecture](/assets/images/planning/abstract_execution_classes.png) There are abstract classes for controlling the planner, controller, and recovery execution, but these are not pure abstract classes, and MBF has already implemented their functions. However, you may want to change how your planner, controller, and recovery behaviors execute and tie in with your navigation server. In that case, you can inherit from these classes and implement the functions you want to change. You can look at the `abstract_planner_execution.h`, `abstract_controller_execution.h`, and `abstract_recovery_execution.h` in the *mbf_abstract_nav* package to get more information on the functions. diff --git a/wiki/planning/multi-robot-planning.md b/wiki/planning/multi-robot-planning.md index 5802bb12..137d5ad4 100644 --- a/wiki/planning/multi-robot-planning.md +++ b/wiki/planning/multi-robot-planning.md @@ -20,7 +20,7 @@ Centralised family of algorithms can be further subdivided into two classes of a ## Navigation Stack Design 1 : [Planning based approach](https://www.youtube.com/watch?v=K1_bagcw8Gc&themeRefresh=1) In a planning based approach, we design and implement a centralised multi robot planner which calculates collision free trajectories for each robot in the fleet and then these are executed by each robot with a decentralised controller. -![](/assets/images/central_planner.png) +![](/assets/images/planning/central_planner.png) ### Centralised Planner : [Prioritised Collaborative A*](https://github.com/MRSD-Team-RoboSAR/robosar_navigation) @@ -40,7 +40,7 @@ At a high level the prioritized multi A* performs these steps in a loop to perfo The planner is built on top of a 3D graph which consists of nodes in x,y and time. The graph handles all the nearest neighbor searches, collision checks, distance queries and other utility functions for the planner. The graph uses a cost map of the environment to do its collision checks. The costmap inflates all the obstacles in the occupancy grid map and also assigns some cost to neutral motion to encourage planner to take the shortest paths. It also uses cached trajectories of other robots while doing the collision checks so that robots have collision free trajectories in time. The planner currently uses a manhattan distance heuristic to estimate the cost to goal. All set and map data structures are optimized using a custom 3D hash function and have an O(1) lookup time. Priorities are currently assigned to the robots arbitrary before planning and then planning is done sequentially. This is something that can be improved! An interesting finding is about relative cost of waiting in time as against moving. We found that if both moving as well as waiting have the same cost, then A* almost always prefer moving than waiting which can lead to suboptimal behavior. So as of now we have lower cost to waiting than moving which gives us better paths leads to increased search times which is undesirable. We found the paths to be very suboptimal in a 4 connected grid so we use an 8 connected grid which gives very good results but obviously also contributes to our increased search times. -![](/assets/images/prioritised_astar.png) +![](/assets/images/planning/prioritised_astar.png) ### Decentralised controller : [LGController](https://github.com/MRSD-Team-RoboSAR/robosar_controller) @@ -59,7 +59,7 @@ Our trajectories in time include some pauses/stops along the way for avoiding co We wrote a ROS action server to wrap this controller and use it with the rest of the subsystems. So during operation we have a LGController action server running per robot. So we can say that the planning is centralized but the control is completely decentralised. -![](/assets/images/mission_exec.png) +![](/assets/images/planning/mission_exec.png) Once the planner and the controller were ready, there was a need to integrate them with the rest of the system. For this we wrote the Mission Executive class. Mission Executive does a lot of things during the operation. The first thing it is incharge of is asking the latest fleet information from the fleet management system and then setting up the controller servers for each robot in the fleet. It also listens for any changes in the fleet from the FMS and takes appropriate action based on it. It listens to tasks from the task allocation subsystem and is in charge of executing this mission. It first runs the planner on the tasks received from the task allocation. If planning was successful then the mission executive creates a ROS action client for each successful plan and then sends the planned trajectory to the appropriate controller server for execution. Then the mission executive also monitors the execution of the controller and gets ready for a new mission as soon as the controllers are done executing. @@ -88,7 +88,7 @@ The Lazy Traffic controller takes in the paths from the decentralised planner an At high level the basic principle is to not do extensive collision checking or planning unless explicitly required due to an immediate impending collision. How we do this is by enforcing a narrow neighborhood around each robot and doing local collision avoidance to avoid collisions in this neighborhood. This gives the controller its ‘laziness’. This local collision avoidance is implemented using the velocity obstacles algorithm. For each agent, all other agents act as obstacles in the velocity space and hence invalidate a set of velocities that this agent can execute. Velocity obstacles tries to select the best velocity as close to the preferred velocity as possible from the set of valid velocities. Preferred velocity is calculated for each agent from the global A* path found by the planner. Staying on this A* path is the preferred thing to do unless otherwise ruled out due to obstacles. -![](/assets/images/velocity_obstacles.png) +![](/assets/images/planning/velocity_obstacles.png) The lazy traffic controller has many interfaces with a lot of subsystems. The LT controller talks to the fleet management system to receive updates on the status of the fleet. It talks to the SLAM subsystem to receive the latest map of the environment. It also takes the pose for each agent from the transformation tree. It advertises a controller service which is used by the Mission Executive to actually send the list of agents and their planned paths for execution by the controller. Last but not least, it advertises the controller status of each robot, so that the task allocator can assign new tasks once old ones are completed! Pseudocode for the LT controller can be written as : @@ -104,7 +104,7 @@ Pseudocode for the LT controller can be written as : - Modify velocity using interrobot repulsion if another neighbour within repulsion radius -![](/assets/images/lt_controller.png) +![](/assets/images/planning/lt_controller.png) ### Takeaways 1. This design works really well when robots have unconstrained motion around each other in 2D and robots are small in size compared to the free space around them! diff --git a/wiki/planning/planning-overview.md b/wiki/planning/planning-overview.md index a18a491d..2bfdc1db 100644 --- a/wiki/planning/planning-overview.md +++ b/wiki/planning/planning-overview.md @@ -8,7 +8,7 @@ a desired goal pose a geometric description of the robot a geometric description of the world -![Figure 1. Role of motion planning in a robotic system [1]](/assets/images/planning_intro.png) +![Figure 1. Role of motion planning in a robotic system [1]](/assets/images/planning/planning_intro.png) This Wiki details the different types of motion planning algorithms that are available and the key differences between them. Knowing this will make choosing between them easier, depending on the types of projects these algorithms are implemented in. @@ -49,7 +49,7 @@ References that may be useful (including those that include pseudo-code) for exp ### Sampling-Based Planners Sampling-Based algorithms sample possible states in continuous space and try to connect them to find a path from the start to the goal state. These algorithms are suitable in solving high-dimensional problems because the size of the graph they construct is not explicitly exponential in the number of dimensions. Although more rapid and less expensive than Search-Based algorithms, there is difficulty in finding optimal paths and results lack repeatability. Sampling based methods can be divided into two categories – multi-query, where multiple start and goal configurations can be connected without reconstructing the graph structure, and single-query, where the tree is built from scratch for every set of start and goal configurations. A summary of the two categories is shown in Table 1. -![Table 1. Multi-query vs. Single-query [3]](/assets/images/multi_vs_single_query.png) +![Table 1. Multi-query vs. Single-query [3]](/assets/images/planning/multi_vs_single_query.png) Probabilistic Road Map (PRM) is the most popular multi-query algorithm. In the learning phase, free configurations are randomly sampled to become the nodes of a graph. Connections are made between the nodes to form the edges, representing feasible paths of the roadmap. Additional nodes are then created to expand the roadmap and improve its connectivity. In the query phase, the planner tries to find a path that connects start and goal configurations using the graph created in the learning phase. @@ -61,19 +61,19 @@ For single-query methods, Rapidly-exploring Random Trees (RRT) is the most preva Nonholonomic systems are characterized by constraint equations involving the time derivatives of the system configuration variables. These equations are non-integrable; they typically arise when the system has less controls than configuration variables. For instance a car-like robot has two controls (linear and angular velocities) while it moves in a 3-dimensional configuration space. As a consequence, any path in the configuration space does not necessarily correspond to a feasible path for the system. Let us consider two systems: a two-driving wheel mobile robot and a car-like robot. **Two-driving wheel robots**: The general dynamic model is given as: -![](/assets/images/2dwr1.png) +![](/assets/images/planning/2dwr1.png) The reference point of the robot is the midpoint of the two wheels; its coordinates, with respect to a fixed frame, are denoted by (x,y) and θ is the direction of the driving wheels and ℓ is the distance between the driving wheels. By setting v=½\*(v1+v2) and ω= 1/ℓ * (v1−v2) we get the kinematic model which is expressed as the following 3-dimensional system: -![](/assets/images/clr2.png) +![](/assets/images/planning/clr2.png) **Car-like robots**: The reference point with coordinates (x,y) is the midpoint of the rear wheels. We assume that the distance between both rear and front axles is unit length. We denote w as the speed of the front wheels of the car and ζ as the angle between the front wheels and the main direction θ of the car. Moreover a mechanical constraint imposes |ζ| ≤ ζmax and consequently a minimum turning radius. The general dynamic model is given as: -![](/assets/images/clr1.png) +![](/assets/images/planning/clr1.png) A first simplification consists in controlling w; it gives a 4-dimensional system. Let us assume that we do not care about the direction of the front wheels. We may still simplify the model. By setting v=wcosζ and ω=wsinζ we get a 3-dimensional system. -![](/assets/images/clr2.png) +![](/assets/images/planning/clr2.png) ### Sampling- vs Search-based Methods: With constraints come some restrictions on the kinds of planners that will be effective. Grid-based graphs, for example, do not allow fluid motions to be planned but may work fine if a motion consisting of turn-in-place and drive straight maneuvers are acceptable. There are planners that incorporate simple fluid motions such as lattice planners, and Dubins and Reeds-Shepp state-space planners. The former of these can offer cheap planning for non-holonomic systems, so long as the number of extensions is kept low. The latter two present the space of options as arc and straight motions. These are typically for vehicles that use Ackerman steering. One alternative to all those above is a shooting RRT based on motion primitives. Where all of the others tend to work better at slower speeds, shooting RRTs can also work well at high speeds so long as the shooting is done using the vehicle dynamics. It may be possible to combine search-based with sampling-based planners in order to get optimality and feasibility benefits from both, respectively. diff --git a/wiki/programming/__all_subsections.md b/wiki/programming/__all_subsections.md index cc0cbd0c..fcc5426f 100644 --- a/wiki/programming/__all_subsections.md +++ b/wiki/programming/__all_subsections.md @@ -3,7 +3,7 @@ date: 2017-08-21 title: Boost C++ Libraries --- -[![Boost Logo](/assets/images/BoostLibrary-f962f.png)](https://www.boost.org/) +[![Boost Logo](/assets/images/programming/BoostLibrary-f962f.png)](https://www.boost.org/) Boost is the most popular and widely used C++ library. It is available online for free. This stable C++ library contains many helpful data structures, algorithms, utilities, and more. This library influenced the design and implementation of the newest C++ library standard (C++11). @@ -61,7 +61,7 @@ Writing a Makefile can be a complicated task, especially for larger projects. CM When using CMake, it is common and accepted practice to organize a project folder according to a specific folder structure, as seen in the image below. -![CMake File Structure](/assets/images/cmake_file_structure.png) +![CMake File Structure](/assets/images/programming/cmake_file_structure.png) - **bin:** contains the executable files which can be run on the computer. - **build:** contains the makefiles which are required to build the project. @@ -163,7 +163,7 @@ Additionally, you can: The applications are the following 1. Convert Pose to Quaternions and vice versa 2. Find the relative pose transformations by just using simple 3D homogeneous transformation `Eigen::Affine3d T` is a 4*4 homogeneous transform: -![Homogeneous Equation Example](/assets/images/EigenLibrary-35715.png) +![Homogeneous Equation Example](/assets/images/programming/EigenLibrary-35715.png) 3. Now all the transformations (rotation or translation) can be represented in homogeneous form as simple 4*4 matrix multiplications. 4. Suppose you have a pose transform T of robot in the world and you want to find robot’s X-direction relative to the world. You can do this by using `Eigen::Vector3d x_bearing= T.rotation * Eigen::Vector3d::UnitX();` diff --git a/wiki/programming/boost-library.md b/wiki/programming/boost-library.md index ec7cddbe..adad1652 100644 --- a/wiki/programming/boost-library.md +++ b/wiki/programming/boost-library.md @@ -2,7 +2,7 @@ date: 2017-08-21 title: Boost C++ Libraries --- -[![Boost Logo](/assets/images/BoostLibrary-f962f.png)](https://www.boost.org/) +[![Boost Logo](/assets/images/programming/BoostLibrary-f962f.png)](https://www.boost.org/) Boost is the most popular and widely used C++ library. It is available online for free. This stable C++ library contains many helpful data structures, algorithms, utilities, and more. This library influenced the design and implementation of the newest C++ library standard (C++11). diff --git a/wiki/programming/cmake.md b/wiki/programming/cmake.md index c9775592..147f093a 100644 --- a/wiki/programming/cmake.md +++ b/wiki/programming/cmake.md @@ -10,7 +10,7 @@ Writing a Makefile can be a complicated task, especially for larger projects. CM When using CMake, it is common and accepted practice to organize a project folder according to a specific folder structure, as seen in the image below. -![CMake File Structure](/assets/images/cmake_file_structure.png) +![CMake File Structure](/assets/images/programming/cmake_file_structure.png) - **bin:** contains the executable files which can be run on the computer. - **build:** contains the makefiles which are required to build the project. diff --git a/wiki/programming/eigen-library.md b/wiki/programming/eigen-library.md index 2b4ac76c..bb3e25a7 100644 --- a/wiki/programming/eigen-library.md +++ b/wiki/programming/eigen-library.md @@ -30,7 +30,7 @@ Additionally, you can: The applications are the following 1. Convert Pose to Quaternions and vice versa 2. Find the relative pose transformations by just using simple 3D homogeneous transformation `Eigen::Affine3d T` is a 4*4 homogeneous transform: -![Homogeneous Equation Example](/assets/images/EigenLibrary-35715.png) +![Homogeneous Equation Example](/assets/images/programming/EigenLibrary-35715.png) 3. Now all the transformations (rotation or translation) can be represented in homogeneous form as simple 4*4 matrix multiplications. 4. Suppose you have a pose transform T of robot in the world and you want to find robot’s X-direction relative to the world. You can do this by using `Eigen::Vector3d x_bearing= T.rotation * Eigen::Vector3d::UnitX();` diff --git a/wiki/programming/yasmin-ros2-state-machine.md b/wiki/programming/yasmin-ros2-state-machine.md index fecb452e..4b79dda4 100644 --- a/wiki/programming/yasmin-ros2-state-machine.md +++ b/wiki/programming/yasmin-ros2-state-machine.md @@ -125,7 +125,7 @@ sm() - Visualization: `YasminViewerPub("yasmin_snaak", sm)` publishes the state machine so operators can inspect progress live. The visualization of our system is shown below -![Yasmin state machine](/assets/images/state_machine.png) +![Yasmin state machine](/assets/images/programming/state_machine.png) ## Yasmin vs. Behavior Trees diff --git a/wiki/project-management/__all_subsections.md b/wiki/project-management/__all_subsections.md index 3e0f86b2..820e100c 100644 --- a/wiki/project-management/__all_subsections.md +++ b/wiki/project-management/__all_subsections.md @@ -283,7 +283,7 @@ Some more example automation possibilities can be found here: The burndown chart is a popular chart among project managers. This allows the PM to view how the work is progressing over a sprint and the work is not falling behind. It displays the days in the sprint by the story points allocated for that sprint. This can be found in Reports → Burndown Chart. The goal is to have the remaining work track the Guideline. -![Example Burndown Chart](/assets/images/jira_burndown_chart.png) +![Example Burndown Chart](/assets/images/project-management/jira_burndown_chart.png) ## Summary In summary, Jira is a powerful tool for agile development. There are numerous features that can help a project be propelled to success. This article only lists a few features. Use whichever features work best for your team. @@ -469,7 +469,7 @@ A standard meeting notes document should have the following content-sections: Here is an example of maintaining meeting notes on Notion. -![Meeting Notes List](/assets/images/meeting-notes.png) +![Meeting Notes List](/assets/images/project-management/meeting-notes.png) ### Task List @@ -492,7 +492,7 @@ A standard task card should have the following content-sections: - Evidence of Completion Here is an example of tracking tasks on Notion. -![image2.png](/assets/images/task-list.png) +![image2.png](/assets/images/project-management/task-list.png) @@ -500,10 +500,10 @@ Here is an example of tracking tasks on Notion. Notion automatically converts your task list to a timeline format (Gantt chart). However, Notion can only do this to tasks that have a start date and end date defined. Additionally, you can edit the task list to add dependencies between tasks. Here is an example of managing a project's schedule on Notion. -![Picture2.png](/assets/images/project-schedule.png) +![Picture2.png](/assets/images/project-management/project-schedule.png) > While coming up with a project schedule, make sure that you keep external milestones and delivery dates in mind. It is a good practice to come up with intermediate internal milestones enroute external milestones. The image below shows an example of how you can keep track of milestones for your project. -![Picture5.png](/assets/images/milestones.png) +![Picture5.png](/assets/images/project-management/milestones.png) @@ -562,7 +562,7 @@ Here are the rules: Feel free to modify the rules to suit your team’s interests! -![Picture3.png](/assets/images/card-system.png) +![Picture3.png](/assets/images/project-management/card-system.png) ### Office Hours @@ -575,7 +575,7 @@ A fun strategy here is to define project ‘**Office Hours**’ – specific tim After committing to weekly ‘Office Hour’ timings, each team member should try to stick to these timings (or cover up for them where applicable). These office hours will help the project manager keep track of each individual’s progress, efficiency and contribution over time, which will help in future planning activities. Here is an example of Team Availability (Office Hours) that you could apply to your project as well. -![Picture4.png](/assets/images/office-hours.png) +![Picture4.png](/assets/images/project-management/office-hours.png) ### Communication Channels diff --git a/wiki/project-management/jira.md b/wiki/project-management/jira.md index 9b38765c..9aefb7c6 100644 --- a/wiki/project-management/jira.md +++ b/wiki/project-management/jira.md @@ -121,7 +121,7 @@ Some more example automation possibilities can be found here: The burndown chart is a popular chart among project managers. This allows the PM to view how the work is progressing over a sprint and the work is not falling behind. It displays the days in the sprint by the story points allocated for that sprint. This can be found in Reports → Burndown Chart. The goal is to have the remaining work track the Guideline. -![Example Burndown Chart](/assets/images/jira_burndown_chart.png) +![Example Burndown Chart](/assets/images/project-management/jira_burndown_chart.png) ## Summary In summary, Jira is a powerful tool for agile development. There are numerous features that can help a project be propelled to success. This article only lists a few features. Use whichever features work best for your team. diff --git a/wiki/project-management/using-notion-for-project-management.md b/wiki/project-management/using-notion-for-project-management.md index e96668d2..920b8676 100644 --- a/wiki/project-management/using-notion-for-project-management.md +++ b/wiki/project-management/using-notion-for-project-management.md @@ -55,7 +55,7 @@ A standard meeting notes document should have the following content-sections: Here is an example of maintaining meeting notes on Notion. -![Meeting Notes List](/assets/images/meeting-notes.png) +![Meeting Notes List](/assets/images/project-management/meeting-notes.png) ### Task List @@ -78,7 +78,7 @@ A standard task card should have the following content-sections: - Evidence of Completion Here is an example of tracking tasks on Notion. -![image2.png](/assets/images/task-list.png) +![image2.png](/assets/images/project-management/task-list.png) @@ -86,10 +86,10 @@ Here is an example of tracking tasks on Notion. Notion automatically converts your task list to a timeline format (Gantt chart). However, Notion can only do this to tasks that have a start date and end date defined. Additionally, you can edit the task list to add dependencies between tasks. Here is an example of managing a project's schedule on Notion. -![Picture2.png](/assets/images/project-schedule.png) +![Picture2.png](/assets/images/project-management/project-schedule.png) > While coming up with a project schedule, make sure that you keep external milestones and delivery dates in mind. It is a good practice to come up with intermediate internal milestones enroute external milestones. The image below shows an example of how you can keep track of milestones for your project. -![Picture5.png](/assets/images/milestones.png) +![Picture5.png](/assets/images/project-management/milestones.png) @@ -148,7 +148,7 @@ Here are the rules: Feel free to modify the rules to suit your team’s interests! -![Picture3.png](/assets/images/card-system.png) +![Picture3.png](/assets/images/project-management/card-system.png) ### Office Hours @@ -161,7 +161,7 @@ A fun strategy here is to define project ‘**Office Hours**’ – specific tim After committing to weekly ‘Office Hour’ timings, each team member should try to stick to these timings (or cover up for them where applicable). These office hours will help the project manager keep track of each individual’s progress, efficiency and contribution over time, which will help in future planning activities. Here is an example of Team Availability (Office Hours) that you could apply to your project as well. -![Picture4.png](/assets/images/office-hours.png) +![Picture4.png](/assets/images/project-management/office-hours.png) ### Communication Channels diff --git a/wiki/robotics-project-guide/choose-a-robot.md b/wiki/robotics-project-guide/choose-a-robot.md index 7a702eff..fe009be6 100644 --- a/wiki/robotics-project-guide/choose-a-robot.md +++ b/wiki/robotics-project-guide/choose-a-robot.md @@ -4,7 +4,7 @@ title: Choose a Robot mermaid: true --- -![RobotOverview](/assets/images/robot_overview.png) +![RobotOverview](/assets/images/robotics-project-guide/robot_overview.png) [Image source](https://www.machinedesign.com/markets/robotics/article/21835000/whats-the-difference-between-industrial-robots) Truly, there are so many robots that you can choose from to achieve your goal. Once you choose what platform you will be using for your project, it's now time to choose the specific platform. @@ -49,7 +49,7 @@ Despite their advantages, quadrotors come with notable disadvantages. Their limi **Popular Platforms:** -![Quadrotor Platforms](/assets/images/quadrotors_all.png) +![Quadrotor Platforms](/assets/images/robotics-project-guide/quadrotors_all.png) Without getting into the nitty-gritty details, the basic idea is - if you want to have an extremely customized quadrotor, you should use the PX4 Autopilot Platform. PX4 is an open-source flight control system that provides unparalleled flexibility, allowing users to design and implement custom hardware configurations, integrate specialized sensors, and modify flight algorithms. Its modular architecture supports a wide range of hardware, from small indoor drones to large outdoor quadrotors, making it adaptable to various applications. @@ -133,7 +133,7 @@ Compared to wheeled robots, quadrupeds are generally slower but more versatile i **Popular Platforms:** -![Quadruped Platforms](/assets/images/quadrupeds_all.png) +![Quadruped Platforms](/assets/images/robotics-project-guide/quadrupeds_all.png) 1. **Unitree Robots:** - **Unitree Go1 EDU:** A compact and affordable quadruped ideal for education and research, offering advanced locomotion capabilities and ROS support. [Unitree Go1](https://www.unitree.com/products/go1) @@ -192,7 +192,7 @@ Although wheeled robots are primarily suited to flat, obstacle-free environments **Popular Platforms:** -![Wheeled Robots](/assets/images/wheeled_robots_all.png) +![Wheeled Robots](/assets/images/robotics-project-guide/wheeled_robots_all.png) 1. **TurtleBot Series:** - **TurtleBot3 Burger:** A compact, affordable, and programmable ROS-based mobile robot designed for education and research. It features modularity and open-source software, allowing for extensive customization. @@ -238,7 +238,7 @@ Fixed manipulators are stationary robotic arms designed for tasks such as assemb **Popular Platforms:** -![Manipulator Robots](/assets/images/manipulators_all.png) +![Manipulator Robots](/assets/images/robotics-project-guide/manipulators_all.png) 1. **Kinova Gen3 (7 DoF):** - **Degrees of Freedom:** 7 diff --git a/wiki/robotics-project-guide/choose-a-sim.md b/wiki/robotics-project-guide/choose-a-sim.md index dba7193a..5b867d27 100644 --- a/wiki/robotics-project-guide/choose-a-sim.md +++ b/wiki/robotics-project-guide/choose-a-sim.md @@ -4,7 +4,7 @@ title: Choose a Simulator mermaid: true --- -![all_sim](/assets/images/all_sim.png) +![all_sim](/assets/images/robotics-project-guide/all_sim.png) Selecting the appropriate simulator is a pivotal step in any robotics project. Simulators allow you to test algorithms, design robots, and visualize environments without the need for physical hardware, saving both time and resources. This section will guide you through the importance of simulators, help you identify the type of simulator that suits your project's needs, and provide comparisons of popular options across various categories. @@ -138,7 +138,7 @@ Users define the physical and kinematic properties of robots using formats like By providing this information in a URDF file, simulators can accurately construct and simulate the robot's behavior within a virtual environment. -![urdf_to_sim](/assets/images/urdf_to_sim.png) +![urdf_to_sim](/assets/images/robotics-project-guide/urdf_to_sim.png) Here, the `"link"` in the red square on left-side is the URDF section that defines the Unitree G1's pelvis link. Based on the information provided here, the physics engine simulates the pelvis on the humanoid robot. **Extended Effects Through Plugins or Force/Torque Models** @@ -176,7 +176,7 @@ We first go over some popular simulators tailored for robotics applications. *Free for personal or educational use; commercial licenses may apply. ### [Gazebo](https://gazebosim.org/home) -![gazebo_sim](/assets/images/gazebo_sim.png) +![gazebo_sim](/assets/images/robotics-project-guide/gazebo_sim.png) Gazebo is a widely-used open-source robotics simulator that offers robust physics simulation and sensor modeling capabilities. It provides a 3D environment where users can test and develop robots in realistic scenarios. Gazebo's integration with the Robot Operating System (ROS) makes it a standard choice for many robotics projects, facilitating seamless communication between simulation and real-world applications. @@ -192,7 +192,7 @@ Gazebo is a widely-used open-source robotics simulator that offers robust physic - **Learning Curve**: May require time to master its extensive features and functionalities. ### [AirSim (on Unity)](https://microsoft.github.io/AirSim/Unity/?utm_source=chatgpt.com) -![airsim_sim](/assets/images/airsim_sim.png) +![airsim_sim](/assets/images/robotics-project-guide/airsim_sim.png) Developed by Microsoft, AirSim is an open-source simulator designed primarily for drones and autonomous vehicles. Built on the Unreal Engine, it provides high-fidelity visuals and accurate physics modeling, making it suitable for machine learning and computer vision research. AirSim supports both software-in-the-loop and hardware-in-the-loop simulations, allowing for seamless transitions from virtual to real-world testing. **Pros**: @@ -208,7 +208,7 @@ Developed by Microsoft, AirSim is an open-source simulator designed primarily fo ### [CoppeliaSim (formerly V-REP)](https://www.coppeliarobotics.com/) -![coppeliasim_sim](/assets/images/CoppeliaSim_sim.jpg) +![coppeliasim_sim](/assets/images/robotics-project-guide/CoppeliaSim_sim.jpg) CoppeliaSim is a versatile robotics simulator known for its extensive feature set and modularity. It supports a wide range of robot models and includes several physics engines for accurate simulation. CoppeliaSim's integrated development environment allows for rapid prototyping and testing of robotic algorithms. It also offers support for multiple programming languages, enhancing its flexibility for various applications. @@ -225,7 +225,7 @@ CoppeliaSim is a versatile robotics simulator known for its extensive feature se ### [Unity](https://unity.com/blog/engine-platform/robotics-simulation-is-easy-as-1-2-3) -![unity_sim](/assets/images/unity_sim.png) +![unity_sim](/assets/images/robotics-project-guide/unity_sim.png) Unity is a powerful game development platform that has gained popularity in robotics for its high-quality rendering and flexible environment creation. While not specifically designed for robotics, Unity's extensive asset store and scripting capabilities allow users to build complex simulations. With the addition of plugins and bridges, Unity can integrate with ROS, enabling the development of sophisticated robotic applications with realistic visuals. @@ -254,7 +254,7 @@ As the field of robotics increasingly incorporates reinforcement learning (RL) t ### OpenAI Gym -![openaigym_sim](/assets/images/openaigym_sim.png) +![openaigym_sim](/assets/images/robotics-project-guide/openaigym_sim.png) OpenAI Gym is a widely-used toolkit for developing and comparing reinforcement learning algorithms. It provides a standardized API to interact with a variety of environments, ranging from simple tasks to complex simulations. Many RL training simulators are built upon the Gym framework, making it a foundational tool in the RL community. OpenAI Gym itself is not a single physics engine or simulator. Instead, it’s a framework that provides a standardized API for a large collection of reinforcement learning environments. Many other RL simulators follow the conventions used in Gym. @@ -278,7 +278,7 @@ OpenAI Gym itself is not a single physics engine or simulator. Instead, it’s a ### MuJoCo -![mujoco_sim](/assets/images/mujoco_sim.jpg) +![mujoco_sim](/assets/images/robotics-project-guide/mujoco_sim.jpg) MuJoCo (Multi-Joint dynamics with Contact) is a physics engine designed for fast and accurate simulation of articulated structures, making it ideal for reinforcement learning tasks that require high-fidelity physics modeling. @@ -300,7 +300,7 @@ MuJoCo (Multi-Joint dynamics with Contact) is a physics engine designed for fast ### PyBullet -![pybullet_sim](/assets/images/pybullet_sim.png) +![pybullet_sim](/assets/images/robotics-project-guide/pybullet_sim.png) PyBullet is an open-source physics engine that offers real-time simulation of rigid body dynamics, making it suitable for reinforcement learning and robotics research. @@ -322,7 +322,7 @@ PyBullet is an open-source physics engine that offers real-time simulation of ri ### Isaac Lab -![isaaclab_sim](/assets/images/isaaclab_sim.jpg) +![isaaclab_sim](/assets/images/robotics-project-guide/isaaclab_sim.jpg) Isaac Lab is an open-source, GPU-accelerated framework for robot learning, built on top of NVIDIA Isaac Sim. It provides high-fidelity physics simulation using NVIDIA PhysX and photorealistic rendering, making it suitable for training robot policies in simulation before deploying them in real-world scenarios. diff --git a/wiki/robotics-project-guide/define-your-goals-and-requirements.md b/wiki/robotics-project-guide/define-your-goals-and-requirements.md index 4a57d6fc..15694e2c 100644 --- a/wiki/robotics-project-guide/define-your-goals-and-requirements.md +++ b/wiki/robotics-project-guide/define-your-goals-and-requirements.md @@ -29,7 +29,7 @@ Start by clarifying the primary function of your robot: Example: For our quadrupedal robot Tod, the goal is to assist elderly shoppers by carrying their products in a shopping center. The end-users are senior citizens who may have difficulty carrying heavy items, and the environment is a bustling retail space with various obstacles. -Go2 Package Robot +Go2 Package Robot This is the Go2 Package Robot, designed to assist users in carrying heavy items. The robot can navigate autonomously, avoid obstacles, and carry payloads of up to 12 kg. With its robust design, it is well-suited for use in indoor environments such as shopping centers or warehouses. @@ -48,7 +48,7 @@ Functional requirements detail what your robot must be able to do: - **Navigation**: Will it operate autonomously or require human control? - **Interaction**: Does it need to communicate with users or other systems? -| ![Quadruped Robot](/assets/images/go2_image.jpg) | ![Wheeled Robot](/assets/images/wheeled_robot_image.png) | ![Drone Robot](/assets/images/drone_image.png) | +| ![Quadruped Robot](/assets/images/robotics-project-guide/go2_image.jpg) | ![Wheeled Robot](/assets/images/robotics-project-guide/wheeled_robot_image.png) | ![Drone Robot](/assets/images/robotics-project-guide/drone_image.png) | |:---------------------------------:|:---------------------------------:|:-------------------------------:| | Quadruped | Wheeled Vehicle | Drone | diff --git a/wiki/sensing/___all_subsections.md b/wiki/sensing/___all_subsections.md index acf0d2f6..c17e97a6 100644 --- a/wiki/sensing/___all_subsections.md +++ b/wiki/sensing/___all_subsections.md @@ -3,7 +3,7 @@ date: 2017-08-15 title: Adafruit GPS --- -![Adafruit GPS Components](/assets/images/AdafruitGPS-c715f.png) ![Adafruit GPS Assembled](/assets/images/AdafruitGPS-69ceb.png) +![Adafruit GPS Components](/assets/images/sensing/AdafruitGPS-c715f.png) ![Adafruit GPS Assembled](/assets/images/sensing/AdafruitGPS-69ceb.png) The Adafruit Ultimate GPS module is designed for convenient use with Arduino, Raspberry Pi, or other commonly used micro-controllers. The breakout is built around the MTK3339 chipset, a no-nonsense, high-quality GPS module that can track up to 22 satellites on 66 channels, has an excellent high-sensitivity receiver (-165 dB tracking), and a built-in antenna! @@ -43,7 +43,7 @@ title: AprilTags --- AprilTags is a visual fiducial system, useful for a wide variety of tasks including augmented reality, robotics, and camera calibration. The tags provide a means of identification and 3D positioning, even in low visibility conditions. The tags act like barcodes, storing a small amount of information (tag ID), while also enabling simple and accurate 6D (x, y, z, roll, pitch, yaw) pose estimation of the tag. -![AprilTags placed on multiple mobile robots platforms](/assets/images/apriltags-6719c.png) +![AprilTags placed on multiple mobile robots platforms](/assets/images/sensing/apriltags-6719c.png) The AprilTags project originates from a team at the University of Michigan, that has a [detailed website dedicated to the research](https://april.eecs.umich.edu/apriltag/), which is a good starting off point for learning how to use all of the software. The team has provided implementations in both Java and C to read AprilTags from a camera and there are additional implementations available online for tag reading. In addition to the software available on their website, a student at MIT has released a [C++ implementation](http://people.csail.mit.edu/kaess/apriltags). This website also has printable AprilTags for several tag families available in PDF format. @@ -105,14 +105,14 @@ This article presents an overview of object detection using the Azure camera wit To identify individual blocks and their respective grasping points, the perception subsystem undergoes a series of five steps. Initially, it crops the Azure Kinect camera image to center on the workspace. Following this, it applies color thresholding to filter out irrelevant objects and discern the blocks. Subsequently, it identifies the contours of these blocks and filters them based on their area and shape characteristics. Once the blocks are recognized, the perception subsystem computes the grasping points for each block. Collectively, these steps facilitate the accurate detection of block locations and their corresponding grasping points on the workstation. -![Pipeline of Block Detection](/assets/images/pipeline.png) +![Pipeline of Block Detection](/assets/images/sensing/pipeline.png) ### Image Cropping The initial stage of the perception subsystem involves cropping the raw image. Raw images often contain extraneous details, such as the workspace's supporting platform or the presence of individuals' feet near the robot. By cropping the image to focus solely on the workspace, we eliminate a significant amount of unnecessary information, thereby enhancing the system's efficiency and robustness. Currently, this approach employs hard-coded cropping parameters, requiring manual specification of the rows and columns to retain within the image. -![Cropped Image](/assets/images/cropped.png) +![Cropped Image](/assets/images/sensing/cropped.png) ### Color Segmentation Color segmentation can pose challenges in images with prominent shadows. Shadows cause a decrease in RGB pixel values, while light causes an increase, making it challenging to distinguish between different colors. To address this, we employ HSV (Hue, Saturation, Value) thresholding on the image. @@ -123,7 +123,7 @@ To tackle this issue, we employed color meter software to establish the brown co To further refine Jenga block detection and eliminate background noise, we apply a mask to the HSV thresholded image. Initially, we create a mask by contour area thresholding and then fill any holes within the contour to obtain a solid mask. The resulting masked image is shown in Figure 6a. This process ensures the reliable detection of Jenga blocks by removing remaining noise or unwanted objects. -![RGB Vector](/assets/images/rgb_vector.png) +![RGB Vector](/assets/images/sensing/rgb_vector.png) ### Block Contours @@ -135,7 +135,7 @@ To simplify contours and reduce points, we apply OpenCV2's 'minAreaRect' functio Subsequently, we identify the two grasp points of the block by detecting its longer sides. To determine these grasp points in the image frame, we align the depth image with the RGB image to acquire the depth value. Utilizing the x, y, and depth values, we transform the 2D pixel points back to the 3D pose in the camera frame using the intrinsic matrix. The grasp point concerning the base frame is then computed by performing a transform tree lookup, thereby completing the entire perception cycle. -![Contours](/assets/images/zoom1.png) +![Contours](/assets/images/sensing/zoom1.png) ### Image HSV Thresholding vs. Normalization @@ -148,7 +148,7 @@ Although image normalization showed promise, it proved less effective in clutter Normalized Image | HSV Image :-------------------------:|:-------------------------: -![Norm](/assets/images/norm_img.png) | ![HSV](/assets/images/hsv_img.png) +![Norm](/assets/images/sensing/norm_img.png) | ![HSV](/assets/images/sensing/hsv_img.png) ## References @@ -338,12 +338,12 @@ date: 2017-08-15 title: Delphi ESR Radar --- -![Delphi ESR Radar](/assets/images/DelphiESRRadar-8394b.png) +![Delphi ESR Radar](/assets/images/sensing/DelphiESRRadar-8394b.png) Delphi's multimode Electronically Scanning RADAR (ESR) combines a wide field of view at mid-range with long-range coverage to provide two measurement modes simultaneously. The mid-range coverage (60m, +/-45 deg) not only allows vehicles cutting in from adjacent lanes to be detected but also identifies vehicles and pedestrians across the width of the equipped vehicle. The long-range coverage (175m, +/-11 deg) provides accurate range and speed data with powerful object discrimination that can identify up to 64 targets in the vehicle's path. Delphi's technologically advanced ESR uses proven solid state technology plus class-leading performance, packaging and durability to offer customers game-changing forward radar detection. The quality of data provided by Delphi's system enables powerful functionality including adaptive cruise control, forward collision warning, brake support and headway alert. -![Radar Detection Cones](/assets/images/DelphiESRRadar-eba02.png) +![Radar Detection Cones](/assets/images/sensing/DelphiESRRadar-eba02.png) For more introductory information about the sensor and its state-of-the-art technology, please refer to the [official datasheet released by Delphi.](http://cmumrsdproject.wikispaces.com/file/view/delphi_esr_datasheet.pdf/613230495/delphi_esr_datasheet.pdf) @@ -494,23 +494,23 @@ Position information can be critical for achieving high accuracy localization an - Setting the frame rate for the GPS - Only should need to change the Measurement Period - ![](/assets/images/gps1.png) + ![](/assets/images/sensing/gps1.png) - Making the settings permanent on the GPS -![](/assets/images/gps2.png) +![](/assets/images/sensing/gps2.png) - Poor connection between the base station and robot GPS -![](/assets/images/gps3.png) +![](/assets/images/sensing/gps3.png) - Make sure that all the values match between the base station and robot GPS except for the target - robot should be UART2 and the base station UART1 - Loading a configuration file (You may not need to do this) -![](/assets/images/gps4.png) +![](/assets/images/sensing/gps4.png) /wiki/sensing/opencv-stereo.md @@ -549,7 +549,7 @@ Although PCL comes installed with ROS full installation by default, a complete i 1. ## Microsoft Kinect - ![Kinect](/assets/images/kinect.jpg) + ![Kinect](/assets/images/sensing/kinect.jpg) ### Overview: Kinect for Xbox 360 is a low-cost vision device equipped with one IR camera, one color camera, and one IR projector to produce RGB images as well as voxel (depth-pixel) images. The RGB video stream gives an 8-bit VGA resolution (640 x 480 pixels) with a Bayer color filter, while the monochrome depth-sensing video stream is in VGA resolution. The sensor has an angular field of view of 57 degrees horizontally and 43 degrees vertically. Kinect has been reverse engineered to a great extent by the open-source community which has revealed many facts on how depth is measured. Kinect uses a structured light approach form in which we can extract the time of return. They use a standard off-the-shelf CMOS sensor for the same. @@ -575,7 +575,7 @@ Although PCL comes installed with ROS full installation by default, a complete i 2. ## Intel Realsense D435i - ![Realsense](/assets/images/realsense.jpg) + ![Realsense](/assets/images/sensing/realsense.jpg) ### Overview: The Intel® RealSense™ Depth Camera D400 Series uses stereo vision to calculate depth. The D435 is a USB-powered depth camera and consists of a pair of depth sensors, an RGB sensor, and an infrared projector. It gives a good depth map a well the processed reconstructed 3D point clouds. @@ -626,7 +626,7 @@ Although PCL comes installed with ROS full installation by default, a complete i ``` The function pcl_callback will then be called every time the sensor publishes a new pc2.PointCloud2 message. - ![original](/assets/images/original.png) + ![original](/assets/images/sensing/original.png) 3. **Voxel Filter Downsampling** @@ -642,7 +642,7 @@ Although PCL comes installed with ROS full installation by default, a complete i downsampled = vox.filter() ``` - ![downsampled](/assets/images/downsampled.png) + ![downsampled](/assets/images/sensing/downsampled.png) 4. **Region cropping** @@ -669,7 +669,7 @@ Although PCL comes installed with ROS full installation by default, a complete i passed = passthrough.filter() ``` - ![cropped](/assets/images/cropped.png) + ![cropped](/assets/images/sensing/cropped.png) 5. **RANSAC ground segmentation** @@ -691,9 +691,9 @@ Although PCL comes installed with ROS full installation by default, a complete i cloud_objects = cloud_filtered.extract(inliers, negative=True) ``` - ![ransac1](/assets/images/ransac1.png) + ![ransac1](/assets/images/sensing/ransac1.png) - ![ransac2](/assets/images/ransac2.png) + ![ransac2](/assets/images/sensing/ransac2.png) Here Inliers are the points that fit a plane equation, therefore, they should belong to the table. On the other hand, outliers are the remaining points that represent the objects over the table. @@ -736,7 +736,7 @@ Although PCL comes installed with ROS full installation by default, a complete i cluster_indices = ec.Extract() ``` - ![cluster](/assets/images/cluster.png) + ![cluster](/assets/images/sensing/cluster.png) 8. **Sprinkle some machine learning** @@ -750,7 +750,7 @@ Although PCL comes installed with ROS full installation by default, a complete i Here is a visualization of a sample mapped environment. - ![RTABMAP](/assets/images/slam.png) + ![RTABMAP](/assets/images/sensing/slam.png) /wiki/sensing/photometric-calibration.md --- @@ -1026,7 +1026,7 @@ This page will go into detail about to get started with the TS16 Total Station, Total stations have an extended heritage in civil engineering, where they have been used to precisely survey worksites since the 1970s. The total station sends beams of light directly to a glass reflective prism, and uses the time-of-flight properties of the beam to measure distances. The robotic total station tracks it's calibration orientaiton to high precision, such that the measured distance can be converted into a high-precision 3D position mesaurement. Total stations, depending on the prism type and other factors, can accurate track with in millimeter range at up to 3.5km [Leica-Geosystems](file:///home/john/Downloads/Leica_Viva_TS16_DS-2.pdf). -![Example usage of a Total Station in the Field](/assets/images/assets_leica_field_image.jpg) +![Example usage of a Total Station in the Field](/assets/images/sensing/assets_leica_field_image.jpg) [Source](https://leica-geosystems.com/) ### Best Use Cases & Expected Quality @@ -1057,7 +1057,7 @@ This method has been tested on a TS16, but it would likely work on a TS15 or oth The other side of the total station is the reflector, which is used to get the high precision ranging. This is an important piece of hardware, especially in this use case. Since the prism will be moving, having high quality glass will reduce the imperfections that could cause the reflected beam to be off-center, resulting in a higher likelihood of losing tracking of the prism. A high quality prism from Leica will cost more than [$1k](https://www.allenprecision.com/360-reflector). -![Leica GRZ122 360 Prism](/assets/images/leica_360_prism.jpeg) +![Leica GRZ122 360 Prism](/assets/images/sensing/leica_360_prism.jpeg) [Source](https://leica-geosystems.com/) In order to connect the total station to a compute platform, it's possble to use wired or wireless methods. This wiki only explores the usage of USB connections using Leica's custom (and [expensive](https://www.baselineequipment.com/leica-instrument-to-datacollector-laptop-usb-cable)) cable. @@ -1186,7 +1186,7 @@ If you are using a Raspberry Pi, you can use the [ReSpeaker](https://wiki.seeeds The microphone sensitivity can be adjusted using the `pavucontrol` program. This is available on Ubuntu. You can install it using `sudo apt install pavucontrol`. Once installed, you can run it using `pavucontrol`. This will open a GUI. You can then adjust the microphone gain using the slider: -![pavucontrol](/assets/images/pavucontrol.png) +![pavucontrol](/assets/images/sensing/pavucontrol.png) ### Echo Cancellation @@ -1304,7 +1304,7 @@ In informal tests, the STag were able to achieve accuracy within +- 2 centimeter **Exposure**, **ISO sensitivity** and **shutter type** are three camera main parameters which can help greatly improve marker detection. It is highly recommend to use ***global shutter cameras*** instead of rolling shutter cameras to avoid aliasing effects. Exposure and ISO sensitivity parameters are dependent on the application. In our case (TeamJ, MRSD 2021-23), the camera was mounted on a VTOL and the marker was to be detected from at least 12 meters away in outdoor environments. In order to do so, we had to use the lowest exposure (= 1 microsecond) and ISO sensitivity (= 100) settings for our camera. The GIF below shows how exposure and ISO sensitivity affects marker detection output. - ![exposure and iso sensitivity settings affecting marker detection](/assets/images/stag_exposure.gif) + ![exposure and iso sensitivity settings affecting marker detection](/assets/images/sensing/stag_exposure.gif) ## Tips @@ -1434,11 +1434,11 @@ title: Tracking vehicles using a static traffic camera Tracking vehicles using static camera is a useful tool for various use cases pertaining to both macro/micro traffic flow. We present a system where we extract vehicle trajectories using a monocular camera mounted at an intersection. We utilize a HD map and precompute homographies between the image plane of the camera and a bird's eye view plane where we finally project our trajectories. -![data_capture](/assets/images/Data_capture.png) +![data_capture](/assets/images/sensing/Data_capture.png) 1. ### 2D detection and tracking We use detectron 2 and SORT as preliminary vehicle detection and tracking algorithms in the camera frame. The algorithms give a bounding box on estimate. -![detectron_sort_result](/assets/images/detection_sort_output.png) +![detectron_sort_result](/assets/images/sensing/detection_sort_output.png) 2. ### Homography estimation to transform points image plane corresponding to a bird's eye view A ransac based homography is required to be precomputed between 2 image planes in camera and bird's eye view space. OpenCV's `cv::findhomography()` might be handy here. @@ -1446,11 +1446,11 @@ A ransac based homography is required to be precomputed between 2 image planes i 3. ### Bird's eye view and region of interest For getting a bird's eye view of an The bird's eye view can capture a fairly large space of the map depending on where the view is taken from. However the homography estimate is not good at the points far away from the camera origin. For this case we predefine a region of interest in the bird's eye view space and any vehicle out of this region is ignored. -![Bev_frame](/assets/images/bev_fifthcraig.jpg) +![Bev_frame](/assets/images/sensing/bev_fifthcraig.jpg) 4. ### HD Map A HD Map for the world is a prerequisite. Since the intersection we captured data from didn't have a prior map available, we ended up creating our own vanilla map. The major requirements for the map are the information containing the lanes, their directions and the corresponding lane center lines. - ![HD_Map](/assets/images/HD_map.png) + ![HD_Map](/assets/images/sensing/HD_map.png) 5. ### Tracking in the bird's eye view space For sake of avoiding confusion with the tracker in the camera space (SORT) , we will call this tracker as the BEV tracker throughout the rest of this post. This tracker tracks the position and velocity of the vehicles in the bird's eye view frame. @@ -1474,9 +1474,9 @@ Tracked state of a vehicle - **[x, y, vx, vy]** * #### Data Association - The ID association problem is modeled as a linear sum assignment. We use the Hungarian algorithm to solve this. The cost is defined as the euclidean distance between states of any two vehicles. - ![Cost between two vehicles](/assets/images/distance.png) + ![Cost between two vehicles](/assets/images/sensing/distance.png) * This is then formed into a matrix where rows contain ids from bev tracker and columns contain ids from SORT. - ![Linear Sum assignment problem](/assets/images/costmatrix_formation.png) + ![Linear Sum assignment problem](/assets/images/sensing/costmatrix_formation.png) * Adding the priors from SORT- The same IDs from tracker and SORT (say i and j), we assign the cost between those vehicles as 0 or Cij = 0. @@ -1501,7 +1501,7 @@ Tracked state of a vehicle - **[x, y, vx, vy]** * Number of consecutive frames they are seen for. * Number of consecutive frames they have not been seen for. -![Tracking Results](/assets/images/tracking_results.png) +![Tracking Results](/assets/images/sensing/tracking_results.png) #### References: * [1] Yuxin Wu, Alexander Kirillov, Francisco Massa, Wan-Yen Lo, and Ross Girshick.Detectron2. https://github.com/facebookresearch/detectron2, 2019. @@ -1525,7 +1525,7 @@ Ultrawideband positioning takes advantage of the communication pulses to sense d By using multiple stationary devices, a single or multiple mobile beacons can be tracked by combining ranges through trilateration. -![Example usage of a DWM1001 setup](/assets/images/assets_decawave_example_multi_anchor.png) +![Example usage of a DWM1001 setup](/assets/images/sensing/assets_decawave_example_multi_anchor.png) [Source](https://www.researchgate.net/profile/Teijo-Lehtonen/publication/281346001/figure/fig4/AS:284460038803456@1444831966619/DecaWave-UWB-localization-system-SDK-5.png) ### Best Use Cases & Expected Quality @@ -1542,7 +1542,7 @@ Even in the best scenario, it should be expected that a UWB positioning system w In order to setup a DWM1001-Dev UltraWideband positioning system, it's important to have enough DWM1001-Dev modules (`beacons`) for your use case. Each one of the `beacons` can either be configured as a `tag`, `anchor`, or `gateway`. `tag`s represent mobile `beacons` that will be on your robot, `anchors` represent stationary anchors, and `gateways` are modules that sole job are to pipe information over serial to your compute stack. While there are multiple ways to get information from these devices, this guide will describes how to access it over a direct USB serial connection. -![Architecture of a DWM1001-Dev setup with multiple gateways](/assets/images/dwm_arch.png) +![Architecture of a DWM1001-Dev setup with multiple gateways](/assets/images/sensing/dwm_arch.png) Before any work can be done on the `beacons`, they must be flashed with the pre-built software provided by the manufacturer for this task. A detailed guide can be found [here](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjNrN-T8OP7AhWTFVkFHRNTCzcQFnoECBMQAQ&url=https%3A%2F%2Fwww.qorvo.com%2Fproducts%2Fd%2Fda007972&usg=AOvVaw2va8gKJNC_mfXq5EQZAO0S) @@ -1550,7 +1550,7 @@ Before any work can be done on the `beacons`, they must be flashed with the pre- Once the beacons have been flashed, they need to be configured and calibrated. This can be one most easily using their provided Android app, [Decawave DRTLS APK](https://apkcombo.com/decawave-drtls-manager-r1/com.decawave.argomanager/). There is also information found [here](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjNrN-T8OP7AhWTFVkFHRNTCzcQFnoECBMQAQ&url=https%3A%2F%2Fwww.qorvo.com%2Fproducts%2Fd%2Fda007972&usg=AOvVaw2va8gKJNC_mfXq5EQZAO0S) about performing this work directly through a command line, but it is less documented. -![DRTLS App Screenshot](/assets/images/drtls_app.png) +![DRTLS App Screenshot](/assets/images/sensing/drtls_app.png) In order to use the app, follow the instructions linked [here](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwi-id_G9-P7AhVIGVkFHVIPBZ0QFnoECA0QAQ&url=https%3A%2F%2Fwww.qorvo.com%2Fproducts%2Fd%2Fda007996&usg=AOvVaw09yRMbgwEx7hxTDpJP4G8D). @@ -1562,7 +1562,7 @@ It is possible to change the update rate of all `beacons`. For most real time po During configuration, make note of the `beacon` IDS (eg. from `Tag DW11A1` the tag ID is `11A1`). This should be the ID used in the driver config to identify multiple tags independently. -![DRTLS App - Beacon IDS](/assets/images/drtls_ids.png) +![DRTLS App - Beacon IDS](/assets/images/sensing/drtls_ids.png) At this point, the DRTLS app can be used directly to test the 3D positioning. Ensure all modules are powered, and if ther are, enter the "map" page of the app to view all of the `beacons` live, including the dynamic positioning of the `tag`. @@ -1570,7 +1570,7 @@ At this point, the DRTLS app can be used directly to test the 3D positioning. En In most cases, the `anchors` are located around a room, such that they are relatively planar with respect to each other. For 2D localization, this is perfectly acceptable, but it becomes an issue when attempting 3D localization. This is due to the concept of *[dilution of precision](https://en.wikipedia.org/wiki/Dilution_of_precision_(navigation))*, which originated from GPS. For GPS, it means that as GPS satellites attempting to provide a location to a ground side receiver get relatively close to each other, the output precision of the ground side position estimation becomes poorer, as seen below: -![GDOP Example](/assets/images/gdop_example.png) +![GDOP Example](/assets/images/sensing/gdop_example.png) For UWB, this means that if the `anchors` are all close to the same Z plane, their Z localization precision will suffer. Ideally, all anchors should be placed at widely different heights to improve this. However, the beacons need to also be placed away from corners (such as the intersection of the floor/ceiling to the wall), leading to a difficulty. diff --git a/wiki/sensing/adafruit-gps.md b/wiki/sensing/adafruit-gps.md index 18c4b370..070aa7f9 100644 --- a/wiki/sensing/adafruit-gps.md +++ b/wiki/sensing/adafruit-gps.md @@ -2,7 +2,7 @@ date: 2017-08-15 title: Adafruit GPS --- -![Adafruit GPS Components](/assets/images/AdafruitGPS-c715f.png) ![Adafruit GPS Assembled](/assets/images/AdafruitGPS-69ceb.png) +![Adafruit GPS Components](/assets/images/sensing/AdafruitGPS-c715f.png) ![Adafruit GPS Assembled](/assets/images/sensing/AdafruitGPS-69ceb.png) The Adafruit Ultimate GPS module is designed for convenient use with Arduino, Raspberry Pi, or other commonly used micro-controllers. The breakout is built around the MTK3339 chipset, a no-nonsense, high-quality GPS module that can track up to 22 satellites on 66 channels, has an excellent high-sensitivity receiver (-165 dB tracking), and a built-in antenna! diff --git a/wiki/sensing/apriltags.md b/wiki/sensing/apriltags.md index e350616c..ca4e9715 100644 --- a/wiki/sensing/apriltags.md +++ b/wiki/sensing/apriltags.md @@ -4,7 +4,7 @@ title: AprilTags --- AprilTags is a visual fiducial system, useful for a wide variety of tasks including augmented reality, robotics, and camera calibration. The tags provide a means of identification and 3D positioning, even in low visibility conditions. The tags act like barcodes, storing a small amount of information (tag ID), while also enabling simple and accurate 6D (x, y, z, roll, pitch, yaw) pose estimation of the tag. -![AprilTags placed on multiple mobile robots platforms](/assets/images/apriltags-6719c.png) +![AprilTags placed on multiple mobile robots platforms](/assets/images/sensing/apriltags-6719c.png) The AprilTags project originates from a team at the University of Michigan, that has a [detailed website dedicated to the research](https://april.eecs.umich.edu/apriltag/), which is a good starting off point for learning how to use all of the software. The team has provided implementations in both Java and C to read AprilTags from a camera and there are additional implementations available online for tag reading. In addition to the software available on their website, a student at MIT has released a [C++ implementation](http://people.csail.mit.edu/kaess/apriltags). This website also has printable AprilTags for several tag families available in PDF format. diff --git a/wiki/sensing/azure-block-detection.md b/wiki/sensing/azure-block-detection.md index 7ef2d58a..0a486872 100644 --- a/wiki/sensing/azure-block-detection.md +++ b/wiki/sensing/azure-block-detection.md @@ -16,14 +16,14 @@ This article presents an overview of object detection using the Azure camera wit To identify individual blocks and their respective grasping points, the perception subsystem undergoes a series of five steps. Initially, it crops the Azure Kinect camera image to center on the workspace. Following this, it applies color thresholding to filter out irrelevant objects and discern the blocks. Subsequently, it identifies the contours of these blocks and filters them based on their area and shape characteristics. Once the blocks are recognized, the perception subsystem computes the grasping points for each block. Collectively, these steps facilitate the accurate detection of block locations and their corresponding grasping points on the workstation. -![Pipeline of Block Detection](/assets/images/pipeline.png) +![Pipeline of Block Detection](/assets/images/sensing/pipeline.png) ### Image Cropping The initial stage of the perception subsystem involves cropping the raw image. Raw images often contain extraneous details, such as the workspace's supporting platform or the presence of individuals' feet near the robot. By cropping the image to focus solely on the workspace, we eliminate a significant amount of unnecessary information, thereby enhancing the system's efficiency and robustness. Currently, this approach employs hard-coded cropping parameters, requiring manual specification of the rows and columns to retain within the image. -![Cropped Image](/assets/images/cropped.png) +![Cropped Image](/assets/images/sensing/cropped.png) ### Color Segmentation Color segmentation can pose challenges in images with prominent shadows. Shadows cause a decrease in RGB pixel values, while light causes an increase, making it challenging to distinguish between different colors. To address this, we employ HSV (Hue, Saturation, Value) thresholding on the image. @@ -34,7 +34,7 @@ To tackle this issue, we employed color meter software to establish the brown co To further refine Jenga block detection and eliminate background noise, we apply a mask to the HSV thresholded image. Initially, we create a mask by contour area thresholding and then fill any holes within the contour to obtain a solid mask. The resulting masked image is shown in Figure 6a. This process ensures the reliable detection of Jenga blocks by removing remaining noise or unwanted objects. -![RGB Vector](/assets/images/rgb_vector.png) +![RGB Vector](/assets/images/sensing/rgb_vector.png) ### Block Contours @@ -46,7 +46,7 @@ To simplify contours and reduce points, we apply OpenCV2's 'minAreaRect' functio Subsequently, we identify the two grasp points of the block by detecting its longer sides. To determine these grasp points in the image frame, we align the depth image with the RGB image to acquire the depth value. Utilizing the x, y, and depth values, we transform the 2D pixel points back to the 3D pose in the camera frame using the intrinsic matrix. The grasp point concerning the base frame is then computed by performing a transform tree lookup, thereby completing the entire perception cycle. -![Contours](/assets/images/zoom1.png) +![Contours](/assets/images/sensing/zoom1.png) ### Image HSV Thresholding vs. Normalization @@ -59,7 +59,7 @@ Although image normalization showed promise, it proved less effective in clutter Normalized Image | HSV Image :-------------------------:|:-------------------------: -![Norm](/assets/images/norm_img.png) | ![HSV](/assets/images/hsv_img.png) +![Norm](/assets/images/sensing/norm_img.png) | ![HSV](/assets/images/sensing/hsv_img.png) ## References diff --git a/wiki/sensing/delphi-esr-radar.md b/wiki/sensing/delphi-esr-radar.md index 2c24090b..b5531a83 100644 --- a/wiki/sensing/delphi-esr-radar.md +++ b/wiki/sensing/delphi-esr-radar.md @@ -3,12 +3,12 @@ date: 2017-08-15 title: Delphi ESR Radar --- -![Delphi ESR Radar](/assets/images/DelphiESRRadar-8394b.png) +![Delphi ESR Radar](/assets/images/sensing/DelphiESRRadar-8394b.png) Delphi's multimode Electronically Scanning RADAR (ESR) combines a wide field of view at mid-range with long-range coverage to provide two measurement modes simultaneously. The mid-range coverage (60m, +/-45 deg) not only allows vehicles cutting in from adjacent lanes to be detected but also identifies vehicles and pedestrians across the width of the equipped vehicle. The long-range coverage (175m, +/-11 deg) provides accurate range and speed data with powerful object discrimination that can identify up to 64 targets in the vehicle's path. Delphi's technologically advanced ESR uses proven solid state technology plus class-leading performance, packaging and durability to offer customers game-changing forward radar detection. The quality of data provided by Delphi's system enables powerful functionality including adaptive cruise control, forward collision warning, brake support and headway alert. -![Radar Detection Cones](/assets/images/DelphiESRRadar-eba02.png) +![Radar Detection Cones](/assets/images/sensing/DelphiESRRadar-eba02.png) For more introductory information about the sensor and its state-of-the-art technology, please refer to the [official datasheet released by Delphi.](http://cmumrsdproject.wikispaces.com/file/view/delphi_esr_datasheet.pdf/613230495/delphi_esr_datasheet.pdf) diff --git a/wiki/sensing/gps.md b/wiki/sensing/gps.md index f1e7f9b5..d376a970 100644 --- a/wiki/sensing/gps.md +++ b/wiki/sensing/gps.md @@ -42,20 +42,20 @@ Position information can be critical for achieving high accuracy localization an - Setting the frame rate for the GPS - Only should need to change the Measurement Period - ![](/assets/images/gps1.png) + ![](/assets/images/sensing/gps1.png) - Making the settings permanent on the GPS -![](/assets/images/gps2.png) +![](/assets/images/sensing/gps2.png) - Poor connection between the base station and robot GPS -![](/assets/images/gps3.png) +![](/assets/images/sensing/gps3.png) - Make sure that all the values match between the base station and robot GPS except for the target - robot should be UART2 and the base station UART1 - Loading a configuration file (You may not need to do this) -![](/assets/images/gps4.png) +![](/assets/images/sensing/gps4.png) diff --git a/wiki/sensing/pcl.md b/wiki/sensing/pcl.md index 71524370..380658c3 100644 --- a/wiki/sensing/pcl.md +++ b/wiki/sensing/pcl.md @@ -18,7 +18,7 @@ Although PCL comes installed with ROS full installation by default, a complete i 1. ## Microsoft Kinect - ![Kinect](/assets/images/kinect.jpg) + ![Kinect](/assets/images/sensing/kinect.jpg) ### Overview: Kinect for Xbox 360 is a low-cost vision device equipped with one IR camera, one color camera, and one IR projector to produce RGB images as well as voxel (depth-pixel) images. The RGB video stream gives an 8-bit VGA resolution (640 x 480 pixels) with a Bayer color filter, while the monochrome depth-sensing video stream is in VGA resolution. The sensor has an angular field of view of 57 degrees horizontally and 43 degrees vertically. Kinect has been reverse engineered to a great extent by the open-source community which has revealed many facts on how depth is measured. Kinect uses a structured light approach form in which we can extract the time of return. They use a standard off-the-shelf CMOS sensor for the same. @@ -44,7 +44,7 @@ Although PCL comes installed with ROS full installation by default, a complete i 2. ## Intel Realsense D435i - ![Realsense](/assets/images/realsense.jpg) + ![Realsense](/assets/images/sensing/realsense.jpg) ### Overview: The Intel® RealSense™ Depth Camera D400 Series uses stereo vision to calculate depth. The D435 is a USB-powered depth camera and consists of a pair of depth sensors, an RGB sensor, and an infrared projector. It gives a good depth map a well the processed reconstructed 3D point clouds. @@ -95,7 +95,7 @@ Although PCL comes installed with ROS full installation by default, a complete i ``` The function pcl_callback will then be called every time the sensor publishes a new pc2.PointCloud2 message. - ![original](/assets/images/original.png) + ![original](/assets/images/sensing/original.png) 3. **Voxel Filter Downsampling** @@ -111,7 +111,7 @@ Although PCL comes installed with ROS full installation by default, a complete i downsampled = vox.filter() ``` - ![downsampled](/assets/images/downsampled.png) + ![downsampled](/assets/images/sensing/downsampled.png) 4. **Region cropping** @@ -138,7 +138,7 @@ Although PCL comes installed with ROS full installation by default, a complete i passed = passthrough.filter() ``` - ![cropped](/assets/images/cropped.png) + ![cropped](/assets/images/sensing/cropped.png) 5. **RANSAC ground segmentation** @@ -160,9 +160,9 @@ Although PCL comes installed with ROS full installation by default, a complete i cloud_objects = cloud_filtered.extract(inliers, negative=True) ``` - ![ransac1](/assets/images/ransac1.png) + ![ransac1](/assets/images/sensing/ransac1.png) - ![ransac2](/assets/images/ransac2.png) + ![ransac2](/assets/images/sensing/ransac2.png) Here Inliers are the points that fit a plane equation, therefore, they should belong to the table. On the other hand, outliers are the remaining points that represent the objects over the table. @@ -205,7 +205,7 @@ Although PCL comes installed with ROS full installation by default, a complete i cluster_indices = ec.Extract() ``` - ![cluster](/assets/images/cluster.png) + ![cluster](/assets/images/sensing/cluster.png) 8. **Sprinkle some machine learning** @@ -219,5 +219,5 @@ Although PCL comes installed with ROS full installation by default, a complete i Here is a visualization of a sample mapped environment. - ![RTABMAP](/assets/images/slam.png) + ![RTABMAP](/assets/images/sensing/slam.png) diff --git a/wiki/sensing/robotic-total-stations.md b/wiki/sensing/robotic-total-stations.md index 29d7fd21..bceb5e89 100644 --- a/wiki/sensing/robotic-total-stations.md +++ b/wiki/sensing/robotic-total-stations.md @@ -8,7 +8,7 @@ This page will go into detail about to get started with the TS16 Total Station, Total stations have an extended heritage in civil engineering, where they have been used to precisely survey worksites since the 1970s. The total station sends beams of light directly to a glass reflective prism, and uses the time-of-flight properties of the beam to measure distances. The robotic total station tracks it's calibration orientaiton to high precision, such that the measured distance can be converted into a high-precision 3D position mesaurement. Total stations, depending on the prism type and other factors, can accurate track with in millimeter range at up to 3.5km [Leica-Geosystems](file:///home/john/Downloads/Leica_Viva_TS16_DS-2.pdf). -![Example usage of a Total Station in the Field](/assets/images/assets_leica_field_image.jpg) +![Example usage of a Total Station in the Field](/assets/images/sensing/assets_leica_field_image.jpg) [Source](https://leica-geosystems.com/) ### Best Use Cases & Expected Quality @@ -39,7 +39,7 @@ This method has been tested on a TS16, but it would likely work on a TS15 or oth The other side of the total station is the reflector, which is used to get the high precision ranging. This is an important piece of hardware, especially in this use case. Since the prism will be moving, having high quality glass will reduce the imperfections that could cause the reflected beam to be off-center, resulting in a higher likelihood of losing tracking of the prism. A high quality prism from Leica will cost more than [$1k](https://www.allenprecision.com/360-reflector). -![Leica GRZ122 360 Prism](/assets/images/leica_360_prism.jpeg) +![Leica GRZ122 360 Prism](/assets/images/sensing/leica_360_prism.jpeg) [Source](https://leica-geosystems.com/) In order to connect the total station to a compute platform, it's possble to use wired or wireless methods. This wiki only explores the usage of USB connections using Leica's custom (and [expensive](https://www.baselineequipment.com/leica-instrument-to-datacollector-laptop-usb-cable)) cable. diff --git a/wiki/sensing/speech-recognition.md b/wiki/sensing/speech-recognition.md index 655dc26f..3f60ca39 100644 --- a/wiki/sensing/speech-recognition.md +++ b/wiki/sensing/speech-recognition.md @@ -86,7 +86,7 @@ If you are using a Raspberry Pi, you can use the [ReSpeaker](https://wiki.seeeds The microphone sensitivity can be adjusted using the `pavucontrol` program. This is available on Ubuntu. You can install it using `sudo apt install pavucontrol`. Once installed, you can run it using `pavucontrol`. This will open a GUI. You can then adjust the microphone gain using the slider: -![pavucontrol](/assets/images/pavucontrol.png) +![pavucontrol](/assets/images/sensing/pavucontrol.png) ### Echo Cancellation diff --git a/wiki/sensing/stag.md b/wiki/sensing/stag.md index 2a8e43c1..084791d1 100644 --- a/wiki/sensing/stag.md +++ b/wiki/sensing/stag.md @@ -64,7 +64,7 @@ In informal tests, the STag were able to achieve accuracy within +- 2 centimeter **Exposure**, **ISO sensitivity** and **shutter type** are three camera main parameters which can help greatly improve marker detection. It is highly recommend to use ***global shutter cameras*** instead of rolling shutter cameras to avoid aliasing effects. Exposure and ISO sensitivity parameters are dependent on the application. In our case (TeamJ, MRSD 2021-23), the camera was mounted on a VTOL and the marker was to be detected from at least 12 meters away in outdoor environments. In order to do so, we had to use the lowest exposure (= 1 microsecond) and ISO sensitivity (= 100) settings for our camera. The GIF below shows how exposure and ISO sensitivity affects marker detection output. - ![exposure and iso sensitivity settings affecting marker detection](/assets/images/stag_exposure.gif) + ![exposure and iso sensitivity settings affecting marker detection](/assets/images/sensing/stag_exposure.gif) ## Tips diff --git a/wiki/sensing/trajectory_extraction_static_camera.md b/wiki/sensing/trajectory_extraction_static_camera.md index 4a406878..42df51e9 100644 --- a/wiki/sensing/trajectory_extraction_static_camera.md +++ b/wiki/sensing/trajectory_extraction_static_camera.md @@ -6,11 +6,11 @@ title: Tracking vehicles using a static traffic camera Tracking vehicles using static camera is a useful tool for various use cases pertaining to both macro/micro traffic flow. We present a system where we extract vehicle trajectories using a monocular camera mounted at an intersection. We utilize a HD map and precompute homographies between the image plane of the camera and a bird's eye view plane where we finally project our trajectories. -![data_capture](/assets/images/Data_capture.png) +![data_capture](/assets/images/sensing/Data_capture.png) 1. ### 2D detection and tracking We use detectron 2 and SORT as preliminary vehicle detection and tracking algorithms in the camera frame. The algorithms give a bounding box on estimate. -![detectron_sort_result](/assets/images/detection_sort_output.png) +![detectron_sort_result](/assets/images/sensing/detection_sort_output.png) 2. ### Homography estimation to transform points image plane corresponding to a bird's eye view A ransac based homography is required to be precomputed between 2 image planes in camera and bird's eye view space. OpenCV's `cv::findhomography()` might be handy here. @@ -18,11 +18,11 @@ A ransac based homography is required to be precomputed between 2 image planes i 3. ### Bird's eye view and region of interest For getting a bird's eye view of an The bird's eye view can capture a fairly large space of the map depending on where the view is taken from. However the homography estimate is not good at the points far away from the camera origin. For this case we predefine a region of interest in the bird's eye view space and any vehicle out of this region is ignored. -![Bev_frame](/assets/images/bev_fifthcraig.jpg) +![Bev_frame](/assets/images/sensing/bev_fifthcraig.jpg) 4. ### HD Map A HD Map for the world is a prerequisite. Since the intersection we captured data from didn't have a prior map available, we ended up creating our own vanilla map. The major requirements for the map are the information containing the lanes, their directions and the corresponding lane center lines. - ![HD_Map](/assets/images/HD_map.png) + ![HD_Map](/assets/images/sensing/HD_map.png) 5. ### Tracking in the bird's eye view space For sake of avoiding confusion with the tracker in the camera space (SORT) , we will call this tracker as the BEV tracker throughout the rest of this post. This tracker tracks the position and velocity of the vehicles in the bird's eye view frame. @@ -46,9 +46,9 @@ Tracked state of a vehicle - **[x, y, vx, vy]** * #### Data Association - The ID association problem is modeled as a linear sum assignment. We use the Hungarian algorithm to solve this. The cost is defined as the euclidean distance between states of any two vehicles. - ![Cost between two vehicles](/assets/images/distance.png) + ![Cost between two vehicles](/assets/images/sensing/distance.png) * This is then formed into a matrix where rows contain ids from bev tracker and columns contain ids from SORT. - ![Linear Sum assignment problem](/assets/images/costmatrix_formation.png) + ![Linear Sum assignment problem](/assets/images/sensing/costmatrix_formation.png) * Adding the priors from SORT- The same IDs from tracker and SORT (say i and j), we assign the cost between those vehicles as 0 or Cij = 0. @@ -73,7 +73,7 @@ Tracked state of a vehicle - **[x, y, vx, vy]** * Number of consecutive frames they are seen for. * Number of consecutive frames they have not been seen for. -![Tracking Results](/assets/images/tracking_results.png) +![Tracking Results](/assets/images/sensing/tracking_results.png) #### References: * [1] Yuxin Wu, Alexander Kirillov, Francisco Massa, Wan-Yen Lo, and Ross Girshick.Detectron2. https://github.com/facebookresearch/detectron2, 2019. diff --git a/wiki/sensing/ultrawideband-beacon-positioning.md b/wiki/sensing/ultrawideband-beacon-positioning.md index a1be1d8e..fb0ab27c 100644 --- a/wiki/sensing/ultrawideband-beacon-positioning.md +++ b/wiki/sensing/ultrawideband-beacon-positioning.md @@ -12,7 +12,7 @@ Ultrawideband positioning takes advantage of the communication pulses to sense d By using multiple stationary devices, a single or multiple mobile beacons can be tracked by combining ranges through trilateration. -![Example usage of a DWM1001 setup](/assets/images/assets_decawave_example_multi_anchor.png) +![Example usage of a DWM1001 setup](/assets/images/sensing/assets_decawave_example_multi_anchor.png) [Source](https://www.researchgate.net/profile/Teijo-Lehtonen/publication/281346001/figure/fig4/AS:284460038803456@1444831966619/DecaWave-UWB-localization-system-SDK-5.png) ### Best Use Cases & Expected Quality @@ -29,7 +29,7 @@ Even in the best scenario, it should be expected that a UWB positioning system w In order to setup a DWM1001-Dev UltraWideband positioning system, it's important to have enough DWM1001-Dev modules (`beacons`) for your use case. Each one of the `beacons` can either be configured as a `tag`, `anchor`, or `gateway`. `tag`s represent mobile `beacons` that will be on your robot, `anchors` represent stationary anchors, and `gateways` are modules that sole job are to pipe information over serial to your compute stack. While there are multiple ways to get information from these devices, this guide will describes how to access it over a direct USB serial connection. -![Architecture of a DWM1001-Dev setup with multiple gateways](/assets/images/dwm_arch.png) +![Architecture of a DWM1001-Dev setup with multiple gateways](/assets/images/sensing/dwm_arch.png) Before any work can be done on the `beacons`, they must be flashed with the pre-built software provided by the manufacturer for this task. A detailed guide can be found [here](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjNrN-T8OP7AhWTFVkFHRNTCzcQFnoECBMQAQ&url=https%3A%2F%2Fwww.qorvo.com%2Fproducts%2Fd%2Fda007972&usg=AOvVaw2va8gKJNC_mfXq5EQZAO0S) @@ -37,7 +37,7 @@ Before any work can be done on the `beacons`, they must be flashed with the pre- Once the beacons have been flashed, they need to be configured and calibrated. This can be one most easily using their provided Android app, [Decawave DRTLS APK](https://apkcombo.com/decawave-drtls-manager-r1/com.decawave.argomanager/). There is also information found [here](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjNrN-T8OP7AhWTFVkFHRNTCzcQFnoECBMQAQ&url=https%3A%2F%2Fwww.qorvo.com%2Fproducts%2Fd%2Fda007972&usg=AOvVaw2va8gKJNC_mfXq5EQZAO0S) about performing this work directly through a command line, but it is less documented. -![DRTLS App Screenshot](/assets/images/drtls_app.png) +![DRTLS App Screenshot](/assets/images/sensing/drtls_app.png) In order to use the app, follow the instructions linked [here](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwi-id_G9-P7AhVIGVkFHVIPBZ0QFnoECA0QAQ&url=https%3A%2F%2Fwww.qorvo.com%2Fproducts%2Fd%2Fda007996&usg=AOvVaw09yRMbgwEx7hxTDpJP4G8D). @@ -49,7 +49,7 @@ It is possible to change the update rate of all `beacons`. For most real time po During configuration, make note of the `beacon` IDS (eg. from `Tag DW11A1` the tag ID is `11A1`). This should be the ID used in the driver config to identify multiple tags independently. -![DRTLS App - Beacon IDS](/assets/images/drtls_ids.png) +![DRTLS App - Beacon IDS](/assets/images/sensing/drtls_ids.png) At this point, the DRTLS app can be used directly to test the 3D positioning. Ensure all modules are powered, and if ther are, enter the "map" page of the app to view all of the `beacons` live, including the dynamic positioning of the `tag`. @@ -57,7 +57,7 @@ At this point, the DRTLS app can be used directly to test the 3D positioning. En In most cases, the `anchors` are located around a room, such that they are relatively planar with respect to each other. For 2D localization, this is perfectly acceptable, but it becomes an issue when attempting 3D localization. This is due to the concept of *[dilution of precision](https://en.wikipedia.org/wiki/Dilution_of_precision_(navigation))*, which originated from GPS. For GPS, it means that as GPS satellites attempting to provide a location to a ground side receiver get relatively close to each other, the output precision of the ground side position estimation becomes poorer, as seen below: -![GDOP Example](/assets/images/gdop_example.png) +![GDOP Example](/assets/images/sensing/gdop_example.png) For UWB, this means that if the `anchors` are all close to the same Z plane, their Z localization precision will suffer. Ideally, all anchors should be placed at widely different heights to improve this. However, the beacons need to also be placed away from corners (such as the intersection of the floor/ceiling to the wall), leading to a difficulty. diff --git a/wiki/simulation/NDT-Matching-with-Autoware.md b/wiki/simulation/NDT-Matching-with-Autoware.md index 20ef1c08..0c0507b7 100644 --- a/wiki/simulation/NDT-Matching-with-Autoware.md +++ b/wiki/simulation/NDT-Matching-with-Autoware.md @@ -8,7 +8,7 @@ published: true 3D maps enable self driving cars to localize themselves in the environment. To localize using a map and Lidar data one needs to find a way to associate the point cloud from the sensor with the point cloud from the map. This is also known as scan matching in robotics. One of the common ways to do this is Iterative Closest Point, it uses 6 degrees of freedom to find the closest point to the geometric entity from a given 3D point cloud. There exist a lot of geometric variants of ICP such as point-to-plane etc. One of the downfalls of ICP is that it needs a good approximation and a good starting point as it works on non-linear optimization and has tendencies to get stuck in local minima. In real world scenarios our points will probably be a little off from the map. Measurement errors will cause points to be slightly mis-aligned, plus the world might change a little between when we record the map and when we make our new scan. NDT matching provides a solution for these minor errors. Instead of trying to match points from our current scan to point on the map, we try to match points from our current scan to a grid of probability functions created from the map. -![Probability Density Function](/assets/images/pdf.png) +![Probability Density Function](/assets/images/simulation/pdf.png) Following are the two tasks performed diff --git a/wiki/simulation/Spawning-and-Controlling-Vehicles-in-CARLA.md b/wiki/simulation/Spawning-and-Controlling-Vehicles-in-CARLA.md index 8e2b6c68..16d548ec 100644 --- a/wiki/simulation/Spawning-and-Controlling-Vehicles-in-CARLA.md +++ b/wiki/simulation/Spawning-and-Controlling-Vehicles-in-CARLA.md @@ -19,7 +19,7 @@ First, start the CARLA server: ``` This should open up the CARLA server and you will be greeted with a camera feed: -![Hello CARLA](/assets/images/carla_opning.png) +![Hello CARLA](/assets/images/simulation/carla_opning.png) ## Spawning a vehicle in CARLA Now that we have the CARLA server running, we need to connect a client to it. @@ -49,7 +49,7 @@ draw_waypoints(waypoints, road_id=10, life_time=20) ``` All roads in CARLA have an associated road_id. The code above will query the CARLA server for all the waypoints in the map, and the light up the waypoints that are present on road with road_id 10. You should see something like this: -![CARLA Navigation](/assets/images/carla2.png) +![CARLA Navigation](/assets/images/simulation/carla2.png) This visualization helps us in finding out a good spawn location for a vehicle. Let's spawn a car somewhere on road 10 now. @@ -77,7 +77,7 @@ vehicle = client.get_world().spawn_actor(vehicle_blueprint, spawn_point) The reason for increasing the 'z' coordinate of the spawn point it to avoid any collisions with the road. CARLA does not internally handle these collisions during spawn and not having a 'z' offset can lead to issues. We should now have a car on road 10. -![Spawn Completed](/assets/images/carla3.png) +![Spawn Completed](/assets/images/simulation/carla3.png) ## Controlling the spawned car We will be using CARLA's built-in PID controllers for controlling our spawned model 3. @@ -98,7 +98,7 @@ client.get_world().debug.draw_string(target_waypoint.transform.location, 'O', dr ``` The tracked waypoint should now be red in color. -![Visualizing the tracked waypoint](/assets/images/carla4.png) +![Visualizing the tracked waypoint](/assets/images/simulation/carla4.png) Now, track! @@ -109,7 +109,7 @@ for i in range(ticks_to_track): vehicle.apply_control(control_signal) ``` You should see something like the GIF below: -![Tracking](/assets/images/carlaTrack.gif) +![Tracking](/assets/images/simulation/carlaTrack.gif) diff --git a/wiki/simulation/__all_subsections.md b/wiki/simulation/__all_subsections.md index 339ae1ac..5f4e3865 100644 --- a/wiki/simulation/__all_subsections.md +++ b/wiki/simulation/__all_subsections.md @@ -101,7 +101,7 @@ published: true 3D maps enable self driving cars to localize themselves in the environment. To localize using a map and Lidar data one needs to find a way to associate the point cloud from the sensor with the point cloud from the map. This is also known as scan matching in robotics. One of the common ways to do this is Iterative Closest Point, it uses 6 degrees of freedom to find the closest point to the geometric entity from a given 3D point cloud. There exist a lot of geometric variants of ICP such as point-to-plane etc. One of the downfalls of ICP is that it needs a good approximation and a good starting point as it works on non-linear optimization and has tendencies to get stuck in local minima. In real world scenarios our points will probably be a little off from the map. Measurement errors will cause points to be slightly mis-aligned, plus the world might change a little between when we record the map and when we make our new scan. NDT matching provides a solution for these minor errors. Instead of trying to match points from our current scan to point on the map, we try to match points from our current scan to a grid of probability functions created from the map. -![Probability Density Function](/assets/images/pdf.png) +![Probability Density Function](/assets/images/simulation/pdf.png) Following are the two tasks performed @@ -161,14 +161,14 @@ published: true Autoware is based on ROS and uses Gazebo for simulation. The goal of this section is to the the Gazebo simulator with Autoware packages. Autoware can use all the functionalities of ROS, it can be seen as another software layer over ROS. To simulate an ackermann vehicle we need to define an URDF or Xacro model. In this file we can change vehicle models, add actuators and sensors. Autoware offers a default xacro file which can be customized for use, this is all available forin the `vehicle_sim package`. To customize this model we need not change the xacro file. The vehicle dynamics can be changed in the config file `vehicle_model/config/caibration.yaml`. To customize the visual appearance of the vehicle we can use a custom mesh file. Collate (`.dae`) formats can be added to mesh folder and referenced in the vehicle.xacro file. We have later discussed how sensors can be added and customized. -![](/assets/images/autoware_models.png)*Figure 1. Different vehicle models* +![](/assets/images/simulation/autoware_models.png)*Figure 1. Different vehicle models* The vehicle sim package can be downloaded from [vehicle_sim](https://github.com/yukkysaito/vehicle_sim). ### Available Worlds Gazebo uses an ‘empty world’ which lacks any structures, to simulate the environment we need a world file. Autoware provides three templates of world files which can be downloaded from [car_sim](http://gazebosim.org/blog/car_sim ) -![](/assets/images/autoware_worlds.png)*Figure 2. Gazebo worlds developed by autoware* +![](/assets/images/simulation/autoware_worlds.png)*Figure 2. Gazebo worlds developed by autoware* All three worlds also have the Point Cloud Maps (PCD files) available for download which are needed for NDT based localization. One can always use other gazebo worlds but the PCD maps have to be manually generated and downsampled, the process can be found on [Autoware Documentation](https://readthedocs.org/projects/autoware/downloads/pdf/feature-documentation_rtd/) @@ -188,7 +188,7 @@ Autoware provides a number of different types of path planning algorithms. These A sample image with waypoints is shown below. - ![](/assets/images/autoware_plan.png)*Figure 3. Sample waypoints* + ![](/assets/images/simulation/autoware_plan.png)*Figure 3. Sample waypoints* This shows how the waypoints provide a velocity and orientation at every location, and how pure pursuit plans a path that interpolates them, as well as a lookahead target for the vehicle while driving. @@ -198,7 +198,7 @@ This shows how the waypoints provide a velocity and orientation at every locatio - The image below shows a set of lanes and wayareas drawn using Tier IV’s Vector Map Builder online tool. These need to be drawn very precisely and carefully to ensure that they work properly with Autoware. However, once this is done, it can do path planning for arbitrary start and goal locations on the map without requiring a prespecified set of waypoints. -![](/assets/images/autoware_map.png)*Figure 4. Vector Map* +![](/assets/images/simulation/autoware_map.png)*Figure 4. Vector Map* ## Simulating sensors and placing them in different locations on the vehicle @@ -221,18 +221,18 @@ Additional sensors positions can also be defined in this yaml file and later ref ### Visualizing Sensor Data The Autoware GUI can be used to launch Rviz, this can be seen in the figure below - ![](/assets/images/autoware_gui.png) *Figure 5. Autoware GUI* + ![](/assets/images/simulation/autoware_gui.png) *Figure 5. Autoware GUI* Once Rviz is launched you can add sensors to visualize -![](/assets/images/autoware_rviz.png)*Figure 6. Rviz GUI* +![](/assets/images/simulation/autoware_rviz.png)*Figure 6. Rviz GUI* To view all the sensor data in common frames we need to either visualize the base_link frame given that all sensor configurations have been correctly added. To visualize them relative to the world we need to enable localization and publish the `transform map -> odom -> base_link`. This can also be done using `p3d_base_controller` plugin in Gazebo and manually publishing a TF based on the topic assigned to the plugin. ## Integrating and interfacing existing ROS packages with Autoware Autoware contains different submodules entailing a [wide range of capabilities](https://github.com/Autoware-AI/autoware.ai/wiki/Overview) as shown below: -![](/assets/images/autoware_pkgs.png)*Figure 7. Packages offered in Autoware* +![](/assets/images/simulation/autoware_pkgs.png)*Figure 7. Packages offered in Autoware* Many at times we just need to use a simple functionality of Autoware integrated with the rest of the system built independently. To integrate a ROS package with an existing autoware package/tool, we would need to download, install the corresponding package and simply import it by incorporating it along with the CMakeLists.txt and Package.xml file of our ROS package. An example of this use case is shown below: Various autoware messages are available here. It can be installed with the command @@ -282,7 +282,7 @@ First, start the CARLA server: ``` This should open up the CARLA server and you will be greeted with a camera feed: -![Hello CARLA](/assets/images/carla_opning.png) +![Hello CARLA](/assets/images/simulation/carla_opning.png) ## Spawning a vehicle in CARLA Now that we have the CARLA server running, we need to connect a client to it. @@ -312,7 +312,7 @@ draw_waypoints(waypoints, road_id=10, life_time=20) ``` All roads in CARLA have an associated road_id. The code above will query the CARLA server for all the waypoints in the map, and the light up the waypoints that are present on road with road_id 10. You should see something like this: -![CARLA Navigation](/assets/images/carla2.png) +![CARLA Navigation](/assets/images/simulation/carla2.png) This visualization helps us in finding out a good spawn location for a vehicle. Let's spawn a car somewhere on road 10 now. @@ -340,7 +340,7 @@ vehicle = client.get_world().spawn_actor(vehicle_blueprint, spawn_point) The reason for increasing the 'z' coordinate of the spawn point it to avoid any collisions with the road. CARLA does not internally handle these collisions during spawn and not having a 'z' offset can lead to issues. We should now have a car on road 10. -![Spawn Completed](/assets/images/carla3.png) +![Spawn Completed](/assets/images/simulation/carla3.png) ## Controlling the spawned car We will be using CARLA's built-in PID controllers for controlling our spawned model 3. @@ -361,7 +361,7 @@ client.get_world().debug.draw_string(target_waypoint.transform.location, 'O', dr ``` The tracked waypoint should now be red in color. -![Visualizing the tracked waypoint](/assets/images/carla4.png) +![Visualizing the tracked waypoint](/assets/images/simulation/carla4.png) Now, track! @@ -372,7 +372,7 @@ for i in range(ticks_to_track): vehicle.apply_control(control_signal) ``` You should see something like the GIF below: -![Tracking](/assets/images/carlaTrack.gif) +![Tracking](/assets/images/simulation/carlaTrack.gif) diff --git a/wiki/simulation/simulating-vehicle-using-autoware.md b/wiki/simulation/simulating-vehicle-using-autoware.md index 1374bbd4..ee4872ba 100644 --- a/wiki/simulation/simulating-vehicle-using-autoware.md +++ b/wiki/simulation/simulating-vehicle-using-autoware.md @@ -12,14 +12,14 @@ published: true Autoware is based on ROS and uses Gazebo for simulation. The goal of this section is to the the Gazebo simulator with Autoware packages. Autoware can use all the functionalities of ROS, it can be seen as another software layer over ROS. To simulate an ackermann vehicle we need to define an URDF or Xacro model. In this file we can change vehicle models, add actuators and sensors. Autoware offers a default xacro file which can be customized for use, this is all available forin the `vehicle_sim package`. To customize this model we need not change the xacro file. The vehicle dynamics can be changed in the config file `vehicle_model/config/caibration.yaml`. To customize the visual appearance of the vehicle we can use a custom mesh file. Collate (`.dae`) formats can be added to mesh folder and referenced in the vehicle.xacro file. We have later discussed how sensors can be added and customized. -![](/assets/images/autoware_models.png)*Figure 1. Different vehicle models* +![](/assets/images/simulation/autoware_models.png)*Figure 1. Different vehicle models* The vehicle sim package can be downloaded from [vehicle_sim](https://github.com/yukkysaito/vehicle_sim). ### Available Worlds Gazebo uses an ‘empty world’ which lacks any structures, to simulate the environment we need a world file. Autoware provides three templates of world files which can be downloaded from [car_sim](http://gazebosim.org/blog/car_sim ) -![](/assets/images/autoware_worlds.png)*Figure 2. Gazebo worlds developed by autoware* +![](/assets/images/simulation/autoware_worlds.png)*Figure 2. Gazebo worlds developed by autoware* All three worlds also have the Point Cloud Maps (PCD files) available for download which are needed for NDT based localization. One can always use other gazebo worlds but the PCD maps have to be manually generated and downsampled, the process can be found on [Autoware Documentation](https://readthedocs.org/projects/autoware/downloads/pdf/feature-documentation_rtd/) @@ -39,7 +39,7 @@ Autoware provides a number of different types of path planning algorithms. These A sample image with waypoints is shown below. - ![](/assets/images/autoware_plan.png)*Figure 3. Sample waypoints* + ![](/assets/images/simulation/autoware_plan.png)*Figure 3. Sample waypoints* This shows how the waypoints provide a velocity and orientation at every location, and how pure pursuit plans a path that interpolates them, as well as a lookahead target for the vehicle while driving. @@ -49,7 +49,7 @@ This shows how the waypoints provide a velocity and orientation at every locatio - The image below shows a set of lanes and wayareas drawn using Tier IV’s Vector Map Builder online tool. These need to be drawn very precisely and carefully to ensure that they work properly with Autoware. However, once this is done, it can do path planning for arbitrary start and goal locations on the map without requiring a prespecified set of waypoints. -![](/assets/images/autoware_map.png)*Figure 4. Vector Map* +![](/assets/images/simulation/autoware_map.png)*Figure 4. Vector Map* ## Simulating sensors and placing them in different locations on the vehicle @@ -72,18 +72,18 @@ Additional sensors positions can also be defined in this yaml file and later ref ### Visualizing Sensor Data The Autoware GUI can be used to launch Rviz, this can be seen in the figure below - ![](/assets/images/autoware_gui.png) *Figure 5. Autoware GUI* + ![](/assets/images/simulation/autoware_gui.png) *Figure 5. Autoware GUI* Once Rviz is launched you can add sensors to visualize -![](/assets/images/autoware_rviz.png)*Figure 6. Rviz GUI* +![](/assets/images/simulation/autoware_rviz.png)*Figure 6. Rviz GUI* To view all the sensor data in common frames we need to either visualize the base_link frame given that all sensor configurations have been correctly added. To visualize them relative to the world we need to enable localization and publish the `transform map -> odom -> base_link`. This can also be done using `p3d_base_controller` plugin in Gazebo and manually publishing a TF based on the topic assigned to the plugin. ## Integrating and interfacing existing ROS packages with Autoware Autoware contains different submodules entailing a [wide range of capabilities](https://github.com/Autoware-AI/autoware.ai/wiki/Overview) as shown below: -![](/assets/images/autoware_pkgs.png)*Figure 7. Packages offered in Autoware* +![](/assets/images/simulation/autoware_pkgs.png)*Figure 7. Packages offered in Autoware* Many at times we just need to use a simple functionality of Autoware integrated with the rest of the system built independently. To integrate a ROS package with an existing autoware package/tool, we would need to download, install the corresponding package and simply import it by incorporating it along with the CMakeLists.txt and Package.xml file of our ROS package. An example of this use case is shown below: Various autoware messages are available here. It can be installed with the command diff --git a/wiki/simulation/simulation-isaacsim-setup.md b/wiki/simulation/simulation-isaacsim-setup.md index 38004233..44374dcb 100644 --- a/wiki/simulation/simulation-isaacsim-setup.md +++ b/wiki/simulation/simulation-isaacsim-setup.md @@ -89,7 +89,7 @@ Isaac Sim provides several sample scenes such as **industrial warehouses, office ````bash Create → Environment → Simple Room ```` -![simple room](/assets/images/isaac_simpleroom.png) +![simple room](/assets/images/simulation/isaac_simpleroom.png) You can browse other scene samples in Isaac Sim Asset Browser. It is accessible from the **Window > Browser tab.** @@ -103,7 +103,7 @@ You can browse these robots in Isaac Sim Asset Browser under Robots folder. It is accessible from the **Window > Browser tab.** For example, a popular wheeled robot for navigation is Nova Carter. We can import from the Robots/Carter/nova_carter.usd -![nova carter](/assets/images/carter.png) +![nova carter](/assets/images/simulation/carter.png) Here are some properties that can be tuned to correct the robot's behavior: @@ -127,7 +127,7 @@ NVIDIA Isaac Sim also supports many realistic sensors modules, such as **stereo For example, creating a Camera Sensor: To create the camera from the menu: **Create>Sensors>Camera and Depth Sensors>Intel>Intel Realsense D455**. The Intel Realsense Depth Camera D455 consists of multiple RGB and depth image sensors and a 6-axis IMU. -![realsense](/assets/images/realsense.png) +![realsense](/assets/images/simulation/realsense.png) [Camera, RTX, Physics Based Sensors](https://docs.isaacsim.omniverse.nvidia.com/4.5.0/sensors/index.html#sensors) @@ -153,7 +153,7 @@ Simulation time is important because ROS 2 nodes often require synchronized time ### Nav2 Setup This diagram shows the ROS2 messages required for Nav2: -![nav2](/assets/images/nav2.png) +![nav2](/assets/images/simulation/nav2.png) 1. Install Nav2, refer to the [Nav2 installation page](https://docs.nav2.org/getting_started/index.html#installation). diff --git a/wiki/state-estimation/Cartographer-ROS-Integration.md b/wiki/state-estimation/Cartographer-ROS-Integration.md index fa9f44cb..226b4060 100644 --- a/wiki/state-estimation/Cartographer-ROS-Integration.md +++ b/wiki/state-estimation/Cartographer-ROS-Integration.md @@ -20,7 +20,7 @@ The detailed explanation of the Cartographer's algorithm and tuning can be found One of Cartographer's strength is that its 2D SLAM is aware of the 3D world (it will project a titled LiDAR scan to the horizontal axis). This is in contrast to gmapping which requires the LaserScan to always be perfectly level and horizontal. As seen below, the tracking frame (base_link) is not level, causing the LiDAR LaserScan to be tilted, but Cartographer takes the tilt into account. -![](/assets/images/carto-1.png) +![](/assets/images/state-estimation/carto-1.png) # Installation @@ -66,7 +66,7 @@ You need to provide a static TF transform from `base_link` to your imu frame and Example shown below -![](/assets/images/carto-2.png) +![](/assets/images/state-estimation/carto-2.png) An important point is that `base_link` needs to be **coincident** with `imu_link` (both must have the exact same position and orientation). If you need `base_link` for navigational purposes, I recommend creating one more child frame from`base_link`, e.g. `nav_link` that is at the appropriate location on the robot for navigation, e.g. centre of the wheels and at the axis of rotation. @@ -80,7 +80,7 @@ Requirements: - The IMU should be fast, at around 100 Hz - The IMU should have the correct timestamps, errors in this will cause errors in the SLAM -![](/assets/images/carto-3.jpeg) +![](/assets/images/state-estimation/carto-3.jpeg) ## 3. Prepare LiDAR LaserScan data @@ -121,7 +121,7 @@ You can refer to a sample config file [here](https://github.com/howde-robotics/d Cartographer will output TF for robot pose in the map frame and an [OccupancyGrid](http://docs.ros.org/en/noetic/api/nav_msgs/html/msg/OccupancyGrid.html). However, if you want to use the provided OccupancyGrid with other navigation modules, such as move_base, the standard Cartographer OccupancyGrid will not work. This is because most navigation apps require the costmap to only have either of 3 values, FREE (0), OBSTACLES (100), or UNKNOWN (-1). Cartographer instead has a range of values depending on the confidence that the algorithms have about the state of the cells. For example, at first detection, a cell can have a value of around ~40, but as more data is collected that cell's value can go to 0 (if it is FREE) or 100 (if it is OBSTACLES). If you try to use this map as a global costmap for move_base, you will get a costmap that looks like the image below. -![](/assets/images/carto-4.png) +![](/assets/images/state-estimation/carto-4.png) The workaround is to change the way Cartographer looks at obstacles. Refer to the commit [here](https://github.com/howde-robotics/cartographer/commit/93eee6e207bcbeccdbd696f2ea2f5a00234665f1) for the changes necessary. You need to change a line in `cartographer/io/submap_painter.cc` in line `209` from: @@ -142,11 +142,11 @@ This will immediately make an obstacle in Cartographer's OccupancyGrid to be at However, if you now try to use it as a costmap, you will get something like the image below: -![](/assets/images/carto-5.png) +![](/assets/images/state-estimation/carto-5.png) As you can see, it now has obstacles and walls, but they are very sparse with gaps in between. The solution is to add `inflation_layer` using the costmap package. See more [here](http://wiki.ros.org/costmap_2d/hydro/inflation). Now once you inflate the walls and obstacles you will get a costmap that looks like this: -![](/assets/images/carto-6.png) +![](/assets/images/state-estimation/carto-6.png) Now that is a usable costmap for navigation. diff --git a/wiki/state-estimation/__all_subsections.md b/wiki/state-estimation/__all_subsections.md index 26f000f8..d3419343 100644 --- a/wiki/state-estimation/__all_subsections.md +++ b/wiki/state-estimation/__all_subsections.md @@ -6,7 +6,7 @@ title: Adaptive Monte Carlo Localization ## What is a particle filter? Particle filter are initialized by a very high number of particles spanning the entire state space. As you get additional measurements, you predict and update your measurements which makes your robot have a multi-modal posterior distribution. This is a big difference from a Kalman Filter which approximates your posterior distribution to be a Gaussian. Over multiple iterations, the particles converge to a unique value in state space. -![Particle Filter in Action over Progressive Time Steps](/assets/images/AdaptiveMonteCarloLocalization-65e37.png) +![Particle Filter in Action over Progressive Time Steps](/assets/images/state-estimation/AdaptiveMonteCarloLocalization-65e37.png) **Figure 1:** Particle Filter in Action over Progressive Time Steps @@ -31,7 +31,7 @@ The key idea is to bound the error introduced by the sample-based representation ## Use of Adaptive Particle Filter for Localization To use adaptive particle filter for localization, we start with a map of our environment and we can either set robot to some position, in which case we are manually localizing it or we could very well make the robot start from no initial estimate of its position. Now as the robot moves forward, we generate new samples that predict the robot's position after the motion command. Sensor readings are incorporated by re-weighting these samples and normalizing the weights. Generally it is good to add few random uniformly distributed samples as it helps the robot recover itself in cases where it has lost track of its position. In those cases, without these random samples, the robot will keep on re-sampling from an incorrect distribution and will never recover. The reason why it takes the filter multiple sensor readings to converge is that within a map, we might have dis-ambiguities due to symmetry in the map, which is what gives us a multi-modal posterior belief. -![Localization Process using Particle Filters](/assets/images/AdaptiveMonteCarloLocalization-0d322.png) +![Localization Process using Particle Filters](/assets/images/state-estimation/AdaptiveMonteCarloLocalization-0d322.png) [Dieter Fox's paper on Monte Carlo Localization for Mobile Robots](https://www.ri.cmu.edu/pub_files/pub1/fox_dieter_1999_1/fox_dieter_1999_1.pdf) gives further details on this topic and also compares this technique to many others such as Kalman Filter based Localization, Grid Based and Topological Markov Localization. @@ -116,7 +116,7 @@ The detailed explanation of the Cartographer's algorithm and tuning can be found One of Cartographer's strength is that its 2D SLAM is aware of the 3D world (it will project a titled LiDAR scan to the horizontal axis). This is in contrast to gmapping which requires the LaserScan to always be perfectly level and horizontal. As seen below, the tracking frame (base_link) is not level, causing the LiDAR LaserScan to be tilted, but Cartographer takes the tilt into account. -![](/assets/images/carto-1.png) +![](/assets/images/state-estimation/carto-1.png) # Installation @@ -162,7 +162,7 @@ You need to provide a static TF transform from `base_link` to your imu frame and Example shown below -![](/assets/images/carto-2.png) +![](/assets/images/state-estimation/carto-2.png) An important point is that `base_link` needs to be **coincident** with `imu_link` (both must have the exact same position and orientation). If you need `base_link` for navigational purposes, I recommend creating one more child frame from`base_link`, e.g. `nav_link` that is at the appropriate location on the robot for navigation, e.g. centre of the wheels and at the axis of rotation. @@ -176,7 +176,7 @@ Requirements: - The IMU should be fast, at around 100 Hz - The IMU should have the correct timestamps, errors in this will cause errors in the SLAM -![](/assets/images/carto-3.jpeg) +![](/assets/images/state-estimation/carto-3.jpeg) ## 3. Prepare LiDAR LaserScan data @@ -217,7 +217,7 @@ You can refer to a sample config file [here](https://github.com/howde-robotics/d Cartographer will output TF for robot pose in the map frame and an [OccupancyGrid](http://docs.ros.org/en/noetic/api/nav_msgs/html/msg/OccupancyGrid.html). However, if you want to use the provided OccupancyGrid with other navigation modules, such as move_base, the standard Cartographer OccupancyGrid will not work. This is because most navigation apps require the costmap to only have either of 3 values, FREE (0), OBSTACLES (100), or UNKNOWN (-1). Cartographer instead has a range of values depending on the confidence that the algorithms have about the state of the cells. For example, at first detection, a cell can have a value of around ~40, but as more data is collected that cell's value can go to 0 (if it is FREE) or 100 (if it is OBSTACLES). If you try to use this map as a global costmap for move_base, you will get a costmap that looks like the image below. -![](/assets/images/carto-4.png) +![](/assets/images/state-estimation/carto-4.png) The workaround is to change the way Cartographer looks at obstacles. Refer to the commit [here](https://github.com/howde-robotics/cartographer/commit/93eee6e207bcbeccdbd696f2ea2f5a00234665f1) for the changes necessary. You need to change a line in `cartographer/io/submap_painter.cc` in line `209` from: @@ -238,11 +238,11 @@ This will immediately make an obstacle in Cartographer's OccupancyGrid to be at However, if you now try to use it as a costmap, you will get something like the image below: -![](/assets/images/carto-5.png) +![](/assets/images/state-estimation/carto-5.png) As you can see, it now has obstacles and walls, but they are very sparse with gaps in between. The solution is to add `inflation_layer` using the costmap package. See more [here](http://wiki.ros.org/costmap_2d/hydro/inflation). Now once you inflate the walls and obstacles you will get a costmap that looks like this: -![](/assets/images/carto-6.png) +![](/assets/images/state-estimation/carto-6.png) Now that is a usable costmap for navigation. @@ -282,7 +282,7 @@ Ultrawideband positioning takes advantage of the communication pulses to sense d By using multiple stationary devices, a single or multiple mobile beacons can be tracked by combining ranges through trilateration. -![Example usage of a DWM1001 setup](/assets/images/decawave_example_multi_anchor.png) +![Example usage of a DWM1001 setup](/assets/images/state-estimation/decawave_example_multi_anchor.png) [Source](https://www.researchgate.net/profile/Teijo-Lehtonen/publication/281346001/figure/fig4/AS:284460038803456@1444831966619/DecaWave-UWB-localization-system-SDK-5.png) At the time of writing, one of the most common modules for UWB is the DWM1001. Since these modules are mass manufactured, they can be purchased very inexpensively and should be considered one of the most affordable options for positioning systems. @@ -292,7 +292,7 @@ At the time of writing, one of the most common modules for UWB is the DWM1001. S Ultrasonic positioning works in a similar way to UWB, but rather than transitting frequencies at a very high frequency, the products instead rely on a combination of lower frquency communication pulses and beamforming. By using a sensor array on each device, they are able to claim a 2D positioning accuracy of +-2cm. -![Example usage of a DWM1001 setup](/assets/images/marvelmind_example.jpg) +![Example usage of a DWM1001 setup](/assets/images/state-estimation/marvelmind_example.jpg) [Source](https://marvelmind.com/) As an important note, ultrasonic pulses are harmful to human hearing over an extended period of time and should not deployed around humans without ear protection. @@ -301,7 +301,7 @@ As an important note, ultrasonic pulses are harmful to human hearing over an ext Total stations have an extended heritage in civil engineering, where they have been used to precisely survey worksites since the 1970s. The total station sends beams of light directly to a glass reflective prism, and uses the time-of-flight properties of the beam to measure distances. The robotic total station tracks it's calibration orientaiton to high precision, such that the measured distance can be converted into a high-precision 3D position mesaurement. Total stations, depending on the prism type and other factors, can accurate track with in millimeter range at up to 3.5km [Leica-Geosystems](file:///home/john/Downloads/Leica_Viva_TS16_DS-2.pdf). -![Example usage of a Total Station in the Field](/assets/images/leica_field_image.jpg) +![Example usage of a Total Station in the Field](/assets/images/state-estimation/leica_field_image.jpg) [Source](https://leica-geosystems.com/) ## Key Factors to Consider @@ -671,7 +671,7 @@ track_bbs_ids = mot_tracker.update(detections) ... ``` -![SORT Tracker](/assets/images/sort-tracker.jpg) +![SORT Tracker](/assets/images/state-estimation/sort-tracker.jpg) ### Inverse Perspective Mapping Inverse Perspective Mapping is basically a perspective transformation or a homography between two planes in the world. The idea here is to project the camera view (image plane) on to the ground plane in the world to obtain a birds-eye-view of the scene. One way to do this is to directly pick a set of points (minimum 4) in the image corresponding to a rectangular region on the ground plane and then estimate the homography matrix. @@ -680,13 +680,13 @@ In order to estimate the homography, you need a set of correspondences. You need Once the homography is known, pick the bottom center of all the bounding boxes, as this point most closely represents the point on the ground plane, and apply the homography to this image point to obtain an estimate of location in the world frame. -![IPM Calibration](/assets/images/ipm_two.png) +![IPM Calibration](/assets/images/state-estimation/ipm_two.png) There are many pitfalls and assumptions in this technique. As mentioned earlier, the objects to detect must lie on the same ground plane and the relative distance of the camera sensor and orientation with respect to the ground plane must remain constant. If the bounding box detection is inaccurate, a small deviation in the image point might lead to a significant error in the estimated position in the world frame. You can also model the uncertainty in the position estimate to generate an occupancy grid with the mean and covariance of the position of the object. We will later see how to fuse these estimates with another sensor modality such as a Radar to refine our estimate and track these detections as well. -![Occupancy Grid Gaussian](/assets/images/occupancy-grid.png) +![Occupancy Grid Gaussian](/assets/images/state-estimation/occupancy-grid.png) #### Camera Output Camera returns two states for every detections. According to our current camera configuration, state (Ego vehicle frame) of the detections are given as: @@ -706,7 +706,7 @@ Radar provides four states for every detections, moreover depending on the use c Following is the result of camera detection and estimated position in the 3D world. The detection was performed on image stream from Carla simulator and the results are visualized in Rviz. The blue cubes represent estimates from camera and red cubes are the Radar detections. -![Occupancy Grid](/assets/images/camera-radar-targets.png) +![Occupancy Grid](/assets/images/state-estimation/camera-radar-targets.png) ## Tracker Framework The framework has the following major components: @@ -767,7 +767,7 @@ Once you have the motion compensated tracks, you need to follow the same algorit #### Final Results of Tracking and Sensor Fusion -![Tracker Results](/assets/images/Tracker-01.PNG) ![Tracker Results](/assets/images/Tracker-02.PNG) +![Tracker Results](/assets/images/state-estimation/Tracker-01.PNG) ![Tracker Results](/assets/images/state-estimation/Tracker-02.PNG) ### Tracker Evaluation and Metrics @@ -1205,7 +1205,7 @@ For our application for using the quadcopter to servo over a block, the interact ## Visual Servoing Application We used the formulation described above in order to build an application where the drone uses 4 corners of a block as feature points in the image in order to align over the block. The desired coordinates of the feature points were used as input and the servoing system computed the required velocities in order to move towards the desired configuration. We made sure to clip the output velocities to a value of 0.4m/s for safety and we were able to successfully servo over the block. We also needed to make sure that we are servoing at an appropriate height in order to ensure the block stays in the field of view. -| ![Visual Servoing in action](/assets/images/servoing-action.png) | +| ![Visual Servoing in action](/assets/images/state-estimation/servoing-action.png) | |:--:| | *Visual Servoing in action from the onboard camera* | diff --git a/wiki/state-estimation/adaptive-monte-carlo-localization.md b/wiki/state-estimation/adaptive-monte-carlo-localization.md index dc4c0e5f..8542e99d 100644 --- a/wiki/state-estimation/adaptive-monte-carlo-localization.md +++ b/wiki/state-estimation/adaptive-monte-carlo-localization.md @@ -5,7 +5,7 @@ title: Adaptive Monte Carlo Localization ## What is a particle filter? Particle filter are initialized by a very high number of particles spanning the entire state space. As you get additional measurements, you predict and update your measurements which makes your robot have a multi-modal posterior distribution. This is a big difference from a Kalman Filter which approximates your posterior distribution to be a Gaussian. Over multiple iterations, the particles converge to a unique value in state space. -![Particle Filter in Action over Progressive Time Steps](/assets/images/AdaptiveMonteCarloLocalization-65e37.png) +![Particle Filter in Action over Progressive Time Steps](/assets/images/state-estimation/AdaptiveMonteCarloLocalization-65e37.png) **Figure 1:** Particle Filter in Action over Progressive Time Steps @@ -30,7 +30,7 @@ The key idea is to bound the error introduced by the sample-based representation ## Use of Adaptive Particle Filter for Localization To use adaptive particle filter for localization, we start with a map of our environment and we can either set robot to some position, in which case we are manually localizing it or we could very well make the robot start from no initial estimate of its position. Now as the robot moves forward, we generate new samples that predict the robot's position after the motion command. Sensor readings are incorporated by re-weighting these samples and normalizing the weights. Generally it is good to add few random uniformly distributed samples as it helps the robot recover itself in cases where it has lost track of its position. In those cases, without these random samples, the robot will keep on re-sampling from an incorrect distribution and will never recover. The reason why it takes the filter multiple sensor readings to converge is that within a map, we might have dis-ambiguities due to symmetry in the map, which is what gives us a multi-modal posterior belief. -![Localization Process using Particle Filters](/assets/images/AdaptiveMonteCarloLocalization-0d322.png) +![Localization Process using Particle Filters](/assets/images/state-estimation/AdaptiveMonteCarloLocalization-0d322.png) [Dieter Fox's paper on Monte Carlo Localization for Mobile Robots](https://www.ri.cmu.edu/pub_files/pub1/fox_dieter_1999_1/fox_dieter_1999_1.pdf) gives further details on this topic and also compares this technique to many others such as Kalman Filter based Localization, Grid Based and Topological Markov Localization. diff --git a/wiki/state-estimation/gps-lacking-state-estimation-sensors.md b/wiki/state-estimation/gps-lacking-state-estimation-sensors.md index 79111011..7f0f4951 100644 --- a/wiki/state-estimation/gps-lacking-state-estimation-sensors.md +++ b/wiki/state-estimation/gps-lacking-state-estimation-sensors.md @@ -22,7 +22,7 @@ Ultrawideband positioning takes advantage of the communication pulses to sense d By using multiple stationary devices, a single or multiple mobile beacons can be tracked by combining ranges through trilateration. -![Example usage of a DWM1001 setup](/assets/images/decawave_example_multi_anchor.png) +![Example usage of a DWM1001 setup](/assets/images/state-estimation/decawave_example_multi_anchor.png) [Source](https://www.researchgate.net/profile/Teijo-Lehtonen/publication/281346001/figure/fig4/AS:284460038803456@1444831966619/DecaWave-UWB-localization-system-SDK-5.png) At the time of writing, one of the most common modules for UWB is the DWM1001. Since these modules are mass manufactured, they can be purchased very inexpensively and should be considered one of the most affordable options for positioning systems. @@ -32,7 +32,7 @@ At the time of writing, one of the most common modules for UWB is the DWM1001. S Ultrasonic positioning works in a similar way to UWB, but rather than transitting frequencies at a very high frequency, the products instead rely on a combination of lower frquency communication pulses and beamforming. By using a sensor array on each device, they are able to claim a 2D positioning accuracy of +-2cm. -![Example usage of a DWM1001 setup](/assets/images/marvelmind_example.jpg) +![Example usage of a DWM1001 setup](/assets/images/state-estimation/marvelmind_example.jpg) [Source](https://marvelmind.com/) As an important note, ultrasonic pulses are harmful to human hearing over an extended period of time and should not deployed around humans without ear protection. @@ -41,7 +41,7 @@ As an important note, ultrasonic pulses are harmful to human hearing over an ext Total stations have an extended heritage in civil engineering, where they have been used to precisely survey worksites since the 1970s. The total station sends beams of light directly to a glass reflective prism, and uses the time-of-flight properties of the beam to measure distances. The robotic total station tracks it's calibration orientaiton to high precision, such that the measured distance can be converted into a high-precision 3D position mesaurement. Total stations, depending on the prism type and other factors, can accurate track with in millimeter range at up to 3.5km [Leica-Geosystems](file:///home/john/Downloads/Leica_Viva_TS16_DS-2.pdf). -![Example usage of a Total Station in the Field](/assets/images/leica_field_image.jpg) +![Example usage of a Total Station in the Field](/assets/images/state-estimation/leica_field_image.jpg) [Source](https://leica-geosystems.com/) ## Key Factors to Consider diff --git a/wiki/state-estimation/radar-camera-sensor-fusion.md b/wiki/state-estimation/radar-camera-sensor-fusion.md index 9ebc6816..c0a9f678 100644 --- a/wiki/state-estimation/radar-camera-sensor-fusion.md +++ b/wiki/state-estimation/radar-camera-sensor-fusion.md @@ -54,7 +54,7 @@ track_bbs_ids = mot_tracker.update(detections) ... ``` -![SORT Tracker](/assets/images/sort-tracker.jpg) +![SORT Tracker](/assets/images/state-estimation/sort-tracker.jpg) ### Inverse Perspective Mapping Inverse Perspective Mapping is basically a perspective transformation or a homography between two planes in the world. The idea here is to project the camera view (image plane) on to the ground plane in the world to obtain a birds-eye-view of the scene. One way to do this is to directly pick a set of points (minimum 4) in the image corresponding to a rectangular region on the ground plane and then estimate the homography matrix. @@ -63,13 +63,13 @@ In order to estimate the homography, you need a set of correspondences. You need Once the homography is known, pick the bottom center of all the bounding boxes, as this point most closely represents the point on the ground plane, and apply the homography to this image point to obtain an estimate of location in the world frame. -![IPM Calibration](/assets/images/ipm_two.png) +![IPM Calibration](/assets/images/state-estimation/ipm_two.png) There are many pitfalls and assumptions in this technique. As mentioned earlier, the objects to detect must lie on the same ground plane and the relative distance of the camera sensor and orientation with respect to the ground plane must remain constant. If the bounding box detection is inaccurate, a small deviation in the image point might lead to a significant error in the estimated position in the world frame. You can also model the uncertainty in the position estimate to generate an occupancy grid with the mean and covariance of the position of the object. We will later see how to fuse these estimates with another sensor modality such as a Radar to refine our estimate and track these detections as well. -![Occupancy Grid Gaussian](/assets/images/occupancy-grid.png) +![Occupancy Grid Gaussian](/assets/images/state-estimation/occupancy-grid.png) #### Camera Output Camera returns two states for every detections. According to our current camera configuration, state (Ego vehicle frame) of the detections are given as: @@ -89,7 +89,7 @@ Radar provides four states for every detections, moreover depending on the use c Following is the result of camera detection and estimated position in the 3D world. The detection was performed on image stream from Carla simulator and the results are visualized in Rviz. The blue cubes represent estimates from camera and red cubes are the Radar detections. -![Occupancy Grid](/assets/images/camera-radar-targets.png) +![Occupancy Grid](/assets/images/state-estimation/camera-radar-targets.png) ## Tracker Framework The framework has the following major components: @@ -150,7 +150,7 @@ Once you have the motion compensated tracks, you need to follow the same algorit #### Final Results of Tracking and Sensor Fusion -![Tracker Results](/assets/images/Tracker-01.PNG) ![Tracker Results](/assets/images/Tracker-02.PNG) +![Tracker Results](/assets/images/state-estimation/Tracker-01.PNG) ![Tracker Results](/assets/images/state-estimation/Tracker-02.PNG) ### Tracker Evaluation and Metrics diff --git a/wiki/state-estimation/visual-servoing.md b/wiki/state-estimation/visual-servoing.md index 3883ab9b..0f3a1558 100644 --- a/wiki/state-estimation/visual-servoing.md +++ b/wiki/state-estimation/visual-servoing.md @@ -41,7 +41,7 @@ For our application for using the quadcopter to servo over a block, the interact ## Visual Servoing Application We used the formulation described above in order to build an application where the drone uses 4 corners of a block as feature points in the image in order to align over the block. The desired coordinates of the feature points were used as input and the servoing system computed the required velocities in order to move towards the desired configuration. We made sure to clip the output velocities to a value of 0.4m/s for safety and we were able to successfully servo over the block. We also needed to make sure that we are servoing at an appropriate height in order to ensure the block stays in the field of view. -| ![Visual Servoing in action](/assets/images/servoing-action.png) | +| ![Visual Servoing in action](/assets/images/state-estimation/servoing-action.png) | |:--:| | *Visual Servoing in action from the onboard camera* | diff --git a/wiki/system-design-development/__all_subsections.md b/wiki/system-design-development/__all_subsections.md index bfb5b7b0..cd1081ee 100644 --- a/wiki/system-design-development/__all_subsections.md +++ b/wiki/system-design-development/__all_subsections.md @@ -11,7 +11,7 @@ To illustrate its importance imagine the following scenario: You are at the final integration steps of your project and something isn't working. You start by checking out the hardware and see Figure 1. -![Cable Management Gone Wrong](/assets/images/CableManagement-c5b3a.png) +![Cable Management Gone Wrong](/assets/images/system-design-development/CableManagement-c5b3a.png) **Figure 1: Cable management gone wrong** @@ -26,7 +26,7 @@ If this is your first time creating a wiring diagram for your system you will pr Note: in systems engineering you will be required to create a cyberphysical architecture for your system. This diagram may be similar, but they are still fundamentally different. Notice how here we are explicitly differentiating cables, and boards. We get more information from a cable management perspective this way. For example notice how, in **Figure 2**, cable 3 only has one plug. This tells us that Sensor 1 has an unremovable cable attached to it. -![Wiring Managment](/assets/images/CableManagement-b3a03.png) +![Wiring Managment](/assets/images/system-design-development/CableManagement-b3a03.png) **Figure 2: Example wiring block diagram of 2 circuit card assembly boards and 1 sensor connected by three cables. Here the JX labels stand for the jacks on the different circuit boards and the PX stand for the plugs of the cables.** @@ -35,7 +35,7 @@ Now that you have outlined all of the different boards and connections it is tim If you are defining your own connections it is time to make some cable wiring diagrams. You can imagine these diagrams as a zoomed in detailed picture of each of the cables in your wiring block diagram. Figure 3 shows an example cable wiring diagram. It is not necessary to get as detailed as Figure 3. In fact, I've used excel to create very effective wiring diagrams before. The most important objective of these diagrams is to understand the signals and wires on each cable. One more crucial detail highlighted in these diagrams is the length of each cable. Make sure you have a rough idea of how long each cable will be, keyword: rough. You may not be able to determine the exact length of your cable, but going through this exercise will make you start thinking about cable routing. At this step it is necessary to sit down with the mechanical designer of your system and discuss how your cables are physically getting from A to B. -![Example Cable Wiring Diagram for a USB Cable](/assets/images/CableManagement-654ae.png) +![Example Cable Wiring Diagram for a USB Cable](/assets/images/system-design-development/CableManagement-654ae.png) **Figure 3: Example Cable wiring diagram for a USB cable** @@ -91,7 +91,7 @@ If you do decide to use connectors that require crimps it is important that you ### Grouping Wires Once you know what connector, wires, and crimps to use it is time to assemble the cable. For the most part this is straightforward, but there are some tricks that will make cable management later on easier. First, if you have any twisted pairs in your cable or want to group wires together without additional hardware, you can use the drill trick to make nice looking cables like **Figure 4**. A video of the Twisted Pair Drill Trick can be viewed [here](https://www.youtube.com/watch?v=uTJhrTTl-EE) -![Twisted Wires Done Using a Drill](/assets/images/CableManagement-6f4d5.png) +![Twisted Wires Done Using a Drill](/assets/images/system-design-development/CableManagement-6f4d5.png) **Figure 4: Twisted wires done using a drill** @@ -302,17 +302,17 @@ title: PCB Design Notes (electrolytic and non­electrolytic) for noise­reduction. - It is important to have proper LED indication on the PCB (as shown in **Figure 1** and **Figure 2**) for testing and accountability. Use LED indicators to ensure proper functioning of the board. -![LED indication in schematic with noise reduction cap](/assets/images/PCBDesignNotes-8fedc.png) +![LED indication in schematic with noise reduction cap](/assets/images/system-design-development/PCBDesignNotes-8fedc.png) **Figure 1: LED indication in schematic with noise reduction cap** -![Labeled Fuse and Zener­diode for Protection](/assets/images/PCBDesignNotes-09baf.png) +![Labeled Fuse and Zener­diode for Protection](/assets/images/system-design-development/PCBDesignNotes-09baf.png) **Figure 2: Labeled Fuse and Zener­diode for Protection** - You can add additional comments on schematic as shown in **Figure 3**, this helps to put information related to board which is otherwise not explicit from the schematic. -![Schematic with comments](/assets/images/PCBDesignNotes-d5ba2.png) +![Schematic with comments](/assets/images/system-design-development/PCBDesignNotes-d5ba2.png) **Figure 3: Schematic with comments** @@ -326,7 +326,7 @@ As you get your board design ready, please keep in mind that you want to have so manufacturing process, some metal is going to be deposited inside each hole. This reduces the diameter of the hole, making it smaller than it was when it was drilled. As a rule of thumb, add 8­12mils to the nominal round lead diameter, and round up if you need to match the diameter to a particular drill size list. Keep in mind that a bit bigger is better than too small; you don't want to find yourself filing a lead that is too big (you cannot make the hole bigger, because it would remove the through­hole metal). Double­check and make sure that none of the holes is smaller than 0.015” diameter, and that neither tracks nor clearances between tracks/pads/planes are smaller than 0.006”. -![Variable Track Width](/assets/images/PCBDesignNotes-05e85.png) +![Variable Track Width](/assets/images/system-design-development/PCBDesignNotes-05e85.png) **Figure 4: Variable Track Width** @@ -420,22 +420,22 @@ One of the most useful views is the operational. In practice, you will rarely go #### Level 1 In this level, one can usually put the Use Case. While technically it belongs in the Capability View or All View, since we're otherwise not using CVs (unless you start modeling at the very beginning and use the CV for requirements). In the Use Case, put the Actors (the user, obviously, and the highest level subsystems you'd normally see in a WBS), and then what information flows between them. This would be the highest level information packet containing all other information flow we see on the level 2 Activity Diagrams. -![SIDD colorless OV 1](/assets/images/SubsystemInterfaceModeling-8748c.png) +![SIDD colorless OV 1](/assets/images/system-design-development/SubsystemInterfaceModeling-8748c.png) #### Level 2 This is the meat of the Interface Design Description, where you can flow out all the things the system might do. Rather than go into a lot of operational or capability viewpoints, go straight into activity diagrams since the system is relatively small. Each box at the first indenture of level 2. >Use "indentures" of activity diagrams since the other "levels" of OV are technically something else, signified by letters like OV-2b or OV-2c) is a high level activity (see below for the highest level view of MRSD 2015 "Dock In Piece" project). -![SIDD colorless OV 2 Dock Quadcopter](/assets/images/SubsystemInterfaceModeling-fb765.png) +![SIDD colorless OV 2 Dock Quadcopter](/assets/images/system-design-development/SubsystemInterfaceModeling-fb765.png) As you can see from this chart, the highest level activities of docking the quadcopter are things like 'take off' and 'rendezvous with docking face', which have lines between to signify the temporal flow, and labels to signify what information needs to pass in order to make it happen. Most important are the labels which cross swimlanes, because that's information that will have to be packaged and sent from one subsystem to another. At this level the swimlanes are the actors and high level subsystems, but if we go a level down, we see subsystems within subsystems (the system-of-systems concept made manifest). -![SIDD-colorless-OV-2b Rendezvous with Docking Face](/assets/images/SubsystemInterfaceModeling-4e816.png) +![SIDD-colorless-OV-2b Rendezvous with Docking Face](/assets/images/system-design-development/SubsystemInterfaceModeling-4e816.png) The first three swimlanes from the left are subsystems of the quadcopter while the final is crossing to/from the Palantir. -![SIDD-colorless-OV-2a Determine Docking Possibility](/assets/images/SubsystemInterfaceModeling-8e94f.png) +![SIDD-colorless-OV-2a Determine Docking Possibility](/assets/images/system-design-development/SubsystemInterfaceModeling-8e94f.png) Here all four swimlanes are different subsystems (though the Palantir is technically part of the dock, it is quite separate physically and informationally), but support the higher level activity of docking) @@ -443,7 +443,7 @@ Here all four swimlanes are different subsystems (though the Palantir is technic #### Level 3 OV-2c is where intrasystem activities show up in the architecture. This indenture shows information flowing and activities that occur entirely on one system, sometimes with a single information flow leaving the internal swimlanes to some external box or all flowing to a single box which has the same name as a box in an indenture above, signifying what information and actions flow inside a system to make that one action occur - similar how how an OV-2b is often the expanded version of a single box in the OV-2a indenture. We cancelled all of our OV-2c diagrams early on and by the time the new system was finalized, we didn't have time to model, but this is what it looked like when we had the quadcopter doing localization with an onboard camera. -![SIDD-colorless-CANCELED OV-2c Localize Quadcopter](/assets/images/SubsystemInterfaceModeling-73d8e.png) +![SIDD-colorless-CANCELED OV-2c Localize Quadcopter](/assets/images/system-design-development/SubsystemInterfaceModeling-73d8e.png) All swimlanes are of systems internal to the quadcopter subsystem, and eventually flow out to it keeping a fixed hover point. @@ -453,7 +453,7 @@ If you were modeling from the very beginning, capability and to some extent acti ### Data and Information View You can always dive straight into DIV-2 rather than DIV-1, but if you start early with modeling a DIV-1 is useful. We'll cover the second level here. Each line in the activity diagram had a name (or should have). That was a data flow, and these data flows naturally have information. In the DIV-2, you show what this information is. -![SIDD-colorless-DIV-2 DockMotionDetails](/assets/images/SubsystemInterfaceModeling-7097d.png) +![SIDD-colorless-DIV-2 DockMotionDetails](/assets/images/system-design-development/SubsystemInterfaceModeling-7097d.png) It may seem trivial at first, but these views show not just information, but their type, names, and what larger information boxes they flow into. This can make integration much easier as everyone knows what every subsystem needs from every other subsystem and if the naming conventions are kept to, there is no confusion in how to get that information. diff --git a/wiki/system-design-development/cable-management.md b/wiki/system-design-development/cable-management.md index 0e2e0088..41be4a44 100644 --- a/wiki/system-design-development/cable-management.md +++ b/wiki/system-design-development/cable-management.md @@ -10,7 +10,7 @@ To illustrate its importance imagine the following scenario: You are at the final integration steps of your project and something isn't working. You start by checking out the hardware and see Figure 1. -![Cable Management Gone Wrong](/assets/images/CableManagement-c5b3a.png) +![Cable Management Gone Wrong](/assets/images/system-design-development/CableManagement-c5b3a.png) **Figure 1: Cable management gone wrong** @@ -25,7 +25,7 @@ If this is your first time creating a wiring diagram for your system you will pr Note: in systems engineering you will be required to create a cyberphysical architecture for your system. This diagram may be similar, but they are still fundamentally different. Notice how here we are explicitly differentiating cables, and boards. We get more information from a cable management perspective this way. For example notice how, in **Figure 2**, cable 3 only has one plug. This tells us that Sensor 1 has an unremovable cable attached to it. -![Wiring Managment](/assets/images/CableManagement-b3a03.png) +![Wiring Managment](/assets/images/system-design-development/CableManagement-b3a03.png) **Figure 2: Example wiring block diagram of 2 circuit card assembly boards and 1 sensor connected by three cables. Here the JX labels stand for the jacks on the different circuit boards and the PX stand for the plugs of the cables.** @@ -34,7 +34,7 @@ Now that you have outlined all of the different boards and connections it is tim If you are defining your own connections it is time to make some cable wiring diagrams. You can imagine these diagrams as a zoomed in detailed picture of each of the cables in your wiring block diagram. Figure 3 shows an example cable wiring diagram. It is not necessary to get as detailed as Figure 3. In fact, I've used excel to create very effective wiring diagrams before. The most important objective of these diagrams is to understand the signals and wires on each cable. One more crucial detail highlighted in these diagrams is the length of each cable. Make sure you have a rough idea of how long each cable will be, keyword: rough. You may not be able to determine the exact length of your cable, but going through this exercise will make you start thinking about cable routing. At this step it is necessary to sit down with the mechanical designer of your system and discuss how your cables are physically getting from A to B. -![Example Cable Wiring Diagram for a USB Cable](/assets/images/CableManagement-654ae.png) +![Example Cable Wiring Diagram for a USB Cable](/assets/images/system-design-development/CableManagement-654ae.png) **Figure 3: Example Cable wiring diagram for a USB cable** @@ -90,7 +90,7 @@ If you do decide to use connectors that require crimps it is important that you ### Grouping Wires Once you know what connector, wires, and crimps to use it is time to assemble the cable. For the most part this is straightforward, but there are some tricks that will make cable management later on easier. First, if you have any twisted pairs in your cable or want to group wires together without additional hardware, you can use the drill trick to make nice looking cables like **Figure 4**. A video of the Twisted Pair Drill Trick can be viewed [here](https://www.youtube.com/watch?v=uTJhrTTl-EE) -![Twisted Wires Done Using a Drill](/assets/images/CableManagement-6f4d5.png) +![Twisted Wires Done Using a Drill](/assets/images/system-design-development/CableManagement-6f4d5.png) **Figure 4: Twisted wires done using a drill** diff --git a/wiki/system-design-development/pcb-design.md b/wiki/system-design-development/pcb-design.md index 08c4330b..626985b0 100644 --- a/wiki/system-design-development/pcb-design.md +++ b/wiki/system-design-development/pcb-design.md @@ -45,17 +45,17 @@ title: PCB Design Notes (electrolytic and non­electrolytic) for noise­reduction. - It is important to have proper LED indication on the PCB (as shown in **Figure 1** and **Figure 2**) for testing and accountability. Use LED indicators to ensure proper functioning of the board. -![LED indication in schematic with noise reduction cap](/assets/images/PCBDesignNotes-8fedc.png) +![LED indication in schematic with noise reduction cap](/assets/images/system-design-development/PCBDesignNotes-8fedc.png) **Figure 1: LED indication in schematic with noise reduction cap** -![Labeled Fuse and Zener­diode for Protection](/assets/images/PCBDesignNotes-09baf.png) +![Labeled Fuse and Zener­diode for Protection](/assets/images/system-design-development/PCBDesignNotes-09baf.png) **Figure 2: Labeled Fuse and Zener­diode for Protection** - You can add additional comments on schematic as shown in **Figure 3**, this helps to put information related to board which is otherwise not explicit from the schematic. -![Schematic with comments](/assets/images/PCBDesignNotes-d5ba2.png) +![Schematic with comments](/assets/images/system-design-development/PCBDesignNotes-d5ba2.png) **Figure 3: Schematic with comments** @@ -69,7 +69,7 @@ As you get your board design ready, please keep in mind that you want to have so manufacturing process, some metal is going to be deposited inside each hole. This reduces the diameter of the hole, making it smaller than it was when it was drilled. As a rule of thumb, add 8­12mils to the nominal round lead diameter, and round up if you need to match the diameter to a particular drill size list. Keep in mind that a bit bigger is better than too small; you don't want to find yourself filing a lead that is too big (you cannot make the hole bigger, because it would remove the through­hole metal). Double­check and make sure that none of the holes is smaller than 0.015” diameter, and that neither tracks nor clearances between tracks/pads/planes are smaller than 0.006”. -![Variable Track Width](/assets/images/PCBDesignNotes-05e85.png) +![Variable Track Width](/assets/images/system-design-development/PCBDesignNotes-05e85.png) **Figure 4: Variable Track Width** diff --git a/wiki/system-design-development/subsystem-interface-modeling.md b/wiki/system-design-development/subsystem-interface-modeling.md index 2a87fb24..d81efe32 100644 --- a/wiki/system-design-development/subsystem-interface-modeling.md +++ b/wiki/system-design-development/subsystem-interface-modeling.md @@ -14,22 +14,22 @@ One of the most useful views is the operational. In practice, you will rarely go #### Level 1 In this level, one can usually put the Use Case. While technically it belongs in the Capability View or All View, since we're otherwise not using CVs (unless you start modeling at the very beginning and use the CV for requirements). In the Use Case, put the Actors (the user, obviously, and the highest level subsystems you'd normally see in a WBS), and then what information flows between them. This would be the highest level information packet containing all other information flow we see on the level 2 Activity Diagrams. -![SIDD colorless OV 1](/assets/images/SubsystemInterfaceModeling-8748c.png) +![SIDD colorless OV 1](/assets/images/system-design-development/SubsystemInterfaceModeling-8748c.png) #### Level 2 This is the meat of the Interface Design Description, where you can flow out all the things the system might do. Rather than go into a lot of operational or capability viewpoints, go straight into activity diagrams since the system is relatively small. Each box at the first indenture of level 2. >Use "indentures" of activity diagrams since the other "levels" of OV are technically something else, signified by letters like OV-2b or OV-2c) is a high level activity (see below for the highest level view of MRSD 2015 "Dock In Piece" project). -![SIDD colorless OV 2 Dock Quadcopter](/assets/images/SubsystemInterfaceModeling-fb765.png) +![SIDD colorless OV 2 Dock Quadcopter](/assets/images/system-design-development/SubsystemInterfaceModeling-fb765.png) As you can see from this chart, the highest level activities of docking the quadcopter are things like 'take off' and 'rendezvous with docking face', which have lines between to signify the temporal flow, and labels to signify what information needs to pass in order to make it happen. Most important are the labels which cross swimlanes, because that's information that will have to be packaged and sent from one subsystem to another. At this level the swimlanes are the actors and high level subsystems, but if we go a level down, we see subsystems within subsystems (the system-of-systems concept made manifest). -![SIDD-colorless-OV-2b Rendezvous with Docking Face](/assets/images/SubsystemInterfaceModeling-4e816.png) +![SIDD-colorless-OV-2b Rendezvous with Docking Face](/assets/images/system-design-development/SubsystemInterfaceModeling-4e816.png) The first three swimlanes from the left are subsystems of the quadcopter while the final is crossing to/from the Palantir. -![SIDD-colorless-OV-2a Determine Docking Possibility](/assets/images/SubsystemInterfaceModeling-8e94f.png) +![SIDD-colorless-OV-2a Determine Docking Possibility](/assets/images/system-design-development/SubsystemInterfaceModeling-8e94f.png) Here all four swimlanes are different subsystems (though the Palantir is technically part of the dock, it is quite separate physically and informationally), but support the higher level activity of docking) @@ -37,7 +37,7 @@ Here all four swimlanes are different subsystems (though the Palantir is technic #### Level 3 OV-2c is where intrasystem activities show up in the architecture. This indenture shows information flowing and activities that occur entirely on one system, sometimes with a single information flow leaving the internal swimlanes to some external box or all flowing to a single box which has the same name as a box in an indenture above, signifying what information and actions flow inside a system to make that one action occur - similar how how an OV-2b is often the expanded version of a single box in the OV-2a indenture. We cancelled all of our OV-2c diagrams early on and by the time the new system was finalized, we didn't have time to model, but this is what it looked like when we had the quadcopter doing localization with an onboard camera. -![SIDD-colorless-CANCELED OV-2c Localize Quadcopter](/assets/images/SubsystemInterfaceModeling-73d8e.png) +![SIDD-colorless-CANCELED OV-2c Localize Quadcopter](/assets/images/system-design-development/SubsystemInterfaceModeling-73d8e.png) All swimlanes are of systems internal to the quadcopter subsystem, and eventually flow out to it keeping a fixed hover point. @@ -47,7 +47,7 @@ If you were modeling from the very beginning, capability and to some extent acti ### Data and Information View You can always dive straight into DIV-2 rather than DIV-1, but if you start early with modeling a DIV-1 is useful. We'll cover the second level here. Each line in the activity diagram had a name (or should have). That was a data flow, and these data flows naturally have information. In the DIV-2, you show what this information is. -![SIDD-colorless-DIV-2 DockMotionDetails](/assets/images/SubsystemInterfaceModeling-7097d.png) +![SIDD-colorless-DIV-2 DockMotionDetails](/assets/images/system-design-development/SubsystemInterfaceModeling-7097d.png) It may seem trivial at first, but these views show not just information, but their type, names, and what larger information boxes they flow into. This can make integration much easier as everyone knows what every subsystem needs from every other subsystem and if the naming conventions are kept to, there is no confusion in how to get that information. diff --git a/wiki/tools/Qtcreator-ros.md b/wiki/tools/Qtcreator-ros.md index 9dfd8977..f57d0ec8 100644 --- a/wiki/tools/Qtcreator-ros.md +++ b/wiki/tools/Qtcreator-ros.md @@ -70,19 +70,19 @@ This section will guide you to create your first simple Hello-World Qt program 2. Create new project using `File -> New File or Project -> Application -> Qt Widgets Application` - ![](/assets/images/Qtcreator-ros-new-project.png) + ![](/assets/images/tools/Qtcreator-ros-new-project.png) 3. Name your project/application - ![](/assets/images/Qtcreator-ros-new-project-menu.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-menu.png) 4. If you installed correctly, the Kit will be detected automatically, if not this [link](https://stackoverflow.com/questions/26499404/qtcreator-no-valid-kits-found) might be useful - ![](/assets/images/Qtcreator-ros-new-project-kit.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-kit.png) 5. Name your main class. Although this is not the main function, it acts as the entry point of the application - ![](/assets/images/Qtcreator-ros-new-project-class-menu.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-class-menu.png) 6. Select finish @@ -90,11 +90,11 @@ This section will guide you to create your first simple Hello-World Qt program 8. Click the green arrow at the bottom left side or use `Ctrl + R` to build and run. You should see a blank application window like this one - ![](/assets/images/Qtcreator-ros-new-project-run.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-run.png) 9. Close the program by clicking on the red cross on the `MainWindow` window. and navigate to the `mainwindow.ui` file under `Forms` on the left menu. It will automatically switch to the `Design` tab and open this UI editor tool - ![](/assets/images/Qtcreator-ros-new-project-design.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-design.png) 10. The left menu is now switched to the basic UI widgets available. You can put them through drag and drop. Try to drag and drop these 4 types of widgets: @@ -103,23 +103,23 @@ This section will guide you to create your first simple Hello-World Qt program 3. `Display Widgets -> Label` 4. `Display Widgets -> Text Browser` - ![](/assets/images/Qtcreator-ros-new-project-ui-elements.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-ui-elements.png) 11. Some of the widgets have text that is displayed on them such as the `Label` and `Push Button`, you can double-left-click on them and edit the display text - ![](/assets/images/Qtcreator-ros-new-project-edit-text.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-edit-text.png) 12. On the right menu you should see a summary of all the objects and widgets that you have created. Here we can see the 4 widgets we added. An important distinction here is that the left column is the name of the object (unique entity) and the right column is the class name (not unique). Hence, you can have multiple labels, but these are based on `QLabel` class - ![](/assets/images/Qtcreator-ros-new-project-ui-obj.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-ui-obj.png) 13. To drive the point home, try to rename the objects. It is advisable to give it meaningful name as you would name a variable. Also, remember to save often with `Ctrl + S` - ![](/assets/images/Qtcreator-ros-new-project-ui-obj-rename.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-ui-obj-rename.png) 14. Run the program again `Ctrl + R` and you should see your widget. Try to type on the line edit widget - ![](/assets/images/Qtcreator-ros-new-project-run2.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-run2.png) # Qt communication framework diff --git a/wiki/tools/__all_subsections.md b/wiki/tools/__all_subsections.md index 4626c888..620a8553 100644 --- a/wiki/tools/__all_subsections.md +++ b/wiki/tools/__all_subsections.md @@ -8,28 +8,28 @@ Altium Circuitmaker is a Community Driven PCB Design Application. Circuitmaker c ## Strengths and Weaknesses ### Benefits 1. Cloud based part library drawn from the Octopart database - - ![Library Menu](/assets/images/AltiumCircuitmaker-8aecd.png) + - ![Library Menu](/assets/images/tools/AltiumCircuitmaker-8aecd.png) 2. Friendlier UI - This is strictly a comparison to EagleCAD. Eagle's UI is a more involved style, which lets the user get deeper into things, but is also not nearly as easy for the casual or new user, or for someone in a hurry. - - ![Part Info Window](/assets/images/AltiumCircuitmaker-78555.png) + - ![Part Info Window](/assets/images/tools/AltiumCircuitmaker-78555.png) 3. Can output STEP files and view the part in 3D in Circuitmaker - - ![3D View](/assets/images/AltiumCircuitmaker-fcf01.png) + - ![3D View](/assets/images/tools/AltiumCircuitmaker-fcf01.png) 4. The autorouter appears somewhat smarter - Partially due to the easier UI, it also feels like it takes it less time and effort to find a good path. You can make multiple profiles of routing schemes and widths, and choose to route only one net at a time. However, by putting in multiple width rules that each cover a single net, you can autoroute every net at once at the correct width. - - ![Rule Menu](/assets/images/AltiumCircuitmaker-4b425.png) + - ![Rule Menu](/assets/images/tools/AltiumCircuitmaker-4b425.png) 5. Collaborative cloud based development method 6. Outputs include an excel BOM 7. No trial version; all functionality provided for free in the open beta. ### Drawbacks 1. No preloaded set of common drill sizes - - ![Hole Menu](/assets/images/AltiumCircuitmaker-f5782.png) + - ![Hole Menu](/assets/images/tools/AltiumCircuitmaker-f5782.png) 2. No board outline by default 3. Poor default wiring options 4. Copper Pours are not intelligent - - ![Pour Plane Cutout](/assets/images/AltiumCircuitmaker-e83b9.png) + - ![Pour Plane Cutout](/assets/images/tools/AltiumCircuitmaker-e83b9.png) 5. Some UI still obviously in need of tweaking - - ![Library Side Menu](/assets/images/AltiumCircuitmaker-1caa4.png) + - ![Library Side Menu](/assets/images/tools/AltiumCircuitmaker-1caa4.png) ### Summary In many ways, Circuitmaker is an improvement over EagleCAD. As an *open beta*, there are occasional stability issues as well as very long periods where it stops to work through an instruction. It's far enough along that the instability issues are a minor nuisance and do not appear to affect better computers. As for the freezes, Circuitmaker is a bit slow to start and to close, to load menus, and there are peak usage periods where it's slow to fetch new part information from the cloud. Otherwise it runs quite well. For projects, it could save a lot of time. In Eagle, the teams all make and remake the same parts, and often do much the same kind of thing throughout their project if they rely on PCBs. With Circuitmaker, all the parts fetch from Octop @@ -74,15 +74,15 @@ Like any other IDE, CLion has countless features. These can also be extended by #### Debugging -![CLion Debugging 1](/assets/images/debug1.jpeg) +![CLion Debugging 1](/assets/images/tools/debug1.jpeg) After opening the project folder in CLion, right-click on the `CMakeLists.txt` and choose Reload CMake Project. The various executable target added in the CMake file will be available in the drop-down menu at the top right as shown in the above image. -![CLion Debug 2](/assets/images/debug2.jpeg) +![CLion Debug 2](/assets/images/tools/debug2.jpeg) Add the breakpoint in the code where you want to pause the code and press the debug button as shown in the image. -![CLion Debug 3](/assets/images/debug3.jpeg) +![CLion Debug 3](/assets/images/tools/debug3.jpeg) CLion will pause the execution at the breakpoint. You can view all the global, local variables and their values in the variable inspector. It also provides the functionality to run the code line by line by using various step in, step over, step out function. You can also press the resume button to continue execution till the next break-point. You can add new breakpoints even when code is paused at a breakpoint. @@ -90,7 +90,7 @@ CLion will pause the execution at the breakpoint. You can view all the global, l Refactoring is one of the most powerful tools in the CLion. Simplest re-factor operation is renaming a variable. -![Refactor 1](/assets/images/refactor1.png) +![Refactor 1](/assets/images/tools/refactor1.png) `right-click -> Refactor -> Rename` @@ -99,7 +99,7 @@ Refactoring is one of the most powerful tools in the CLion. Simplest re-factor o `right-click -> Refactor -> Extract -> Method` -![Refactor 2](/assets/images/refactor2.jpeg) +![Refactor 2](/assets/images/tools/refactor2.jpeg) #### Entity Linking @@ -111,7 +111,7 @@ Entity linking is very useful in efficiently navigating code-base in CLion. The Entity linking works to the imported library as well. If you have imported some C++ library and want to check the source code inside the library, just use entity linking. It will open the source code of the library if it's available. For example, in the below image, definition of `std::vector::push_back()` is opened using entity linking of CLion. -![Refactor 3](/assets/images/refactor3.png) +![Refactor 3](/assets/images/tools/refactor3.png) #### Context-Aware Search @@ -119,7 +119,7 @@ Given a function or a variable, all its usage inside the code can also be search `right-click -> Find Usages` -![Refactor 4](/assets/images/refactor4.png) +![Refactor 4](/assets/images/tools/refactor4.png) Above image shows the various usages CLion found of the private variable `costMap` inside the repository. @@ -192,16 +192,16 @@ A link for [downloading](https://code.visualstudio.com/download). 2. Open VS Code (can use the Linux search/windows button). Source folders into the workspace. 3. The top left tab gives you file explorer. Click it! -![File Explorer](/assets/images/vscode4.png) +![File Explorer](/assets/images/tools/vscode4.png) #### Features 1. **Keyword search**: Right-click inside the file explorer space. Check out “Find in Folder..” and try searching for a keyword and you’d see lightning fast multi-file search (or) click on the search button below the explorer and use the find and replace options. -![Keyword Search](/assets/images/vscode11.png) +![Keyword Search](/assets/images/tools/vscode11.png) 2. **Seek definition**: Open any file and right-click to peek at the definition of functions. Why is this useful? Reading code implies trying to figure out what each function is doing. Super useful in projects. Works for variables, classes, functions. You name it. VS-code can define it. -![Seek Definition](/assets/images/vscode5.png) +![Seek Definition](/assets/images/tools/vscode5.png) 3. **Open the file by name**: Ctrl+P, and type file name. 4. **Shortcuts**: I use sublime shortcuts on VS Code. That’s the cool thing. You can configure it to work for your style. How to configure? You can install a sublime text key-bindings plugin. More on plugins later. But this specific one is called: ms-vscode.sublime-keybindings. @@ -217,15 +217,15 @@ Add all custom shortcuts in preferences, keyboard shortcuts. Do ctrl+shift+P and 5. **Integrated terminal**: Click on terminal and open a new terminal. -![Open terminal](/assets/images/vscode2.png) +![Open terminal](/assets/images/tools/vscode2.png) Now you can run programs without rotating between terminal and editor. Reduces a lot of strain on the eyes. You can also create multiple screens in the terminal. 6. **Python debugger**: You can put breakpoints and run python programs and look into the state of the program for faster debugging. Click next to the line number and that should drop a BP. Now start debugging. Choose whichever option makes sense (for trials go for current file). -![Python Breakpoint - 1](/assets/images/vscode10.png) -![Python Breakpoint - 2](/assets/images/vscode8.png) -![Python Breakpoint - 3](/assets/images/vscode3.png) +![Python Breakpoint - 1](/assets/images/tools/vscode10.png) +![Python Breakpoint - 2](/assets/images/tools/vscode8.png) +![Python Breakpoint - 3](/assets/images/tools/vscode3.png) You can step through the lines or move to the next BP or let the program run till the end. @@ -233,7 +233,7 @@ Drawback: Image data cannot be displayed. Spyder offers that option. You cannot 7. **Language support**: What we MRSD people use? It supports all of it. Python, C++, Markdown, JSON, YAML, XML, CMake. How to change? Click on python/whatever there is. -![Language Support](/assets/images/vscode6.png) +![Language Support](/assets/images/tools/vscode6.png) Random thoughts: Spaces to tabs, the right-hand small screen helps find easy chunks of code, terminal focus shortcuts, file explorer shows modified files, tracked/untracked files, squiggles show if invalid syntax, auto-complete, function argument list displays. @@ -241,15 +241,15 @@ Random thoughts: Spaces to tabs, the right-hand small screen helps find easy chu 1. **Git graph**: I think git support is auto existing on baseline VS Code but this just ups it. Why good? -![tracking/modification status](/assets/images/vscode9.png) +![tracking/modification status](/assets/images/tools/vscode9.png) When you do a git rebase/merge, conflicts show up in nice blocks which you can just choose. No more million backspaces to remove code. -![git rebase/merge](/assets/images/vscode12.png) +![git rebase/merge](/assets/images/tools/vscode12.png) If you use it with the integrated terminal, you can just choose a file from the terminal output, choose a block of code to stay, and continue rebasing. -![The graph: click on the git graph button on the bottom toolbar and voila](/assets/images/vscode13.png) +![The graph: click on the git graph button on the bottom toolbar and voila](/assets/images/tools/vscode13.png) 2. **Python**: This covers all the python debugging tools + module search functionality. @@ -549,7 +549,7 @@ whoami # Success!! ## Mitigation of Privilege Escalation -![images/privesc.png](/assets/images/privesc.png) +![images/privesc.png](/assets/images/tools/privesc.png) ## Exposed Docker Socket @@ -559,7 +559,7 @@ If docker.sock is mounted from the host into a container, we can use docker.sock The Docker socket is a type of UNIX socket used by the Docker CLI to execute Docker commands with root privileges. docker.sock is not originally present inside the container, but users inside the container may need to mount it to manage or create other containers. However, mounting docker.sock inside the container increases the attack surface and poses a security risk. -![images/docker_socket.png](../../assets/images/docker_socket.png) +![images/docker_socket.png](../../assets/images/tools/docker_socket.png) Next, we will go through the steps of the demo experiment: @@ -1395,19 +1395,19 @@ This section will guide you to create your first simple Hello-World Qt program 2. Create new project using `File -> New File or Project -> Application -> Qt Widgets Application` - ![](/assets/images/Qtcreator-ros-new-project.png) + ![](/assets/images/tools/Qtcreator-ros-new-project.png) 3. Name your project/application - ![](/assets/images/Qtcreator-ros-new-project-menu.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-menu.png) 4. If you installed correctly, the Kit will be detected automatically, if not this [link](https://stackoverflow.com/questions/26499404/qtcreator-no-valid-kits-found) might be useful - ![](/assets/images/Qtcreator-ros-new-project-kit.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-kit.png) 5. Name your main class. Although this is not the main function, it acts as the entry point of the application - ![](/assets/images/Qtcreator-ros-new-project-class-menu.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-class-menu.png) 6. Select finish @@ -1415,11 +1415,11 @@ This section will guide you to create your first simple Hello-World Qt program 8. Click the green arrow at the bottom left side or use `Ctrl + R` to build and run. You should see a blank application window like this one - ![](/assets/images/Qtcreator-ros-new-project-run.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-run.png) 9. Close the program by clicking on the red cross on the `MainWindow` window. and navigate to the `mainwindow.ui` file under `Forms` on the left menu. It will automatically switch to the `Design` tab and open this UI editor tool - ![](/assets/images/Qtcreator-ros-new-project-design.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-design.png) 10. The left menu is now switched to the basic UI widgets available. You can put them through drag and drop. Try to drag and drop these 4 types of widgets: @@ -1428,15 +1428,15 @@ This section will guide you to create your first simple Hello-World Qt program 3. `Display Widgets -> Label` 4. `Display Widgets -> Text Browser` - ![](/assets/images/Qtcreator-ros-new-project-ui-elements.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-ui-elements.png) 11. Some of the widgets have text that is displayed on them such as the `Label` and `Push Button`, you can double-left-click on them and edit the display text - ![](/assets/images/Qtcreator-ros-new-project-edit-text.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-edit-text.png) 12. On the right menu you should see a summary of all the objects and widgets that you have created. Here we can see the 4 widgets we added. An important distinction here is that the left column is the name of the object (unique entity) and the right column is the class name (not unique). Hence, you can have multiple labels, but these are based on `QLabel` class - ![](/assets/images/Qtcreator-ros-new-project-ui-obj.png) + ![](/assets/images/tools/Qtcreator-ros-new-project-ui-obj.png) 13. To drive the point home, try to rename the objects. It is advisable to give it mear a new message is received. @@ -1650,7 +1650,7 @@ $ pip install PyQt5 This is the final application you can get by following this tutorial. Blocks that require customization will be explained in the documentation. -![Final QT](/assets/images/PyQt-final.png) +![Final QT](/assets/images/tools/PyQt-final.png) ## Application Walkthrough @@ -1669,13 +1669,13 @@ The system level timer captures the time taken between the start and the end of The color change for the timers are as follows: Green Button -![Green Button](/assets/images/PyQt-green.png) +![Green Button](/assets/images/tools/PyQt-green.png) Yellow Button -![Yellow Button](/assets/images/PyQt-yellow.png) +![Yellow Button](/assets/images/tools/PyQt-yellow.png) Orange Button -![Orange Button](/assets/images/PyQt-orange.png) +![Orange Button](/assets/images/tools/PyQt-orange.png) Red Button -![Red Button](/assets/images/PyQt-red.png) +![Red Button](/assets/images/tools/PyQt-red.png) The code block for this is given here: ```python @@ -1700,7 +1700,7 @@ The task level timer captures the time taken between the start and the end of on One additional feature of the task level timer is it saves the task logs. These are outputted in the `Task Times` block that is directly below the button. -![Red Button](/assets/images/PyQt-logs.png) +![Red Button](/assets/images/tools/PyQt-logs.png) ``` def TaskTimerBlock(self): @@ -2001,7 +2001,7 @@ image_topic.subscribe(function(message) { }); ```epository [here](https://github.com/deltaautonomy/delta_viz/blob/master/delta_viz_app/index.html). -![](/assets/images/deltaviz.jpg) +![](/assets/images/tools/deltaviz.jpg) ## See Also - A [tutorial](https://roboticsknowledgebase.com/wiki/tools/stream-rviz) on setting up virtual cameras and lighting in Rviz and stream these images which can be used in your GUI or for other applications within ROS. diff --git a/wiki/tools/altium-circuitmaker.md b/wiki/tools/altium-circuitmaker.md index 593b809c..2d71a7d2 100644 --- a/wiki/tools/altium-circuitmaker.md +++ b/wiki/tools/altium-circuitmaker.md @@ -9,20 +9,20 @@ Altium Circuitmaker is a Community Driven PCB Design Application. Circuitmaker c 1. Cloud based part library drawn from the Octopart database - Users can search keywords to find a matching part in the Octopart database. The ones that show up first are the ones that are immediately ready to be used in Circuitmaker. - If you need something that isn't made yet, building the part is not difficult and users can import existing symbols and footprints to make it easier. It even includes a list of where you can buy parts and prices. However, it tries to open web pages in the UI -- this is slow, inefficient. - - ![Library Menu](/assets/images/AltiumCircuitmaker-8aecd.png) + - ![Library Menu](/assets/images/tools/AltiumCircuitmaker-8aecd.png) 2. Friendlier UI - This is strictly a comparison to EagleCAD. Eagle's UI is a more involved style, which lets the user get deeper into things, but is also not nearly as easy for the casual or new user, or for someone in a hurry. - There are also some common sense updates that likely haven't happened because Eagle is more interested in improving functionality than usability. For example, double clicking things in Circuitmaker opens property windows so you can adjust lengths, widths, names, etc. - Circuitmaker also displays part purchasing information if you hover over them (though this is still buggy and may require multiple attempts). - - ![Buying Tooltip](/assets/images/AltiumCircuitmaker-3f756.png) + - ![Buying Tooltip](/assets/images/tools/AltiumCircuitmaker-3f756.png) - There are also more keyboard shortcuts that can be used during actions like placing and wiring, as well as naming nets to make it easier in routing. Even making new library entries is simple since you can almost always find a symbol that matches and usually a footprint that is either close or the same form factor as your part. - - ![Part Info Window](/assets/images/AltiumCircuitmaker-78555.png) + - ![Part Info Window](/assets/images/tools/AltiumCircuitmaker-78555.png) 3. Can output STEP files and view the part in 3D in Circuitmaker - This feature allows users to see parts in 3D while they were placed on the board. This has the added benefits of identifying items placed in the wrong direction and getting a feel for sizes. However, not all parts have a 3D model and they're a bit harder to find currently in the 'existing parts' library. Making a new 3D view is harder than drawing symbols and footprints. That said, when there is a model, it's helpful to have. Additionally, you can output your board to a STEP file and put it in your Solidworks model. This allows users to see where you want to place the board on the assembly. - - ![3D View](/assets/images/AltiumCircuitmaker-fcf01.png) + - ![3D View](/assets/images/tools/AltiumCircuitmaker-fcf01.png) 4. The autorouter appears somewhat smarter - Partially due to the easier UI, it also feels like it takes it less time and effort to find a good path. You can make multiple profiles of routing schemes and widths, and choose to route only one net at a time. However, by putting in multiple width rules that each cover a single net, you can autoroute every net at once at the correct width. - - ![Rule Menu](/assets/images/AltiumCircuitmaker-4b425.png) + - ![Rule Menu](/assets/images/tools/AltiumCircuitmaker-4b425.png) 5. Collaborative cloud based development method - Teams can build their system without all being on the same computer doing it. Other teams can comment on things on the schematic if they want. This allows teams to edit and fork PCB designs rather than trying to put it all through one person (or trying to contribute separate files). Commenting on schematics is another distinct advantage. 6. Outputs include an excel BOM @@ -33,17 +33,17 @@ Altium Circuitmaker is a Community Driven PCB Design Application. Circuitmaker c ### Drawbacks 1. No preloaded set of common drill sizes - Users have to have a chart of sizes handy to avoid inputting a diameter that doesn't exist. This is a minor but surprising oversight given that common drill sizes should be an easy thing to include in a dropdown. It may be because there is no actual 'drill' button, just an option to place a generic 'pad' which shows up as a through hole like all the others, but without being attached to a larger part. As you can see, there are a lot of options, but it doesn't have a dropdown for standard drills. - - ![Hole Menu](/assets/images/AltiumCircuitmaker-f5782.png) + - ![Hole Menu](/assets/images/tools/AltiumCircuitmaker-f5782.png) 2. No board outline by default - Users have to draw an outline on a different layer. Some companies don't like keepout layers, so users may put it both there and on the silkscreen layer. 3. Poor default wiring options - If users don't put the elbow in the right place, they will end up with your net spanning every pin on one side of a part. On the other hand, there are lots of keyboard shortcuts for changing wiring routes. You can even place wire at different angles. 4. Copper Pours are not intelligent - Copper pours automatically make cutouts even for traces on their defined net. This only happens at first pour or when you 'repour' to fix problems. However, if a repour is necessary then you have to fix the cutouts manually. If found a rule to change the way it connects to pins inside the plane that are on its target net, but not for traces. If users play with that rule, they might figure it out, but that's the status right now. - - ![Pour Plane Cutout](/assets/images/AltiumCircuitmaker-e83b9.png) + - ![Pour Plane Cutout](/assets/images/tools/AltiumCircuitmaker-e83b9.png) 5. Some UI still obviously in need of tweaking - It seems to be quite stable now, but there are key features and UI windows that need to be made more friendly. The worst is the library search box. The screenshot in the library UI section is the full screen version, and usually it's best used as a sidebar. - - ![Library Side Menu](/assets/images/AltiumCircuitmaker-1caa4.png) + - ![Library Side Menu](/assets/images/tools/AltiumCircuitmaker-1caa4.png) - It needs to be laid out better so that it can fit more into the window. I think eliminating the pricing and editions segments might help, or turning it into two columns. Either way, this is a minor nuisance compared to having to make your own library or hunt around for ones that already exist. ### Summary diff --git a/wiki/tools/clion.md b/wiki/tools/clion.md index 40c1ae23..c7e8d1d1 100644 --- a/wiki/tools/clion.md +++ b/wiki/tools/clion.md @@ -41,15 +41,15 @@ Like any other IDE, CLion has countless features. These can also be extended by #### Debugging -![CLion Debugging 1](/assets/images/debug1.jpeg) +![CLion Debugging 1](/assets/images/tools/debug1.jpeg) After opening the project folder in CLion, right-click on the `CMakeLists.txt` and choose Reload CMake Project. The various executable target added in the CMake file will be available in the drop-down menu at the top right as shown in the above image. -![CLion Debug 2](/assets/images/debug2.jpeg) +![CLion Debug 2](/assets/images/tools/debug2.jpeg) Add the breakpoint in the code where you want to pause the code and press the debug button as shown in the image. -![CLion Debug 3](/assets/images/debug3.jpeg) +![CLion Debug 3](/assets/images/tools/debug3.jpeg) CLion will pause the execution at the breakpoint. You can view all the global, local variables and their values in the variable inspector. It also provides the functionality to run the code line by line by using various step in, step over, step out function. You can also press the resume button to continue execution till the next break-point. You can add new breakpoints even when code is paused at a breakpoint. @@ -57,7 +57,7 @@ CLion will pause the execution at the breakpoint. You can view all the global, l Refactoring is one of the most powerful tools in the CLion. Simplest re-factor operation is renaming a variable. -![Refactor 1](/assets/images/refactor1.png) +![Refactor 1](/assets/images/tools/refactor1.png) While simple text-editor can do find and replace, it is not context-aware. CLion re-factor is context-aware meaning renaming of the variable will only happen inside the scope of that variable. To rename variable using refactor select the variable: @@ -68,7 +68,7 @@ A more useful refactoring tool is to extract the method or extract the function `right-click -> Refactor -> Extract -> Method` -![Refactor 2](/assets/images/refactor2.jpeg) +![Refactor 2](/assets/images/tools/refactor2.jpeg) Refactor will analyze the selected text and identify the variables that need to be passed to the new function. It will show those variables in the GUI form as shown in the above image. Will GUI interface, user can add, rename, delete variables that are being passed as well change the name of the function. After verifying the function signature, the user can press the `Extract` button. It will cut the code from the original place and will put it inside a new function along with all the necessary changes in the header file to add that function/method. @@ -84,7 +84,7 @@ Entity linking is very useful in efficiently navigating code-base in CLion. The Entity linking works to the imported library as well. If you have imported some C++ library and want to check the source code inside the library, just use entity linking. It will open the source code of the library if it's available. For example, in the below image, definition of `std::vector::push_back()` is opened using entity linking of CLion. -![Refactor 3](/assets/images/refactor3.png) +![Refactor 3](/assets/images/tools/refactor3.png) #### Context-Aware Search @@ -92,7 +92,7 @@ Given a function or a variable, all its usage inside the code can also be search `right-click -> Find Usages` -![Refactor 4](/assets/images/refactor4.png) +![Refactor 4](/assets/images/tools/refactor4.png) Above image shows the various usages CLion found of the private variable `costMap` inside the repository. diff --git a/wiki/tools/code-editors-introduction-to-vs-code-and-vim.md b/wiki/tools/code-editors-introduction-to-vs-code-and-vim.md index 72fe0133..04a7d5f6 100644 --- a/wiki/tools/code-editors-introduction-to-vs-code-and-vim.md +++ b/wiki/tools/code-editors-introduction-to-vs-code-and-vim.md @@ -51,16 +51,16 @@ A link for [downloading](https://code.visualstudio.com/download). 2. Open VS Code (can use the Linux search/windows button). Source folders into the workspace. 3. The top left tab gives you file explorer. Click it! -![File Explorer](/assets/images/vscode4.png) +![File Explorer](/assets/images/tools/vscode4.png) #### Features 1. **Keyword search**: Right-click inside the file explorer space. Check out “Find in Folder..” and try searching for a keyword and you’d see lightning fast multi-file search (or) click on the search button below the explorer and use the find and replace options. -![Keyword Search](/assets/images/vscode11.png) +![Keyword Search](/assets/images/tools/vscode11.png) 2. **Seek definition**: Open any file and right-click to peek at the definition of functions. Why is this useful? Reading code implies trying to figure out what each function is doing. Super useful in projects. Works for variables, classes, functions. You name it. VS-code can define it. -![Seek Definition](/assets/images/vscode5.png) +![Seek Definition](/assets/images/tools/vscode5.png) 3. **Open the file by name**: Ctrl+P, and type file name. 4. **Shortcuts**: I use sublime shortcuts on VS Code. That’s the cool thing. You can configure it to work for your style. How to configure? You can install a sublime text key-bindings plugin. More on plugins later. But this specific one is called: ms-vscode.sublime-keybindings. @@ -76,15 +76,15 @@ Add all custom shortcuts in preferences, keyboard shortcuts. Do ctrl+shift+P and 5. **Integrated terminal**: Click on terminal and open a new terminal. -![Open terminal](/assets/images/vscode2.png) +![Open terminal](/assets/images/tools/vscode2.png) Now you can run programs without rotating between terminal and editor. Reduces a lot of strain on the eyes. You can also create multiple screens in the terminal. 6. **Python debugger**: You can put breakpoints and run python programs and look into the state of the program for faster debugging. Click next to the line number and that should drop a BP. Now start debugging. Choose whichever option makes sense (for trials go for current file). -![Python Breakpoint - 1](/assets/images/vscode10.png) -![Python Breakpoint - 2](/assets/images/vscode8.png) -![Python Breakpoint - 3](/assets/images/vscode3.png) +![Python Breakpoint - 1](/assets/images/tools/vscode10.png) +![Python Breakpoint - 2](/assets/images/tools/vscode8.png) +![Python Breakpoint - 3](/assets/images/tools/vscode3.png) You can step through the lines or move to the next BP or let the program run till the end. @@ -92,7 +92,7 @@ Drawback: Image data cannot be displayed. Spyder offers that option. You cannot 7. **Language support**: What we MRSD people use? It supports all of it. Python, C++, Markdown, JSON, YAML, XML, CMake. How to change? Click on python/whatever there is. -![Language Support](/assets/images/vscode6.png) +![Language Support](/assets/images/tools/vscode6.png) Random thoughts: Spaces to tabs, the right-hand small screen helps find easy chunks of code, terminal focus shortcuts, file explorer shows modified files, tracked/untracked files, squiggles show if invalid syntax, auto-complete, function argument list displays. @@ -100,15 +100,15 @@ Random thoughts: Spaces to tabs, the right-hand small screen helps find easy chu 1. **Git graph**: I think git support is auto existing on baseline VS Code but this just ups it. Why good? -![tracking/modification status](/assets/images/vscode9.png) +![tracking/modification status](/assets/images/tools/vscode9.png) When you do a git rebase/merge, conflicts show up in nice blocks which you can just choose. No more million backspaces to remove code. -![git rebase/merge](/assets/images/vscode12.png) +![git rebase/merge](/assets/images/tools/vscode12.png) If you use it with the integrated terminal, you can just choose a file from the terminal output, choose a block of code to stay, and continue rebasing. -![The graph: click on the git graph button on the bottom toolbar and voila](/assets/images/vscode13.png) +![The graph: click on the git graph button on the bottom toolbar and voila](/assets/images/tools/vscode13.png) 2. **Python**: This covers all the python debugging tools + module search functionality. diff --git a/wiki/tools/docker-security.md b/wiki/tools/docker-security.md index 1204c066..ea405a8e 100644 --- a/wiki/tools/docker-security.md +++ b/wiki/tools/docker-security.md @@ -88,7 +88,7 @@ whoami # Success!! ## Mitigation of Privilege Escalation -![images/privesc.png](/assets/images/privesc.png) +![images/privesc.png](/assets/images/tools/privesc.png) ## Exposed Docker Socket @@ -98,7 +98,7 @@ If docker.sock is mounted from the host into a container, we can use docker.sock The Docker socket is a type of UNIX socket used by the Docker CLI to execute Docker commands with root privileges. docker.sock is not originally present inside the container, but users inside the container may need to mount it to manage or create other containers. However, mounting docker.sock inside the container increases the attack surface and poses a security risk. -![images/docker_socket.png](../../assets/images/docker_socket.png) +![images/docker_socket.png](../../assets/images/tools/docker_socket.png) Next, we will go through the steps of the demo experiment: diff --git a/wiki/tools/ros-gui.md b/wiki/tools/ros-gui.md index 7dd99ad1..aaaa6577 100644 --- a/wiki/tools/ros-gui.md +++ b/wiki/tools/ros-gui.md @@ -32,7 +32,7 @@ $ pip install PyQt5 This is the final application you can get by following this tutorial. Blocks that require customization will be explained in the documentation. -![Final QT](/assets/images/PyQt-final.png) +![Final QT](/assets/images/tools/PyQt-final.png) ## Application Walkthrough @@ -51,13 +51,13 @@ The system level timer captures the time taken between the start and the end of The color change for the timers are as follows: Green Button -![Green Button](/assets/images/PyQt-green.png) +![Green Button](/assets/images/tools/PyQt-green.png) Yellow Button -![Yellow Button](/assets/images/PyQt-yellow.png) +![Yellow Button](/assets/images/tools/PyQt-yellow.png) Orange Button -![Orange Button](/assets/images/PyQt-orange.png) +![Orange Button](/assets/images/tools/PyQt-orange.png) Red Button -![Red Button](/assets/images/PyQt-red.png) +![Red Button](/assets/images/tools/PyQt-red.png) The code block for this is given here: ```python @@ -82,7 +82,7 @@ The task level timer captures the time taken between the start and the end of on One additional feature of the task level timer is it saves the task logs. These are outputted in the `Task Times` block that is directly below the button. -![Red Button](/assets/images/PyQt-logs.png) +![Red Button](/assets/images/tools/PyQt-logs.png) ``` def TaskTimerBlock(self): diff --git a/wiki/tools/roslibjs.md b/wiki/tools/roslibjs.md index b4c4a428..b79bd23f 100644 --- a/wiki/tools/roslibjs.md +++ b/wiki/tools/roslibjs.md @@ -167,7 +167,7 @@ image_topic.subscribe(function(message) { Here is an example of a dashboard (DeltaViz) for Delta Autonomy developed by [me](mailto:heethesh@gmail.com). The GUI makes use of ROS diagnostic message to monitor FPS of different nodes in the pipeline, subscribes to images and virtual camera stream from Rviz, and also has sound alerts and flashes to notify the users (developed for their specific use-case). The source code is available on our repository [here](https://github.com/deltaautonomy/delta_viz/blob/master/delta_viz_app/index.html). -![](/assets/images/deltaviz.jpg) +![](/assets/images/tools/deltaviz.jpg) ## See Also - A [tutorial](https://roboticsknowledgebase.com/wiki/tools/stream-rviz) on setting up virtual cameras and lighting in Rviz and stream these images which can be used in your GUI or for other applications within ROS. From 0fee4008af96ad29fa95aeaa38571c7620fb8be2 Mon Sep 17 00:00:00 2001 From: Nevin Valsaraj Date: Wed, 11 Mar 2026 00:10:26 -0700 Subject: [PATCH 4/6] docs(wiki): fix typo and subfolder move for autoware blevel image --- assets/images/simulation/autoware_blevel.png | Bin 0 -> 692151 bytes wiki/simulation/NDT-Matching-with-Autoware.md | 2 +- wiki/simulation/__all_subsections.md | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 assets/images/simulation/autoware_blevel.png diff --git a/assets/images/simulation/autoware_blevel.png b/assets/images/simulation/autoware_blevel.png new file mode 100644 index 0000000000000000000000000000000000000000..2b7ac360b52110d2e0966e0e3e6009db0b99725b GIT binary patch literal 692151 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

~$tz?`r5SBOyaZ`e62?d|5JHb{BMbWN{(%3n& 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�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 z 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

mI%SyB%iQas4^K`=G)ek0nxZ4}Xq2~RBqtU@ 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%0AS2ny4^TJ^^pVtM){T6sho*N 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

W8_x`Iri?Q;$Z)dt377AD8V$w9>w@F)&JnUp` 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 yv{MZy;g1;~7qpH$T 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 MQ2bafW)%4U0KpabA^-pY literal 0 HcmV?d00001 diff --git a/wiki/simulation/NDT-Matching-with-Autoware.md b/wiki/simulation/NDT-Matching-with-Autoware.md index 0c0507b7..3155b6c5 100644 --- a/wiki/simulation/NDT-Matching-with-Autoware.md +++ b/wiki/simulation/NDT-Matching-with-Autoware.md @@ -50,5 +50,5 @@ Then you will see the mapping running really quickly in one terminal and the num Once you have finished creating the map, save it in your desired location with either a downsampling (to reduce the file size), or full/original quality output, by using the “app” tab in the NDT_Mapping node in the Computing tab. It will save as a .pcd file that can either be viewed using PCL_Viewer (a PCL tool) or RViz with Autoware. The image below shows a map we made of NSH B-level on 29th January, 2020. To view a map in RViz, load Autoware, initialize the point cloud in the Mapping tab, and click on the TF button for a default TF. Then you should be able to launch RViz and visualize the point_map as shown below. You can change the point colours and axis colours to “intensity” and the sizes/transparencies as well. -![PCD of B-Level RI](/assets/images/autoware_blevel.png) +![PCD of B-Level RI](/assets/images/simulation/autoware_blevel.png) diff --git a/wiki/simulation/__all_subsections.md b/wiki/simulation/__all_subsections.md index 5f4e3865..b5f66772 100644 --- a/wiki/simulation/__all_subsections.md +++ b/wiki/simulation/__all_subsections.md @@ -143,7 +143,7 @@ Then you will see the mapping running really quickly in one terminal and the num Once you have finished creating the map, save it in your desired location with either a downsampling (to reduce the file size), or full/original quality output, by using the “app” tab in the NDT_Mapping node in the Computing tab. It will save as a .pcd file that can either be viewed using PCL_Viewer (a PCL tool) or RViz with Autoware. The image below shows a map we made of NSH B-level on 29th January, 2020. To view a map in RViz, load Autoware, initialize the point cloud in the Mapping tab, and click on the TF button for a default TF. Then you should be able to launch RViz and visualize the point_map as shown below. You can change the point colours and axis colours to “intensity” and the sizes/transparencies as well. -![PCD of B-Level RI](/assets/images/autoware_blevel.png) +![PCD of B-Level RI](/assets/images/simulation/autoware_blevel.png) /wiki/simulation/simulating-vehicle-using-autoware/ From 6aff3fdd51ebb904de3ab91b5e671c094eef03cb Mon Sep 17 00:00:00 2001 From: Nevin Valsaraj Date: Wed, 11 Mar 2026 00:17:15 -0700 Subject: [PATCH 5/6] docs(wiki): restore tag placeholder in roslibjs tutorial --- wiki/tools/__all_subsections.md | 2 +- wiki/tools/roslibjs.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/wiki/tools/__all_subsections.md b/wiki/tools/__all_subsections.md index 620a8553..c1e6ca9d 100644 --- a/wiki/tools/__all_subsections.md +++ b/wiki/tools/__all_subsections.md @@ -1980,7 +1980,7 @@ You can do more advanced stuff such as subscribing to images, Rviz visualization To visualize and update an image stream live within your web app, first you need a placeholder in HTML for your image. Define it as follows within the `body` tag with an unique ID to update it later via JavaScript. ``` - + ``` Now, you can create a topic handler and subscribe to your image from ROS. Note that, if you want to integrate image streams with `roslibjs`, the ROS socket bridge expects images in compressed format. See this section [here](https://roboticsknowledgebase.com/wiki/tools/stream-rviz/compressing-image-streams) for more details on setting up image compression for your topics. diff --git a/wiki/tools/roslibjs.md b/wiki/tools/roslibjs.md index b79bd23f..61a782e2 100644 --- a/wiki/tools/roslibjs.md +++ b/wiki/tools/roslibjs.md @@ -145,6 +145,7 @@ You can do more advanced stuff such as subscribing to images, Rviz visualization To visualize and update an image stream live within your web app, first you need a placeholder in HTML for your image. Define it as follows within the `body` tag with an unique ID to update it later via JavaScript. ``` + ``` Now, you can create a topic handler and subscribe to your image from ROS. Note that, if you want to integrate image streams with `roslibjs`, the ROS socket bridge expects images in compressed format. See this section [here](https://roboticsknowledgebase.com/wiki/tools/stream-rviz/compressing-image-streams) for more details on setting up image compression for your topics. From 52b071e4133a5b253abd67bb1a57f4590064e70e Mon Sep 17 00:00:00 2001 From: Nevin Valsaraj Date: Wed, 11 Mar 2026 00:21:34 -0700 Subject: [PATCH 6/6] docs(wiki): fix relative image path in docker security tutorial --- wiki/tools/__all_subsections.md | 2 +- wiki/tools/docker-security.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wiki/tools/__all_subsections.md b/wiki/tools/__all_subsections.md index c1e6ca9d..c9e219a4 100644 --- a/wiki/tools/__all_subsections.md +++ b/wiki/tools/__all_subsections.md @@ -559,7 +559,7 @@ If docker.sock is mounted from the host into a container, we can use docker.sock The Docker socket is a type of UNIX socket used by the Docker CLI to execute Docker commands with root privileges. docker.sock is not originally present inside the container, but users inside the container may need to mount it to manage or create other containers. However, mounting docker.sock inside the container increases the attack surface and poses a security risk. -![images/docker_socket.png](../../assets/images/tools/docker_socket.png) +![images/docker_socket.png](/assets/images/tools/docker_socket.png) Next, we will go through the steps of the demo experiment: diff --git a/wiki/tools/docker-security.md b/wiki/tools/docker-security.md index ea405a8e..103d8511 100644 --- a/wiki/tools/docker-security.md +++ b/wiki/tools/docker-security.md @@ -98,7 +98,7 @@ If docker.sock is mounted from the host into a container, we can use docker.sock The Docker socket is a type of UNIX socket used by the Docker CLI to execute Docker commands with root privileges. docker.sock is not originally present inside the container, but users inside the container may need to mount it to manage or create other containers. However, mounting docker.sock inside the container increases the attack surface and poses a security risk. -![images/docker_socket.png](../../assets/images/tools/docker_socket.png) +![images/docker_socket.png](/assets/images/tools/docker_socket.png) Next, we will go through the steps of the demo experiment: