ROS学习之tf.3 tf受信機(C++)の作成
9820 ワード
ROS.tf3 tf (C++)
このチュートリアルはROS.WIKI、私は整理の过程の中でいくつかの间违いと问题が现れるかもしれなくて、问题があって公式サイトのバージョンを见ても私に相谈することができます
, tf tf 。
, tf tf。
1.1 tf
。
:
$ roscd learning_tf
1.2 src / turtle_tf_listener.cpp 。
#include
#include
#include
#include
int main(int argc,char** argv)
{
ros::init(argc, argv, "my_tf_listener");
ros::NodeHandle node;
ros::service::waitForService("spawn");
ros::ServiceClient add_turtle = node.serviceClient<:spawn>("spawn");
turtlesim::Spawn srv;
add_turtle.call(srv);
ros::Publisher turtle_vel = node.advertise<:twist>("turtle2/cmd_vel",10);
tf::TransformListener listener;
ros::Rate rate(10.0);
while(node.ok())
{
tf::StampedTransform transform;
try
{
listener.lookupTransform("/turtle2","/turtle1",ros::Time(0),transform);
}
catch(tf::TransformException &ex)
{
ROS_ERROR("%s",ex.what());
ros::Duration(1.0).sleep();
continue;
}
geometry_msgs::Twist vel_msg;
vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(),transform.getOrigin().x());
vel_msg.linear.x = 0.5 * sqrt(pow(transform.getOrigin().x(),2)+pow(transform.getOrigin().y(),2));
turtle_vel.publish(vel_msg);
rate.sleep();
}
return 0;
}
“Lookup would require extrapolation into the past”, :
try {
listener.waitForTransform(destination_frame, original_frame, ros::Time(0), ros::Duration(10.0) );
listener.lookupTransform(destination_frame, original_frame, ros::Time(0), transform);
} catch (tf::TransformException ex) {
ROS_ERROR("%s",ex.what());
}
1.3
(1) #include
tf TransformListener 。 TransformListener, tf / transform_listener.h 。 (2) tf::TransformListener listener;
ここではTransformListenerオブジェクトを作成します.リスナーが作成されると、回線を介したtf変換の受信を開始し、10秒までバッファリングする.TransformListenerオブジェクトの範囲は変わらないでください.そうしないと、キャッシュが埋め込まれず、ほとんどのクエリーが失敗します.1つの一般的な方法は、TransformListenerオブジェクトをクラスのメンバー変数にすることです.(3)try
{
listener.lookupTransform("/turtle2", "/turtle1",
ros::Time(0), transform);
}
ここで、本格的な作業が完了し、リスナーに特定の変換をクエリーします.この4つのパラメータを見てみましょう.frame/turtle 1からframe/turtle 2への変換を望んでいます.私たちが変えたい時間.提供ros::Time(0)は、最新の変換のみを提供します.結果変換のオブジェクトを格納します.
(4)geometry_msgs::Twist vel_msg;vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(),transform.getOrigin().x());
vel_msg.linear.x= 0.5 *sqrt(pow(transform.getOrigin().x(),2)+pow(transform.getOrigin().y(),2));
ここで、変換は、turtle 1との距離および角度に基づいて、turtle 2の新しい線形および角速度を計算するために使用される.トピック「turtle 2/cmd_vel」に新しい速度が公開され、simはturtle 2の移動を更新するために使用します.
2.1リスナーの実行
コードを作成し、まずコンパイルしましょう.CMakeListsを開く.txtファイル、下部に次の行を追加します.add_executable(turtle_tf_listener src/turtle_tf_listener.cpp)
target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES})
ワークスペースのコンパイル$ catkin_make
すべてがうまくいけば、あなたのdevel/lib/learning_tfフォルダにturtle_という名前があるはずです.tf_Listenerのバイナリファイル.もしそうなら、このプレゼンテーションの起動ファイルを追加する準備ができています.テキストエディタでstart_という名前のdemo.Launchの起動ファイルをブロック内に結合します.
...
まず、前のチュートリアルの起動ファイル(ctrl-cを使用)が停止していることを確認します.完全なウミガメのプレゼンテーションを開始する準備ができました.$ roslaunch learning_tf start_demo.launch
, ( , ), ! turtlesim , : [ERROR] 1253915565.300572000: Frame id /turtle2 does not exist! When trying to transform between /turtle1 and /turtle2.
[ERROR] 1253915565.401172000: Frame id /turtle2 does not exist! When trying to transform between /turtle1 and /turtle2.
2 , turtlesim tf 。 , (C++)