TF座標変換

ROS の小さなカメが続きます


5.1 TF座標変換・Autolabor-ROSロボット入門講座「ROS理論と実践」ゼロベースチュートリアル

tf モジュール: ROS で、異なる座標系間で点またはベクトルを変換するために使用されます。

ROS では元々座標変換は tf に対応していましたが、ハイドロ版から tf は廃止され、より簡潔で効率的な tf2 に移行されました。tf2 に対応する共通関数パッケージは次のとおりです。

tf2_geometry_msgs: ROS メッセージを tf2 メッセージに変換できます。

tf2: 座標変換のための共通メッセージをカプセル化します。

tf2_ros: tf2 の roscpp および rospy バインディングを提供し、座標変換に一般的に使用される API をカプセル化します。

座標系: ROS では、オブジェクトは座標系を通じて校正されます (正確には、右手座標系を通じて校正されます)。

1. 座標メッセージメッセージ

サブスクリプションおよび公開モデルのデータ キャリア メッセージは重要な実装です。まず、座標変換の実装で一般的に使用されるメッセージgeometry_msgs/TransformStamped を理解する必要があります。 geometry_msgs/PointStamped

前者は座標系に関する位置情報を伝達するために使用され、後者は特定の座標系における座標点の情報を伝達するために使用されます。座標変換においては、座標系の相対関係や座標点情報が必要になることが多い。

2. 静的座標変換

いわゆる静的座標変換とは、2 つの座標系間の相対位置が固定されることを意味します。

tf2に依存するプロジェクト関数パッケージを作成するtf2_ros tf2_geometry_msgs roscpp rospy std_msgs geometry_msgs

子座標系と親座標系の関係と、座標変換関数transform()で使用されるメソッド に注意してください。

3. 動的座標変換

いわゆる動的座標変換とは、2 つの座標系間の相対位置が変化することを意味します。

Turtlesim_nodeを開始します。このノードのフォームにはワールド座標系があり (左下隅が座標系の原点です)、タートルは別の座標系です。キーボードはタートルの動きを制御し、タートルの相対位置を動的に公開します。 2 つの座標系。

tf2に依存するプロジェクト関数パッケージを作成するtf2_ros tf2_geometry_msgs roscpp rospy std_msgs geometry_msgs Turtlesim

Turtle1/poseをサブスクライブすると、ワールド座標系でのタートルの X 座標、Y 座標、オフセット、線速度、角速度を取得できます。

ros::Subscriber sub = nh.subscribe<turtlesim::Pose>("/turtle1/pose",1000,callback);


void callback(const turtlesim::Pose::ConstPtr& pose){
    
    geometry_msgs::TransformStamped tfs;
    //  |----头设置
    tfs.header.frame_id = "world";
    tfs.header.stamp = ros::Time::now();

    //  |----坐标系 ID
    tfs.child_frame_id = "turtle1";

    //  |----坐标系相对信息设置
    tfs.transform.translation.x = pose->x;
    tfs.transform.translation.y = pose->y;
    tfs.transform.translation.z = 0.0; // 二维实现,pose 中没有z,z 是 0
}

4.複数の座標変換

既存の座標系 (親座標系ワールド) には 2 つのサブレベル システム Son1、son2 があり、ワールドに対する Son1 とワールドに対する Son2 の関係がわかっています。son2 における Son1 の原点の座標を求めます。 Son2 の点の座標を見つけるには、son1 の点の座標が必要です。

tf2に依存するプロジェクト関数パッケージを作成するtf2_ros tf2_geometry_msgs roscpp rospy std_msgs geometry_msgs Turtlesim

静的座標変換を使用して、世界に対する Son1 と Son2 の座標関係をパブリッシュします。

<launch>
    <node pkg="tf2_ros" type="static_transform_publisher" name="son1" args="0.2 0.8 0.3 0 0 0 /world /son1" output="screen" />
    <node pkg="tf2_ros" type="static_transform_publisher" name="son2" args="0.5 0 0 0 0 0 /world /son2" output="screen" />
</launch>

Son2 を基準とした Son1 の点の座標を分析します。 

