diff --git a/Laboratoire 0.ipynb b/Laboratoire 0.ipynb index 259014b..f4fc627 100644 --- a/Laboratoire 0.ipynb +++ b/Laboratoire 0.ipynb @@ -108,6 +108,11 @@ }, { "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, "source": [ "# Introduction au simulateur\n", "\n", @@ -142,7 +147,7 @@ "- La machine a au moins 4G de RAM\n", "- Si possible, plus d'un CPU\n", "\n", - "Avant de lancer la VM, ajoutez un `port forwarding` dans `Network -> Advanced -> Port Forwarding`. Ensuite, ajoutez une règle pour `forward` le port `9090` de la machine hôte au port `9090` de la machine invitée.\n", + "Avant de lancer la VM, ajoutez un `port forwarding` dans `Settings -> Network -> Advanced -> Port Forwarding`. Ensuite, ajoutez une règle pour `forward` le port `9090` de la machine hôte au port `9090` de la machine invitée.\n", "\n", "![port_forwarding](doc/port_forwarding.png)\n", "\n", @@ -177,11 +182,18 @@ "```\n", "4. Redémarrer la machine avec\n", "```bash\n", - "sudo shutdown now\n", + "sudo reboot now\n", "```\n", "\n", "Si cela ne fonctionne toujours pas, il faudrait créer une nouvelle machine virtuelle vierge et y installer les dépendances. Les étapes d'installations sont détaillées dans le notebook `ConfigurationVM.ipynb`.\n", "\n", + "## Mise-à-jour du simulateur\n", + "\n", + "```bash\n", + "cd catkin_ws\n", + "git pull\n", + "```\n", + "\n", "## Création d'une carte\n", "\n", "En guise d'introduction au simulateur, nous allons construire une carte avec les données du LiDAR avec un algorithme que vous allez étudier plus tard dans le cours : SLAM [Simultaneous localization and mapping](https://www.wikiwand.com/en/Simultaneous_localization_and_mapping).\n", @@ -200,7 +212,7 @@ "\n", "En bas de la fenêtre principale de Gazebo, il y a un compteur affichant le `Real Time Factor`. Ce facteur représente la vitesse relative de la simulation par rapport au temps réel. Ce facteur devrait être près de 1, si ce n'est pas le cas, nous allons ajuster le pas de la simulation.\n", "\n", - "Lancez un autre terminal avec `CTRL-ALT-T` et entrez-y:\n", + "Lancez un autre terminal avec `CTRL-ALT-T` (ou dans un nouvel onglet `CTRL-SHIFT-T`) et entrez-y:\n", "\n", "```bash\n", "gz physics -s 0.001\n", @@ -273,13 +285,7 @@ "![mapping](doc/mapping.png)\n", "\n", "Vous pouvez maintenant choisir `2D Nav Goal` et placer un vecteur dans la carte, le robot va s'y rendre de façon autonome en évitant les obstacles." - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%% md\n" - } - } + ] }, { "cell_type": "markdown", @@ -592,7 +598,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -606,7 +612,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.10.5" }, "widgets": { "state": {}, @@ -615,4 +621,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/Laboratoire 2.ipynb b/Laboratoire 2.ipynb index 3ae6ee6..675168c 100644 --- a/Laboratoire 2.ipynb +++ b/Laboratoire 2.ipynb @@ -32,7 +32,6 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false }, @@ -51,7 +50,9 @@ "from robmob.robot import Robot\n", "from robmob.sensors import GyroSensor\n", "from robmob.sensors import SimulatorSensor, IN_SIMULATION\n", - "from robmob.visualization import Visualizer" + "from robmob.visualization import Visualizer\n", + "\n", + "import numpy as np" ] }, { @@ -69,7 +70,6 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false }, @@ -100,7 +100,6 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false }, @@ -129,7 +128,6 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false }, @@ -165,7 +163,6 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false }, @@ -218,7 +215,6 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false }, @@ -248,7 +244,6 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false }, @@ -299,7 +294,7 @@ "\n", "> **PROTIP** Utilisez l'opérateur modulo % pour ramener l'angle en 0 et 360\n", "\n", - "Si vous utilisez le simulateur, vous devrez utiliser le code suivant pour obtenir le `real_time_factor` du simulateur. Le `real_time_factor` sera un facteur multiplicatif au temps d'intégration `dt = real_time_factor / gyro.SAMPLE_RATE`. Ce facteur vient compenser le fait que votre ordinateur et le simulateur ne s'exécutent pas au même rythme. Si le `real_time_factor` est égal à 2, si une seconde se passe sur votre ordinateur, 2 secondes se seront écoulées dans la simulation. Ainsi, il faut ajuster le temps d'intégration." + "**Si vous utilisez le simulateur**, vous devrez utiliser le code suivant pour obtenir le `real_time_factor` du simulateur. Le `real_time_factor` sera un facteur multiplicatif au temps d'intégration `dt = real_time_factor / gyro.SAMPLE_RATE`. Ce facteur vient compenser le fait que votre ordinateur et le simulateur ne s'exécutent pas au même rythme. Si le `real_time_factor` est égal à 2, si une seconde se passe sur votre ordinateur, 2 secondes se seront écoulées dans la simulation. Ainsi, il faut ajuster le temps d'intégration." ] }, { @@ -337,10 +332,10 @@ "cell_type": "code", "execution_count": null, "metadata": { - "tags": [], "pycharm": { "name": "#%%\n" - } + }, + "tags": [] }, "outputs": [], "source": [ @@ -357,7 +352,6 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false }, @@ -400,6 +394,24 @@ "> **PROTIP** Il est possible que vous observiez que l'angle dérive rapidement. Ce la peut être causé par un changement de température du robot (voir OffDr dans la datasheet). Si cela est le cas, réévaluez le code de la partie 2 pour recalculer `z_offset`" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Maintenant, produisez un graphique montrant la vitesse angulaire du robot en fonction du temps, et un deuxième montrant l'angle du robot dans le temps." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# TODO graphique vitesse angulaire\n", + "\n", + "# TODO graphique position" + ] + }, { "cell_type": "markdown", "metadata": { @@ -410,24 +422,26 @@ "source": [ "### Partie 4 - Influence de l'angle du gyroscope\n", "\n", + "> **Attention:** Ne pas faire en simulation!\n", + "\n", "Faites de nouveaux la partie précédente, mais en plaçant le capteur sur un plan\n", "incliné (utilisez les Lego inclinés à cette fin). Faites quelques tours de 360 degrés, toujours en marquant\n", "un tour complet d’une pause de quelques secondes. Comparez les résultats de l'angle final obtenu avec\n", "l'intégration du signal calibré par rapport à un estimé de 360 degrés. En particulier, est-ce\n", "capteur vient changer la mesure?\n", "\n", - "Dans le simulateur, commencez par mettre la simulation sur pause en cliquand sur le bouton pause en bas à gauche de l'écran. Ensuite, créer deux cubes en dehors de l'arène grâce à la barre d'outil en haut. Ensuite, changer l'échelle des cubes afin de construire une pente similaire à la figure suivante:\n", + "**Dans le simulateur**, commencez par mettre la simulation sur pause en cliquand sur le bouton pause en bas à gauche de l'écran. Ensuite, un cube en dehors de l'arène grâce à la barre d'outil en haut. Ensuite, changer l'échelle des cubes afin de former un plan comme sur la figure suivante. Ensuite, utilisez l'outil de rotation pour lui donner une légère pente. La pente ne doit pas être trop abrupte.\n", "\n", "![pente dans gazebo](doc/gazebo_slope.png)\n", "\n", - "La pente ne doit pas être trop abrupte. Relancer la simulation pour que les objets puissent tomber en place, puis, refaite pause. Maintenant suivez les étapes suivantes pour chaque bloc afin de les rendre statiques:\n", + "Maintenant suivez les étapes suivantes pour chaque bloc afin de les rendre statiques:\n", "\n", - "- Clique droit -> edit model -> onglet Model :\n", + "- Clique droit sur le cube -> Edit Model -> Onglet Model dans le menu de gauche :\n", " - décocher auto-disable\n", " - cocher static\n", " - aller a File -> Exit Model Editor -> Save and Exit -> Sauvegarder le fichier\n", "\n", - "Vous pouvez maintenant placer le robot sur la pente et réaliser l'expérience." + "Vous pouvez maintenant placer le robot sur la pente et réaliser l'expérience. Faites attention de ne pas laisser tomber le robot de trop haut, sinon la simulation risque de diverger." ] }, { @@ -517,21 +531,22 @@ "\n", "Pour la simulation, vous pouvez ajouter des objets comme vous avez fait dans le laboratoire 1. Voir le lien suivant pour ajouter des objets dans le monde de gazebo : http://gazebosim.org/tutorials?tut=build_world!\n", "\n", - "- Après la création de l'objet -> clique droit -> edit model -> onglet Model :\n", + "- Après la création de l'objet -> clique droit -> Edit Model -> Onglet Model dans le menu de gauche :\n", " - décocher auto-disable\n", " - cocher static\n", " - clique gauche sur l'objet pour le selectionner\n", " - clique droit -> Open link inspector -> Visual -> Geometry -> choisir les dimensions (exemple : 0.005, 0.2, 1.0)\n", " - Aller a l'onglet collision -> Geometry -> memes valeurs que dans Visual\n", " - cliquer Ok\n", - " - aller a File -> Exit Model Editor -> Save and Exit -> Sauvegarder le fichier" + " - aller a File -> Exit Model Editor -> Save and Exit -> Sauvegarder le fichier\n", + " \n", + "Faites tourner le robot grâce à `roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false }, @@ -558,7 +573,6 @@ " real_time_factor = simulator.mean_real_time_factor()\n", "else:\n", " real_time_factor = 1\n", - "print(real_time_factor)\n", "\n", "current_angle = 0\n", "last_measure_time = time.time()\n", @@ -573,10 +587,9 @@ " number_of_measures = math.floor(time_since_last_measure * gyro.SAMPLE_RATE)\n", "\n", " #Intégration des dernière mesures depuis la dernière mise-à-jour\n", - " current_angle += np.sum((gyro_measures_z[-number_of_measures:] - z_offset) * (1 / gyro.SAMPLE_RATE))\n", + " current_angle += np.sum((gyro_measures_z[-number_of_measures:] - z_offset) * (real_time_factor / gyro.SAMPLE_RATE))\n", "\n", " current_ir_volt = ir_sensor.peek_data()\n", - "\n", " map_points.append([math.radians(current_angle), fn_volt_to_cm(current_ir_volt)])" ] }, @@ -584,7 +597,6 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false, "jupyter": { "outputs_hidden": false }, @@ -609,7 +621,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -623,7 +635,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" + "version": "3.10.5" }, "widgets": { "state": {}, @@ -632,4 +644,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/doc/gazebo_slope.png b/doc/gazebo_slope.png index 992f7bd..b3a9854 100644 Binary files a/doc/gazebo_slope.png and b/doc/gazebo_slope.png differ diff --git a/robmob/sensors.py b/robmob/sensors.py index 4723eed..50abe5b 100644 --- a/robmob/sensors.py +++ b/robmob/sensors.py @@ -104,9 +104,25 @@ class SharpSensor(Sensor): SAMPLE_RATE = 50 # Calibration table of the high range sharp sensor, for 15+ cm. - HIGH_RANGE_CALIB_TABLE = np.asarray( - [[15, 2.76], [20, 2.53], [30, 1.99], [40, 1.53], [50, 1.23], [60, 1.04], [70, 0.91], [80, 0.82], [90, 0.72], - [100, 0.66], [110, 0.6], [120, 0.55], [130, 0.50], [140, 0.46], [150, 0.435], [150, 0]]) + HIGH_RANGE_CALIB_TABLE = np.asarray([ + [15, 2.76], + [20, 2.53], + [30, 1.99], + [40, 1.53], + [50, 1.23], + [60, 1.04], + [70, 0.91], + [80, 0.82], + [90, 0.72], + [100, 0.66], + [110, 0.6], + [120, 0.55], + [130, 0.50], + [140, 0.46], + [150, 0.435], + [200, 0], + [np.inf, 0] + ]) def __init__(self, analog_input_id=0, buffer_size=100): """