見出し画像

Robotics and ROS 2 - Learn by Doing! Manipulators: MoveIt2 (セクション4-2/10)

  • RViz 2の可視化機能:ROS 2メッセージをグラフィカルに表示し、ロボットのマップやセンサーデータを直感的に理解できる。

  • MoveIt2とパラメータ:軌道計画やピックアンドプレースのための設定可能なツールで、ロボットの構成に応じて動作をカスタマイズ可能。

  • PythonおよびC++でのパラメータ管理:ノードパラメータを動的に変更し、CLIを使用して簡単にパラメータを読み書きする方法を学ぶ。

「Robotics and ROS 2 - Learn by Doing! Manipulators」コースのセクション4の第2四半期では、RViz 2の可視化機能と、PythonおよびC++におけるパラメータの概念について探求します。このセグメントでは、ロボットモデルを効果的に可視化し、ノードパラメータを動的に管理する方法を理解するための知識を深めます。

レクチャー30: RViz 2 - 強力な可視化ツール

RViz 2でのロボットの可視化

RViz 2は、ROS 2におけるさまざまなロボットシステムの側面を可視化するための必須ツールです。これはパブリッシャー・サブスクライバ通信プロトコルを使用してROS 2トピックからメッセージを受信し、直感的なグラフィカルインターフェイスで表示します。これにより、マップ、センサーデータ、カメラ画像などの複雑なデータを、生のメッセージデータだけでは理解しにくい情報を視覚的に解釈できます。

RViz 2の主な機能

  1. マップの可視化: ナビゲーションのためにロボットが使用する建物の占有グリッドを表示し、白、黒、灰色で色分けされたエリアを示します。

  2. センサーデータ: レーザースキャンやその他のセンサーデータをグラフィカルオーバーレイとして表示します。

  3. カメラフィード: 高頻度でカメラ画像をストリーミングおよび表示します。

レクチャー31: MoveIt2を用いたパラメータの導入

MoveIt2を使った軌道計画

MoveIt2は、軌道計画やピックアンドプレース操作のような一般的なロボットマニピュレーション問題を解決するための強力なツールです。これはさまざまなマニピュレータに適応できる構成可能なフレームワークを提供し、ロボティクスコミュニティで広く使用されています。

パラメータを使ったMoveIt2の構成

MoveIt2のパラメータにより、異なるロボットのセットアップに合わせてソフトウェアの動作をカスタマイズできます。これにより、3自由度のシンプルなロボットから6自由度の複雑なロボットまで、さまざまなロボットに対して機能を調整することが可能です。

レクチャー32: Pythonでのパラメータの実装

シンプルなパラメータノードの作成

パラメータを使用して構成でき、その値に基づいて動作を変更するシンプルなPythonノードを実装しました。以下はPythonスクリプトの簡略版です:

import rclpy
from rclpy.node import Node
from rcl_interfaces.msg import SetParametersResult
from rclpy.parameter import Parameter

class SimpleParameter(Node):
    def __init__(self):
        super().__init__("simple_parameter")
        self.declare_parameter("simple_int_param", 28)
        self.declare_parameter("simple_string_param", "Antonio")
        self.add_on_set_parameters_callback(self.paramChangeCallback)

    def paramChangeCallback(self, params):
        result = SetParametersResult()
        for param in params:
            if param.name == "simple_int_param" and param.type_ == Parameter.Type.INTEGER:
                self.get_logger().info(f"Param simple_int_param changed! New value is {param.value}")
                result.successful = True
            if param.name == "simple_string_param" and param.type_ == Parameter.Type.STRING:
                self.get_logger().info(f"Param simple_string_param changed! New value is {param.value}")
                result.successful = True
        return result

def main():
    rclpy.init()
    simple_parameter = SimpleParameter()
    rclpy.spin(simple_parameter)
    simple_parameter.destroy_node()
    rclpy.shutdown()

if __name__ == "__main__":
    main()

レクチャー33: C++でのパラメータの実装

C++でのシンプルなパラメータノードの作成

次に、同様の機能をC++で実装しました。C++バージョンでは、`rclcpp::Node`を継承するクラスを作成し、パラメータ変更を処理するコールバックを使用します。以下はC++コードの簡略版です:

#include <rclcpp/rclcpp.hpp>
#include <rcl_interfaces/msg/set_parameters_result.hpp>
#include <vector>
#include <string>
#include <memory>

class SimpleParameter : public rclcpp::Node {
public:
    SimpleParameter() : Node("simple_parameter") {
        declare_parameter<int>("simple_int_param", 28);
        declare_parameter<std::string>("simple_string_param", "Antonio");
        param_callback_handle_ = add_on_set_parameters_callback(
            std::bind(&SimpleParameter::paramChangeCallback, this, std::placeholders::_1));
    }

private:
    OnSetParametersCallbackHandle::SharedPtr param_callback_handle_;

    rcl_interfaces::msg::SetParametersResult paramChangeCallback(const std::vector<rclcpp::Parameter> &parameters) {
        rcl_interfaces::msg::SetParametersResult result;
        for (const auto &param : parameters) {
            if (param.get_name() == "simple_int_param" && param.get_type() == rclcpp::ParameterType::PARAMETER_INTEGER) {
                RCLCPP_INFO(this->get_logger(), "Param simple_int_param changed! New value is %d", param.as_int());
                result.successful = true;
            }
            if (param.get_name() == "simple_string_param" && param.get_type() == rclcpp::ParameterType::PARAMETER_STRING) {
                RCLCPP_INFO(this->get_logger(), "Param simple_string_param changed! New value is %s", param.as_string().c_str());
                result.successful = true;
            }
        }
        return result;
    }
};

int main(int argc, char *argv[]) {
    rclcpp::init(argc, argv);
    auto node = std::make_shared<SimpleParameter>();
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}

レクチャー34: ROS 2 パラメータCLIの使用

CLIを介してパラメータと対話する

ROS 2 CLIは、ノードパラメータと対話するための強力なツールを提供します。ターミナルからパラメータをリスト、取得、設定できます。例えば、ノードのすべてのパラメータをリストするには:

ros2 param list

特定のパラメータの値を取得するには:

ros2 param get /simple_parameter simple_int_param

新しい値をパラメータに設定するには:

ros2 param set /simple_parameter simple_string_param "Hi ROS 2"

結論

このコースのこの部分では、複雑なロボットデータを可視化するためのRViz 2の機能と、PythonおよびC++でのノードパラメータの動的管理方法を探求しました。これらのスキルは、洗練されたロボティクスアプリケーションを開発およびデバッグするために重要です。RViz 2はセンサーデータやその他のロボットメッセージを視覚的に解釈する能力を高め、動的パラメータ管理はノードの動作を柔軟にカスタマイズすることを可能にします。

「超本当にドラゴン」へ

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