1. 程式人生 > >ROS學習之tf基本用法

ROS學習之tf基本用法

主要細節參見wiki,這裡我寫一下它的broadcaster和listener做個記錄:

tf_broadcaster.cpp:

#include<ros/ros.h>
#include<tf/transform_broadcaster.h>

int main(int argc, char** argv){
	ros::init(argc, argv, "robot_tf_publisher");
	ros::NodeHandle node;
	
	ros::Rate rate(100);

	tf::TransformBroadcaster broadcaster;
	while(node.ok()){
		broadcaster.sendTransform(
			tf::StampedTransform(
				tf::Transform(
					tf::Quaternion(0,0,0,1),
					tf::Vector3(0.1,0.0,0.2)
				),
				ros::Time::now(),
				"base_link",
				"base_laser"
			)
		);
		rate.sleep();
	}
}

在broadcaster中我們主要描述的是兩個座標frame之間的位置關係,這裡是base_link與base_laser之間的位置關係,表base_laser在base_link的x=0.1,y=0.0,z=0.2的位置,旋轉方面quaternion置0,沒有變化。

tf_listener.cpp:

#include<ros/ros.h>
#include<tf/transform_listener.h>
#include<geometry_msgs/PointStamped.h>

void transformPoint(const tf::TransformListener& listener){
        //這裡先隨意設定一個點,當做是laser座標的點,然後我們將其轉換成base_link座標上的位置
        geometry_msgs::PointStamped laser_point;
	laser_point.header.frame_id = "base_laser";
	
	laser_point.header.stamp = ros::Time();
	laser_point.point.x = 1.0;
	laser_point.point.y = 0.2;
	laser_point.point.z = 0.0;

	try{
                //建立一個點,用來存放當前base_laser的點在base_link座標系中的位置
                geometry_msgs::PointStamped base_point;
                //下面這句話,它會自動為我們進行相應的轉換,並將結果放入base_point,由於laser_point的frame_id為base_laser,這裡我們先寫將轉換到的座標系base_link.                
                listener.transformPoint("base_link", laser_point, base_point);
		ROS_INFO("base_laser: (%.2f, %.2f. %.2f) -----> base_link: (%.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("Received an exception trying to transform a point from \"base_laser\" to \"base_link\": %s", ex.what());
	}
}



int main(int argc, char** argv){
	ros::init(argc, argv, "robot_tf_listener");
	ros::NodeHandle node;

	tf::TransformListener listener(ros::Duration(10));
	//定時每隔1秒查詢進行一次:
	ros::Timer timer = node.createTimer( ros::Duration(1.0), boost::bind( &transformPoint, boost::ref(listener) ) );
	ros::spin();
}

在CMakeLists檔案中加入:
add_executable(tf_broadcaster src/tf_broadcaster.cpp)
add_executable(tf_listener src/tf_listener.cpp)
target_link_libraries(tf_broadcaster ${catkin_LIBRARIES})
target_link_libraries(tf_listener ${catkin_LIBRARIES})

依次執行,會發現出現結果:
[ INFO] [1472897890.623220105]: base_laser: (1.00, 0.20. 0.00) -----> base_link: (1.10, 0.20, 0.20) at time 1472897890.61
[ INFO] [1472897891.623229008]: base_laser: (1.00, 0.20. 0.00) -----> base_link: (1.10, 0.20, 0.20) at time 1472897891.61
[ INFO] [1472897892.624179159]: base_laser: (1.00, 0.20. 0.00) -----> base_link: (1.10, 0.20, 0.20) at time 1472897892.61
[ INFO] [1472897893.622589774]: base_laser: (1.00, 0.20. 0.00) -----> base_link: (1.10, 0.20, 0.20) at time 1472897893.61
[ INFO] [1472897894.624529454]: base_laser: (1.00, 0.20. 0.00) -----> base_link: (1.10, 0.20, 0.20) at time 1472897894.61

顯示出了兩座標關係~~

相關推薦

ROS學習tf基本用法

主要細節參見wiki,這裡我寫一下它的broadcaster和listener做個記錄: tf_broadcaster.cpp: #include<ros/ros.h> #include<tf/transform_broadcaster.h> in

ROS學習tf.2.編寫一個TF廣播器(C++)

ROS.tf2.編寫一個tf廣播器(C++)宣告:本教程來自於ROS.WIKI,本人在整理過程中可能出現一些錯誤和問題,有問題可以去檢視官網版本也可以諮詢本人1.1在接下來的兩篇教程中,我們將編寫程式碼來重現tf入門教程中的演示。之後,以下教程將重點介紹使用更高階的tf功能擴

ROS學習tf.3編寫一個tf接收器(C++)

ROS.tf3編寫一個tf接收器(C++)宣告:本教程來自於ROS.WIKI,本人在整理過程中可能出現一些錯誤和問題,有問題可以去檢視官網版本也可以諮詢本人在之前的教程中,我們建立了一個tf廣播公司向tf釋出一隻烏龜的姿勢。 在本教程中,我們將建立一個tf接收器來開始使用tf

scala學習 基本和高階用法(二)

