├── robmob ├── __init__.py ├── kobuki │ ├── __init__.py │ └── commands.py ├── rover │ ├── __init__.py │ └── commands.py ├── simulation.py ├── geometry.py ├── commands.py ├── sensors.py ├── visualization.py ├── ros2numpy.py ├── point_cloud.py ├── icp_orig.py └── icp.py ├── robmob_test ├── __init__.py ├── aruco_test.py └── robot_test.py ├── scripts ├── backup │ ├── reboot.sh │ ├── poweroff.sh │ ├── touch.sh │ ├── upgrade_ubuntu.sh │ ├── grub_timeout.sh │ └── to_all_robots.sh ├── shutdown_jupyter.sh ├── README.md ├── jupyter.service ├── jupyter.sh ├── ros_rover.service ├── ros_rover.sh └── setup.sh ├── doc ├── rviz.png ├── kobuki.jpg ├── mapping.png ├── router.jpg ├── kangaroo.jpg ├── gazebo_intro.png ├── gazebo_slope.png ├── jupyterexample.png ├── port_forwarding.png ├── studentlaptop.jpg ├── port_forwarding_rule.png ├── software_architecture.odg └── software_architecture.png ├── img ├── depth_g.png ├── hokuyo.jpg ├── Sharp_exp1.png ├── Sharp_exp2.png ├── kalman-ir.png ├── rplidar.jpeg ├── Sharp_2Y0A02.jpg ├── calcul_angle.png ├── gyro_schema.png ├── kinect-noise.png ├── Sharp_datasheet.png ├── gyro_datasheet.png ├── kinect-noise-2.png ├── montage_crayon.png ├── vitesse_kobuki.png ├── montage_rotation.png ├── gyro_new_datasheet.png └── assemblage_calibration.jpg ├── point_cloud ├── resources │ ├── textures │ │ ├── skyboxsun25degtest.txt │ │ ├── skybox │ │ │ ├── skyboxsun25degtest.txt │ │ │ ├── nx.jpg │ │ │ ├── ny.jpg │ │ │ ├── nz.jpg │ │ │ ├── px.jpg │ │ │ ├── py.jpg │ │ │ └── pz.jpg │ │ ├── LICENSE │ │ ├── background.gif │ │ └── skyboxsun25degtest.png │ └── icons │ │ ├── angle.png │ │ ├── area.png │ │ ├── focus.png │ │ ├── sphere.png │ │ ├── volume.png │ │ ├── distance.png │ │ ├── flip_y_z.png │ │ ├── profile.png │ │ ├── clip_volume.png │ │ ├── fps_controls.png │ │ ├── earth_controls.png │ │ ├── earth_controls_1.png │ │ ├── orbit_controls.png │ │ ├── distance.svg │ │ ├── clip_volume.svg │ │ └── sphere.svg ├── data │ └── r │ │ ├── r.bin │ │ └── r.hrc ├── libs │ ├── Cesium │ │ ├── Assets │ │ │ └── Textures │ │ │ │ ├── maki │ │ │ │ ├── bank.png │ │ │ │ ├── bar.png │ │ │ │ ├── beer.png │ │ │ │ ├── bus.png │ │ │ │ ├── cafe.png │ │ │ │ ├── car.png │ │ │ │ ├── city.png │ │ │ │ ├── dam.png │ │ │ │ ├── farm.png │ │ │ │ ├── fuel.png │ │ │ │ ├── gift.png │ │ │ │ ├── golf.png │ │ │ │ ├── park.png │ │ │ │ ├── post.png │ │ │ │ ├── rail.png │ │ │ │ ├── shop.png │ │ │ │ ├── star.png │ │ │ │ ├── town.png │ │ │ │ ├── zoo.png │ │ │ │ ├── bakery.png │ │ │ │ ├── camera.png │ │ │ │ ├── cesium.png │ │ │ │ ├── cinema.png │ │ │ │ ├── circle.png │ │ │ │ ├── cross.png │ │ │ │ ├── danger.png │ │ │ │ ├── ferry.png │ │ │ │ ├── garden.png │ │ │ │ ├── harbor.png │ │ │ │ ├── heart.png │ │ │ │ ├── marker.png │ │ │ │ ├── museum.png │ │ │ │ ├── music.png │ │ │ │ ├── park2.png │ │ │ │ ├── pitch.png │ │ │ │ ├── police.png │ │ │ │ ├── prison.png │ │ │ │ ├── rocket.png │ │ │ │ ├── school.png │ │ │ │ ├── skiing.png │ │ │ │ ├── soccer.png │ │ │ │ ├── square.png │ │ │ │ ├── tennis.png │ │ │ │ ├── water.png │ │ │ │ ├── airfield.png │ │ │ │ ├── airport.png │ │ │ │ ├── baseball.png │ │ │ │ ├── bicycle.png │ │ │ │ ├── building.png │ │ │ │ ├── campsite.png │ │ │ │ ├── cemetery.png │ │ │ │ ├── chemist.png │ │ │ │ ├── college.png │ │ │ │ ├── cricket.png │ │ │ │ ├── dog-park.png │ │ │ │ ├── embassy.png │ │ │ │ ├── entrance.png │ │ │ │ ├── fast-food.png │ │ │ │ ├── grocery.png │ │ │ │ ├── heliport.png │ │ │ │ ├── hospital.png │ │ │ │ ├── ice-cream.png │ │ │ │ ├── land-use.png │ │ │ │ ├── laundry.png │ │ │ │ ├── library.png │ │ │ │ ├── lodging.png │ │ │ │ ├── logging.png │ │ │ │ ├── minefield.png │ │ │ │ ├── monument.png │ │ │ │ ├── oil-well.png │ │ │ │ ├── parking.png │ │ │ │ ├── pharmacy.png │ │ │ │ ├── roadblock.png │ │ │ │ ├── scooter.png │ │ │ │ ├── suitcase.png │ │ │ │ ├── swimming.png │ │ │ │ ├── telephone.png │ │ │ │ ├── theatre.png │ │ │ │ ├── toilets.png │ │ │ │ ├── town-hall.png │ │ │ │ ├── triangle.png │ │ │ │ ├── village.png │ │ │ │ ├── warehouse.png │ │ │ │ ├── wetland.png │ │ │ │ ├── art-gallery.png │ │ │ │ ├── basketball.png │ │ │ │ ├── commercial.png │ │ │ │ ├── disability.png │ │ │ │ ├── hairdresser.png │ │ │ │ ├── industrial.png │ │ │ │ ├── lighthouse.png │ │ │ │ ├── mobilephone.png │ │ │ │ ├── playground.png │ │ │ │ ├── rail-above.png │ │ │ │ ├── rail-light.png │ │ │ │ ├── rail-metro.png │ │ │ │ ├── restaurant.png │ │ │ │ ├── alcohol-shop.png │ │ │ │ ├── circle-stroked.png │ │ │ │ ├── clothing-store.png │ │ │ │ ├── fire-station.png │ │ │ │ ├── marker-stroked.png │ │ │ │ ├── parking-garage.png │ │ │ │ ├── polling-place.png │ │ │ │ ├── slaughterhouse.png │ │ │ │ ├── square-stroked.png │ │ │ │ ├── star-stroked.png │ │ │ │ ├── waste-basket.png │ │ │ │ ├── america-football.png │ │ │ │ ├── place-of-worship.png │ │ │ │ ├── rail-underground.png │ │ │ │ ├── religious-jewish.png │ │ │ │ ├── religious-muslim.png │ │ │ │ ├── triangle-stroked.png │ │ │ │ ├── emergency-telephone.png │ │ │ │ ├── london-underground.png │ │ │ │ └── religious-christian.png │ │ │ │ ├── moonSmall.jpg │ │ │ │ ├── waterNormals.jpg │ │ │ │ ├── waterNormalsSmall.jpg │ │ │ │ ├── NaturalEarthII │ │ │ │ ├── 0 │ │ │ │ │ ├── 0 │ │ │ │ │ │ └── 0.jpg │ │ │ │ │ └── 1 │ │ │ │ │ │ └── 0.jpg │ │ │ │ ├── 1 │ │ │ │ │ ├── 0 │ │ │ │ │ │ ├── 0.jpg │ │ │ │ │ │ └── 1.jpg │ │ │ │ │ ├── 1 │ │ │ │ │ │ ├── 0.jpg │ │ │ │ │ │ └── 1.jpg │ │ │ │ │ ├── 2 │ │ │ │ │ │ ├── 0.jpg │ │ │ │ │ │ └── 1.jpg │ │ │ │ │ └── 3 │ │ │ │ │ │ ├── 0.jpg │ │ │ │ │ │ └── 1.jpg │ │ │ │ ├── 2 │ │ │ │ │ ├── 0 │ │ │ │ │ │ ├── 0.jpg │ │ │ │ │ │ ├── 1.jpg │ │ │ │ │ │ ├── 2.jpg │ │ │ │ │ │ └── 3.jpg │ │ │ │ │ ├── 1 │ │ │ │ │ │ ├── 0.jpg │ │ │ │ │ │ ├── 1.jpg │ │ │ │ │ │ ├── 2.jpg │ │ │ │ │ │ └── 3.jpg │ │ │ │ │ ├── 2 │ │ │ │ │ │ ├── 0.jpg │ │ │ │ │ │ ├── 1.jpg │ │ │ │ │ │ ├── 2.jpg │ │ │ │ │ │ └── 3.jpg │ │ │ │ │ ├── 3 │ │ │ │ │ │ ├── 0.jpg │ │ │ │ │ │ ├── 1.jpg │ │ │ │ │ │ ├── 2.jpg │ │ │ │ │ │ └── 3.jpg │ │ │ │ │ ├── 4 │ │ │ │ │ │ ├── 0.jpg │ │ │ │ │ │ ├── 1.jpg │ │ │ │ │ │ ├── 2.jpg │ │ │ │ │ │ └── 3.jpg │ │ │ │ │ ├── 5 │ │ │ │ │ │ ├── 0.jpg │ │ │ │ │ │ ├── 1.jpg │ │ │ │ │ │ ├── 2.jpg │ │ │ │ │ │ └── 3.jpg │ │ │ │ │ ├── 6 │ │ │ │ │ │ ├── 0.jpg │ │ │ │ │ │ ├── 1.jpg │ │ │ │ │ │ ├── 2.jpg │ │ │ │ │ │ └── 3.jpg │ │ │ │ │ └── 7 │ │ │ │ │ │ ├── 0.jpg │ │ │ │ │ │ ├── 1.jpg │ │ │ │ │ │ ├── 2.jpg │ │ │ │ │ │ └── 3.jpg │ │ │ │ └── tilemapresource.xml │ │ │ │ ├── SkyBox │ │ │ │ ├── tycho2t3_80_mx.jpg │ │ │ │ ├── tycho2t3_80_my.jpg │ │ │ │ ├── tycho2t3_80_mz.jpg │ │ │ │ ├── tycho2t3_80_px.jpg │ │ │ │ ├── tycho2t3_80_py.jpg │ │ │ │ └── tycho2t3_80_pz.jpg │ │ │ │ └── pin.svg │ │ ├── Widgets │ │ │ ├── Images │ │ │ │ ├── info-loading.gif │ │ │ │ ├── TimelineIcons.png │ │ │ │ ├── Cesium_Logo_overlay.png │ │ │ │ ├── TerrainProviders │ │ │ │ │ ├── STK.png │ │ │ │ │ └── Ellipsoid.png │ │ │ │ ├── ImageryProviders │ │ │ │ │ ├── bingAerial.png │ │ │ │ │ ├── bingRoads.png │ │ │ │ │ ├── blackMarble.png │ │ │ │ │ ├── openStreetMap.png │ │ │ │ │ ├── stamenToner.png │ │ │ │ │ ├── naturalEarthII.png │ │ │ │ │ ├── bingAerialLabels.png │ │ │ │ │ ├── esriWorldImagery.png │ │ │ │ │ ├── esriWorldStreetMap.png │ │ │ │ │ ├── stamenWatercolor.png │ │ │ │ │ ├── esriNationalGeographic.png │ │ │ │ │ └── mapQuestOpenStreetMap.png │ │ │ │ └── NavigationHelp │ │ │ │ │ └── Touch.svg │ │ │ ├── FullscreenButton │ │ │ │ └── FullscreenButton.css │ │ │ ├── CesiumWidget │ │ │ │ ├── lighter.css │ │ │ │ └── CesiumWidget.css │ │ │ ├── PerformanceWatchdog │ │ │ │ └── PerformanceWatchdog.css │ │ │ ├── Geocoder │ │ │ │ ├── lighter.css │ │ │ │ └── Geocoder.css │ │ │ ├── Timeline │ │ │ │ ├── lighter.css │ │ │ │ └── Timeline.css │ │ │ ├── SelectionIndicator │ │ │ │ └── SelectionIndicator.css │ │ │ ├── BaseLayerPicker │ │ │ │ ├── lighter.css │ │ │ │ └── BaseLayerPicker.css │ │ │ ├── lighterShared.css │ │ │ ├── NavigationHelpButton │ │ │ │ ├── lighter.css │ │ │ │ └── NavigationHelpButton.css │ │ │ ├── Viewer │ │ │ │ └── Viewer.css │ │ │ ├── shared.css │ │ │ ├── Animation │ │ │ │ ├── lighter.css │ │ │ │ └── Animation.css │ │ │ ├── SceneModePicker │ │ │ │ └── SceneModePicker.css │ │ │ ├── CesiumInspector │ │ │ │ └── CesiumInspector.css │ │ │ └── InfoBox │ │ │ │ ├── InfoBox.css │ │ │ │ └── InfoBoxDescription.css │ │ └── Workers │ │ │ └── transferTypedArrayTest.js │ ├── three.js │ │ ├── LICENSE │ │ └── README.md │ ├── proj4 │ │ └── LICENSE.md │ ├── other │ │ ├── stats.min.js │ │ └── BinaryHeap.js │ ├── plasio │ │ ├── js │ │ │ └── client.js │ │ └── workers │ │ │ └── laz-loader-worker.js │ └── signals │ │ ├── signals.min.js │ │ └── README.md ├── cloud.js ├── css │ └── potree.css └── js │ └── ProgressBar.js ├── offline ├── Labo 2 │ └── calib.npy ├── Labo 3 │ ├── focal.png │ ├── local_1.png │ ├── local_2.png │ ├── local_3.png │ ├── local_4.png │ └── Labo 3.md └── Labo 6 │ └── lab6_offline_data.txt ├── server ├── robot_upstart.sh ├── all_robots_example.sh ├── robmob.launch └── post_install_script.sh ├── travaux_pratiques └── Installation Laboratoire Introduction Robotique mobile.pdf ├── contact └── contact.txt ├── plans ├── lab4.org ├── lab6.org ├── lab2.org └── lab0.org ├── requirements.txt ├── admin └── README.md ├── .gitignore ├── FullOdomSensor.ipynb ├── RobotCheckup.ipynb ├── TestJulia.ipynb ├── IR-Test.ipynb ├── collect └── CollectTest.ipynb └── Kinect Test.ipynb /robmob/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /robmob_test/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /robmob/kobuki/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /robmob/rover/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /robmob/simulation.py: -------------------------------------------------------------------------------- 1 | IN_SIMULATION = True 2 | -------------------------------------------------------------------------------- /scripts/backup/reboot.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | reboot 3 | -------------------------------------------------------------------------------- /scripts/backup/poweroff.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | poweroff 3 | -------------------------------------------------------------------------------- /scripts/backup/touch.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | touch /tmp/my_ding_dong 3 | -------------------------------------------------------------------------------- /doc/rviz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/doc/rviz.png -------------------------------------------------------------------------------- /doc/kobuki.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/doc/kobuki.jpg -------------------------------------------------------------------------------- /doc/mapping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/doc/mapping.png -------------------------------------------------------------------------------- /doc/router.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/doc/router.jpg -------------------------------------------------------------------------------- /img/depth_g.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/depth_g.png -------------------------------------------------------------------------------- /img/hokuyo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/hokuyo.jpg -------------------------------------------------------------------------------- /doc/kangaroo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/doc/kangaroo.jpg -------------------------------------------------------------------------------- /img/Sharp_exp1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/Sharp_exp1.png -------------------------------------------------------------------------------- /img/Sharp_exp2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/Sharp_exp2.png -------------------------------------------------------------------------------- /img/kalman-ir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/kalman-ir.png -------------------------------------------------------------------------------- /img/rplidar.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/rplidar.jpeg -------------------------------------------------------------------------------- /scripts/backup/upgrade_ubuntu.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | apt-get update && apt-get -y upgrade 3 | -------------------------------------------------------------------------------- /doc/gazebo_intro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/doc/gazebo_intro.png -------------------------------------------------------------------------------- /doc/gazebo_slope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/doc/gazebo_slope.png -------------------------------------------------------------------------------- /img/Sharp_2Y0A02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/Sharp_2Y0A02.jpg -------------------------------------------------------------------------------- /img/calcul_angle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/calcul_angle.png -------------------------------------------------------------------------------- /img/gyro_schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/gyro_schema.png -------------------------------------------------------------------------------- /img/kinect-noise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/kinect-noise.png -------------------------------------------------------------------------------- /point_cloud/resources/textures/skyboxsun25degtest.txt: -------------------------------------------------------------------------------- 1 | http://reije081.home.xs4all.nl/skyboxes/ 2 | -------------------------------------------------------------------------------- /doc/jupyterexample.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/doc/jupyterexample.png -------------------------------------------------------------------------------- /doc/port_forwarding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/doc/port_forwarding.png -------------------------------------------------------------------------------- /doc/studentlaptop.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/doc/studentlaptop.jpg -------------------------------------------------------------------------------- /img/Sharp_datasheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/Sharp_datasheet.png -------------------------------------------------------------------------------- /img/gyro_datasheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/gyro_datasheet.png -------------------------------------------------------------------------------- /img/kinect-noise-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/kinect-noise-2.png -------------------------------------------------------------------------------- /img/montage_crayon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/montage_crayon.png -------------------------------------------------------------------------------- /img/vitesse_kobuki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/vitesse_kobuki.png -------------------------------------------------------------------------------- /img/montage_rotation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/montage_rotation.png -------------------------------------------------------------------------------- /offline/Labo 2/calib.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/offline/Labo 2/calib.npy -------------------------------------------------------------------------------- /offline/Labo 3/focal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/offline/Labo 3/focal.png -------------------------------------------------------------------------------- /point_cloud/data/r/r.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/data/r/r.bin -------------------------------------------------------------------------------- /point_cloud/data/r/r.hrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/data/r/r.hrc -------------------------------------------------------------------------------- /point_cloud/resources/textures/skybox/skyboxsun25degtest.txt: -------------------------------------------------------------------------------- 1 | http://reije081.home.xs4all.nl/skyboxes/ 2 | -------------------------------------------------------------------------------- /doc/port_forwarding_rule.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/doc/port_forwarding_rule.png -------------------------------------------------------------------------------- /img/gyro_new_datasheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/gyro_new_datasheet.png -------------------------------------------------------------------------------- /offline/Labo 3/local_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/offline/Labo 3/local_1.png -------------------------------------------------------------------------------- /offline/Labo 3/local_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/offline/Labo 3/local_2.png -------------------------------------------------------------------------------- /offline/Labo 3/local_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/offline/Labo 3/local_3.png -------------------------------------------------------------------------------- /offline/Labo 3/local_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/offline/Labo 3/local_4.png -------------------------------------------------------------------------------- /doc/software_architecture.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/doc/software_architecture.odg -------------------------------------------------------------------------------- /doc/software_architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/doc/software_architecture.png -------------------------------------------------------------------------------- /img/assemblage_calibration.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/img/assemblage_calibration.jpg -------------------------------------------------------------------------------- /point_cloud/resources/textures/LICENSE: -------------------------------------------------------------------------------- 1 | background: 2 | http://halfblog.net/2012/09/22/minimalistic-iphone-5-wallpapers/ -------------------------------------------------------------------------------- /scripts/shutdown_jupyter.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | ps aux | grep jupyter | awk '{print $2}' | xargs kill || true 3 | -------------------------------------------------------------------------------- /point_cloud/resources/icons/angle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/icons/angle.png -------------------------------------------------------------------------------- /point_cloud/resources/icons/area.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/icons/area.png -------------------------------------------------------------------------------- /point_cloud/resources/icons/focus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/icons/focus.png -------------------------------------------------------------------------------- /point_cloud/resources/icons/sphere.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/icons/sphere.png -------------------------------------------------------------------------------- /point_cloud/resources/icons/volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/icons/volume.png -------------------------------------------------------------------------------- /server/robot_upstart.sh: -------------------------------------------------------------------------------- 1 | rosrun kobuki_ftdi create_udev_rules 2 | rosrun robot_upstart install kobuki_node/launch/robmob.launch 3 | -------------------------------------------------------------------------------- /point_cloud/resources/icons/distance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/icons/distance.png -------------------------------------------------------------------------------- /point_cloud/resources/icons/flip_y_z.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/icons/flip_y_z.png -------------------------------------------------------------------------------- /point_cloud/resources/icons/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/icons/profile.png -------------------------------------------------------------------------------- /point_cloud/resources/icons/clip_volume.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/icons/clip_volume.png -------------------------------------------------------------------------------- /point_cloud/resources/icons/fps_controls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/icons/fps_controls.png -------------------------------------------------------------------------------- /point_cloud/resources/textures/background.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/textures/background.gif -------------------------------------------------------------------------------- /point_cloud/resources/textures/skybox/nx.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/textures/skybox/nx.jpg -------------------------------------------------------------------------------- /point_cloud/resources/textures/skybox/ny.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/textures/skybox/ny.jpg -------------------------------------------------------------------------------- /point_cloud/resources/textures/skybox/nz.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/textures/skybox/nz.jpg -------------------------------------------------------------------------------- /point_cloud/resources/textures/skybox/px.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/textures/skybox/px.jpg -------------------------------------------------------------------------------- /point_cloud/resources/textures/skybox/py.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/textures/skybox/py.jpg -------------------------------------------------------------------------------- /point_cloud/resources/textures/skybox/pz.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/textures/skybox/pz.jpg -------------------------------------------------------------------------------- /point_cloud/resources/icons/earth_controls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/icons/earth_controls.png -------------------------------------------------------------------------------- /point_cloud/resources/icons/earth_controls_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/icons/earth_controls_1.png -------------------------------------------------------------------------------- /point_cloud/resources/icons/orbit_controls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/icons/orbit_controls.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/bank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/bank.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/bar.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/beer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/beer.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/bus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/bus.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/cafe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/cafe.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/car.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/car.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/city.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/city.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/dam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/dam.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/farm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/farm.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/fuel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/fuel.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/gift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/gift.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/golf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/golf.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/park.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/park.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/post.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/post.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/rail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/rail.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/shop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/shop.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/star.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/town.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/town.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/zoo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/zoo.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/moonSmall.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/moonSmall.jpg -------------------------------------------------------------------------------- /point_cloud/resources/textures/skyboxsun25degtest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/resources/textures/skyboxsun25degtest.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/bakery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/bakery.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/camera.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/cesium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/cesium.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/cinema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/cinema.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/circle.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/cross.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/danger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/danger.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/ferry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/ferry.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/garden.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/garden.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/harbor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/harbor.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/heart.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/marker.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/museum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/museum.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/music.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/park2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/park2.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/pitch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/pitch.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/police.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/police.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/prison.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/prison.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/rocket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/rocket.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/school.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/school.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/skiing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/skiing.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/soccer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/soccer.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/square.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/tennis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/tennis.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/water.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/water.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/info-loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/info-loading.gif -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/airfield.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/airfield.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/airport.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/airport.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/baseball.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/baseball.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/bicycle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/bicycle.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/building.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/building.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/campsite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/campsite.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/cemetery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/cemetery.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/chemist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/chemist.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/college.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/college.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/cricket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/cricket.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/dog-park.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/dog-park.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/embassy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/embassy.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/entrance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/entrance.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/fast-food.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/fast-food.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/grocery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/grocery.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/heliport.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/heliport.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/hospital.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/hospital.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/ice-cream.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/ice-cream.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/land-use.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/land-use.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/laundry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/laundry.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/library.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/library.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/lodging.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/lodging.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/logging.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/logging.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/minefield.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/minefield.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/monument.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/monument.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/oil-well.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/oil-well.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/parking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/parking.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/pharmacy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/pharmacy.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/roadblock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/roadblock.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/scooter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/scooter.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/suitcase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/suitcase.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/swimming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/swimming.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/telephone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/telephone.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/theatre.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/theatre.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/toilets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/toilets.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/town-hall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/town-hall.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/triangle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/triangle.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/village.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/village.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/warehouse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/warehouse.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/wetland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/wetland.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/waterNormals.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/waterNormals.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/TimelineIcons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/TimelineIcons.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/art-gallery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/art-gallery.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/basketball.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/basketball.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/commercial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/commercial.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/disability.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/disability.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/hairdresser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/hairdresser.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/industrial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/industrial.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/lighthouse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/lighthouse.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/mobilephone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/mobilephone.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/playground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/playground.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/rail-above.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/rail-above.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/rail-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/rail-light.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/rail-metro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/rail-metro.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/restaurant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/restaurant.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/alcohol-shop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/alcohol-shop.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/circle-stroked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/circle-stroked.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/clothing-store.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/clothing-store.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/fire-station.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/fire-station.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/marker-stroked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/marker-stroked.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/parking-garage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/parking-garage.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/polling-place.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/polling-place.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/slaughterhouse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/slaughterhouse.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/square-stroked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/square-stroked.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/star-stroked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/star-stroked.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/waste-basket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/waste-basket.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/waterNormalsSmall.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/waterNormalsSmall.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/FullscreenButton/FullscreenButton.css: -------------------------------------------------------------------------------- 1 | .cesium-button.cesium-fullscreenButton {display: block; width: 100%; height: 100%; margin: 0; border-radius: 0;} -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/Cesium_Logo_overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/Cesium_Logo_overlay.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/TerrainProviders/STK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/TerrainProviders/STK.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/0/0/0.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/0/1/0.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/1/0/0.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/1/0/1.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/1/1/0.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/1/1/1.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/1/2/0.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/1/2/1.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/1/3/0.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/1/3/1.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/0/0.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/0/1.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/0/2.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/0/3.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/1/0.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/1/1.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/1/2.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/1/3.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/2/0.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/2/1.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/2/2.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/2/3.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/3/0.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/3/1.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/3/2.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/3/3.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/4/0.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/4/1.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/4/2.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/4/3.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/5/0.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/5/1.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/5/2.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/5/3.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/6/0.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/6/1.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/6/2.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/6/3.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/7/0.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/7/1.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/7/2.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/2/7/3.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/SkyBox/tycho2t3_80_mx.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/SkyBox/tycho2t3_80_my.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/SkyBox/tycho2t3_80_mz.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/SkyBox/tycho2t3_80_px.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/SkyBox/tycho2t3_80_py.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/SkyBox/tycho2t3_80_pz.jpg -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/america-football.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/america-football.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/place-of-worship.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/place-of-worship.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/rail-underground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/rail-underground.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/religious-jewish.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/religious-jewish.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/religious-muslim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/religious-muslim.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/triangle-stroked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/triangle-stroked.png -------------------------------------------------------------------------------- /scripts/README.md: -------------------------------------------------------------------------------- 1 | # Procedure 2 | 3 | 1. Setup Wi-Fi 4 | 2. Change password with `sudo passwd norlab` -> `robmob` 5 | 3. Run `setup.sh` 6 | - Will create venv and setup services 7 | -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/emergency-telephone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/emergency-telephone.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/london-underground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/london-underground.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/maki/religious-christian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Assets/Textures/maki/religious-christian.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/bingAerial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/bingAerial.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/bingRoads.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/bingRoads.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/TerrainProviders/Ellipsoid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/TerrainProviders/Ellipsoid.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/blackMarble.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/blackMarble.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/openStreetMap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/openStreetMap.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/stamenToner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/stamenToner.png -------------------------------------------------------------------------------- /offline/Labo 3/Labo 3.md: -------------------------------------------------------------------------------- 1 | # Calibration de la focale 2 | Ouvrir `focal.png`, la largeur de la boîte est de `19.5cm` à une distance de `50cm`. 3 | 4 | # Localisation 5 | 6 | Une tuile fait `30cm` de côté. 7 | -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/naturalEarthII.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/naturalEarthII.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/bingAerialLabels.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/esriWorldImagery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/esriWorldImagery.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/esriWorldStreetMap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/esriWorldStreetMap.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/stamenWatercolor.png -------------------------------------------------------------------------------- /scripts/jupyter.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=hit service 3 | After=network-online.target 4 | 5 | [Service] 6 | ExecStart=/home/norlab/glo4001/scripts/jupyter.sh 7 | 8 | [Install] 9 | WantedBy=multi-user.target -------------------------------------------------------------------------------- /scripts/jupyter.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | cd /home/norlab/glo4001/scripts || exit 3 | #./shutdown_jupyter.sh 4 | cd /home/norlab/glo4001 || exit 5 | source venv/bin/activate 6 | jupyter notebook --allow-root 7 | -------------------------------------------------------------------------------- /travaux_pratiques/Installation Laboratoire Introduction Robotique mobile.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/travaux_pratiques/Installation Laboratoire Introduction Robotique mobile.pdf -------------------------------------------------------------------------------- /contact/contact.txt: -------------------------------------------------------------------------------- 1 | Contact session Automne 2022: william.guimont-martin.1@ulaval.ca 2 | Contact session Hiver 2022: william.guimont-martin.1@ulaval.ca 3 | Contact session Automme 2019: maxime.vaidis.1@ulaval.ca 4 | -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/esriNationalGeographic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/esriNationalGeographic.png -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norlab-ulaval/glo4001/HEAD/point_cloud/libs/Cesium/Widgets/Images/ImageryProviders/mapQuestOpenStreetMap.png -------------------------------------------------------------------------------- /scripts/ros_rover.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=ROS 3 | After=network-online.target 4 | 5 | [Service] 6 | Type=forking 7 | ExecStart=/home/norlab/glo4001/scripts/ros_rover.sh 8 | 9 | [Install] 10 | WantedBy=multi-user.target -------------------------------------------------------------------------------- /plans/lab4.org: -------------------------------------------------------------------------------- 1 | #+title: Lab4 2 | #+author: William Guimont-Martin 3 | 4 | * Buts du laboratoire 5 | - Odométrie 6 | - Encoders 7 | - Listes numpy 8 | - Intégration des encodeurs 9 | * Plan de la séance 10 | - Disponible pour répondre aux questions 11 | -------------------------------------------------------------------------------- /scripts/backup/grub_timeout.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cp /etc/default/grub /etc/default/grub.bak 3 | sed 's/GRUB_HIDDEN_TIMEOUT=[0-9]\+/GRUB_HIDDEN_TIMEOUT=1/' /etc/default/grub.bak | sed 's/GRUB_TIMEOUT=[0-9]\+$/GRUB_TIMEOUT=0/' | tee /etc/default/grub 4 | update-grub 5 | -------------------------------------------------------------------------------- /scripts/ros_rover.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | CMD="export HOME=/home/norlab && source /opt/ros/foxy/setup.bash && source /home/norlab/ros2_ws/install/setup.bash && cd /home/norlab/ros2_ws/ && ros2 launch rover_launchers rover_base_launch.xml" 3 | screen -D -R -S ros_rover -d -m bash -c "$CMD" 4 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | ninja 2 | notebook==7.2.0 3 | ipywidgets 4 | ipykernel 5 | jupyter 6 | websocket-client==0.37.0 7 | pillow 8 | scipy 9 | matplotlib 10 | pyserial 11 | opencv-python 12 | ipython 13 | ipympl 14 | prosac 15 | depthai 16 | --extra-index-url https://artifacts.luxonis.com/artifactory/luxonis-python-snapshot-local/ -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/CesiumWidget/lighter.css: -------------------------------------------------------------------------------- 1 | .cesium-lighter .cesium-widget-errorPanel {background: rgba(255, 255, 255, 0.7);} .cesium-lighter .cesium-widget-errorPanel-content {border: 1px solid #526F82; border-radius: 7px; background-color: white; color: black;} .cesium-lighter .cesium-widget-errorPanel-header {color: #B87D00;} -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/PerformanceWatchdog/PerformanceWatchdog.css: -------------------------------------------------------------------------------- 1 | .cesium-performance-watchdog-message-area {position: relative; background-color: yellow; color: black; padding: 10px;} .cesium-performance-watchdog-message {margin-right: 30px;} .cesium-performance-watchdog-message-dismiss {position: absolute; right: 0; margin: 0 10px 0 0;} -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/pin.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /plans/lab6.org: -------------------------------------------------------------------------------- 1 | #+title: Lab6 2 | #+author: William Guimont-Martin 3 | 4 | * Buts du laboratoire 5 | - Laboratoire TRÈS important 6 | - EKF! 7 | - Il faut s'assurer de bien comprendre le filtre de Kalman et le EKF! 8 | * Plan de la séance 9 | - *IMPORTANT* mettre à jour le code du laboratoire! https://github.com/norlab-ulaval/glo4001 10 | - Télécharger de nouveau le ZIP du code des laboratoires 11 | - Disponible pour répondre aux questions 12 | -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Geocoder/lighter.css: -------------------------------------------------------------------------------- 1 | .cesium-lighter .cesium-geocoder-input {border: solid 1px #759dc0; background-color: rgba(240, 240, 240, 0.9); color: black;} .cesium-lighter .cesium-viewer-geocoderContainer:hover .cesium-geocoder-input {border-color: #aef; box-shadow: 0 0 8px #fff;} .cesium-lighter .cesium-geocoder-searchButton {background-color: #e2f0ff; fill: #111;} .cesium-lighter .cesium-geocoder-searchButton:hover {background-color: #a6d2ff;} -------------------------------------------------------------------------------- /point_cloud/cloud.js: -------------------------------------------------------------------------------- 1 | {"version": "1.6", "octreeDir": "data", "boundingBox": {"lx": 357.0, "ly": 0.016213164375515447, "lz": 0.0070870311845173724, "ux": 65535.0, "uy": 6.759067715910542, "uz": 2.693692631051118}, "tightBoundingBox": {"lx": 357.0, "ly": 0.016213164375515447, "lz": 0.0070870311845173724, "ux": 65535.0, "uy": 6.759067715910542, "uz": 2.693692631051118}, "pointAttributes": ["POSITION_CARTESIAN", "COLOR_PACKED"], "spacing": 0.01, "scale": 0.01, "hierarchyStepSize": 1} -------------------------------------------------------------------------------- /plans/lab2.org: -------------------------------------------------------------------------------- 1 | #+title: Lab2 2 | #+author: William Guimont-Martin 3 | 4 | * Buts du laboratoire 5 | - Introduction au gyroscope à taux 6 | - Calibration de capteurs 7 | - Intégration des mesures 8 | - Dérive de capteurs 9 | - Création d'une carte 10 | * Plan de la séance 11 | - *IMPORTANT* mettre à jour le code du laboratoire! https://github.com/norlab-ulaval/glo4001 12 | - Télécharger de nouveau le ZIP du code des laboratoires 13 | - Disponible pour répondre aux questions 14 | -------------------------------------------------------------------------------- /server/all_robots_example.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | for ip in 192.168.0.{100..114} 4 | do 5 | echo "Starting on ${ip}" 6 | ssh -t robmob@${ip} " 7 | sudo apt-get install --yes --force-yes \ 8 | nload \ 9 | ros-indigo-compressed-image-transport && \ 10 | sudo bash -c \"curl -sSf https://raw.githubusercontent.com/davidlandry93/glo4001/master/server/robmob.launch > /opt/ros/indigo/share/kobuki_node/launch/robmob.launch\"" 11 | done 12 | echo "Done." 13 | -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Timeline/lighter.css: -------------------------------------------------------------------------------- 1 | .cesium-lighter .cesium-timeline-bar {background: -moz-linear-gradient(top, #eeeeee 0%, #ffffff 50%, #fafafa 100%); background: -webkit-linear-gradient(top, #eeeeee 0%,#ffffff 50%,#fafafa 100%); background: linear-gradient(to bottom, #eeeeee 0%,#ffffff 50%,#fafafa 100%);} .cesium-lighter .cesium-timeline-ticLabel {color: #000;} .cesium-lighter .cesium-timeline-ticMain {position: absolute; bottom: 0; left: 0; width: 1px; height: 50%; background: #000;} .cesium-lighter .cesium-timeline-ticSub {background: #444;} -------------------------------------------------------------------------------- /server/robmob.launch: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/SelectionIndicator/SelectionIndicator.css: -------------------------------------------------------------------------------- 1 | .cesium-selection-wrapper {position: absolute; width: 160px; height: 160px; pointer-events: none; visibility: hidden; opacity: 0; -webkit-transition: visibility 0s 0.2s, opacity 0.2s ease-in; -moz-transition: visibility 0s 0.2s, opacity 0.2s ease-in; transition: visibility 0s 0.2s, opacity 0.2s ease-in;} .cesium-selection-wrapper-visible {visibility: visible; opacity: 1; -webkit-transition: opacity 0.2s ease-out; -moz-transition: opacity 0.2s ease-out; transition: opacity 0.2s ease-out;} .cesium-selection-wrapper svg {fill: #2e2; stroke: #000; stroke-width: 1.1px;} -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/BaseLayerPicker/lighter.css: -------------------------------------------------------------------------------- 1 | .cesium-lighter .cesium-baseLayerPicker-itemIcon {border-color: #759dc0;} .cesium-lighter .cesium-baseLayerPicker-dropDown {background-color: rgba(240, 240, 240, 0.75);} .cesium-lighter .cesium-baseLayerPicker-sectionTitle {color: black;} .cesium-lighter .cesium-baseLayerPicker-itemLabel {color: black;} .cesium-lighter .cesium-baseLayerPicker-item:hover .cesium-baseLayerPicker-itemIcon {border-color: #000;} .cesium-lighter .cesium-baseLayerPicker-selectedItem .cesium-baseLayerPicker-itemLabel {color: rgb(0, 61, 168);} .cesium-lighter .cesium-baseLayerPicker-selectedItem .cesium-baseLayerPicker-itemIcon {border: double 4px rgb(0, 61, 168);} -------------------------------------------------------------------------------- /point_cloud/css/potree.css: -------------------------------------------------------------------------------- 1 | /* this style is to test non fullscreen canvas */ 2 | /*#renderArea{ 3 | position: absolute; 4 | width: 90%; 5 | height: 80%; 6 | top: 100px; 7 | left: 100px; 8 | right: 100px; 9 | bottom: 100px; 10 | }*/ 11 | 12 | #renderArea{ 13 | width: 100%; 14 | height: 100%; 15 | } 16 | 17 | .info{ 18 | color: white; 19 | font-weight: bold; 20 | text-shadow: 1px 1px 1px black, 21 | 1px -1px 1px black, 22 | -1px 1px 1px black, 23 | -1px -1px 1px black; 24 | } 25 | 26 | a:hover, a:visited, a:link, a:active{ 27 | color: #ccccff; 28 | text-decoration: none; 29 | } 30 | 31 | canvas { 32 | width: 100%; 33 | height: 100% 34 | } 35 | 36 | body{ 37 | margin: 0; 38 | padding: 0 39 | } -------------------------------------------------------------------------------- /scripts/backup/to_all_robots.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ $# -eq 0 ] 4 | then 5 | echo "Need a bash script as argument." 6 | exit 1 7 | fi 8 | 9 | BASH_SCRIPT_TO_SEND=$1 10 | echo "Sending $BASH_SCRIPT_TO_SEND" and executing on all robots. 11 | read -s -p "Robots password: " REMOTE_PASSWORD 12 | 13 | # for ROBOT_IP in 192.168.0.{100..114} 14 | for ROBOT_IP in 192.168.0.{100..114} 15 | do 16 | if ping -c 1 $ROBOT_IP &> /dev/null 17 | then 18 | echo "Sending script to $ROBOT_IP" 19 | scp $BASH_SCRIPT_TO_SEND robmob@$ROBOT_IP:/tmp 20 | echo "Executing script on remote machine" 21 | ssh robmob@$ROBOT_IP "chmod u+x /tmp/$BASH_SCRIPT_TO_SEND; echo $REMOTE_PASSWORD | sudo -S sh -c 'nohup /tmp/$BASH_SCRIPT_TO_SEND > /dev/null 2>&1 &'" 22 | else 23 | echo "Robot $ROBOT_IP is ded" 24 | fi 25 | done 26 | -------------------------------------------------------------------------------- /admin/README.md: -------------------------------------------------------------------------------- 1 | # Procedures to setup the robots 2 | 3 | ## Make the Orin image 4 | Follow the instructions from: [Orin Setup](OrinSetup.md) 5 | 6 | ## Flashing the Jetson image 7 | 8 | ```shell 9 | # On the correctly configured Jetson 10 | sudo dd if=/dev/sda of=jetson_img.iso bs=1M oflag=direct status=progress 11 | tar -czvf jetson_img.iso.tar.gz jetson_img.iso 12 | 13 | # On the computer 14 | # Download the image 15 | # Extract the image 16 | tar -xzvf jetson_img.iso.tar.gz 17 | # Plug the nvme drive and check the device 18 | fdisk -l 19 | pv -s 120G < jetson_img.iso > /dev/sda 20 | ``` 21 | 22 | ## Final setup 23 | 24 | ```shell 25 | # Change the password to `robmob` 26 | sudo passwd norlab 27 | # Get the code 28 | git clone https://github.com/norlab-ulaval/glo4001 29 | # Setup 30 | ~/glo4001/scripts/setup.sh 31 | # Make a Wi-Fi hotspot with the name `team-wifi` 32 | ``` -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Assets/Textures/NaturalEarthII/tilemapresource.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | NE2_HR_LC_SR_W_DR_recolored.tif 4 | 5 | EPSG:4326 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /robmob_test/aruco_test.py: -------------------------------------------------------------------------------- 1 | import time 2 | import unittest 3 | 4 | import cv2 5 | import matplotlib.pyplot as plt 6 | 7 | from robmob.robot import Robot 8 | from robmob.rover.commands import ResetCommand, MovementPWMCommand 9 | from robmob.rover.sensors import RobotEspSensor, SharpSensor, CameraRGBSensor, CameraDepthSensor, OakLiteCamera 10 | 11 | class TestRobot(unittest.TestCase): 12 | def test_connect(self): 13 | capture = cv2.VideoCapture(0) 14 | ret, frame = capture.read() 15 | capture.release() 16 | plt.imshow(frame) 17 | plt.show() 18 | 19 | arucoDict = cv2.aruco.Dictionary_get(cv2.aruco.DICT_5X5_50) 20 | arucoParams = cv2.aruco.DetectorParameters_create() 21 | (corners, ids, rejected) = cv2.aruco.detectMarkers(frame, arucoDict, 22 | parameters=arucoParams) 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/lighterShared.css: -------------------------------------------------------------------------------- 1 | .cesium-lighter .cesium-button {color: #111; fill: #111; background: #e2f0ff; border: 1px solid #759dc0;} .cesium-lighter .cesium-button:focus {color: #000; fill: #000; border-color: #ea4;} .cesium-lighter .cesium-button:hover {color: #000; fill: #000; background: #a6d2ff; border-color: #aef; box-shadow: 0 0 8px #777;} .cesium-lighter .cesium-button:active {color: #fff; fill: #fff; background: #48b; border-color: #ea0;} .cesium-lighter .cesium-button:disabled, .cesium-lighter .cesium-button-disabled, .cesium-lighter .cesium-button-disabled:focus, .cesium-lighter .cesium-button-disabled:hover, .cesium-lighter .cesium-button-disabled:active {background: #ccc; border-color: #999; color: #999; fill: #999; box-shadow: none;} .cesium-lighter .cesium-performanceDisplay {background-color: #e2f0ff; border-color: #759dc0;} .cesium-lighter .cesium-performanceDisplay-fps {color: #e52;} .cesium-lighter .cesium-performanceDisplay-ms {color: #ea4;} -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/NavigationHelpButton/lighter.css: -------------------------------------------------------------------------------- 1 | .cesium-lighter .cesium-navigation-help-instructions {border: 1px solid #759dc0; background-color: rgba(255, 255, 255, 0.9);} .cesium-lighter .cesium-navigation-help-pan {color: #66ccee; font-weight: bold;} .cesium-lighter .cesium-navigation-help-zoom {color: #65ec00; font-weight: bold;} .cesium-lighter .cesium-navigation-help-rotate {color: #eec722; font-weight: bold;} .cesium-lighter .cesium-navigation-help-tilt {color: #d800d8; font-weight: bold;} .cesium-lighter .cesium-navigation-help-details {color: #222222;} .cesium-lighter .cesium-navigation-button {color: #222222; border-top: 1px solid #759dc0; border-right: 1px solid #759dc0;} .cesium-lighter .cesium-navigation-button-selected {background-color: rgba(196, 225, 255, 0.9);} .cesium-lighter .cesium-navigation-button-unselected {background-color: rgba(226, 240, 255, 0.9);} .cesium-lighter .cesium-navigation-button-unselected:hover {background-color: rgba(166, 210, 255, 0.9);} -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/CesiumWidget/CesiumWidget.css: -------------------------------------------------------------------------------- 1 | .cesium-widget {position: relative;} .cesium-widget, .cesium-widget canvas {width: 100%; height: 100%; touch-action: none;} .cesium-widget-credits {display: block; position: absolute; bottom: 0; left: 0; color: #fff; font-size: 10px; text-shadow: 0px 0px 2px #000000; padding-right: 5px;} .cesium-widget-credits a, .cesium-widget-credits a:visited {color: #fff;} .cesium-widget-errorPanel {position: absolute; top: 0; right: 0; bottom: 0; left: 0; text-align: center; background: rgba(0, 0, 0, 0.7); z-index: 99999;} .cesium-widget-errorPanel:before {display: inline-block; vertical-align: middle; height: 100%; content: "";} .cesium-widget-errorPanel-content {width: 75%; display: inline-block; text-align: left; vertical-align: middle; border: 1px solid #526F82; border-radius: 7px; background-color: black; color: white; font-size: 10pt; padding: 1em;} .cesium-widget-errorPanel-header {font-size: 120%; color: #fe4;} .cesium-widget-errorPanel-scroll {overflow: auto; font-family: monospace; white-space: pre-wrap; padding: 0; margin: 10px 0;} .cesium-widget-errorPanel-buttonPanel {text-align: center;} -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Workers/transferTypedArrayTest.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Cesium - https://github.com/AnalyticalGraphicsInc/cesium 3 | * 4 | * Copyright 2011-2015 Cesium Contributors 5 | * 6 | * Licensed under the Apache License, Version 2.0 (the "License"); 7 | * you may not use this file except in compliance with the License. 8 | * You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, software 13 | * distributed under the License is distributed on an "AS IS" BASIS, 14 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | * See the License for the specific language governing permissions and 16 | * limitations under the License. 17 | * 18 | * Columbus View (Pat. Pend.) 19 | * 20 | * Portions licensed separately. 21 | * See https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md for full licensing details. 22 | */ 23 | "undefined"==typeof self&&(self={}),self.onmessage=function(e){"use strict";var s=e.data.array,a=self.webkitPostMessage||self.postMessage;try{a({array:s},[s.buffer])}catch(f){a({})}}; -------------------------------------------------------------------------------- /point_cloud/libs/three.js/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright © 2010-2014 three.js authors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Viewer/Viewer.css: -------------------------------------------------------------------------------- 1 | .cesium-viewer {font-family: sans-serif; font-size: 16px; overflow: hidden; display: block; position: relative; top: 0; left: 0; width: 100%; height: 100%;} .cesium-viewer-cesiumWidgetContainer {width: 100%; height: 100%;} .cesium-viewer-bottom {display: block; position: absolute; bottom: 0; left: 0; right: 0; padding-right: 5px;} .cesium-viewer .cesium-widget-credits {display: inline; position: static; bottom: auto; left: auto; padding-right: 0; color: #ffffff; font-size: 10px; text-shadow: 0 0 2px #000000;} .cesium-viewer-timelineContainer {position: absolute; bottom: 0; left: 169px; right: 29px; height: 27px; padding: 0; margin: 0; overflow: hidden; font-size: 14px;} .cesium-viewer-animationContainer {position: absolute; bottom: 0; left: 0; padding: 0; width: 169px; height: 112px;} .cesium-viewer-fullscreenContainer {position: absolute; bottom: 0; right: 0; padding: 0; width: 29px; height: 29px; overflow: hidden;} .cesium-viewer-toolbar {display: block; position: absolute; top: 5px; right: 5px;} .cesium-viewer-cesiumInspectorContainer {display: block; position: absolute; top: 50px; right: 10px;} .cesium-viewer-geocoderContainer {position: relative; display: inline-block; margin: 0 3px;} -------------------------------------------------------------------------------- /robmob/geometry.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | def circle_intersection(circle1, circle2): 5 | """ 6 | @summary: calculates intersection points of two circles 7 | @param circle1: tuple(x,y,radius) 8 | @param circle2: tuple(x,y,radius) 9 | @result: tuple of intersection points (which are (x,y) tuple) 10 | """ 11 | # return self.circle_intersection_sympy(circle1,circle2) 12 | x1, y1, r1 = circle1 13 | x2, y2, r2 = circle2 14 | # http://stackoverflow.com/a/3349134/798588 15 | dx, dy = x2 - x1, y2 - y1 16 | d = np.sqrt(dx * dx + dy * dy) 17 | if d > r1 + r2: 18 | print("No solution because the circles don't intersect") 19 | return None 20 | if d < abs(r1 - r2): 21 | print('No solution because one circle in contained within the other') 22 | return None 23 | if d == 0 and r1 == r2: 24 | print('The circles are coincident and there are an infinite number of solutions') 25 | return None 26 | 27 | a = (r1 * r1 - r2 * r2 + d * d) / (2 * d) 28 | h = np.sqrt(r1 * r1 - a * a) 29 | xm = x1 + a * dx / d 30 | ym = y1 + a * dy / d 31 | xs1 = xm + h * dy / d 32 | xs2 = xm - h * dy / d 33 | ys1 = ym - h * dx / d 34 | ys2 = ym + h * dx / d 35 | 36 | return (xs1, ys1), (xs2, ys2) 37 | -------------------------------------------------------------------------------- /robmob/commands.py: -------------------------------------------------------------------------------- 1 | import _thread 2 | import json 3 | import time 4 | 5 | 6 | class CommandPublisher: 7 | def __init__(self): 8 | self.stop = False 9 | 10 | def start_publishing(self, send_fn, command): 11 | command_json = json.dumps(command.message_to_publish) 12 | frequency_hz = command.publish_frequency_hz 13 | 14 | if frequency_hz is Command.SEND_ONCE: 15 | send_fn(command_json) 16 | else: 17 | _thread.start_new_thread(self._publish_repeatedly, (send_fn, command_json, frequency_hz)) 18 | 19 | def stop_publishing(self): 20 | self.stop = True 21 | 22 | def _publish_repeatedly(self, send_fn, json, frequency_hz): 23 | sleep_time_sec = 1.0 / frequency_hz 24 | while not self.stop: 25 | send_fn(json) 26 | time.sleep(sleep_time_sec) 27 | 28 | 29 | class Command: 30 | SEND_ONCE = None 31 | # Overwrite this in implementations if required 32 | COMMAND_TOPIC = '' 33 | 34 | def __init__(self, send_frequency_hz=10): 35 | self.publish_frequency_hz = send_frequency_hz 36 | self.message_to_publish = { 37 | 'op': 'publish', 38 | 'topic': self.COMMAND_TOPIC 39 | } 40 | 41 | def _set_message(self, msg): 42 | self.message_to_publish['msg'] = msg.message 43 | -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Geocoder/Geocoder.css: -------------------------------------------------------------------------------- 1 | .cesium-viewer-geocoderContainer .cesium-geocoder-input {border: solid 1px #444; background-color: rgba(40, 40, 40, 0.7); color: white; display: inline-block; vertical-align: middle; width: 0; height: 32px; margin: 0; padding: 0 32px 0 0; border-radius: 0; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; -webkit-transition: width ease-in-out 0.25s, background-color 0.2s ease-in-out; -moz-transition: width ease-in-out 0.25s, background-color 0.2s ease-in-out; transition: width ease-in-out 0.25s, background-color 0.2s ease-in-out; -webkit-appearance: none;} .cesium-viewer-geocoderContainer:hover .cesium-geocoder-input {border-color: #aef; box-shadow: 0 0 8px #fff;} .cesium-viewer-geocoderContainer .cesium-geocoder-input:focus {border-color: #ea4; background-color: rgba(15, 15, 15, 0.9); box-shadow: none; outline: none;} .cesium-viewer-geocoderContainer:hover .cesium-geocoder-input, .cesium-viewer-geocoderContainer .cesium-geocoder-input:focus, .cesium-viewer-geocoderContainer .cesium-geocoder-input-wide {padding-left: 4px; width: 250px;} .cesium-geocoder-searchButton {background-color: #303336; display: inline-block; position: absolute; cursor: pointer; width: 32px; top: 1px; right: 1px; height: 30px; vertical-align: middle; fill: #edffff;} .cesium-geocoder-searchButton:hover {background-color: #48b;} -------------------------------------------------------------------------------- /robmob/rover/commands.py: -------------------------------------------------------------------------------- 1 | from overrides import overrides 2 | 3 | from robmob.commands import Command 4 | 5 | 6 | class RoverCommand(Command): 7 | COMMAND_TOPIC = '/rover/command' 8 | 9 | def __init__(self, send_frequency_hz=10): 10 | super().__init__(send_frequency_hz) 11 | self.message_to_publish['type'] = 'std_msgs/msg/String' 12 | 13 | @overrides 14 | def _set_message(self, msg): 15 | msg = self._to_ros_string(msg) 16 | self.message_to_publish['msg'] = msg 17 | 18 | def _to_ros_string(self, data): 19 | return {'data': str(data)} 20 | 21 | 22 | class MovementCommand(RoverCommand): 23 | def __init__(self, linear, angular): 24 | super().__init__() 25 | self._set_message({"T": 13, "X": linear, "Y": angular}) 26 | 27 | 28 | class ResetCommand(RoverCommand): 29 | def __init__(self): 30 | super().__init__(Command.SEND_ONCE) 31 | self._set_message({"T": 11, "X": 0, "Y": 0}) 32 | 33 | 34 | class MovementFloatCommand(RoverCommand): 35 | def __init__(self, left: float, right: float): 36 | super().__init__() 37 | self._set_message({"T": 1, "L": left, "R": right}) 38 | 39 | 40 | class MovementPWMCommand(RoverCommand): 41 | def __init__(self, left: int, right: int): 42 | super().__init__() 43 | self._set_message({"T": 11, "L": left, "R": right}) 44 | -------------------------------------------------------------------------------- /scripts/setup.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | sudo apt install -y python3.8-venv screen udev ros-foxy-depthai-ros 3 | cd ~/glo4001 4 | git reset --hard 5 | git pull 6 | python3 -m venv venv 7 | source venv/bin/activate 8 | pip install --upgrade pip 9 | pip install -r requirements.txt 10 | sudo wget -qO- https://docs.luxonis.com/install_dependencies.sh | bash 11 | grep -qxF 'export LD_PRELOAD=/home/norlab/glo4001/venv/lib/python3.8/site-packages/depthai.libs/libgomp-43378.so.1.0.0' ~/.bashrc || \ 12 | echo 'export LD_PRELOAD=/home/norlab/glo4001/venv/lib/python3.8/site-packages/depthai.libs/libgomp-43378.so.1.0.0' >> ~/.bashrc 13 | 14 | #sudo cp ~/glo4001/scripts/jupyter.service /etc/systemd/system/jupyter.service 15 | #sudo cp ~/glo4001/scripts/ros_rover.service /etc/systemd/system/ros_rover.service 16 | 17 | sudo chmod 777 -R /tmp 18 | 19 | # udev 20 | echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="03e7", MODE="0666"' | sudo tee /etc/udev/rules.d/80-movidius.rules 21 | sudo udevadm control --reload-rules && sudo udevadm trigger 22 | 23 | #sudo systemctl daemon-reload 24 | 25 | #sudo systemctl enable jupyter 26 | #sudo systemctl enable ros_rover 27 | 28 | #sudo systemctl start jupyter 29 | #sudo systemctl start ros_rover 30 | 31 | cd ~/ros2_ws 32 | git reset --hard 33 | git pull 34 | sudo apt update 35 | rosdep update 36 | rosdep install --from-paths src --ignore-src -r -y 37 | ./symlink_build.sh 38 | -------------------------------------------------------------------------------- /offline/Labo 6/lab6_offline_data.txt: -------------------------------------------------------------------------------- 1 | 2.999999999999999889e-01 3.500000000000000333e-01 4.000000000000000222e-01 4.500000000000000111e-01 5.000000000000000000e-01 5.500000000000000444e-01 5.999999999999999778e-01 6.500000000000000222e-01 7.000000000000000666e-01 7.500000000000000000e-01 8.000000000000000444e-01 8.499999999999999778e-01 9.000000000000000222e-01 9.500000000000000666e-01 1.000000000000000000e+00 1.050000000000000044e+00 1.100000000000000089e+00 1.150000000000000133e+00 1.199999999999999956e+00 2 | 3.008461296558380127e-01 3.655714094638824463e-01 4.040713906288146973e-01 4.437856674194335938e-01 4.965383708477020264e-01 5.459285974502563477e-01 6.112307906150817871e-01 6.553076505661010742e-01 7.030000090599060059e-01 7.538571953773498535e-01 8.063572049140930176e-01 8.537142872810363770e-01 9.071428179740905762e-01 9.567856788635253906e-01 1.011142969131469727e+00 1.056214451789855957e+00 1.111499905586242676e+00 1.155571341514587402e+00 1.222714304924011230e+00 3 | 3.033134637803487355e+00 3.024923989269882263e+00 3.027961489726838540e+00 3.018535739406858376e+00 3.019625666239876605e+00 3.017909576703661223e+00 3.013080473620885602e+00 3.016885577198008317e+00 3.016846108529698256e+00 3.013404462108144166e+00 3.012735526696022070e+00 3.011113100392200259e+00 3.007278269487609901e+00 3.009815137101476523e+00 3.009547664168446879e+00 3.008180273595367105e+00 3.009259878184831205e+00 3.007424002931207152e+00 3.008012111670064215e+00 4 | -------------------------------------------------------------------------------- /plans/lab0.org: -------------------------------------------------------------------------------- 1 | #+title: Lab0 2 | #+author: William Guimont-Martin 3 | 4 | * Buts du laboratoire 5 | - Installation des outils 6 | - Python 7 | - Machine virtuelle 8 | - Laboratoires du cours 9 | - Introduction au simulateur 10 | - Comment l'utiliser 11 | - Raccourcis fréquents 12 | - Configuration 13 | - Introduction aux algorithmes de robotique mobile 14 | - Début de réflexion sur les algorithmes 15 | - Mapping 16 | - SLAM 17 | - Localisation 18 | - Filtre à particules 19 | - Planification de chemins 20 | - Introduction aux laboratoies 21 | - Connexion au robot avec Python 22 | - Utilisation de robmob 23 | - Introduction a matplotlib 24 | * Plan de la séance 25 | - Pour ceux qui utilisent les ordinateurs du laboratoire: utilisez VMWare 26 | - *Pour ceux qui utilisent VMWare*: En cas d'erreur de kernel. Ouvrir le fichier .vmx dans les dossier contenant la machine virtuelle. Changer TRUE pour FALSE a la ligne 22. 27 | - *Pour ceux qui utilisent VMWare*: Puisque le port forwarding ne fonctionne pas sur vmware, il faut tout faire dans la machine virtuelle (Faire les etapes d'installation dans la VM) 28 | - Laboratoires: https://github.com/norlab-ulaval/glo4001 29 | - *Télécharger la machine virtuelle du cours (~6Gb)!* 30 | - Suivre les instructions du README 31 | - Suivre le Laboratoire 0.ipynb 32 | - *Mettre à jour le code du simulateur!* 33 | cd ~/catkin_ws 34 | git pull 35 | - *Important de bien comprendre comment lancer le simulateur!* 36 | - Disponible pour répondre aux questions 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | *.egg-info/ 23 | .installed.cfg 24 | *.egg 25 | 26 | # PyInstaller 27 | # Usually these files are written by a python script from a template 28 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 29 | *.manifest 30 | *.spec 31 | 32 | # Installer logs 33 | pip-log.txt 34 | pip-delete-this-directory.txt 35 | 36 | # Unit test / coverage reports 37 | htmlcov/ 38 | .tox/ 39 | .coverage 40 | .coverage.* 41 | .cache 42 | nosetests.xml 43 | coverage.xml 44 | *,cover 45 | .hypothesis/ 46 | 47 | # Translations 48 | *.mo 49 | *.pot 50 | 51 | # Django stuff: 52 | *.log 53 | local_settings.py 54 | 55 | # Flask stuff: 56 | instance/ 57 | .webassets-cache 58 | 59 | # Scrapy stuff: 60 | .scrapy 61 | 62 | # Sphinx documentation 63 | docs/_build/ 64 | 65 | # PyBuilder 66 | target/ 67 | 68 | # IPython Notebook 69 | .ipynb_checkpoints 70 | 71 | # pyenv 72 | .python-version 73 | 74 | # celery beat schedule file 75 | celerybeat-schedule 76 | 77 | # dotenv 78 | .env 79 | 80 | # virtualenv 81 | venv/ 82 | .venv/ 83 | ENV/ 84 | 85 | # Spyder project settings 86 | .spyderproject 87 | 88 | # Rope project settings 89 | .ropeproject 90 | 91 | # vim 92 | *.swp 93 | 94 | # Pycharm 95 | /.idea/ 96 | 97 | # Julia 98 | /venvjl/ 99 | -------------------------------------------------------------------------------- /point_cloud/libs/proj4/LICENSE.md: -------------------------------------------------------------------------------- 1 | ##Proj4js -- Javascript reprojection library. 2 | 3 | Authors: 4 | - Mike Adair madairATdmsolutions.ca 5 | - Richard Greenwood richATgreenwoodmap.com 6 | - Didier Richard didier.richardATign.fr 7 | - Stephen Irons stephen.ironsATclear.net.nz 8 | - Olivier Terral oterralATgmail.com 9 | - Calvin Metcalf cmetcalfATappgeo.com 10 | 11 | Copyright (c) 2014, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons, Olivier Terral and Calvin Metcalf 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a 14 | copy of this software and associated documentation files (the "Software"), 15 | to deal in the Software without restriction, including without limitation 16 | the rights to use, copy, modify, merge, publish, distribute, sublicense, 17 | and/or sell copies of the Software, and to permit persons to whom the 18 | Software is furnished to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included 21 | in all copies or substantial portions of the Software. 22 | 23 | _THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 24 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 26 | THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 28 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 29 | DEALINGS IN THE SOFTWARE._ -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/shared.css: -------------------------------------------------------------------------------- 1 | .cesium-svgPath-svg {position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden;} .cesium-button {display: inline-block; position: relative; background: #303336; border: 1px solid #444; color: #edffff; fill: #edffff; border-radius: 4px; padding: 5px 12px; margin: 2px 3px; cursor: pointer; overflow: hidden; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none;} .cesium-button:focus {color: #fff; fill: #fff; border-color: #ea4; outline: none;} .cesium-button:hover {color: #fff; fill: #fff; background: #48b; border-color: #aef; box-shadow: 0 0 8px #fff;} .cesium-button:active {color: #000; fill: #000; background: #adf; border-color: #fff; box-shadow: 0 0 8px #fff;} .cesium-button:disabled, .cesium-button-disabled, .cesium-button-disabled:focus, .cesium-button-disabled:hover, .cesium-button-disabled:active {background: #303336; border-color: #444; color: #646464; fill: #646464; box-shadow: none; cursor: default;} .cesium-button option {background-color: #000; color: #eee;} .cesium-button option:disabled {color: #777;} .cesium-toolbar-button {-moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; width: 32px; height: 32px; border-radius: 14%; padding: 0; vertical-align: middle; z-index: 0;} .cesium-performanceDisplay-defaultContainer {position: absolute; top: 50px; right: 10px; text-align: right;} .cesium-performanceDisplay {background-color: rgba(40, 40, 40, 0.7); padding: 7px; border-radius: 5px; border: 1px solid #444; font: bold 12px sans-serif;} .cesium-performanceDisplay-fps {color: #e52;} .cesium-performanceDisplay-ms {color: #de3;} -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Animation/lighter.css: -------------------------------------------------------------------------------- 1 | .cesium-lighter .cesium-animation-themeNormal {color: #E5F2FE;} .cesium-lighter .cesium-animation-themeHover {color: #ABD6FF;} .cesium-lighter .cesium-animation-themeSelect {color: #E5F2FE;} .cesium-lighter .cesium-animation-themeDisabled {color: #EFEFEF;} .cesium-lighter .cesium-animation-themeKnob {color: #E1E2E3;} .cesium-lighter .cesium-animation-themePointer {color: #FA5;} .cesium-lighter .cesium-animation-themeSwoosh {color: #ACE;} .cesium-lighter .cesium-animation-themeSwooshHover {color: #BDF;} .cesium-lighter .cesium-animation-svgText {fill: #111;} .cesium-lighter .cesium-animation-rectButton .cesium-animation-buttonPath {fill: #111;} .cesium-lighter .cesium-animation-rectButton .cesium-animation-buttonMain {stroke: #759DC0;} .cesium-lighter .cesium-animation-buttonToggled .cesium-animation-buttonGlow {fill: #FFAA2A;} .cesium-lighter .cesium-animation-buttonToggled .cesium-animation-buttonMain {stroke: #EA0;} .cesium-lighter .cesium-animation-rectButton:hover .cesium-animation-buttonMain {stroke: #759DC0;} .cesium-lighter .cesium-animation-buttonToggled:hover .cesium-animation-buttonGlow {fill: #fff;} .cesium-lighter .cesium-animation-buttonToggled:hover .cesium-animation-buttonMain {stroke: #EA0;} .cesium-lighter .cesium-animation-rectButton:active .cesium-animation-buttonMain {fill: #ABD6FF;} .cesium-lighter .cesium-animation-buttonDisabled .cesium-animation-buttonMain {stroke: #D3D3D3;} .cesium-lighter .cesium-animation-buttonDisabled .cesium-animation-buttonPath {fill: #818181;} .cesium-lighter .cesium-animation-shuttleRingBack {fill: #FAFAFA; fill-opacity: 1; stroke: #AEAEAE; stroke-width: 1.2;} .cesium-lighter .cesium-animation-shuttleRingSwoosh line {stroke: #8AC;} .cesium-lighter .cesium-animation-knobOuter {stroke: #A5A5A5;} -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Timeline/Timeline.css: -------------------------------------------------------------------------------- 1 | .cesium-timeline-main {position: relative; left: 0; bottom: 0; overflow: hidden; border: solid 1px #888;} .cesium-timeline-trackContainer {width: 100%; overflow: auto; border-top: solid 1px #888; position: relative; top: 0; left: 0;} .cesium-timeline-tracks {position: absolute; top: 0; left: 0; width: 100%;} .cesium-timeline-needle {position: absolute; left: 0; top: 1.7em; bottom: 0; width: 1px; background: #F00;} .cesium-timeline-bar {position: relative; left: 0; top: 0; overflow: hidden; cursor: pointer; width: 100%; height: 1.7em; background-color: #fafafa; background: rgba(32, 32, 32, 0.8); background: -moz-linear-gradient(top, rgba(116,117,119,0.8) 0%, rgba(58,68,82,0.8) 11%, rgba(46,50,56,0.8) 46%, rgba(53,53,53,0.8) 81%, rgba(53,53,53,0.8) 100%); background: -webkit-linear-gradient(top, rgba(116,117,119,0.8) 0%,rgba(58,68,82,0.8) 11%,rgba(46,50,56,0.8) 46%,rgba(53,53,53,0.8) 81%,rgba(53,53,53,0.8) 100%); background: linear-gradient(to bottom, rgba(116,117,119,0.8) 0%,rgba(58,68,82,0.8) 11%,rgba(46,50,56,0.8) 46%,rgba(53,53,53,0.8) 81%,rgba(53,53,53,0.8) 100%);} .cesium-timeline-ruler {visibility: hidden; white-space: nowrap; font-size: 80%; z-index: -200;} .cesium-timeline-highlight {position: absolute; bottom: 0; left: 0; background: #08F;} .cesium-timeline-ticLabel {position: absolute; top: 0; left: 0; white-space: nowrap; font-size: 80%; color: #eee;} .cesium-timeline-ticMain {position: absolute; bottom: 0; left: 0; width: 1px; height: 50%; background: #eee;} .cesium-timeline-ticSub {position: absolute; bottom: 0; left: 0; width: 1px; height: 33%; background: #aaa;} .cesium-timeline-ticTiny {position: absolute; bottom: 0; left: 0; width: 1px; height: 25%; background: #888;} .cesium-timeline-icon16 {display: block; position: absolute; width: 16px; height: 16px; background-image: url("../Images/TimelineIcons.png"); background-repeat: no-repeat;} -------------------------------------------------------------------------------- /FullOdomSensor.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "from robmob import robot, sensors" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": null, 15 | "metadata": { 16 | "collapsed": false, 17 | "jupyter": { 18 | "outputs_hidden": false 19 | } 20 | }, 21 | "outputs": [], 22 | "source": [ 23 | "robot_ip = 'localhost'\n", 24 | "r = robot.Robot(robot_ip)\n", 25 | "r.connect()" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": null, 31 | "metadata": { 32 | "collapsed": false, 33 | "jupyter": { 34 | "outputs_hidden": false 35 | } 36 | }, 37 | "outputs": [], 38 | "source": [ 39 | "full_odom = sensors.FullOdomSensor()\n", 40 | "r.add_sensor(full_odom)" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": null, 46 | "metadata": { 47 | "collapsed": false, 48 | "jupyter": { 49 | "outputs_hidden": false 50 | } 51 | }, 52 | "outputs": [], 53 | "source": [ 54 | "full_odom.peek_data()" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": null, 60 | "metadata": {}, 61 | "outputs": [], 62 | "source": [] 63 | } 64 | ], 65 | "metadata": { 66 | "kernelspec": { 67 | "display_name": "Python 3", 68 | "language": "python", 69 | "name": "python3" 70 | }, 71 | "language_info": { 72 | "codemirror_mode": { 73 | "name": "ipython", 74 | "version": 3 75 | }, 76 | "file_extension": ".py", 77 | "mimetype": "text/x-python", 78 | "name": "python", 79 | "nbconvert_exporter": "python", 80 | "pygments_lexer": "ipython3", 81 | "version": "3.8.10" 82 | } 83 | }, 84 | "nbformat": 4, 85 | "nbformat_minor": 4 86 | } 87 | -------------------------------------------------------------------------------- /server/post_install_script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | USERNAME=robmob 4 | HOSTNAME="$1" 5 | IP="$2" 6 | 7 | 8 | if [ "$(whoami)" != "root" ]; then 9 | echo "This script must be run as root." 10 | exit 1 11 | fi 12 | 13 | if [ "$1" = "--help"]; then 14 | echo "usage: post_install_script.sh HOSTNAME IP" 15 | exit 0 16 | fi 17 | 18 | if [ -z "$1" ] || [ -z "$2" ]; then 19 | echo "usage: post_install_script.sh HOSTNAME IP" 20 | exit 1 21 | fi 22 | 23 | 24 | # ROS INSTALL 25 | 26 | echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list 27 | 28 | apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net --recv-key 0xB01FA116 29 | 30 | apt-get update 31 | 32 | apt-get install -y --force-yes \ 33 | htop \ 34 | nload \ 35 | openssh-server \ 36 | python-twisted \ 37 | ros-indigo-compressed-depth-image-transport \ 38 | ros-indigo-compressed-image-transport \ 39 | ros-indigo-freenect-launch \ 40 | ros-indigo-hokuyo-node \ 41 | ros-indigo-image-transport-plugins \ 42 | ros-indigo-kobuki-core \ 43 | ros-indigo-kobuki-node \ 44 | ros-indigo-robot-upstart \ 45 | ros-indigo-ros-base \ 46 | ros-indigo-rosbridge-suite \ 47 | vim \ 48 | wget 49 | 50 | rosdep init 51 | su -c "rosdep update" $USERNAME 52 | 53 | su -c "echo \"source /opt/ros/indigo/setup.bash\" >> /home/$USERNAME/.bashrc" $USERNAME 54 | source /opt/ros/indigo/setup.bash 55 | 56 | 57 | # UDEV rules for the kobuki and the hokuyo. 58 | 59 | echo "SUBSYSTEMS==\"tty\", KERNEL==\"ttyACM[0-9]*\", ACTION==\"add\", MODE=\"0666\", GROUP=\"dialout\"" > /etc/udev/rules.d/99-hokuyo.rules 60 | 61 | 62 | # Configure robot_upstart 63 | 64 | curl -sSf https://raw.githubusercontent.com/davidlandry93/glo4001/master/server/robmob.launch > /opt/ros/indigo/share/kobuki_node/launch/robmob.launch 65 | -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/SceneModePicker/SceneModePicker.css: -------------------------------------------------------------------------------- 1 | span.cesium-sceneModePicker-wrapper {display: inline-block; position: relative; margin: 0 3px;} .cesium-sceneModePicker-visible {visibility: visible; opacity: 1; transition: opacity 0.25s linear; -webkit-transition: opacity 0.25s linear; -moz-transition: opacity 0.25s linear;} .cesium-sceneModePicker-hidden {visibility: hidden; opacity: 0; transition: visibility 0s 0.25s, opacity 0.25s linear; -webkit-transition: visibility 0s 0.25s, opacity 0.25s linear; -moz-transition: visibility 0s 0.25s, opacity 0.25s linear;} .cesium-sceneModePicker-wrapper .cesium-sceneModePicker-none {display: none;} .cesium-sceneModePicker-slide-svg {-webkit-transition: left 2s; -moz-transition: left 2s; transition: left 2s; top: 0; left: 0;} .cesium-sceneModePicker-wrapper .cesium-sceneModePicker-dropDown-icon {-moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; padding: 0; margin: 3px 0;} .cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button3D, .cesium-sceneModePicker-wrapper .cesium-sceneModePicker-buttonColumbusView, .cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button2D {margin: 0 0 3px 0;} .cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button3D .cesium-sceneModePicker-icon2D {left: 100%;} .cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button3D .cesium-sceneModePicker-iconColumbusView {left: 200%;} .cesium-sceneModePicker-wrapper .cesium-sceneModePicker-buttonColumbusView .cesium-sceneModePicker-icon3D {left: -200%;} .cesium-sceneModePicker-wrapper .cesium-sceneModePicker-buttonColumbusView .cesium-sceneModePicker-icon2D {left: -100%;} .cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button2D .cesium-sceneModePicker-icon3D {left: -100%;} .cesium-sceneModePicker-wrapper .cesium-sceneModePicker-button2D .cesium-sceneModePicker-iconColumbusView {left: 100%;} .cesium-sceneModePicker-wrapper .cesium-sceneModePicker-selected {border-color: #2e2; box-shadow: 0 0 8px #fff, 0 0 8px #fff;} -------------------------------------------------------------------------------- /RobotCheckup.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "metadata": { 6 | "collapsed": false 7 | }, 8 | "source": [ 9 | "%load_ext autoreload\n", 10 | "%autoreload 2\n", 11 | "%matplotlib inline" 12 | ], 13 | "outputs": [], 14 | "execution_count": null 15 | }, 16 | { 17 | "cell_type": "code", 18 | "metadata": { 19 | "collapsed": true 20 | }, 21 | "source": [ 22 | "import matplotlib.pyplot as plt\n", 23 | "import numpy as np\n", 24 | "import time\n", 25 | "\n", 26 | "from robmob.robot import Robot\n", 27 | "from robmob.sensors import SharpSensor\n", 28 | "from IPython.display import clear_output\n", 29 | "from websocket import WebSocketConnectionClosedException" 30 | ], 31 | "outputs": [], 32 | "execution_count": null 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": {}, 37 | "source": [ 38 | "# Robot Checkup\n", 39 | "\n", 40 | "Valider le fonctionnement de tous les systèmes d'un robot donné.\n", 41 | "\n", 42 | "## Communication" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "metadata": { 48 | "collapsed": false 49 | }, 50 | "source": [ 51 | "robot_ip = '192.168.0.100'\n", 52 | "r = Robot(robot_ip)\n", 53 | "r.connect()" 54 | ], 55 | "outputs": [], 56 | "execution_count": null 57 | }, 58 | { 59 | "cell_type": "code", 60 | "metadata": { 61 | "collapsed": true 62 | }, 63 | "source": [], 64 | "outputs": [], 65 | "execution_count": null 66 | } 67 | ], 68 | "metadata": { 69 | "kernelspec": { 70 | "display_name": "Python 3", 71 | "language": "python", 72 | "name": "python3" 73 | }, 74 | "language_info": { 75 | "codemirror_mode": { 76 | "name": "ipython", 77 | "version": 3 78 | }, 79 | "file_extension": ".py", 80 | "mimetype": "text/x-python", 81 | "name": "python", 82 | "nbconvert_exporter": "python", 83 | "pygments_lexer": "ipython3", 84 | "version": "3.5.2" 85 | } 86 | }, 87 | "nbformat": 4, 88 | "nbformat_minor": 2 89 | } 90 | -------------------------------------------------------------------------------- /robmob/sensors.py: -------------------------------------------------------------------------------- 1 | import collections 2 | import time 3 | from abc import ABC, abstractmethod 4 | 5 | import numpy as np 6 | 7 | 8 | class Sensor(ABC): 9 | # Overwrite in implementations 10 | TOPIC = '' 11 | MESSAGE_TYPE = '' 12 | SAMPLE_RATE = 0 13 | 14 | def __init__(self, buffer_size): 15 | self.buffer_size = buffer_size 16 | self.buffer = collections.deque([], maxlen=buffer_size) 17 | self.continuous_buffer = None 18 | self.subscription_message = {'op': 'subscribe', 19 | 'type': self.MESSAGE_TYPE, 20 | 'topic': self.TOPIC} 21 | self.unsubscribe_message = {'op': 'unsubscribe', 22 | 'topic': self.TOPIC} 23 | 24 | @abstractmethod 25 | def parse_message(self, message): 26 | ... 27 | 28 | def on_message(self, message): 29 | parsed_message = self.parse_message(message) 30 | self.buffer.append(parsed_message) 31 | if self.continuous_buffer is not None: 32 | self.continuous_buffer.append(parsed_message) 33 | 34 | def read_data(self): 35 | try: 36 | return self.buffer.popleft() 37 | except IndexError: 38 | raise IndexError('Le buffeur du capteur est vide') 39 | 40 | def peek_data(self): 41 | try: 42 | return self.buffer[-1] 43 | except IndexError: 44 | raise IndexError('Le buffeur du capteur est vide') 45 | 46 | def read_buffer(self): 47 | old_buffer = self.buffer 48 | self.buffer = collections.deque([], maxlen=self.buffer_size) 49 | return self.format_buffer_numpy(old_buffer) 50 | 51 | def peek_buffer(self): 52 | return self.format_buffer_numpy(self.buffer) 53 | 54 | def sample_data_for_x_sec(self, x): 55 | self.continuous_buffer = [] 56 | time.sleep(x) 57 | samples, self.continuous_buffer = self.continuous_buffer, None 58 | return self.format_buffer_numpy(samples) 59 | 60 | def format_buffer_numpy(self, buf): 61 | return np.asarray(buf) 62 | -------------------------------------------------------------------------------- /point_cloud/libs/other/stats.min.js: -------------------------------------------------------------------------------- 1 | // stats.js - http://github.com/mrdoob/stats.js 2 | var Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement("div");f.id="stats";f.addEventListener("mousedown",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText="width:80px;opacity:0.9;cursor:pointer";var a=document.createElement("div");a.id="fps";a.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#002";f.appendChild(a);var i=document.createElement("div");i.id="fpsText";i.style.cssText="color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px"; 3 | i.innerHTML="FPS";a.appendChild(i);var c=document.createElement("div");c.id="fpsGraph";c.style.cssText="position:relative;width:74px;height:30px;background-color:#0ff";for(a.appendChild(c);74>c.children.length;){var j=document.createElement("span");j.style.cssText="width:1px;height:30px;float:left;background-color:#113";c.appendChild(j)}var d=document.createElement("div");d.id="ms";d.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#020;display:none";f.appendChild(d);var k=document.createElement("div"); 4 | k.id="msText";k.style.cssText="color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px";k.innerHTML="MS";d.appendChild(k);var e=document.createElement("div");e.id="msGraph";e.style.cssText="position:relative;width:74px;height:30px;background-color:#0f0";for(d.appendChild(e);74>e.children.length;)j=document.createElement("span"),j.style.cssText="width:1px;height:30px;float:left;background-color:#131",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display= 5 | "block";d.style.display="none";break;case 1:a.style.display="none",d.style.display="block"}};return{REVISION:11,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+" MS ("+n+"-"+o+")";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+"px";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+" FPS ("+p+"-"+q+")",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height= 6 | a+"px",m=b,r=0);return b},update:function(){l=this.end()}}}; 7 | -------------------------------------------------------------------------------- /robmob/visualization.py: -------------------------------------------------------------------------------- 1 | import matplotlib.pyplot as plt 2 | import numpy as np 3 | from matplotlib import animation 4 | 5 | 6 | class Visualizer: 7 | 8 | def __init__(self, sensor): 9 | self.sensor = sensor 10 | 11 | def plot_data(self): 12 | fig, ax = plt.subplots(1, 1, subplot_kw=dict(projection='polar')) 13 | 14 | ax.grid(True) 15 | ax.set_rmax(3.0) 16 | ax.set_rmin(0.0) 17 | ax.set_theta_zero_location('N') 18 | last_data = self.sensor.peek_data() 19 | ranges = np.array(last_data['ranges']) 20 | angles = np.arange(last_data['angle_min'], last_data['angle_max'] + last_data['angle_increment'], 21 | last_data['angle_increment']) 22 | 23 | scatter_plot = ax.scatter(angles, ranges, color='b', s=2, animated=True) 24 | 25 | plt.show() 26 | 27 | def animate_sensor(self, animation_length_second=2): 28 | fig, ax = plt.subplots(1, 1, subplot_kw=dict(projection='polar')) 29 | 30 | ax.grid(True) 31 | ax.set_rmax(3.0) 32 | ax.set_rmin(0.0) 33 | ax.set_theta_zero_location('N') 34 | 35 | last_data = self.sensor.read_data() 36 | ranges = np.array(last_data['ranges']) 37 | angles = np.arange(last_data['angle_min'], last_data['angle_max'] + last_data['angle_increment'], 38 | last_data['angle_increment']) 39 | 40 | scatter_plot = ax.scatter(angles, ranges, color='b', s=2, animated=True) 41 | 42 | def init_frame(): 43 | scatter_plot.set_array([]) 44 | return (scatter_plot,) 45 | 46 | def animate(i): 47 | last_data = self.sensor.peek_most_recent_data() 48 | ranges = np.array(last_data['ranges']) 49 | angles = np.arange(last_data['angle_min'], last_data['angle_max'] + last_data['angle_increment'], 50 | last_data['angle_increment']) 51 | 52 | table = np.zeros((ranges.shape[0], 2)) 53 | table[:, 0] = angles 54 | table[:, 1] = ranges 55 | scatter_plot.set_offsets(table) 56 | 57 | return scatter_plot, 58 | 59 | return animation.FuncAnimation(fig, animate, frames=100, interval=100, blit=True) 60 | -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/CesiumInspector/CesiumInspector.css: -------------------------------------------------------------------------------- 1 | .cesium-cesiumInspector {border-radius: 5px; -webkit-transition: width ease-in-out 0.25s; -moz-transition: width ease-in-out 0.25s; transition: width ease-in-out 0.25s; background: rgba(48, 51, 54, 0.8); border: 1px solid #444; color: #edffff; display: inline-block; position: relative; padding: 4px 12px; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; overflow: hidden;} .cesium-cesiumInspector-button {text-align: center; font-size: 11pt;} .cesium-cesiumInspector-visible .cesium-cesiumInspector-button {border-bottom: 1px solid #aaa; padding-bottom: 3px;} .cesium-cesiumInspector input:enabled, .cesium-cesiumInspector-button {cursor: pointer;} .cesium-cesiumInspector-visible {width: 185px; height: auto;} .cesium-cesiumInspector-hidden {width: 122px; height: 17px;} .cesium-cesiumInspector-show {max-height: 500px;} .cesium-cesiumInspector-hide {max-height: 0; padding: 0 !important; overflow: hidden;} .cesium-cesiumInspector-dropDown {margin: 5px 0; font-family: sans-serif; font-size: 10pt; width: 185px;} .cesium-cesiumInspector-frustumStats {padding-left: 10px; padding: 5px; background-color: rgba(80, 80, 80, 0.75);} .cesium-cesiumInspector-pickButton {background-color: rgba(0, 0, 0, 0.3); border: 1px solid #444; color: #edffff; border-radius: 5px; padding: 3px 7px; cursor: pointer; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; margin: 0 auto;} .cesium-cesiumInspector-pickButton:focus {outline: none;} .cesium-cesiumInspector-pickButton:active, .cesium-cesiumInspector-pickButtonHighlight {color: #000; background: #adf; border-color: #fff; box-shadow: 0 0 8px #fff;} .cesium-cesiumInspector-center {text-align: center;} .cesium-cesiumInspector-sectionHeader {font-weight: bold;} .cesium-cesiumInspector-pickSection {border: 1px solid #aaa; border-radius: 5px; padding: 3px; margin-bottom: 5px;} .cesium-cesiumInspector-section {margin-bottom: 10px; -webkit-transition: max-height 0.25s; -moz-transition: max-height 0.25s; transition: max-height 0.25s;} .cesium-cesiumInspector-toggleSwitch {padding: 3px; cursor: pointer;} .cesium-cesiumInspector-tileText {padding-bottom: 10px; border-bottom: 1px solid #aaa;} .cesium-cesiumInspector-relativeText {padding-top: 10px;} -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/NavigationHelpButton/NavigationHelpButton.css: -------------------------------------------------------------------------------- 1 | .cesium-navigationHelpButton-wrapper {position: relative; display: inline-block;} .cesium-navigation-help {visibility: hidden; position: absolute; top: 38px; right: 2px; width: 250px; border-radius: 10px; -webkit-transform: scale(0.01); -moz-transform: scale(0.01); transform: scale(0.01); -webkit-transform-origin: 234px -10px; -moz-transform-origin: 234px -10px; transform-origin: 234px -10px; -webkit-transition: visibility 0s 0.25s, -webkit-transform 0.25s ease-in; -moz-transition: visibility 0s 0.25s, -moz-transform 0.25s ease-in; transition: visibility 0s 0.25s, transform 0.25s ease-in;} .cesium-navigation-help-visible {visibility: visible; -webkit-transform: scale(1); -moz-transform: scale(1); transform: scale(1); -webkit-transition: -webkit-transform 0.25s ease-out; -moz-transition: -moz-transform 0.25s ease-out; transition: transform 0.25s ease-out;} .cesium-navigation-help-instructions {border: 1px solid #444; background-color: rgba(38, 38, 38, 0.75); padding-bottom: 5px; border-radius: 0 0 10px 10px;} .cesium-click-navigation-help {display: none;} .cesium-touch-navigation-help {display: none; padding-top: 5px;} .cesium-click-navigation-help-visible {display: block;} .cesium-touch-navigation-help-visible {display: block;} .cesium-navigation-help-pan {color: #66ccff; font-weight: bold;} .cesium-navigation-help-zoom {color: #65fd00; font-weight: bold;} .cesium-navigation-help-rotate {color: #ffd800; font-weight: bold;} .cesium-navigation-help-tilt {color: #d800d8; font-weight: bold;} .cesium-navigation-help-details {color: #ffffff;} .cesium-navigation-button {color: #fff; background-color: transparent; border-bottom: none; border-top: 1px solid #444; border-right: 1px solid #444; margin: 0; width: 50%; cursor: pointer;} .cesium-navigation-button-icon {vertical-align: middle; padding: 5px 1px;} .cesium-navigation-button:focus {outline: none;} .cesium-navigation-button-left {border-radius: 10px 0 0 0; border-left: 1px solid #444;} .cesium-navigation-button-right {border-radius: 0 10px 0 0; border-left: none;} .cesium-navigation-button-selected {background-color: rgba(38, 38, 38, 0.75);} .cesium-navigation-button-unselected {background-color: rgba(0, 0, 0, 0.75);} .cesium-navigation-button-unselected:hover {background-color: rgba(76, 76, 76, 0.75);} -------------------------------------------------------------------------------- /TestJulia.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "id": "1a3f645f", 7 | "metadata": { 8 | "pycharm": { 9 | "name": "#%%\n" 10 | } 11 | }, 12 | "outputs": [], 13 | "source": [ 14 | "using PyCall\n", 15 | "push!(pyimport(\"sys\").\"path\", \".\")\n", 16 | "robmob = pyimport(\"robmob\")\n", 17 | "robot = pyimport(\"robmob.robot\")\n", 18 | "sensors = pyimport(\"robmob.sensors\")" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": null, 24 | "id": "44704594", 25 | "metadata": { 26 | "pycharm": { 27 | "name": "#%%\n" 28 | } 29 | }, 30 | "outputs": [], 31 | "source": [ 32 | "robot_ip = \"localhost\"\n", 33 | "robot = robot.Robot(robot_ip)\n", 34 | "\n", 35 | "robot.connect()" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": null, 41 | "id": "990afa89", 42 | "metadata": { 43 | "pycharm": { 44 | "name": "#%%\n" 45 | } 46 | }, 47 | "outputs": [], 48 | "source": [ 49 | "sharp_sensor_id = 0\n", 50 | "sharp_sensor = sensors.SharpSensor(sharp_sensor_id)\n", 51 | "\n", 52 | "oracle_sensor = sensors.OracleSharpSensor()\n", 53 | "\n", 54 | "robot.add_sensor(sharp_sensor)\n", 55 | "robot.add_sensor(oracle_sensor)" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": null, 61 | "id": "a611d99e", 62 | "metadata": { 63 | "pycharm": { 64 | "name": "#%%\n" 65 | } 66 | }, 67 | "outputs": [], 68 | "source": [ 69 | "using Statistics\n", 70 | "\n", 71 | "data = sharp_sensor.read_buffer()\n", 72 | "println(data)\n", 73 | "\n", 74 | "println(\"La lecture moyenne est de $(Statistics.mean(data)) volts\")\n", 75 | "\n", 76 | "data = oracle_sensor.read_buffer()\n", 77 | "println(data)\n", 78 | "\n", 79 | "println(\"La vraie distance est de $(Statistics.mean(data)) cm\")" 80 | ] 81 | } 82 | ], 83 | "metadata": { 84 | "kernelspec": { 85 | "display_name": "Julia 1.4.1", 86 | "language": "julia", 87 | "name": "julia-1.4" 88 | }, 89 | "language_info": { 90 | "file_extension": ".jl", 91 | "mimetype": "application/julia", 92 | "name": "julia", 93 | "version": "1.4.1" 94 | } 95 | }, 96 | "nbformat": 4, 97 | "nbformat_minor": 5 98 | } 99 | -------------------------------------------------------------------------------- /point_cloud/libs/three.js/README.md: -------------------------------------------------------------------------------- 1 | three.js 2 | ======== 3 | 4 | #### JavaScript 3D library #### 5 | 6 | The aim of the project is to create a lightweight 3D library with a very low level of complexity — in other words, for dummies. The library provides <canvas>, <svg>, CSS3D and WebGL renderers. 7 | 8 | [Examples](http://threejs.org/) — [Documentation](http://threejs.org/docs/) — [Migrating](https://github.com/mrdoob/three.js/wiki/Migration) — [Help](http://stackoverflow.com/questions/tagged/three.js) 9 | 10 | 11 | ### Usage ### 12 | 13 | Download the [minified library](http://threejs.org/build/three.min.js) and include it in your html. 14 | Alternatively see [how to build the library yourself](https://github.com/mrdoob/three.js/wiki/build.py,-or-how-to-generate-a-compressed-Three.js-file). 15 | 16 | ```html 17 | 18 | ``` 19 | 20 | This code creates a scene, a camera, and a geometric cube, and it adds the cube to the scene. It then creates a <canvas> renderer for the scene and camera, and it adds that viewport to the document.body element. Finally it animates the cube within the scene for the camera. 21 | 22 | ```html 23 | 64 | ``` 65 | If everything went well you should see [this](http://jsfiddle.net/Gy4w7/). 66 | 67 | ### Change log ### 68 | 69 | [releases](https://github.com/mrdoob/three.js/releases) 70 | -------------------------------------------------------------------------------- /robmob/ros2numpy.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | name_to_dtypes = { 4 | "rgb8": (np.uint8, 3), 5 | "rgba8": (np.uint8, 4), 6 | "rgb16": (np.uint16, 3), 7 | "rgba16": (np.uint16, 4), 8 | "bgr8": (np.uint8, 3), 9 | "bgra8": (np.uint8, 4), 10 | "bgr16": (np.uint16, 3), 11 | "bgra16": (np.uint16, 4), 12 | "mono8": (np.uint8, 1), 13 | "mono16": (np.uint16, 1), 14 | 15 | # for bayer image (based on cv_bridge.cpp) 16 | "bayer_rggb8": (np.uint8, 1), 17 | "bayer_bggr8": (np.uint8, 1), 18 | "bayer_gbrg8": (np.uint8, 1), 19 | "bayer_grbg8": (np.uint8, 1), 20 | "bayer_rggb16": (np.uint16, 1), 21 | "bayer_bggr16": (np.uint16, 1), 22 | "bayer_gbrg16": (np.uint16, 1), 23 | "bayer_grbg16": (np.uint16, 1), 24 | 25 | # OpenCV CvMat types 26 | "8UC1": (np.uint8, 1), 27 | "8UC2": (np.uint8, 2), 28 | "8UC3": (np.uint8, 3), 29 | "8UC4": (np.uint8, 4), 30 | "8SC1": (np.int8, 1), 31 | "8SC2": (np.int8, 2), 32 | "8SC3": (np.int8, 3), 33 | "8SC4": (np.int8, 4), 34 | "16UC1": (np.uint16, 1), 35 | "16UC2": (np.uint16, 2), 36 | "16UC3": (np.uint16, 3), 37 | "16UC4": (np.uint16, 4), 38 | "16SC1": (np.int16, 1), 39 | "16SC2": (np.int16, 2), 40 | "16SC3": (np.int16, 3), 41 | "16SC4": (np.int16, 4), 42 | "32SC1": (np.int32, 1), 43 | "32SC2": (np.int32, 2), 44 | "32SC3": (np.int32, 3), 45 | "32SC4": (np.int32, 4), 46 | "32FC1": (np.float32, 1), 47 | "32FC2": (np.float32, 2), 48 | "32FC3": (np.float32, 3), 49 | "32FC4": (np.float32, 4), 50 | "64FC1": (np.float64, 1), 51 | "64FC2": (np.float64, 2), 52 | "64FC3": (np.float64, 3), 53 | "64FC4": (np.float64, 4) 54 | } 55 | 56 | 57 | def image_to_numpy(msg): 58 | encoding = msg['encoding'] 59 | if not encoding in name_to_dtypes: 60 | raise TypeError(f'Unrecognized encoding {encoding}') 61 | 62 | dtype_class, channels = name_to_dtypes[encoding] 63 | dtype = np.dtype(dtype_class) 64 | dtype = dtype.newbyteorder('>' if msg['is_bigendian'] else '<') 65 | shape = (msg['height'], msg['width'], channels) 66 | 67 | data = np.fromstring(msg['data'], dtype=dtype).reshape(shape) 68 | data.strides = ( 69 | msg['step'], 70 | dtype.itemsize * channels, 71 | dtype.itemsize 72 | ) 73 | 74 | if channels == 1: 75 | data = data[..., 0] 76 | return data 77 | -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/InfoBox/InfoBox.css: -------------------------------------------------------------------------------- 1 | .cesium-infoBox {display: block; position: absolute; top: 50px; right: 0; width: 40%; max-width: 480px; background: rgba(38, 38, 38, 0.95); color: #edffff; border: 1px solid #444; border-right: none; border-top-left-radius: 7px; border-bottom-left-radius: 7px; box-shadow: 0 0 10px 1px #000; -webkit-transform: translate(100%, 0); -moz-transform: translate(100%, 0); transform: translate(100%, 0); visibility: hidden; opacity: 0; -webkit-transition: visibility 0s 0.2s, opacity 0.2s ease-in, -webkit-transform 0.2s ease-in; -moz-transition: visibility 0s 0.2s, opacity 0.2s ease-in, -moz-transform 0.2s ease-in; transition: visibility 0s 0.2s, opacity 0.2s ease-in, transform 0.2s ease-in;} .cesium-infoBox-visible {-webkit-transform: translate(0, 0); -moz-transform: translate(0, 0); transform: translate(0, 0); visibility: visible; opacity: 1; -webkit-transition: opacity 0.2s ease-out, -webkit-transform 0.2s ease-out; -moz-transition: opacity 0.2s ease-out, -moz-transform 0.2s ease-out; transition: opacity 0.2s ease-out, transform 0.2s ease-out;} .cesium-infoBox-title {display: block; height: 20px; padding: 5px 30px 5px 25px; background: rgba(84, 84, 84, 1.0); border-top-left-radius: 7px; text-align: center; text-overflow: ellipsis; white-space: nowrap; overflow: hidden; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box;} .cesium-infoBox-bodyless .cesium-infoBox-title {border-bottom-left-radius: 7px;} button.cesium-infoBox-camera {display: block; position: absolute; top: 4px; left: 4px; width: 22px; height: 22px; background: transparent; border-color: transparent; border-radius: 3px; padding: 0 5px; margin: 0;} button.cesium-infoBox-close {display: block; position: absolute; top: 5px; right: 5px; height: 20px; background: transparent; border: none; border-radius: 2px; font-weight: bold; font-size: 16px; padding: 0 5px; margin: 0; color: #edffff;} button.cesium-infoBox-close:focus {background: rgba(238, 136, 0, 0.44); outline: none;} button.cesium-infoBox-close:hover {background: #888; color: #000;} button.cesium-infoBox-close:active {background: #a00; color: #000;} .cesium-infoBox-bodyless .cesium-infoBox-iframe {display: none;} .cesium-infoBox-loadingContainer {margin: 5px; text-align: center;} .cesium-infoBox-loading {display: inline-block; background-image: url(../Images/info-loading.gif); width: 16px; height: 11px;} .cesium-infoBox-iframe {border: none; width: 100%; width: calc(100% - 2px);} -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Animation/Animation.css: -------------------------------------------------------------------------------- 1 | .cesium-animation-theme {visibility: hidden; display: block; position: absolute; z-index: -100;} .cesium-animation-themeNormal {color: #222;} .cesium-animation-themeHover {color: #4488B0;} .cesium-animation-themeSelect {color: #242;} .cesium-animation-themeDisabled {color: #333;} .cesium-animation-themeKnob {color: #222;} .cesium-animation-themePointer {color: #2E2;} .cesium-animation-themeSwoosh {color: #8AC;} .cesium-animation-themeSwooshHover {color: #AEF;} .cesium-animation-svgText {fill: #edffff; font-family: Sans-Serif; font-size: 15px; text-anchor: middle;} .cesium-animation-blank {fill: #000; fill-opacity: 0.01; stroke: none;} .cesium-animation-rectButton {cursor: pointer; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none;} .cesium-animation-rectButton .cesium-animation-buttonGlow {fill: #fff; stroke: none; display: none;} .cesium-animation-rectButton:hover .cesium-animation-buttonGlow {display: block;} .cesium-animation-rectButton .cesium-animation-buttonPath {fill: #edffff;} .cesium-animation-rectButton .cesium-animation-buttonMain {stroke: #444; stroke-width: 1.2;} .cesium-animation-rectButton:hover .cesium-animation-buttonMain {stroke: #AEF;} .cesium-animation-rectButton:active .cesium-animation-buttonMain {fill: #ABD6FF;} .cesium-animation-buttonDisabled {-moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none;} .cesium-animation-buttonDisabled .cesium-animation-buttonMain {stroke: #555;} .cesium-animation-buttonDisabled .cesium-animation-buttonPath {fill: #818181;} .cesium-animation-buttonDisabled .cesium-animation-buttonGlow {display: none;} .cesium-animation-buttonToggled .cesium-animation-buttonGlow {display: block; fill: #2E2;} .cesium-animation-buttonToggled .cesium-animation-buttonMain {stroke: #2E2;} .cesium-animation-buttonToggled:hover .cesium-animation-buttonGlow {fill: #fff;} .cesium-animation-buttonToggled:hover .cesium-animation-buttonMain {stroke: #2E2;} .cesium-animation-shuttleRingG {cursor: pointer;} .cesium-animation-shuttleRingPointer {cursor: pointer;} .cesium-animation-shuttleRingPausePointer {cursor: pointer;} .cesium-animation-shuttleRingBack {fill: #181818; fill-opacity: 0.8; stroke: #333; stroke-width: 1.2;} .cesium-animation-shuttleRingSwoosh line {stroke: #8AC; stroke-width: 3; stroke-opacity: 0.2; stroke-linecap: round;} .cesium-animation-knobOuter {cursor: pointer; stroke: #444; stroke-width: 1.2;} .cesium-animation-knobInner {cursor: pointer;} -------------------------------------------------------------------------------- /point_cloud/js/ProgressBar.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | function ProgressBar(){ 4 | this._progress = 0; 5 | this._message = ""; 6 | 7 | this.maxOpacity = 0.6; 8 | 9 | this.element = document.createElement("div"); 10 | this.elProgress = document.createElement("div"); 11 | this.elProgressMessage = document.createElement("div"); 12 | 13 | //this.element.innerHTML = "element"; 14 | //this.elProgress.innerHTML = "progress"; 15 | 16 | this.element.innerHTML = ""; 17 | this.element.style.position = "fixed"; 18 | this.element.style.bottom = "40px"; 19 | this.element.style.width = "200px"; 20 | this.element.style.marginLeft = "-100px"; 21 | this.element.style.left = "50%"; 22 | this.element.style.borderRadius = "5px"; 23 | this.element.style.border = "1px solid #727678"; 24 | this.element.style.height = "16px"; 25 | this.element.style.padding = "1px"; 26 | this.element.style.textAlign = "center"; 27 | this.element.style.backgroundColor = "#6ba8e5"; 28 | this.element.style.opacity = this.maxOpacity; 29 | this.element.style.pointerEvents = "none"; 30 | 31 | this.elProgress.innerHTML = " "; 32 | this.elProgress.style.backgroundColor = "#b8e1fc"; 33 | this.elProgress.style.position = "absolute"; 34 | this.elProgress.style.borderRadius = "5px"; 35 | this.elProgress.style.width = "0%"; 36 | this.elProgress.style.height = "100%"; 37 | this.elProgress.style.margin = "0px"; 38 | this.elProgress.style.padding = "0px"; 39 | 40 | this.elProgressMessage.style.position = "absolute"; 41 | this.elProgressMessage.style.width = "100%"; 42 | this.elProgressMessage.innerHTML = "loading 1 / 10"; 43 | 44 | 45 | 46 | document.body.appendChild(this.element); 47 | this.element.appendChild(this.elProgress); 48 | this.element.appendChild(this.elProgressMessage); 49 | 50 | this.hide(); 51 | }; 52 | 53 | ProgressBar.prototype.hide = function(){ 54 | this.element.style.opacity = 0; 55 | this.element.style.transition = "all 0.2s ease"; 56 | }; 57 | 58 | ProgressBar.prototype.show = function(){ 59 | this.element.style.opacity = this.maxOpacity; 60 | this.element.style.transition = "all 0.2s ease"; 61 | }; 62 | 63 | Object.defineProperty(ProgressBar.prototype, "progress", { 64 | get: function(){ 65 | return this._progress; 66 | }, 67 | set: function(value){ 68 | this._progress = value; 69 | this.elProgress.style.width = (value * 100) + "%"; 70 | } 71 | }); 72 | 73 | Object.defineProperty(ProgressBar.prototype, "message", { 74 | get: function(){ 75 | return this._message; 76 | }, 77 | set: function(message){ 78 | this._message = message; 79 | this.elProgressMessage.innerHTML = message; 80 | } 81 | }); -------------------------------------------------------------------------------- /robmob/kobuki/commands.py: -------------------------------------------------------------------------------- 1 | from robmob.commands import Command 2 | from robmob.simulation import IN_SIMULATION 3 | 4 | DO_NOT_SEND_REPEATEDLY_FLAG = None 5 | DEFAULT_LINEAR_SPEED = 0.12 6 | DEFAULT_ANGULAR_SPEED = 1.0 7 | MAX_LINEAR_SPEED = 0.4 8 | MAX_ANGULAR_SPEED = 1.8 9 | 10 | SIMULATION_COMMAND_TOPIC = '/cmd_vel' 11 | ROBOT_COMMAND_TOPIC = '/mobile_base/commands/velocity' 12 | COMMAND_TOPIC = SIMULATION_COMMAND_TOPIC if IN_SIMULATION else ROBOT_COMMAND_TOPIC 13 | 14 | 15 | class RosTwistMessage: 16 | 17 | def __init__(self, linear_velocity, angular_velocity): 18 | self.message = { 19 | 'linear': { 20 | 'x': linear_velocity, 21 | 'y': 0.0, 22 | 'z': 0.0 23 | }, 24 | 'angular': { 25 | 'x': 0.0, 26 | 'y': 0.0, 27 | 'z': angular_velocity 28 | } 29 | } 30 | 31 | 32 | class KobukiCommand(Command): 33 | COMMAND_TOPIC = COMMAND_TOPIC 34 | 35 | 36 | class ResetCommand(KobukiCommand): 37 | def __init__(self): 38 | super().__init__(DO_NOT_SEND_REPEATEDLY_FLAG) 39 | self._set_message(RosTwistMessage(0, 0)) 40 | 41 | 42 | class MovementCommand(KobukiCommand): 43 | def __init__(self, linear, angular): 44 | super().__init__() 45 | if abs(linear) > MAX_LINEAR_SPEED: 46 | raise ValueError( 47 | 'La vitesse fournie est trop grande. La vitesse maximale du robot est {}'.format(MAX_LINEAR_SPEED)) 48 | if abs(angular) > MAX_ANGULAR_SPEED: 49 | raise ValueError( 50 | 'La vitesse linéaire fournie est trop grande. La vitesse de rotation maximale du robot est {}'.format( 51 | MAX_ANGULAR_SPEED)) 52 | 53 | self._set_message(RosTwistMessage(linear, angular)) 54 | 55 | 56 | class RotationCommand(MovementCommand): 57 | def __init__(self, speed): 58 | super().__init__(0.0, speed) 59 | 60 | 61 | class LinearMovementCommand(MovementCommand): 62 | def __init__(self, speed): 63 | super().__init__(speed, 0.0) 64 | 65 | 66 | class TurnLeftCommand(RotationCommand): 67 | def __init__(self): 68 | super().__init__(DEFAULT_ANGULAR_SPEED) 69 | 70 | 71 | class TurnRightCommand(RotationCommand): 72 | def __init__(self): 73 | super().__init__(-DEFAULT_ANGULAR_SPEED) 74 | 75 | 76 | class MoveForwardCommand(LinearMovementCommand): 77 | def __init__(self): 78 | super().__init__(DEFAULT_LINEAR_SPEED) 79 | 80 | 81 | class MoveBackwardCommand(LinearMovementCommand): 82 | def __init__(self): 83 | super().__init__(-DEFAULT_LINEAR_SPEED) 84 | -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/BaseLayerPicker/BaseLayerPicker.css: -------------------------------------------------------------------------------- 1 | .cesium-baseLayerPicker-selected {position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: none;} .cesium-baseLayerPicker-dropDown {display: block; position: absolute; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; top: auto; right: 0; width: 320px; max-height: 500px; margin-top: 5px; background-color: rgba(38, 38, 38, 0.75); border: 1px solid #444; padding: 6px; overflow: auto; border-radius: 10px; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; -webkit-transform: translate(0, -20%); -moz-transform: translate(0, -20%); transform: translate(0, -20%); visibility: hidden; opacity: 0; -webkit-transition: visibility 0s 0.2s, opacity 0.2s ease-in, -webkit-transform 0.2s ease-in; -moz-transition: visibility 0s 0.2s, opacity 0.2s ease-in, -moz-transform 0.2s ease-in; transition: visibility 0s 0.2s, opacity 0.2s ease-in, transform 0.2s ease-in;} .cesium-baseLayerPicker-dropDown-visible {-webkit-transform: translate(0, 0); -moz-transform: translate(0, 0); transform: translate(0, 0); visibility: visible; opacity: 1; -webkit-transition: opacity 0.2s ease-out, -webkit-transform 0.2s ease-out; -moz-transition: opacity 0.2s ease-out, -moz-transform 0.2s ease-out; transition: opacity 0.2s ease-out, transform 0.2s ease-out;} .cesium-baseLayerPicker-sectionTitle {display: block; font-family: sans-serif; font-size: 16pt; text-align: left; color: #edffff; border-bottom: 1px solid #888; margin-bottom: 4px;} .cesium-baseLayerPicker-choices {display: block; position: relative; top: auto; right: 0;} .cesium-baseLayerPicker-item {display: inline-block; vertical-align: top; margin: 2px 5px; width: 64px; text-align: center; cursor: pointer;} .cesium-baseLayerPicker-itemLabel {display: block; font-family: sans-serif; font-size: 8pt; text-align: center; vertical-align: middle; color: #edffff; cursor: pointer; word-wrap: break-word;} .cesium-baseLayerPicker-item:hover .cesium-baseLayerPicker-itemLabel, .cesium-baseLayerPicker-item:focus .cesium-baseLayerPicker-itemLabel {text-decoration: underline;} .cesium-baseLayerPicker-itemIcon {display: inline-block; position: relative; width: inherit; height: auto; background-size: 100% 100%; border: solid 1px #444; border-radius: 9px; color: #edffff; margin: 0; padding: 0; cursor: pointer; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;} .cesium-baseLayerPicker-item:hover .cesium-baseLayerPicker-itemIcon {border-color: #fff; box-shadow: 0 0 8px #fff, 0 0 8px #fff;} .cesium-baseLayerPicker-selectedItem .cesium-baseLayerPicker-itemLabel {color: rgb(189, 236, 248);} .cesium-baseLayerPicker-selectedItem .cesium-baseLayerPicker-itemIcon {border: double 4px rgb(189, 236, 248);} -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/InfoBox/InfoBoxDescription.css: -------------------------------------------------------------------------------- 1 | .cesium-svgPath-svg {position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden;} .cesium-button {display: inline-block; position: relative; background: #303336; border: 1px solid #444; color: #edffff; fill: #edffff; border-radius: 4px; padding: 5px 12px; margin: 2px 3px; cursor: pointer; overflow: hidden; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; user-select: none;} .cesium-button:focus {color: #fff; fill: #fff; border-color: #ea4; outline: none;} .cesium-button:hover {color: #fff; fill: #fff; background: #48b; border-color: #aef; box-shadow: 0 0 8px #fff;} .cesium-button:active {color: #000; fill: #000; background: #adf; border-color: #fff; box-shadow: 0 0 8px #fff;} .cesium-button:disabled, .cesium-button-disabled, .cesium-button-disabled:focus, .cesium-button-disabled:hover, .cesium-button-disabled:active {background: #303336; border-color: #444; color: #646464; fill: #646464; box-shadow: none; cursor: default;} .cesium-button option {background-color: #000; color: #eee;} .cesium-button option:disabled {color: #777;} .cesium-toolbar-button {-moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; width: 32px; height: 32px; border-radius: 14%; padding: 0; vertical-align: middle; z-index: 0;} .cesium-performanceDisplay-defaultContainer {position: absolute; top: 50px; right: 10px; text-align: right;} .cesium-performanceDisplay {background-color: rgba(40, 40, 40, 0.7); padding: 7px; border-radius: 5px; border: 1px solid #444; font: bold 12px sans-serif;} .cesium-performanceDisplay-fps {color: #e52;} .cesium-performanceDisplay-ms {color: #de3;} body {margin: 0; padding: 0;} .cesium-infoBox-description {font-family: sans-serif; font-size: 13px; padding: 4px 10px; margin-right: 4px; color: #edffff;} .cesium-infoBox-description a:link, .cesium-infoBox-description a:visited, .cesium-infoBox-description a:hover, .cesium-infoBox-description a:active {color: #edffff;} .cesium-infoBox-description table {color: #edffff;} .cesium-infoBox-defaultTable {width: 100%; color: #edffff;} .cesium-infoBox-defaultTable tr:nth-child(odd) {background-color: rgba(84, 84, 84, 0.8);} .cesium-infoBox-defaultTable tr:nth-child(even) {background-color: rgba(84, 84, 84, 0.25);} .cesium-infoBox-defaultTable th {font-weight: normal; padding: 3px; vertical-align: middle; text-align: center;} .cesium-infoBox-defaultTable td {padding: 3px; vertical-align: middle; text-align: left;} .cesium-infoBox-description-lighter {color: #000000;} .cesium-infoBox-description-lighter a:link, .cesium-infoBox-description-lighter a:visited, .cesium-infoBox-description-lighter a:hover, .cesium-infoBox-description-lighter a:active {color: #000000;} .cesium-infoBox-description-lighter table {color: #000000;} .cesium-infoBox-defaultTable-lighter {width: 100%; color: #000000;} .cesium-infoBox-defaultTable-lighter tr:nth-child(odd) {background-color: rgba(179, 179, 179, 0.8);} .cesium-infoBox-defaultTable-lighter tr:nth-child(even) {background-color: rgba(179, 179, 179, 0.25);} -------------------------------------------------------------------------------- /point_cloud/resources/icons/distance.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 20 | 39 | 42 | 43 | 45 | 46 | 48 | image/svg+xml 49 | 51 | 52 | 53 | 54 | 55 | 59 | 64 | 74 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /point_cloud/libs/plasio/js/client.js: -------------------------------------------------------------------------------- 1 | // client.js 2 | // Client side stuffs for greyhound web viewer 3 | // 4 | 5 | // Import all modules here even if we don't want to use them 6 | // so that browserify can pick them up 7 | var $ = require('jquery'), 8 | render = require('./render'), 9 | ui = require('./ui'), 10 | laslaz = require('./laslaz'); 11 | 12 | 13 | function endsWith(str, s) { 14 | return str.indexOf(s) === (str.length - s.length); 15 | } 16 | 17 | (function(w) { 18 | "use strict"; 19 | 20 | // The NACL module calls method on the window, make sure the laslaz module 21 | // can see messages sent by NACL 22 | // 23 | window.handleMessage = laslaz.handleMessage; 24 | 25 | // show an error message to the user 26 | // 27 | var errorOut = function(msg) { 28 | $("#messages").html("

