ROS Efficient Advanced 第 1 章 -- ROS Advanced コンポーネントの TF 座標変換

1データ

この記事から3つのブログを使ってTFの座標変化を学びますが、TFはトランスフォーム、映画トランスフォーマーの英語はtransformerです。
この記事の参考資料は以下のとおりです。
(1) 『ROS ロボット開発実践』胡春旭、第 4 章第 2 節
(2) 右手座標系:ロボットにおける xyz 座標系と右手の法則
(3)オイラー角とクォータニオン:
オイラー角とクォータニオンの相互変換について詳しく解説
クォータニオンとオイラー角(RPY角)
クォータニオンとオイラー角(ヨー、ピッチ、ロール)の変換

2 テキスト

2.1 右手座標系

ロボット工学や自動運転の分野では、すべての座標系は右手座標系です。右手を伸ばして、x 軸の正の方向から y 軸の正の方向に持ち、親指は Z 軸の正の方向です。
ここに画像の説明を挿入

2.2 オイラー角

3 次元空間では、ロール、ピッチ、ヨーはオブジェクトの回転を記述する 3 つの基本的な角度であり、オイラー角としても知られています。
オイラー角は、元の座標系に対するオブジェクトの回転を記述するために使用されます。飛行機を例にとると、その元の 3 次元座標系は次のようになります: 胴体は X 軸に沿っており、機首は正の方向を向いていますx 軸の方向右手の法則に従って、y 軸は平面の左側にあり、z 軸は平面の上にあります。
(1) ロール (ローリング): オブジェクトがそれ自身の X 軸の周りを回転する角度。
オルタナティブ
(2) ピッチ (pitch): オブジェクトが自身の y 軸の周りを回転する角度。
オルタナティブ
(3) ヨー (ヨー): オブジェクトがそれ自身の Z 軸の周りを回転する角度。
オルタナティブ
以下は、オイラー角を理解するのにも役立つ群図です。
オルタナティブ

2.3 オイラー角と四元数

オイラー角と四元数はどちらも 3 次元空間における物理の回転を記述するために使用されます。比較すると:
(1) オイラー角は 3 つの回転角を使用します。これは直感的で明確ですが、ジンバルのロックの問題が発生します。詳細は「オイラー角とクォータニオンの詳しい解説
(2)」を参照してください。 クォータニオンとは、回転ベクトル+回転角度の組み合わせで物体の回転を記述します。ベクトルはx、y、zで表され、角度は で表されます。 w、つまり q=(x ,y,z,w)、つまり四元数です。さらに、x、y、z は複素数です。つまり、q=xi+yj+zk+w、i2 = j2 = k2 = -1 となります。
(3) クォータニオンには、動作効率が高く、ジンバルのデッドロックの問題がなく、補間動作が便利であるという利点があります。ただし、四元数は物理的に直感的に理解することができず、非常に抽象的なため、通常はオイラー角を使用して回転を記述し、演算が必要な場合は四元数に変換します
(4) クォータニオンとオイラー角の間の固定行列演算の変換式が存在します (ここでは詳しく説明しません。本当に理解するのが難しいです): クォータニオンとオイラー角の変換 (Yaw、Pitch、Roll )

2.4 TF ソフトウェア パッケージの起源