目錄 1. Scala的資料型別 2. Scala變數 3. Scala 訪問修飾符 4. Scala 方法和函式 5. Scala陣列 6. Collection(集合) 7. Scala的類和物件 8. Scala的介面trait 9

Java學習筆記LinkedList基本用法

LinkedList簡介LinkedList 是一個繼承於AbstractSequentialList的雙向連結串列。它也可以被當作堆疊、佇列或雙端佇列進行操作。LinkedList 實現 List 介面,能進行佇列操作。LinkedList 實現 Deque 介面,即能將L

ROS學習編譯一個包

cti ges begin -s 包名 code start ner 一個 catkin_make -DCATKIN_WHITELIST_PACKAGES= "包名" $ catkin_make -DCATKIN_WHITELIST_PACKAGES="begin

ros學習kobuki

key con core sta -i fig other del mini sudo apt-get install ros-indigo-kobuki ros-indigo-kobuki-corerosrun kobuki_ftdi create_udev_rules#

Python的學習旅———基本數據類型 (元組)

切片 bsp 操作 取值 可變 tro num nbsp 運算 可以存儲多個值 主要用來讀 元組不可變 可以當作字典的key number=(10,12,34,65,234,123) # number=tuple(10,12,34,65,234,123) 可以按照索引取值

Python的學習旅———基本數據類型(字符編碼)

統一 所有 語言 一個 記錄 取代 edi 科學 文字 計算機中儲存的信息都是用二進制數表示的。通俗的說,按照何種規則將字符存儲在計算機中,如‘n‘用什麽表示,稱為"編碼";反之,將存儲在計算機中的二進制數解析顯示出來,稱為"解碼".在解碼過程中,如果使用了錯誤的解碼規則,

Python學習路-基本數據類型

bool bsp 基本數據 ring mar odi complex oat python 數字number 整數int 復數complex 浮點數float 小整數池:-5~257 布爾值bool True Falsel 三元運算 __author__

Java開發學習java基本數據類型

培訓班 otto oat style 簡單 lean 實用 類型 str 數據類型是每個編程語言必不可少的基礎知識,也是必須要掌握的技能,很多人知識簡單的進行理解,並沒有很系統的進行知識的梳理,以下是對java語言的內置數據類型匯總:  Java語言有8種基本類型。6種數字

ROS學習路的整理

        ROS是基於linux系統的一個次級作業系統,目前被看做是機器人界的一套標準平臺,可以類比手機的安卓作業系統或者是電腦的windows作業系統。ROS最大的優點在於靈活、低耦合、分散式、開源以及功能強大而豐富的

Tensorflow學習筆記——tf.ummary用法

轉於;https://www.cnblogs.com/lyc-seu/p/8647792.html Tensorflow學習筆記——tf.ummary用法         最近在研究tensorflow自帶的例程speech_command,順便學習t

python學習路-基本資料型別1 變數的概念、數字、字串

1 什麼是資料型別? 每種程式語言都有自己的資料型別,用於標識計算機可以認識的資料,Python中主要的資料型別為字串,整數,浮點數,列表,元祖,字典,集合七種主要的資料型別,其中以列表,字典為最主要的資料型別。 2 什麼是變數? 在說資料型別之前,首先說一下變數,那什麼是變數?簡單講,變數就是一個容器

Python學習Git基本操作

版本庫建立 什麼是版本庫呢?版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。 所以,建立一個版本庫非常簡單,首先,選擇一個合適

es6class 基本用法解析

javaScript 語言中,生成例項物件的傳統方法是通過建構函式,與傳統的面嚮物件語言(比如 C++ 和 Java)差異很大,ES6 提供了更接近傳統語言的寫法,引入了 class(類)這個概念,作為物件的模板。通過class關鍵字,可以定義類。 es6 class 與es5的面向物件的區別: 寫法不同,

ROS學習路(二)檔案系統

    在ROS的檔案包裡面,有純粹的程式碼,也有編譯後的二進位制檔案。如何將這些檔案有條不紊的整理起來呢?於是就有了下面這種檔案系統: 對於每一個特定的功能,用一個資料夾包起來,就是所謂的功能包: (1)config:放置功能包中的配置檔案,由使用者建立,檔名可以不同

ros學習camera calibration 單目攝像頭標定

環境:ubuntu16.04 ros版本 kinetic 標定筆記本單目攝像頭 需要的準備:1、標定圖:下面這張列印到a4紙上。 2、攝像機驅動,我使用的是usb_cam,下載地址:https://github.com/ros-drivers/usb_c

angular$location基本用法

一. 獲取url的相關方法: 以 'http://localhost/$location/21.1%20$location.html#/foo?name=bunny#myhash' 這個路徑為例: 1. 獲取當前完整的url路徑: $location.absUrl():

QT中圖表類QChart系列(1)-基本用法,畫折線圖、各個類之間的關係

首先要注意3點: (1)在.pro檔案中新增:QT       += charts。 (2)用到QChart的檔案中新增:QT_CHARTS_USE_NAMESPACE,或者:using namespace QtCharts; 在ui介面中拖入一個graphicsVi