" + msg + "

"); 29 | console.log('Error : ' + msg); 30 | }; 31 | 32 | // show a status message to the user 33 | var message = function(msg) { 34 | $("#messages").html("

" + msg + "

"); 35 | console.log('Status: ' + msg); 36 | }; 37 | 38 | $(document).on("plasio.start", function() { 39 | render.startRenderer($("#container").get(0), message); 40 | }); 41 | 42 | })(window); 43 | 44 | $(function() { 45 | setTimeout(function() { 46 | var isWebGLSupported = function() { 47 | if ("WebGLRenderingContext" in window) { 48 | // might have support 49 | // 50 | var e = document.createElement("canvas"); 51 | var webgl = e.getContext("webgl"); 52 | var experimental = false; 53 | if (webgl === null) { 54 | webgl = e.getContext("experimental-webgl"); 55 | experimental = true; 56 | } 57 | 58 | return [webgl !== null, experimental]; 59 | } 60 | 61 | return false; 62 | }; 63 | 64 | // if we're good to go, trigger the plasio.start event, all initializers 65 | // should be hooked to this event, and not DOMContentLoaded 66 | // 67 | var r = isWebGLSupported(); 68 | var supported = r[0]; 69 | var experimental = r[1]; 70 | if(supported) { 71 | $(".fullscreen").fadeOut(200); 72 | // we need to intialize the UI first, before we initialize everything else, 73 | // since UI has to show results and statuses about things as they initialize 74 | // 75 | $.event.trigger({ 76 | type: "plasio.startUI" 77 | }); 78 | 79 | $.event.trigger({ 80 | type: "plasio.start" 81 | }); 82 | 83 | if (experimental) { 84 | $.event.trigger({ 85 | type: "plasio.webglIsExperimental" 86 | }); 87 | } 88 | 89 | var parseURL = function(qs) { 90 | var name = qs.match(/\?s=(\S+)/); 91 | return name ? name[1] : null; 92 | }; 93 | 94 | 95 | // If a URL is specified, load that now 96 | var query = window.location.search; 97 | if (query) { 98 | query = parseURL(query); 99 | if (query && query.length > 0) { 100 | $.event.trigger({ 101 | type: "plasio.loadfiles.remote", 102 | url: query, 103 | name: query 104 | }); 105 | } 106 | } 107 | } 108 | else { 109 | $("#no-support").css("opacity", 1.0); 110 | } 111 | }, 1000); 112 | }); 113 | -------------------------------------------------------------------------------- /point_cloud/libs/signals/signals.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | JS Signals 4 | Released under the MIT license 5 | Author: Miller Medeiros 6 | Version: 1.0.0 - Build: 268 (2012/11/29 05:48 PM) 7 | */ 8 | (function(i){function h(a,b,c,d,e){this._listener=b;this._isOnce=c;this.context=d;this._signal=a;this._priority=e||0}function g(a,b){if(typeof a!=="function")throw Error("listener is a required param of {fn}() and should be a Function.".replace("{fn}",b));}function e(){this._bindings=[];this._prevParams=null;var a=this;this.dispatch=function(){e.prototype.dispatch.apply(a,arguments)}}h.prototype={active:!0,params:null,execute:function(a){var b;this.active&&this._listener&&(a=this.params?this.params.concat(a): 9 | a,b=this._listener.apply(this.context,a),this._isOnce&&this.detach());return b},detach:function(){return this.isBound()?this._signal.remove(this._listener,this.context):null},isBound:function(){return!!this._signal&&!!this._listener},isOnce:function(){return this._isOnce},getListener:function(){return this._listener},getSignal:function(){return this._signal},_destroy:function(){delete this._signal;delete this._listener;delete this.context},toString:function(){return"[SignalBinding isOnce:"+this._isOnce+ 10 | ", isBound:"+this.isBound()+", active:"+this.active+"]"}};e.prototype={VERSION:"1.0.0",memorize:!1,_shouldPropagate:!0,active:!0,_registerListener:function(a,b,c,d){var e=this._indexOfListener(a,c);if(e!==-1){if(a=this._bindings[e],a.isOnce()!==b)throw Error("You cannot add"+(b?"":"Once")+"() then add"+(!b?"":"Once")+"() the same listener without removing the relationship first.");}else a=new h(this,a,b,c,d),this._addBinding(a);this.memorize&&this._prevParams&&a.execute(this._prevParams);return a}, 11 | _addBinding:function(a){var b=this._bindings.length;do--b;while(this._bindings[b]&&a._priority<=this._bindings[b]._priority);this._bindings.splice(b+1,0,a)},_indexOfListener:function(a,b){for(var c=this._bindings.length,d;c--;)if(d=this._bindings[c],d._listener===a&&d.context===b)return c;return-1},has:function(a,b){return this._indexOfListener(a,b)!==-1},add:function(a,b,c){g(a,"add");return this._registerListener(a,!1,b,c)},addOnce:function(a,b,c){g(a,"addOnce");return this._registerListener(a, 12 | !0,b,c)},remove:function(a,b){g(a,"remove");var c=this._indexOfListener(a,b);c!==-1&&(this._bindings[c]._destroy(),this._bindings.splice(c,1));return a},removeAll:function(){for(var a=this._bindings.length;a--;)this._bindings[a]._destroy();this._bindings.length=0},getNumListeners:function(){return this._bindings.length},halt:function(){this._shouldPropagate=!1},dispatch:function(a){if(this.active){var b=Array.prototype.slice.call(arguments),c=this._bindings.length,d;if(this.memorize)this._prevParams= 13 | b;if(c){d=this._bindings.slice();this._shouldPropagate=!0;do c--;while(d[c]&&this._shouldPropagate&&d[c].execute(b)!==!1)}}},forget:function(){this._prevParams=null},dispose:function(){this.removeAll();delete this._bindings;delete this._prevParams},toString:function(){return"[Signal active:"+this.active+" numListeners:"+this.getNumListeners()+"]"}};var f=e;f.Signal=e;typeof define==="function"&&define.amd?define(function(){return f}):typeof module!=="undefined"&&module.exports?module.exports=f:i.signals= 14 | f})(this); -------------------------------------------------------------------------------- /IR-Test.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": { 7 | "collapsed": false, 8 | "jupyter": { 9 | "outputs_hidden": false 10 | } 11 | }, 12 | "outputs": [], 13 | "source": [ 14 | "# Importation des modules\n", 15 | "\n", 16 | "%load_ext autoreload\n", 17 | "%autoreload 2\n", 18 | "%matplotlib inline\n", 19 | "\n", 20 | "import numpy as np\n", 21 | "import matplotlib.pyplot as plt\n", 22 | "import time\n", 23 | "from robmob.robot import Robot\n", 24 | "from websocket import WebSocketConnectionClosedException\n", 25 | "from robmob.sensors import SharpSensor\n", 26 | "from IPython.display import clear_output" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": null, 32 | "metadata": { 33 | "collapsed": false, 34 | "jupyter": { 35 | "outputs_hidden": false 36 | } 37 | }, 38 | "outputs": [], 39 | "source": [ 40 | "ip_list = [('192.168.0.1%02d' % x) for x in range(15)]\n", 41 | "\n", 42 | "for ip in ip_list:\n", 43 | " try:\n", 44 | " robot = Robot(ip)\n", 45 | " robot.connect()\n", 46 | " time.sleep(0.3) #wait connection\n", 47 | "\n", 48 | " sharp_sensor_0 = SharpSensor(0)\n", 49 | " sharp_sensor_1 = SharpSensor(1)\n", 50 | " robot.add_sensor(sharp_sensor_0)\n", 51 | " robot.add_sensor(sharp_sensor_1)\n", 52 | " time.sleep(0.8) #let buffer fill with data\n", 53 | " \n", 54 | " key_in = ''\n", 55 | " \n", 56 | " while key_in not in ['n', 'q']:\n", 57 | " clear_output()\n", 58 | " print(\"Testing ip %s:\\nid0: %0.4f\\nid1: %0.4f\" % (ip, \n", 59 | " sharp_sensor_0.peek_data(), \n", 60 | " sharp_sensor_1.peek_data()))\n", 61 | " key_in = input()\n", 62 | " \n", 63 | " robot.disconnect()\n", 64 | " \n", 65 | " if key_in == 'q':\n", 66 | " break\n", 67 | " \n", 68 | " \n", 69 | " except (WebSocketConnectionClosedException, IndexError):\n", 70 | " clear_output()\n", 71 | " print('ip %s is not reachable' % ip)\n", 72 | " input() " 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": null, 78 | "metadata": {}, 79 | "outputs": [], 80 | "source": [ 81 | "\n", 82 | "\n", 83 | "\n" 84 | ] 85 | }, 86 | { 87 | "cell_type": "code", 88 | "execution_count": null, 89 | "metadata": {}, 90 | "outputs": [], 91 | "source": [] 92 | } 93 | ], 94 | "metadata": { 95 | "kernelspec": { 96 | "display_name": "Python 3", 97 | "language": "python", 98 | "name": "python3" 99 | }, 100 | "language_info": { 101 | "codemirror_mode": { 102 | "name": "ipython", 103 | "version": 3 104 | }, 105 | "file_extension": ".py", 106 | "mimetype": "text/x-python", 107 | "name": "python", 108 | "nbconvert_exporter": "python", 109 | "pygments_lexer": "ipython3", 110 | "version": "3.8.10" 111 | } 112 | }, 113 | "nbformat": 4, 114 | "nbformat_minor": 4 115 | } 116 | -------------------------------------------------------------------------------- /robmob/point_cloud.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | import numpy as np 4 | 5 | 6 | class PointCloud: 7 | SCALE = 0.01 8 | 9 | def __init__(self, points_optical_system, colors=None): 10 | if type(points_optical_system) is not np.ndarray or points_optical_system.shape[1] != 3: 11 | raise ValueError("points must be a numpy array of shape (n, 3)") 12 | if colors is not None and not points_optical_system.shape == points_optical_system.shape: 13 | raise ValueError("colors and points must have the same size") 14 | 15 | points = np.zeros_like(points_optical_system) 16 | points[:, 0] = points_optical_system[:, 2] 17 | points[:, 1] = -1 * points_optical_system[:, 0] 18 | points[:, 2] = -1 * points_optical_system[:, 1] 19 | 20 | self.points = points 21 | self.colors = colors if colors is not None else self._red_color_matrix(points.shape) 22 | 23 | self.min_x, self.min_y, self.min_z = np.amin(self.points, axis=0) 24 | self.max_x, self.max_y, self.max_z = np.amax(self.points, axis=0) 25 | 26 | def _red_color_matrix(self, shape): 27 | colors = np.zeros(shape, dtype=np.uint8) 28 | colors[:, 0] = 255 29 | return colors 30 | 31 | def _write_r_hrc(self): 32 | n_of_points = self.points.shape[0] 33 | n_of_points_bytes = int(n_of_points).to_bytes(4, byteorder='little') 34 | hrc_content = b'\x00' + n_of_points_bytes 35 | with open("./point_cloud/data/r/r.hrc", "wb") as f: 36 | f.write(hrc_content) 37 | 38 | def _write_cloud_js(self): 39 | cloud_js_content = { 40 | "version": "1.6", 41 | "octreeDir": "data", 42 | "boundingBox": { 43 | "lx": self.min_x, 44 | "ly": self.min_y, 45 | "lz": self.min_z, 46 | "ux": self.max_x, 47 | "uy": self.max_y, 48 | "uz": self.max_z 49 | }, 50 | "tightBoundingBox": { 51 | "lx": self.min_x, 52 | "ly": self.min_y, 53 | "lz": self.min_z, 54 | "ux": self.max_x, 55 | "uy": self.max_y, 56 | "uz": self.max_z 57 | }, 58 | "pointAttributes": [ 59 | "POSITION_CARTESIAN", 60 | "COLOR_PACKED" 61 | ], 62 | "spacing": 0.01, 63 | "scale": self.SCALE, 64 | "hierarchyStepSize": 1 65 | } 66 | with open("./point_cloud/cloud.js", "w") as f: 67 | f.write(json.dumps(cloud_js_content)) 68 | 69 | def _write_points(self): 70 | with open("./point_cloud/data/r/r.bin", "wb") as f: 71 | for point, color in zip(self.points, self.colors): 72 | point_uint = (point - np.array([self.min_x, self.min_y, self.min_z])) / self.SCALE 73 | 74 | x, y, z = np.asarray(point_uint, dtype='int') 75 | r, g, b = np.asarray(color, dtype='int') 76 | 77 | point_bytes = int(x).to_bytes(4, byteorder='little') + \ 78 | int(y).to_bytes(4, byteorder='little') + \ 79 | int(z).to_bytes(4, byteorder='little') + \ 80 | int(r).to_bytes(1, byteorder='little') + \ 81 | int(g).to_bytes(1, byteorder='little') + \ 82 | int(b).to_bytes(1, byteorder='little') + \ 83 | b'\x00' 84 | f.write(point_bytes) 85 | 86 | def save(self): 87 | self._write_r_hrc() 88 | self._write_cloud_js() 89 | self._write_points() 90 | -------------------------------------------------------------------------------- /robmob/icp_orig.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | def best_fit_transform(A, B): 5 | """ 6 | Calculates the least-squares best-fit transform between corresponding 3D points A->B 7 | Input: 8 | A: Nx3 numpy array of corresponding 3D points 9 | B: Nx3 numpy array of corresponding 3D points 10 | Returns: 11 | T: 4x4 homogeneous transformation matrix 12 | R: 3x3 rotation matrix 13 | t: 3x1 column vector 14 | """ 15 | 16 | assert len(A) == len(B) 17 | 18 | # translate points to their centroids 19 | centroid_A = np.mean(A, axis=0) 20 | centroid_B = np.mean(B, axis=0) 21 | AA = A - centroid_A 22 | BB = B - centroid_B 23 | 24 | # rotation matrix 25 | H = np.dot(AA.T, BB) 26 | U, S, Vt = np.linalg.svd(H) 27 | R = np.dot(Vt.T, U.T) 28 | 29 | # special reflection case 30 | if np.linalg.det(R) < 0: 31 | Vt[2, :] *= -1 32 | R = np.dot(Vt.T, U.T) 33 | 34 | # translation 35 | t = centroid_B.T - np.dot(R, centroid_A.T) 36 | 37 | # homogeneous transformation 38 | T = np.identity(4) 39 | T[0:3, 0:3] = R 40 | T[0:3, 3] = t 41 | 42 | return T, R, t 43 | 44 | 45 | def nearest_neighbor(src, dst): 46 | """ 47 | Find the nearest (Euclidean) neighbor in dst for each point in src 48 | Input: 49 | src: Nx3 array of points 50 | dst: Nx3 array of points 51 | Output: 52 | distances: Euclidean distances (errors) of the nearest neighbor 53 | indecies: dst indecies of the nearest neighbor 54 | """ 55 | 56 | indecies = np.zeros(src.shape[0], dtype=int) 57 | distances = np.zeros(src.shape[0]) 58 | for i, s in enumerate(src): 59 | min_dist = np.inf 60 | for j, d in enumerate(dst): 61 | dist = np.linalg.norm(s - d) 62 | if dist < min_dist: 63 | min_dist = dist 64 | indecies[i] = j 65 | distances[i] = dist 66 | return distances, indecies 67 | 68 | 69 | def icp(A, B, init_pose=None, max_iterations=20, tolerance=0.001): 70 | """ 71 | The Iterative Closest Point method 72 | Input: 73 | A: Nx3 numpy array of source 3D points 74 | B: Nx3 numpy array of destination 3D point 75 | init_pose: 4x4 homogeneous transformation 76 | max_iterations: exit algorithm after max_iterations 77 | tolerance: convergence criteria 78 | Output: 79 | T: final homogeneous transformation 80 | distances: Euclidean distances (errors) of the nearest neighbor 81 | """ 82 | 83 | # make points homogeneous, copy them so as to maintain the originals 84 | src = np.ones((4, A.shape[0])) 85 | dst = np.ones((4, B.shape[0])) 86 | src[0:3, :] = np.copy(A.T) 87 | dst[0:3, :] = np.copy(B.T) 88 | 89 | # apply the initial pose estimation 90 | if init_pose is not None: 91 | src = np.dot(init_pose, src) 92 | 93 | prev_error = 0 94 | 95 | for i in range(max_iterations): 96 | # find the nearest neighbours between the current source and destination points 97 | distances, indices = nearest_neighbor(src[0:3, :].T, dst[0:3, :].T) 98 | 99 | # compute the transformation between the current source and nearest destination points 100 | T, _, _ = best_fit_transform(src[0:3, :].T, dst[0:3, indices].T) 101 | 102 | # update the current source 103 | src = np.dot(T, src) 104 | 105 | # check error 106 | mean_error = np.sum(distances) / distances.size 107 | if abs(prev_error - mean_error) < tolerance: 108 | break 109 | prev_error = mean_error 110 | 111 | # calculcate final tranformation 112 | T, _, _ = best_fit_transform(A, src[0:3, :].T) 113 | 114 | return T, distances 115 | -------------------------------------------------------------------------------- /point_cloud/libs/signals/README.md: -------------------------------------------------------------------------------- 1 | # JS-Signals # 2 | 3 | [![Build Status](https://secure.travis-ci.org/millermedeiros/js-signals.png)](https://travis-ci.org/millermedeiros/js-signals) 4 | 5 | Custom event/messaging system for JavaScript inspired by [AS3-Signals](https://github.com/robertpenner/as3-signals). 6 | 7 | For a more in-depth introduction read the [JS-Signals Project Page](http://millermedeiros.github.com/js-signals/) and visit the links below. 8 | 9 | 10 | ## Links ## 11 | 12 | * [Project Page](http://millermedeiros.github.com/js-signals/) 13 | * [Wiki](http://github.com/millermedeiros/js-signals/wiki/) 14 | * [Documentation](http://millermedeiros.github.com/js-signals/docs) 15 | * [Changelog](http://github.com/millermedeiros/js-signals/blob/master/CHANGELOG.md) 16 | * [CompoundSignal - special Signal kind](https://github.com/millermedeiros/CompoundSignal) 17 | * [jasmine-signals](https://github.com/AdamNowotny/jasmine-signals) 18 | (Jasmine assertions to simplify signals testing) 19 | 20 | 21 | ## License ## 22 | 23 | * [MIT License](http://www.opensource.org/licenses/mit-license.php) 24 | 25 | 26 | ## Distribution Files ## 27 | 28 | You can use the same distribution file for all the evironments, browser script 29 | tag, AMD, CommonJS (since v0.7.0). 30 | 31 | Files inside `dist` folder: 32 | 33 | * docs/index.html : Documentation. 34 | * signals.js : Uncompressed source code with comments. 35 | * signals.min.js : Compressed code. 36 | 37 | You can install JS-Signals on Node.js using [NPM](http://npmjs.org/) 38 | 39 | npm install signals 40 | 41 | 42 | ## CompoundSignal 43 | 44 | Note that there is an advanced Signal type called `CompoundSignal` that is 45 | compatible with js-signals v0.7.0+. It's useful for cases where you may need to 46 | execute an action after multiple Signals are dispatched. It was split into its' 47 | own repository since this feature isn't always needed and that way it can be 48 | easily distributed trough npm. 49 | 50 | [CompoundSignal repository](https://github.com/millermedeiros/CompoundSignal) 51 | 52 | 53 | 54 | ## Repository Structure ## 55 | 56 | ### Folder Structure ### 57 | 58 | |-build -> files used on the build process 59 | |-src -> source files 60 | |-tests -> unit tests 61 | `-dist -> distribution files 62 | `-docs -> documentation 63 | 64 | ### Branches ### 65 | 66 | master -> always contain code from the latest stable version 67 | release-** -> code canditate for the next stable version (alpha/beta) 68 | develop -> main development branch (nightly) 69 | **other** -> features/hotfixes/experimental, probably non-stable code 70 | 71 | 72 | ## Building your own ## 73 | 74 | This project uses [Apache Ant](http://ant.apache.org/) for the build process. If for some reason you need to build a custom version of JS-Signals install Ant and run: 75 | 76 | ant build 77 | 78 | This will delete all JS files inside the `dist` folder, merge/update/compress source files, validate generated code using [JSLint](http://www.jslint.com/) and copy the output to the `dist` folder. 79 | 80 | There is also another ant task that runs the build task and generate 81 | documentation (used before each deploy): 82 | 83 | ant deploy 84 | 85 | **IMPORTANT:** `dist` folder always contain the latest version, regular users should **not** need to run build task. 86 | 87 | 88 | ## Running Tests ## 89 | 90 | The specs work on the browser and on node.js, during development you can use 91 | the `spec/runner_dev.html` file to avoid doing a build every time you make 92 | changes to the source files. On node.js you need to run `ant compile` after 93 | each source file change otherwise `npm test` will execute the files from last 94 | build - not adding it as a `pretest` script since the build adds information 95 | about the build date and build number and that would pollute the commit 96 | history. 97 | 98 | -------------------------------------------------------------------------------- /point_cloud/libs/Cesium/Widgets/Images/NavigationHelp/Touch.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | image/svg+xml 49 | 52 | 53 | 59 | 60 | 63 | 64 | 67 | 68 | 71 | 72 | 75 | 76 | 79 | 80 | 83 | 84 | 87 | 88 | 91 | 92 | 95 | 96 | 99 | 100 | 103 | 104 | 107 | 108 | 111 | 112 | 115 | 116 | 119 | 120 | -------------------------------------------------------------------------------- /point_cloud/libs/plasio/workers/laz-loader-worker.js: -------------------------------------------------------------------------------- 1 | // laz-loader-worker.js 2 | // 3 | 4 | //importScripts('laz-perf.js'); 5 | 6 | var instance = null; // laz-perf instance 7 | 8 | function readAs(buf, Type, offset, count) { 9 | count = (count === undefined || count === 0 ? 1 : count); 10 | var sub = buf.slice(offset, offset + Type.BYTES_PER_ELEMENT * count); 11 | 12 | var r = new Type(sub); 13 | if (count === undefined || count === 1) 14 | return r[0]; 15 | 16 | var ret = []; 17 | for (var i = 0 ; i < count ; i ++) { 18 | ret.push(r[i]); 19 | } 20 | 21 | return ret; 22 | } 23 | 24 | function parseLASHeader(arraybuffer) { 25 | var o = {}; 26 | 27 | o.pointsOffset = readAs(arraybuffer, Uint32Array, 32*3); 28 | o.pointsFormatId = readAs(arraybuffer, Uint8Array, 32*3+8); 29 | o.pointsStructSize = readAs(arraybuffer, Uint16Array, 32*3+8+1); 30 | o.pointsCount = readAs(arraybuffer, Uint32Array, 32*3 + 11); 31 | 32 | 33 | var start = 32*3 + 35; 34 | o.scale = readAs(arraybuffer, Float64Array, start, 3); start += 24; // 8*3 35 | o.offset = readAs(arraybuffer, Float64Array, start, 3); start += 24; 36 | 37 | var bounds = readAs(arraybuffer, Float64Array, start, 6); start += 48; // 8*6; 38 | o.maxs = [bounds[0], bounds[2], bounds[4]]; 39 | o.mins = [bounds[1], bounds[3], bounds[5]]; 40 | 41 | return o; 42 | } 43 | 44 | function handleEvent(msg) { 45 | switch(msg.type) { 46 | case "open": 47 | try { 48 | instance = new Module.LASZip(); 49 | var abInt = new Uint8Array(msg.arraybuffer); 50 | var buf = Module._malloc(msg.arraybuffer.byteLength); 51 | 52 | instance.arraybuffer = msg.arraybuffer; 53 | instance.buf = buf; 54 | Module.HEAPU8.set(abInt, buf); 55 | instance.open(buf, msg.arraybuffer.byteLength); 56 | 57 | instance.readOffset = 0; 58 | 59 | postMessage({ type: "open", status: 1}); 60 | } 61 | catch(e) { 62 | postMessage({ type: "open", status: 0, details: e }); 63 | } 64 | break; 65 | 66 | case "header": 67 | if (!instance) 68 | throw new Error("You need to open the file before trying to read header"); 69 | 70 | 71 | 72 | var header = parseLASHeader(instance.arraybuffer); 73 | header.pointsFormatId &= 0x3f; 74 | instance.header = header; 75 | postMessage({type: "header", status: 1, header: header}); 76 | break; 77 | 78 | case "read": 79 | if (!instance) 80 | throw new Error("You need to open the file before trying to read stuff"); 81 | 82 | var start = msg.start, count = msg.count, skip = msg.skip; 83 | var o = instance; 84 | 85 | if (!o.header) 86 | throw new Error("You need to query header before reading, I maintain state that way, sorry :("); 87 | 88 | var pointsToRead = Math.min(count * skip, o.header.pointsCount - o.readOffset); 89 | var bufferSize = Math.ceil(pointsToRead / skip); 90 | var pointsRead = 0; 91 | 92 | var this_buf = new Uint8Array(bufferSize * o.header.pointsStructSize); 93 | var buf_read = Module._malloc(o.header.pointsStructSize); 94 | for (var i = 0 ; i < pointsToRead ; i ++) { 95 | o.getPoint(buf_read); 96 | 97 | if (i % skip === 0) { 98 | var a = new Uint8Array(Module.HEAPU8.buffer, buf_read, o.header.pointsStructSize); 99 | this_buf.set(a, pointsRead * o.header.pointsStructSize, o.header.pointsStructSize); 100 | pointsRead ++; 101 | } 102 | 103 | o.readOffset ++; 104 | } 105 | 106 | postMessage({ 107 | type: 'header', 108 | status: 1, 109 | buffer: this_buf.buffer, 110 | count: pointsRead, 111 | hasMoreData: o.readOffset < o.header.pointsCount 112 | }); 113 | 114 | break; 115 | 116 | 117 | case "close": 118 | if (instance !== null) { 119 | instance.delete(); 120 | instance = null; 121 | } 122 | postMessage({ type: "close", status: 1}); 123 | break; 124 | } 125 | } 126 | 127 | onmessage = function(event) { 128 | try { 129 | handleEvent(event.data); 130 | } catch(e) { 131 | postMessage({type: event.data.type, status: 0, details: e}); 132 | } 133 | }; 134 | 135 | 136 | -------------------------------------------------------------------------------- /robmob_test/robot_test.py: -------------------------------------------------------------------------------- 1 | import time 2 | import unittest 3 | 4 | import matplotlib.pyplot as plt 5 | 6 | from robmob.robot import Robot 7 | from robmob.rover.commands import ResetCommand, MovementPWMCommand 8 | from robmob.rover.sensors import RobotEspSensor, SharpSensor, CameraRGBSensor, CameraDepthSensor, OakLiteCamera, \ 9 | LDLidarSensor 10 | 11 | 12 | class TestRobot(unittest.TestCase): 13 | def test_connect(self): 14 | robot = Robot('localhost', port=9090) 15 | robot.connect() 16 | self.assertTrue(robot.connection_established) 17 | 18 | def test_range(self): 19 | robot = Robot('localhost', port=9090) 20 | robot.connect() 21 | 22 | sensor = SharpSensor() 23 | robot.add_sensor(sensor) 24 | 25 | time.sleep(2) 26 | msg = sensor.peek_data() 27 | assert isinstance(msg, float) 28 | 29 | def test_receive_msg(self): 30 | robot = Robot('localhost', port=9090) 31 | robot.connect() 32 | 33 | sensor = RobotEspSensor() 34 | robot.add_sensor(sensor) 35 | 36 | time.sleep(1) 37 | msg = sensor.peek_data() 38 | 39 | for k in ( 40 | 'speedGetA', 'speedGetB', 'gx', 'gy', 'gz', 'ax', 'ay', 'az', 'mx', 'my', 'mz', 'rgx', 'rgy', 'rgz', 41 | 'rax', 'ray', 'raz', 'rmx', 'rmy', 'rmz', 'ax_offset', 'ay_offset', 'az_offset', 'gx_offset', 42 | 'gy_offset', 'gz_offset', 'en_odom_l', 'en_odom_r', 'loadVoltage_V'): 43 | self.assertTrue(k in msg) 44 | 45 | def test_send_message(self): 46 | robot = Robot('localhost', port=9090) 47 | robot.connect() 48 | 49 | sensor = RobotEspSensor() 50 | robot.add_sensor(sensor) 51 | 52 | time.sleep(0.5) 53 | start = sensor.peek_data() 54 | 55 | robot.send_command(MovementPWMCommand(255, 127)) 56 | # robot.send_command(MovementFloatCommand(1, 0.5)) 57 | # robot.send_command(MovementCommand(1, 0)) 58 | time.sleep(1) 59 | robot.send_command(ResetCommand()) 60 | 61 | time.sleep(0.1) 62 | end = sensor.peek_data() 63 | 64 | dodl = end['en_odom_l'] - start['en_odom_l'] 65 | dodr = end['en_odom_r'] - start['en_odom_r'] 66 | 67 | self.assertTrue(dodl > 0) 68 | self.assertTrue(dodr > 0) 69 | 70 | def test_plot(self): 71 | robot = Robot('localhost', port=9090) 72 | robot.connect() 73 | 74 | sensor = RobotEspSensor() 75 | robot.add_sensor(sensor) 76 | time.sleep(0.1) 77 | 78 | gz = [] 79 | for i in range(100): 80 | time.sleep(0.02) 81 | gz.append(sensor.peek_data()['rgz']) 82 | 83 | import matplotlib.pyplot as plt 84 | plt.plot(gz) 85 | plt.show() 86 | 87 | def test_camera_rgb_oak(self): 88 | camera = OakLiteCamera(use_rgb=True) 89 | img = camera.peek_rgb() 90 | assert img.shape == (1080, 1920, 3) 91 | plt.imshow(img) 92 | plt.show() 93 | 94 | def test_camera_left_oak(self): 95 | camera = OakLiteCamera() 96 | img = camera.peek_left() 97 | assert img.shape == (480, 640) 98 | plt.imshow(img, cmap='gray') 99 | plt.show() 100 | 101 | def test_camera_depth_oak(self): 102 | camera = OakLiteCamera(use_depth=True) 103 | img = camera.peek_depth() 104 | assert img.shape == (480, 640) 105 | # normalize 106 | img = (img - img.min()) / (img.max() - img.min()) 107 | plt.imshow(img) 108 | plt.show() 109 | 110 | def test_camera_apriltag(self): 111 | camera = OakLiteCamera(use_april=True) 112 | tag = camera.peek_apriltag() 113 | print(tag) 114 | 115 | def test_lidar(self): 116 | robot = Robot('localhost', port=9090) 117 | robot.connect() 118 | 119 | sensor = LDLidarSensor() 120 | robot.add_sensor(sensor) 121 | 122 | time.sleep(2) 123 | msg = sensor.peek_data() 124 | print(msg) 125 | 126 | -------------------------------------------------------------------------------- /point_cloud/libs/other/BinaryHeap.js: -------------------------------------------------------------------------------- 1 | /** 2 | * from: http://eloquentjavascript.net/1st_edition/appendix2.html 3 | * 4 | */ 5 | 6 | function BinaryHeap(scoreFunction){ 7 | this.content = []; 8 | this.scoreFunction = scoreFunction; 9 | } 10 | 11 | BinaryHeap.prototype = { 12 | push: function(element) { 13 | // Add the new element to the end of the array. 14 | this.content.push(element); 15 | // Allow it to bubble up. 16 | this.bubbleUp(this.content.length - 1); 17 | }, 18 | 19 | pop: function() { 20 | // Store the first element so we can return it later. 21 | var result = this.content[0]; 22 | // Get the element at the end of the array. 23 | var end = this.content.pop(); 24 | // If there are any elements left, put the end element at the 25 | // start, and let it sink down. 26 | if (this.content.length > 0) { 27 | this.content[0] = end; 28 | this.sinkDown(0); 29 | } 30 | return result; 31 | }, 32 | 33 | remove: function(node) { 34 | var length = this.content.length; 35 | // To remove a value, we must search through the array to find 36 | // it. 37 | for (var i = 0; i < length; i++) { 38 | if (this.content[i] != node) continue; 39 | // When it is found, the process seen in 'pop' is repeated 40 | // to fill up the hole. 41 | var end = this.content.pop(); 42 | // If the element we popped was the one we needed to remove, 43 | // we're done. 44 | if (i == length - 1) break; 45 | // Otherwise, we replace the removed element with the popped 46 | // one, and allow it to float up or sink down as appropriate. 47 | this.content[i] = end; 48 | this.bubbleUp(i); 49 | this.sinkDown(i); 50 | break; 51 | } 52 | }, 53 | 54 | size: function() { 55 | return this.content.length; 56 | }, 57 | 58 | bubbleUp: function(n) { 59 | // Fetch the element that has to be moved. 60 | var element = this.content[n], score = this.scoreFunction(element); 61 | // When at 0, an element can not go up any further. 62 | while (n > 0) { 63 | // Compute the parent element's index, and fetch it. 64 | var parentN = Math.floor((n + 1) / 2) - 1, 65 | parent = this.content[parentN]; 66 | // If the parent has a lesser score, things are in order and we 67 | // are done. 68 | if (score >= this.scoreFunction(parent)) 69 | break; 70 | 71 | // Otherwise, swap the parent with the current element and 72 | // continue. 73 | this.content[parentN] = element; 74 | this.content[n] = parent; 75 | n = parentN; 76 | } 77 | }, 78 | 79 | sinkDown: function(n) { 80 | // Look up the target element and its score. 81 | var length = this.content.length, 82 | element = this.content[n], 83 | elemScore = this.scoreFunction(element); 84 | 85 | while(true) { 86 | // Compute the indices of the child elements. 87 | var child2N = (n + 1) * 2, child1N = child2N - 1; 88 | // This is used to store the new position of the element, 89 | // if any. 90 | var swap = null; 91 | // If the first child exists (is inside the array)... 92 | if (child1N < length) { 93 | // Look it up and compute its score. 94 | var child1 = this.content[child1N], 95 | child1Score = this.scoreFunction(child1); 96 | // If the score is less than our element's, we need to swap. 97 | if (child1Score < elemScore) 98 | swap = child1N; 99 | } 100 | // Do the same checks for the other child. 101 | if (child2N < length) { 102 | var child2 = this.content[child2N], 103 | child2Score = this.scoreFunction(child2); 104 | if (child2Score < (swap == null ? elemScore : child1Score)) 105 | swap = child2N; 106 | } 107 | 108 | // No need to swap further, we are done. 109 | if (swap == null) break; 110 | 111 | // Otherwise, swap and continue. 112 | this.content[n] = this.content[swap]; 113 | this.content[swap] = element; 114 | n = swap; 115 | } 116 | } 117 | }; -------------------------------------------------------------------------------- /collect/CollectTest.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "id": "63c3b01a-7124-4c66-a42a-5ca02d59369e", 6 | "metadata": {}, 7 | "source": [ 8 | "import pickle\n", 9 | "import pathlib\n", 10 | "\n", 11 | "import matplotlib.pyplot as plt\n", 12 | "import numpy as np" 13 | ], 14 | "outputs": [], 15 | "execution_count": null 16 | }, 17 | { 18 | "cell_type": "code", 19 | "id": "3072f0a0-7813-4557-93d1-0e78974bdb8b", 20 | "metadata": {}, 21 | "source": [ 22 | "lidar_paths = sorted(list(pathlib.Path('data/lidar').iterdir()))\n", 23 | "oak_paths = sorted(list(pathlib.Path('data/oak').iterdir()))\n", 24 | "imu_paths = sorted(list(pathlib.Path('data/imu').iterdir()))" 25 | ], 26 | "outputs": [], 27 | "execution_count": null 28 | }, 29 | { 30 | "cell_type": "code", 31 | "id": "2e89dfde-6181-48b4-9e7f-cc7dd5ea6a93", 32 | "metadata": {}, 33 | "source": [ 34 | "def lidar_to_3d_homogeneous_matrix(lidar_data):\n", 35 | " ranges = np.array(lidar_data['ranges'])\n", 36 | " thetas = np.arange(lidar_data['angle_min'], lidar_data['angle_max']+lidar_data['angle_increment'], lidar_data['angle_increment'])\n", 37 | " xs = ranges * np.cos(thetas[:len(ranges)])\n", 38 | " ys = ranges * np.sin(thetas[:len(ranges)])\n", 39 | " \n", 40 | " pts = np.vstack((xs, ys, np.zeros(xs.shape), np.ones(xs.shape))).T\n", 41 | " \n", 42 | " # Remove the points that are at the origin.\n", 43 | " pts = pts[np.nonzero(np.logical_or(pts[:,0] != 0., pts[:,1] != 0.))]\n", 44 | " \n", 45 | " return pts\n", 46 | "\n", 47 | "def plot_point_clouds(pcls):\n", 48 | " STYLES = ['r+', 'bx', 'g*', 'md', 'ys']\n", 49 | " \n", 50 | " for i, pcl in enumerate(pcls):\n", 51 | " plt.plot(pcl[:,0], pcl[:,1], STYLES[i], label='Nuage {}'.format(i))\n", 52 | " plt.plot([0.0], [0.0], 'ko')\n", 53 | " \n", 54 | " plt.axis('equal')\n", 55 | " plt.legend()\n", 56 | " plt.show()" 57 | ], 58 | "outputs": [], 59 | "execution_count": null 60 | }, 61 | { 62 | "cell_type": "code", 63 | "id": "c2bbc009-816a-442d-a510-5a56b92c719a", 64 | "metadata": {}, 65 | "source": [ 66 | "for lidar_path in lidar_paths:\n", 67 | " data = pickle.load(open(lidar_path, 'rb'))\n", 68 | " plot_point_clouds([lidar_to_3d_homogeneous_matrix(data)])" 69 | ], 70 | "outputs": [], 71 | "execution_count": null 72 | }, 73 | { 74 | "cell_type": "code", 75 | "id": "9bf6e794-a1ea-44e3-a492-675630de2344", 76 | "metadata": { 77 | "scrolled": true 78 | }, 79 | "source": [ 80 | "for oak_path in oak_paths:\n", 81 | " data = pickle.load(open(oak_path, 'rb'))\n", 82 | " plt.imshow(data['data'], cmap='gray')\n", 83 | " plt.show()" 84 | ], 85 | "outputs": [], 86 | "execution_count": null 87 | }, 88 | { 89 | "cell_type": "code", 90 | "id": "9f1ff8dd-1796-40bf-ba3f-798152391022", 91 | "metadata": { 92 | "scrolled": true 93 | }, 94 | "source": [ 95 | "for imu_path in imu_paths[1:10]:\n", 96 | " print(imu_path)\n", 97 | " data = pickle.load(open(imu_path, 'rb'))\n", 98 | " print(data)" 99 | ], 100 | "outputs": [], 101 | "execution_count": null 102 | }, 103 | { 104 | "cell_type": "code", 105 | "id": "65bee1aa-b964-4e49-9635-31587c8db90c", 106 | "metadata": {}, 107 | "source": [], 108 | "outputs": [], 109 | "execution_count": null 110 | } 111 | ], 112 | "metadata": { 113 | "kernelspec": { 114 | "display_name": "Python 3 (ipykernel)", 115 | "language": "python", 116 | "name": "python3" 117 | }, 118 | "language_info": { 119 | "codemirror_mode": { 120 | "name": "ipython", 121 | "version": 3 122 | }, 123 | "file_extension": ".py", 124 | "mimetype": "text/x-python", 125 | "name": "python", 126 | "nbconvert_exporter": "python", 127 | "pygments_lexer": "ipython3", 128 | "version": "3.8.10" 129 | } 130 | }, 131 | "nbformat": 4, 132 | "nbformat_minor": 5 133 | } 134 | -------------------------------------------------------------------------------- /robmob/icp.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | def best_fit_transform(A, B): 5 | """ 6 | Calculates the least-squares best-fit transform between corresponding 3D points A->B 7 | Input: 8 | A: Nx3 numpy array of corresponding 3D points 9 | B: Nx3 numpy array of corresponding 3D points 10 | Returns: 11 | T: 4x4 homogeneous transformation matrix 12 | R: 3x3 rotation matrix 13 | t: 3x1 column vector 14 | """ 15 | 16 | assert len(A) == len(B) 17 | 18 | # translate points to their centroids 19 | centroid_A = np.mean(A, axis=0) 20 | centroid_B = np.mean(B, axis=0) 21 | AA = A - centroid_A 22 | BB = B - centroid_B 23 | 24 | # rotation matrix 25 | H = np.dot(AA.T, BB) 26 | U, S, Vt = np.linalg.svd(H) 27 | R = np.dot(Vt.T, U.T) 28 | 29 | # special reflection case 30 | if np.linalg.det(R) < 0: 31 | Vt[2, :] *= -1 32 | R = np.dot(Vt.T, U.T) 33 | 34 | # translation 35 | t = centroid_B.T - np.dot(R, centroid_A.T) 36 | 37 | # homogeneous transformation 38 | T = np.identity(4) 39 | T[0:3, 0:3] = R 40 | T[0:3, 3] = t 41 | 42 | return T, R, t 43 | 44 | 45 | def nearest_neighbor(src, dst): 46 | """ 47 | Find the nearest (Euclidean) neighbor in dst for each point in src 48 | Input: 49 | src: Nx3 array of points 50 | dst: Nx3 array of points 51 | Output: 52 | distances: Euclidean distances (errors) of the nearest neighbor 53 | indecies: dst indecies of the nearest neighbor 54 | """ 55 | 56 | indecies = np.zeros(src.shape[0], dtype=int) 57 | distances = np.zeros(src.shape[0]) 58 | for i, s in enumerate(src): 59 | distances_mat = np.linalg.norm(dst[:] - s, axis=1) 60 | indecies[i] = np.argmin(distances_mat) 61 | distances[i] = distances_mat[indecies[i]] 62 | 63 | return distances, indecies 64 | 65 | 66 | def homogeneous_copy_of_pcl(pcl): 67 | """ 68 | Input: 69 | pcl: Nx3 or Nx4 numpy array of 3D points. 70 | Output: 71 | A deep copy of the point cloud, in homogeneous coordinates. 72 | If the input matrix had 4 columns, it is returned as is. 73 | """ 74 | if pcl.shape[1] == 4: 75 | return np.copy(pcl.T) 76 | elif pcl.shape[1] == 3: 77 | copy_of_pcl = np.copy(pcl) 78 | return np.concatenate((copy_of_pcl.T, np.ones((1, copy_of_pcl.shape[0]))), axis=0) 79 | 80 | 81 | def icp(A, B, init_pose=None, max_iterations=50, tolerance=0.001): 82 | """ 83 | The Iterative Closest Point method 84 | Input: 85 | A: Nx3 or Nx4 numpy array of source 3D points 86 | B: Nx3 or Nx4 numpy array of destination 3D point 87 | init_pose: 4x4 homogeneous transformation 88 | max_iterations: exit algorithm after max_iterations 89 | tolerance: convergence criteria 90 | Output: 91 | T: final homogeneous transformation 92 | distances: Euclidean distances (errors) of the nearest neighbor 93 | """ 94 | 95 | # Convert the points to homogeneous coordinates. 96 | src = homogeneous_copy_of_pcl(A) 97 | dst = homogeneous_copy_of_pcl(B) 98 | 99 | # apply the initial pose estimation 100 | if init_pose is not None: 101 | src = np.dot(init_pose, src) 102 | 103 | prev_error = 0 104 | 105 | for i in range(max_iterations): 106 | # find the nearest neighbours between the current source and destination points 107 | distances, indices = nearest_neighbor(src[0:3, :].T, dst[0:3, :].T) 108 | 109 | # compute the transformation between the current source and nearest destination points 110 | T, _, _ = best_fit_transform(src[0:3, :].T, dst[0:3, indices].T) 111 | 112 | # update the current source 113 | src = np.dot(T, src) 114 | 115 | # check error 116 | mean_error = np.average(distances) 117 | print('Mean distance between associated points: {}'.format(mean_error)) 118 | if abs(prev_error - mean_error) < tolerance: 119 | break 120 | prev_error = mean_error 121 | 122 | # calculcate final tranformation 123 | T, _, _ = best_fit_transform(A[:, 0:3], src[0:3, :].T) 124 | 125 | return T, distances 126 | -------------------------------------------------------------------------------- /point_cloud/resources/icons/clip_volume.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 21 | 23 | 30 | 31 | 50 | 53 | 54 | 56 | 57 | 59 | image/svg+xml 60 | 62 | 63 | 64 | 65 | 66 | 70 | 80 | 85 | 90 | 96 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /Kinect Test.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": { 7 | "collapsed": false, 8 | "jupyter": { 9 | "outputs_hidden": false 10 | } 11 | }, 12 | "outputs": [], 13 | "source": [ 14 | "# Importation des modules\n", 15 | "\n", 16 | "%load_ext autoreload\n", 17 | "%autoreload 2\n", 18 | "%matplotlib inline\n", 19 | "\n", 20 | "import numpy as np\n", 21 | "import matplotlib.pyplot as plt\n", 22 | "import time\n", 23 | "from robmob.robot import Robot\n", 24 | "from websocket import WebSocketConnectionClosedException\n", 25 | "from robmob.sensors import KinectRGBSensor\n", 26 | "from IPython.display import clear_output" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": null, 32 | "metadata": { 33 | "collapsed": false, 34 | "jupyter": { 35 | "outputs_hidden": false 36 | } 37 | }, 38 | "outputs": [], 39 | "source": [ 40 | "robot = Robot('192.168.0.104')\n", 41 | "robot.connect()\n", 42 | "time.sleep(1)\n", 43 | "kinect = KinectRGBSensor()\n", 44 | "robot.add_sensor(kinect)\n", 45 | "time.sleep(1)\n", 46 | "print(len(kinect.buffer))" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": null, 52 | "metadata": { 53 | "collapsed": false, 54 | "jupyter": { 55 | "outputs_hidden": false 56 | } 57 | }, 58 | "outputs": [], 59 | "source": [ 60 | "print(len(kinect.buffer))" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": null, 66 | "metadata": { 67 | "collapsed": false, 68 | "jupyter": { 69 | "outputs_hidden": false 70 | } 71 | }, 72 | "outputs": [], 73 | "source": [ 74 | "robot.disconnect()" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": null, 80 | "metadata": { 81 | "collapsed": false, 82 | "jupyter": { 83 | "outputs_hidden": false 84 | } 85 | }, 86 | "outputs": [], 87 | "source": [ 88 | "ip_list = [('192.168.0.1%02d' % x) for x in range(15)]\n", 89 | "\n", 90 | "for ip in ip_list:\n", 91 | " try:\n", 92 | " robot = Robot(ip)\n", 93 | " robot.connect()\n", 94 | " time.sleep(0.4) #wait connection\n", 95 | " \n", 96 | " kinect = KinectRGBSensor()\n", 97 | " robot.add_sensor(kinect)\n", 98 | " time.sleep(3) #let buffer fill with data\n", 99 | " \n", 100 | " \n", 101 | " key_in = ''\n", 102 | " \n", 103 | " while key_in not in ['n', 'q']:\n", 104 | " clear_output()\n", 105 | " print(\"Testing ip %s: Buffer has length %d\" % (ip, len(kinect.buffer)))\n", 106 | " key_in = input()\n", 107 | " \n", 108 | " if key_in == 'q':\n", 109 | " robot.disconnect()\n", 110 | " break\n", 111 | " robot.disconnect()\n", 112 | " \n", 113 | " except (WebSocketConnectionClosedException, IndexError):\n", 114 | " clear_output()\n", 115 | " print('ip %s is not reachable' % ip)\n", 116 | " key = input()\n", 117 | " if key == 'q':\n", 118 | " break\n", 119 | " " 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": null, 125 | "metadata": { 126 | "collapsed": false, 127 | "jupyter": { 128 | "outputs_hidden": false 129 | } 130 | }, 131 | "outputs": [], 132 | "source": [] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": null, 137 | "metadata": {}, 138 | "outputs": [], 139 | "source": [] 140 | } 141 | ], 142 | "metadata": { 143 | "kernelspec": { 144 | "display_name": "Python 3", 145 | "language": "python", 146 | "name": "python3" 147 | }, 148 | "language_info": { 149 | "codemirror_mode": { 150 | "name": "ipython", 151 | "version": 3 152 | }, 153 | "file_extension": ".py", 154 | "mimetype": "text/x-python", 155 | "name": "python", 156 | "nbconvert_exporter": "python", 157 | "pygments_lexer": "ipython3", 158 | "version": "3.8.10" 159 | }, 160 | "widgets": { 161 | "state": {}, 162 | "version": "1.1.2" 163 | } 164 | }, 165 | "nbformat": 4, 166 | "nbformat_minor": 4 167 | } 168 | -------------------------------------------------------------------------------- /point_cloud/resources/icons/sphere.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 26 | 30 | 34 | 35 | 42 | 47 | 48 | 55 | 60 | 61 | 72 | 73 | 92 | 95 | 96 | 98 | 99 | 101 | image/svg+xml 102 | 104 | 105 | 106 | 107 | 108 | 112 | 122 | 123 | 124 | --------------------------------------------------------------------------------