見出し画像

Self Driving and ROS 2 - Learn by Doing! Map & Localization: ゾーン可視化 (セクション6-6/11)

  • セクション6のレッスン81から83では、RVizを使用してロボットの警告ゾーンと危険ゾーンを可視化する方法を学びます。

  • PythonとC++で警告ゾーン(黄色)と危険ゾーン(赤)のマーカーを作成し、ロボットの状態に応じて透明度を変更します。

  • RVizでシミュレーションを起動し、リアルタイムでゾーンの変化を監視します。

「自律走行とROS 2 - 実践的に学ぶ!マッピングとローカライゼーション」コースのセクション6の最後のレッスン(レッスン81から83)では、RVizという強力な3Dビジュアライゼーションツールを用いて、安全ゾーンを可視化する方法について学びます。これらのレッスンでは、警告ゾーンと危険ゾーンを表すマーカーを実装することで、ロボットの安全性と監視能力を強化します。以下は、これらのレッスンの概要とそれらがロボットの機能にどのように貢献するかについて説明します。

レッスン81: PythonでRVizにマーカーを表示する

このレッスンの主な目的は、ロボットの警告ゾーンと危険ゾーンを表すビジュアルマーカーをRVizに作成することです。このビジュアライゼーションは、ロボットの環境をリアルタイムで監視するのに役立ち、ロボットの状態とその周囲を直感的に理解する方法を提供します。

実装手順:

  1. 必要なライブラリをインポート: `visualization_msgs`から`Marker`および`MarkerArray`をインポートします。

  2. パブリッシャーの初期化: マーカーをパブリッシュする新しいパブリッシャーを作成し、RVizトピック`zones`にマーカーをパブリッシュします。

  3. マーカーの作成: 2つのマーカーを初期化します。

    • 警告ゾーンマーカー: ロボット周囲に黄色の半透明シリンダーで表現します。

    • 危険ゾーンマーカー: 赤の半透明シリンダーで、重ならないようにわずかに上に配置します。

  4. レーザコールバックの更新: `laser_callback`関数を更新し、ロボットの状態に基づいてマーカーをパブリッシュします。マーカーの透明度は、ロボットがFREE、WARNING、またはDANGER状態のいずれであるかによって変わります。

  5. マーカーのパブリッシュ: マーカーをRVizにパブリッシュし、ゾーンをリアルタイムで可視化します。

以下は、重要なコードセクションの簡略版です:

from visualization_msgs.msg import Marker, MarkerArray

class SafetyStop(Node):
    def __init__(self):
        super().__init__('safety_stop_node')
        self.zones_marker_pub = self.create_publisher(MarkerArray, 'zones', 10)
        self.zones = MarkerArray()
        
        # マーカーの初期化
        warning_zone = Marker()
        warning_zone.id = 0
        warning_zone.type = Marker.CYLINDER
        warning_zone.scale.x = self.warning_distance * 2
        warning_zone.scale.y = self.warning_distance * 2
        warning_zone.color.r = 1.0
        warning_zone.color.g = 0.984
        warning_zone.color.b = 0.0
        warning_zone.color.a = 0.5
        
        danger_zone = Marker()
        danger_zone.id = 1
        danger_zone.type = Marker.CYLINDER
        danger_zone.scale.x = self.danger_distance * 2
        danger_zone.scale.y = self.danger_distance * 2
        danger_zone.color.r = 1.0
        danger_zone.color.g = 0.0
        danger_zone.color.b = 0.0
        danger_zone.color.a = 0.5
        danger_zone.pose.position.z = 0.01
        
        self.zones.markers = [warning_zone, danger_zone]

    def laser_callback(self, msg: LaserScan):
        self.zones_marker_pub.publish(self.zones)

レッスン82: C++でRVizにマーカーを表示する

Pythonでの実装に続いて、同じ機能をC++を用いて作成します。このレッスンでは、ROS 2の多様性を強調し、C++に慣れた開発者が同じ結果を達成できることを確認します。

