編寫一個tf listener

listerner

   1 #include <ros/ros.h>
   2 #include <tf/transform_listener.h>
   3 #include <geometry_msgs/Twist.h>
   4 #include <turtlesim/Spawn.h>
   5 
   6 int main(int argc, char** argv){
   7   ros::init(argc, argv, "my_tf_listener");
   8 
   9   ros::NodeHandle node;
  10 
  11   ros::service::waitForService("spawn");
  12   ros::ServiceClient add_turtle =
  13     node.serviceClient<turtlesim::Spawn>("spawn");
  14   turtlesim::Spawn srv;
  15   add_turtle.call(srv);
  16 
  17   ros::Publisher turtle_vel =
  18     node.advertise<geometry_msgs::Twist>("turtle2/cmd_vel", 10);
  19 
  20   tf::TransformListener listener;
  21 
  22   ros::Rate rate(10.0);
  23   while (node.ok()){
  24     tf::StampedTransform transform;
  25     try{
  26       listener.lookupTransform("/turtle2", "/turtle1",
  27                                ros::Time(0), transform);
  28     }
//

我們向偵聽器查詢一個特定的轉換。我們來看看四個參數:

  1. 我們希望從frame / turtle1到frame / turtle2的轉換。
  2. 我們想要改變的時間。提供ros :: Time(0)只會爲我們提供最新的可用轉換。

  3. 我們存儲結果變換的對象。
29 catch (tf::TransformException &ex) { 30 ROS_ERROR("%s",ex.what()); 31 ros::Duration(1.0).sleep(); 32 continue; 33 } 34 35 geometry_msgs::Twist vel_msg; 36 vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(), 37 transform.getOrigin().x()); 38 vel_msg.linear.x = 0.5 * sqrt(pow(transform.getOrigin().x(), 2) + 39 pow(transform.getOrigin().y(), 2)); 40 turtle_vel.publish(vel_msg); 41 //在這裏,變換用於計算turtle2的新的線性和角速度,基於它與turtle1的距離和角度。新的速度在主題“turtle2 / cmd_vel”中發佈,sim將使用它來更新turtle2的移動。 42 rate.sleep(); 43 } 44 return 0; 45 };
CMakeLists.txt與launch文件裏比較類似
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章