ROS研究ノート:TF座標変換とプログラミング演習
TFの基本的な概念と実装方法については、前のブログ投稿を参照してください:ROS研究ノート:TF座標変換とプログラミングの詳細
この記事では、前の演習に基づいてTFプログラミングの演習を行います。
TFプログラミング:ロボットの座標変換をブロードキャストおよび監視し、リダーとロボットシャーシ間の座標関係を把握し、シャーシ座標系でリダーデータの座標値を見つけます。
TFの使用プロセスに従ってプログラムします。
TFブロードキャスタープログラミング
実装プロセス:
- ROSノードを初期化します
- 放送局を定義する
- 座標変換の作成関連情報の変換と初期化
- Broadcasterがコンバージョン情報を公開
プログラムの具体的な実装は次のとおりです。
#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
int main(int argc, char** argv)
{
//初始化ROS节点
ros::init(argc, argv, "tf_broadcaster");
ros::NodeHandle n;
//声明一个tf广播器
tf::TransformBroadcaster br;
while(ros::ok())
{
//创建坐标变换transform
tf::Transform transform;
//给定平移变换值
transform.setOrigin(tf::Vector3(0.1, 0.0, 0.2));
//给定旋转变换值,这里没有旋转变换,所以定义四元数时无需给定角度
transform.setRotation(tf::Quaternion(0, 0, 0, 1));
//广播器发布坐标变换
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "base_link", "base_laser"));
}
return 0;
}
TFモニタープログラミング
実装プロセス:
- ROSノード情報を初期化します
- TFリスナーを宣言する
- 「base_laser」にポイントを作成し、対応する値を取得します
- 監視して変換情報を取得し、「base_laser」のポイントを変換して「base_link」の座標ポイントを取得します
実装の詳細:
#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <geometry_msgs/PoseStamped.h>
int main(int argc, char** argv)
{
//初始化ROS节点信息
ros::init(argc, argv, "tf_listener");
ros::NodeHandle n;
//创建TF监听器
tf::TransformListener listener;
ros::Rate rate(10.0);
while(ros::ok())
{
//在base_laser上声明一个点laser_point,用来转换得到base_link上的点坐标
geometry_msgs::PointStamped laser_point;
laser_point.header.frame_id = "base_laser";
//使用最近可用的转换
laser_point.header.stamp = ros::Time();
//laser_point检测点获取
laser_point.point.x = 0.3;
laser_point.point.y = 0.0;
laser_point.point.z = 0.0;
try
{
//监听获取tf变换
listener.waitForTransform("base_link", "base_laser", ros::Time(0), ros::Duration(3.0));
geometry_msgs::PointStamped base_point;
base_point.header.frame_id = "base_link";
listener.transformPoint("base_link", laser_point, base_point);
//将坐标变换值进行打印
ROS_INFO("Change laser_point:(%.2f, %.2f, %.2f) to base_point(%.2f, %.2f, %.2f) at Time %.2f", laser_point.point.x, laser_point.point.y, laser_point.point.z, base_point.point.x, base_point.point.y, base_point.point.z, base_point.header.stamp.toSec());
}
catch(tf::TransformException& ex)
{
ROS_ERROR("%s", ex.what());
ros::Duration(1.0).sleep();
continue;
}
rate.sleep();
}
return 0;
}
次の図は、「geometry_msgs / PoseStamped.h」メッセージの内容です。このメッセージは、ヘッダーとポイント
ヘッダーの内部
ポイント内部の2つのタイプを宣言しています。
起動ファイルを構成します
次に、実行するCMakeLists.txtファイルとpackage.xmlファイルを構成します。
これが結果です