C++実装の主な違い:

  • クラスとメソッドの定義: `SafetyStop`クラスとそのメソッドはC++で定義され、Pythonの実装と同じロジックに従います。

  • マーカーの初期化: マーカーは同様に作成および初期化され、警告ゾーンと危険ゾーンの属性が設定されます。

  • コールバック関数: `laserCallback`関数は、マーカーの状態を更新し、RVizにパブリッシュします。

以下は、C++コードの簡略版です:

 #include  "visualization_msgs/msg/marker.hpp" #include  "visualization_msgs/msg/marker_array.hpp"

class SafetyStop : public rclcpp::Node {
public:
    SafetyStop() : Node("safety_stop_node") {
        zones_pub_ = create_publisher<visualization_msgs::msg::MarkerArray>("zones", 10);
        visualization_msgs::msg::Marker warning_zone;
        warning_zone.id = 0;
        warning_zone.type = visualization_msgs::msg::Marker::CYLINDER;
        warning_zone.scale.x = 2 * warning_distance_;
        warning_zone.scale.y = 2 * warning_distance_;
        warning_zone.color.r = 1.0;
        warning_zone.color.g = 0.984;
        warning_zone.color.b = 0.0;
        warning_zone.color.a = 0.5;
        
        visualization_msgs::msg::Marker danger_zone;
        danger_zone.id = 1;
        danger_zone.type = visualization_msgs::msg::Marker::CYLINDER;
        danger_zone.scale.x = 2 * danger_distance_;
        danger_zone.scale.y = 2 * danger_distance_;
        danger_zone.color.r = 1.0;
        danger_zone.color.g = 0.0;
        danger_zone.color.b = 0.0;
        danger_zone.color.a = 0.5;
        danger_zone.pose.position.z = 0.01;

        zones_.markers.push_back(warning_zone);
        zones_.markers.push_back(danger_zone);
    }

    void laserCallback(const sensor_msgs::msg::LaserScan & msg) {
        zones_pub_->publish(zones_);
    }
private:
    rclcpp::Publisher<visualization_msgs::msg::MarkerArray>::SharedPtr zones_pub_;
    visualization_msgs::msg::MarkerArray zones_;
};

レッスン83: RVizでの起動とビジュアライゼーション

最後のレッスンでは、ノードを起動し、RVizでマーカーを可視化する実践的な手順が紹介されます。

起動と可視化の手順:

1. シミュレーションの起動: 定義されたワールドでシミュレートされたロボットを起動します。

    ros2 launch bumperbot_bringup simulated_robot.launch.py world_name:=small_house

2. Safety Stopノードの実行: ロボットの監視と制御を開始するために、safety stopノードを実行します。

    ros2 run bumperbot_utils safety_stop

3. RVizの起動: RVizを起動して、ロボットとその環境を可視化します。

    rviz2

4. RVizに可視化要素を追加:

  • ロボットモデル: 説明トピックを`/robot_description`に設定します。

  • レーザースキャン: トピックを`/scan`に設定します。

  • マーカーアレイ: トピックを`/zones`に設定します。

これらの手順により、警告ゾーンと危険ゾーンがRVizに可視化され、ロボットの状態と環境をリアルタイムで監視することができます。

結論

「自律走行とROS 2 - 実践的に学ぶ!マッピングとローカライゼーション」コースのレッスン81から83では、RVizにおけるビジュアルマーカーの追加によって、ロボットの安全性と監視能力を向上させます。警告ゾーンと危険ゾーンを可視化することで、ロボットの状態を直感的に理解し、安全かつ効率的に操作できるようになります。PythonおよびC++の両方でこれらの機能を実装する方法を学ぶことで、ROS 2プロジェクトにRVizビジュアライゼーション

を効果的に統合するための包括的なガイドが提供されます。

「超本当にドラゴン」へ

この記事が気に入ったらサポートをしてみませんか?