geometry_msgs::TransformStamped tfs = buffer.lookupTransform("son2","son1",ros::Time(0));
ROS_INFO("Son1 相对于 Son2 的坐标关系:父坐标系ID=%s",tfs.header.frame_id.c_str());
ROS_INFO("Son1 相对于 Son2 的坐标关系:子坐标系ID=%s",tfs.child_frame_id.c_str());
ROS_INFO("Son1 相对于 Son2 的坐标关系:x=%.2f,y=%.2f,z=%.2f",
         tfs.transform.translation.x,
         tfs.transform.translation.y,
         fs.transform.translation.z
         );

次に、座標を分析して、son2 内の点の座標を見つけます。

geometry_msgs::PointStamped ps;
ps.header.frame_id = "son1";
ps.header.stamp = ros::Time::now();
ps.point.x = 1.0;
ps.point.y = 2.0;
ps.point.z = 3.0;

geometry_msgs::PointStamped psAtSon2;
psAtSon2 = buffer.transform(ps,"son2");
ROS_INFO("在 Son2 中的坐标:x=%.2f,y=%.2f,z=%.2f",
         psAtSon2.point.x,
         psAtSon2.point.y,
         psAtSon2.point.z
         );

5. 座標系の関係を表示する

输入下面命令機能パッケージが含まれているかどうかを確認する

rospack find tf2_tools

そうでない場合は、次のコマンドを使用してインストールしてください。

sudo apt install ros-noetic-tf2-tools

座標系ブロードキャスト プログラムを開始した後、次のコマンドを実行します。

rosrun tf2_tools view_frames.py

Frames.pdf ファイルが現在のディレクトリに生成されます

6. TF座標変換の具体的な操作

中央のタートル(A)と左下のタートル(B)の2つのタートルが生成され、Bは自動的にAの位置まで走ります。

コマンドを入力してください

rosrun turtlesim turtlesim_node

 

現時点では、小さなカメは 1 匹だけ表示されます。では、キーボードによって制御されず、最初の小さなカメの動きに従う 2 番目の小さなカメを作成するにはどうすればよいでしょうか? rosservice を使用する必要があり、トピックでは spawn を使用します。

2 番目の子カメを作成した後、行う必要があるのは、2 つの子カメのポーズ情報をサブスクライブして座標情報に変換し、2 番目の子カメに対する最初の子カメの座標情報を取得することです。ここで注意すべき点は、turtle1 の座標情報を Turtle2 に対して逆転させないことです。最後に、最初のタートルに続く 2 番目のタートルに、対応する速度情報をパブリッシュします。

5.1.6 TF座標変換実践操作・Autolabor-ROSロボット入門講座「ROS理論と実践」ゼロベースチュートリアル

 7.TF2とTF

TF2 は TF に置き換わりました。TF2 は TF のスーパーセットです。TF の代わりに TF2 を学習することをお勧めします。

TF2 関数パッケージの凝集性が強化されました。TF と TF2 が依存する関数パッケージは異なります。TF は パッケージに対応しtf、TF2 はtf2およびtf2_rosパッケージに対応します。TF2 では、さまざまな種類の API 実装が下請けされています。

TF2 実装は、TF2 静的座標実装、TF2 座標変換リスナーのバッファ実装など、より効率的です。

座標変換はロボットシステムにおいて非常に重要なモジュールです. ROS では座標変換を実装するために特別に TF2 コンポーネントが使用されます. TF2 実装の具体的な内容は主に次の部分を紹介します:

1. 静的座標変換ブロードキャスターは、コーディングまたは組み込み関数パッケージの呼び出し (後者を推奨) によって実装でき、比較的固定された座標系の関係に適しています。

2. 動的座標変換ブロードキャスタは、座標系間の相対関係をコード化された方法でブロードキャストします。これは、変数座標系の関係に適しています。

3. 座標変換リスナーは、ブロードキャスターによってブロードキャストされる座標系メッセージをリッスンするために使用され、異なる座標系間の変換、または異なる座標系間の同一点の変換を実現できます。

4. ロボット システムの座標系関係は比較的複雑ですが、tf2_tools ツールキットを使用して ros で座標系関係図を生成することもできます。

おすすめ

転載: blog.csdn.net/weixin_51995147/article/details/133530575