├── 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 | [](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 |
--------------------------------------------------------------------------------