ロボットには通常、手、足、頭、関節などの多くの座標系があります。
オルタナティブ
自律走行車 (ロボット システムでもあります) には、次のような多くの座標系があることがよくあります。
(1) ユニバーサル横メルカトル図法 (UTM、GPS 座標は一般的に(2) ライダー座標系
:ライダー点群データはこの座標系で記述されます。
(3) レーダー座標系(複数):同上
(4) カメラ座標系(複数):同上
( 5) imu の座標系:
(6) 車体座標系: 原点は後車軸の中心に位置
(7) ローカル水平座標系: ENU、通称世界座標系
自動運転車の全センサーと GPSデータはすべて、独自の座標系を基準とした値です。使用する場合は同じ座標系に変換して使用する必要があり、通常はENU座標系を選択しますが、そうしないとデータが分散して無効になります。

通常、2 つの 3 次元座標系の変換には並進と回転が含まれますが、並進関係は 2 つの座標原点間の移動関係という比較的単純な関係ですが、回転関係はさらに複雑で、オイラー角や四元数が必要になります。
ロボットシステムの三次元座標系のデータ変換は非常に複雑ですが、ros はこの困難な問題を解決するための TF パッケージを提供し、開発者が手動で座標変換を実行することを回避します。

2.5 TF パッケージを学ぶために、turtle_tf を例として取り上げます

ROS は、開発者が TF パッケージの基本原理を学ぶためのサンプルとして Turtle_tf を提供します。
(1) Turtle_tf サンプルを実行する

roslaunch turtle_tf turtle_tf_demo.launch
rosrun turtlesim turtle_teleop_key
// 如果rviz无显示,看这个博客:https://www.codestudyblog.com/cs2201ai/40115063750.html
rosrun rviz rviz 'rospack find turtle_tf' /rviz/turtle_rviz.rviz

Turtle_tf は 2 つのタートルを設計しており、オペレーターはキーボードを使用して 1 番目のタートルの動きを制御し、2 番目のタートルは積極的にフォローアップします (下図を参照)。(2) Turtle_tf の 3 つの座標系のワールド座標系: 原点はウィンドウの左下隅にあり、X 軸は原点から始まり右を向き、Y 軸は原点から始まります。と上を向きます; 右手の法則によれば、z 軸は
ここに画像の説明を挿入
画面 Turtle1 座標系: Turtle1 自身の座標系、Turtle1 は X 軸に沿っており、頭は X 軸の正方形を向いており、Y 軸は Turtle1 の左側にあり、Z 軸は Turtle1 の上にあります (ドン'心配しないでください) Turtle2 座標系: Turtle1と同じTurtle2 独自の座標系rviz では、3 つの座標系は次のようになります (注: 2 つのスクリーンショットは同時にではありません): (3) TF パッケージのロジック管理座標系: TF 座標系ツリーTF パッケージは、各座標系を内部的に座標系ツリーに編成します。たとえば、turtle_tf パッケージでは、座標系ツリーのルート ノードはワールド座標系であり、左右の子ノードは 2 つのタートルの独自の座標系です。2 つのタートルはそれぞれ独自のTF ブロードキャスターを作成して、独自の座標系と世界座標系の TF データをブロードキャストします。TF パッケージはリアルタイムで座標系ツリーを構築できます。次のコマンドを実行して、turtle_tf の TF 座標系ツリーをエクスポートします。



ここに画像の説明を挿入

ここに画像の説明を挿入
ここに画像の説明を挿入


// ubuntu20.04执行下面命令会崩溃,解决方式:https://github.com/ros/geometry/pull/193
rosrun tf view_frames

ここに画像の説明を挿入
(4) TF 座標系ツリーでは、TF リスナーを作成することで、turtle2 座標系に対する Turtle1 の平行移動と回転の関係をリアルタイムに取得できます。次のコマンドを実行します。

rosrun tf tf_echo turtle2 turtle1

出力を実行します。

At time 1688002771.829
  // 平移向量,也就是两个坐标原点的平移,即在turtle2坐标系下,turtle1的位置
  - Translation: [-0.403, 0.072, 0.000]   
  // 四元数描述的旋转关系,即在turtle2坐标系下,turtle1的朝向
  - Rotation: in Quaternion [0.000, 0.000, -0.089, 0.996]     
  			  // 弧度描述的欧拉角,因为是二维平面,只有yaw(绕z轴)角有值
              in RPY (radian) [0.000, 0.000, -0.178]        
              // 角度描述的欧拉角  
              in RPY (degree) [0.000, 0.000, -10.174]         

得られた座標変化関係を利用して、turtle2 が Turtle1 をリアルタイムで追従することができます 具体的な実装については、「ROS の効率的な進歩 - ROS 高度なコンポーネントの TF 座標変換 第 2 部」の第 1 章を参照してください。

2.6 Turtlesim::Pose と geometry_msgs/Twist を理解する

「ROS Efficient Getting Started」シリーズでは、すべて Turtlesim::Pose と geometry_msgs/Twist メッセージを使用して、多くのサンプルを作成しました。前者のトピック名は /turtle1/pose で、turtle1 の位置情報を記述するために使用され、後者のトピック名は /turtle1/cmd_vel で、turtle1 の動作を制御するために使用されます。
これまで座標系の知識がなかったので、これら 2 つのメッセージのデータ フィールドについては深く理解できませんでしたが、ここで詳しく分析します
(1) Turtlesim::Pose は位置を定義するメッセージですおよびワールド座標系タイプでのタートルの方向。これには次の 5 つのフィールドが含まれます。

x,y:是world坐标系下的位置
theta:是world坐标系下,乌龟相对于z轴的旋转;
	   如果乌龟头朝向world坐标系x轴正向,则theta为0;
	   逆时针旋转时,theta增加,最大为pi;
	   顺时针旋转时,theta减小,最小为-pi
linear_velocity:线速度,米每秒
angular_velocity:角速度,弧度每秒

(2) geometry_msgs/Twist のドメインは 2 つのベクトルです。

geometry_msgs/Vector3 linear    // turtle相对于自身坐标系的线速度向量
  float64 x     // 沿x轴方向的线速度(m/s),正值为前进,负值为后退
  float64 y     // 沿y轴方向的线速度(m/s),由于turtle永远沿着自身坐标系x轴朝向正方向,不会侧向运动,因此此值一直为0
  float64 z     // 沿z轴方向的线速度(m/s),由于turtle位于二维平面内,不会上下运动,因此此值一直为0
geometry_msgs/Vector3 angular   // turtle相对于自身坐标系的角速度向量
  float64 x     // 绕x轴的角速度(以弧度/秒为单位),由于turtle不会绕x轴旋转,因此为零
  float64 y     // 绕y轴的角速度(以弧度/秒为单位),由于turtle不会绕y轴旋转,因此为零
  float64 z     // 绕z轴的角速度(以弧度/秒为单位),表示turtlez左转(正值),右转(负值)
// 这条命令是让turtle1顺时针画圆,圆半径就是r = v / w = 2.0 m/s / 1.8 rad/s ~= 1.11 m
rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'

ここに画像の説明を挿入

3 まとめ

このセクションでは、数学から始めて、3 次元の座標変化に関する知識を体系的に整理し、ros に付属する Turtle_tf を使用して、最初に TF ソフトウェア パッケージの原理を学習します。このセクションの知識に基づいて、次のセクションでは Turtle_tf サンプルを手動で実装し、TF ライブラリのインターフェイス呼び出しをマスターし、TF ブロードキャスターと TF リスナーの書き込みメソッドをマスターします。「ROS Efficient Advanced Chapter 1 – TF」を参照してください。 ROS Advanced Components の座標変換 II

おすすめ

転載: blog.csdn.net/cy1641395022/article/details/131236155