Aller au contenu

Ressources supplémentaires sur l’obtention de l’orientation du robot (à l’aide du capteur Imu)

Nous fournissons ici un exemple de code sur la façon d’obtenir des données d’orientation absolues du robot à l’aide d’un capteur Imu intégré.

Exemple de code

Ce code simple s’abonne au sujet du capteur Imu /imu_plugin/out, traite les données des quaternions aux angles d’Euler et imprime l’angle de lacet (c’est-à-dire la rotation autour de l’axe Z) en degrés.

#!/usr/bin/env python3
"""
Script pour tester le capteur imu pour l'orientation du robot
"""
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Imu

import numpy as np


classe ImuTest (node) :
    def __init__(soi) :
        super().__init__("test_imu")

        # Créer un abonné pour le capteur imu
        self.imu_sub = self.create_subscription(
            Imu, 
            "/imu_plugin/out",
            self.imu_callback, 1
        )

    def imu_callback(self, msg):
        """
        Fonction de rappel Imu
        """
        orientation_list = [msg.orientation.x,
                            msg.orientation.y, 
                            msg.orientation.z,
                            msg.orientation.w]
        (roll, pitch, yaw) = self.euler_from_quaternion(orientation_list)

        self.get_logger().info("[IMU] L'angle de lacet est de [ %.3f ] deg" % (np.degrees(yaw)))



    def euler_from_quaternion(self, quaternion) :
        """
        Convertit le quaternion (w à la dernière place) en roulis, tangage et lacet d'Euler
        quaternion = [x, y, z, w]
        """
        x = quaternion[0]
        y = quaternion[1]
        z = quaternion[2]
        w = quaternion[3]

        sinr_cosp = 2 * (w * x + y * z)
        cosr_cosp = 1 - 2 * (x * x + y * y)
        roll = np.arctan2(sinr_cosp, cosr_cosp)

        sinp = 2 * (w * y - z * x)
        pitch = np.arcsin(sinp)

        siny_cosp = 2 * (w * z + x * y)
        cosy_cosp = 1 - 2 * (y * y + z * z)
        yaw = np.arctan2(siny_cosp, cosy_cosp)

        return roll, pitch, yaw



def main(args=None) :
    rclpy.init(args=args)

    test_imu = ImuTest()
    rclpy.spin(test_imu)

    rclpy.shutdown()


if __name__ == "__main__":
    main()

N’hésitez pas à utiliser ce code dans votre solution pour les tâches 1 et 2 si nécessaire.