1. 程式人生 > >ROS的學習(二十一)使用時間和TF

ROS的學習(二十一)使用時間和TF

     rosserial_arduino這個包,包括了可以在arduino上產生時間戳的一個庫,這個時間和執行roscore例項的PC或者是平板上的時間是同步的。下面使用一個例子來演示一下如何訪問時間,並且釋出一個TF變換。開啟一個終端,執行arduino IDE:
arduino

     選擇File->Examples->ros_lib->TimeTF,開啟的程式碼如下所示:
/* 
 * rosserial Time and TF   * Publishes a transform at current time
 */

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

ros::NodeHandle  nh;

geometry_msgs::TransformStamped t;
tf::TransformBroadcaster broadcaster;

char base_link[] = "/base_link";
char odom[] = "/odom";

void setup()
{
  nh.initNode();
  broadcaster.init(nh);
}

void loop()
{  
  t.header.frame_id = odom;
  t.child_frame_id = base_link;
  t.transform.translation.x = 1.0; 
  t.transform.rotation.x = 0.0;
  t.transform.rotation.y = 0.0; 
  t.transform.rotation.z = 0.0; 
  t.transform.rotation.w = 1.0;  
  t.header.stamp = nh.now();
  broadcaster.sendTransform(t);
  nh.spinOnce();
  delay(10);
}

      下面來解釋程式碼:
#include <ros.h>
#include <ros/time.h>
#include <tf/transform_broadcaster.h>

     上面的程式碼是包括一些必須的標頭檔案,
geometry_msgs::TransformStamped t;
tf::TransformBroadcaster broadcaster;

char base_link[] = "/base_link";
char odom[] = "/odom";

     接下來例項化一個TransformStamped的訊息和一個TransformBroadcaster
的物件broadcaster,我們同樣需要指出所釋出變換的框架的名字。
  broadcaster.init(nh);

     在setup函式裡面,我們呼叫了TransformBroadcaster的初始化函式init(),且使用節點的控制代碼作為一個引數。如果沒有這一步,broadcaster將不能正確的釋出訊息。
  t.header.frame_id = odom;
  t.child_frame_id = base_link;
  t.transform.translation.x = 1.0; 
  t.transform.rotation.x = 0.0;
  t.transform.rotation.y = 0.0; 
  t.transform.rotation.z = 0.0; 
  t.transform.rotation.w = 1.0;

     在loop()函式中,我們填充了變換的域,各種ID都被賦予了正確的字串型別的名字,且變換和旋轉的值被正確的設定。
 t.header.stamp = nh.now();

     呼叫nh.now()以ros::Time例項方式返回了當前的時間,
  broadcaster.sendTransform(t);
  nh.spinOnce();
  delay(10);
}

     最後釋出了變換,並且在再次釋出前呼叫了spinOnce和延遲函式。

     接下來執行程式,首先在arduino IDE中點選upload按鈕。

     接著接著執行roscore:

roscore

     接著執行一下rosserial客戶端應用程式,它將會把arduino的訊息轉發給ros的其他部分,
rosrun rosserial_python serial_node.py /dev/ttyACM0

     最後可以通過以下命令來檢查變換:
rosrun tf tf_echo odom base_link


相關推薦

ROS學習使用時間TF

     rosserial_arduino這個包,包括了可以在arduino上產生時間戳的一個庫,這個時間和執行roscore例項的PC或者是平板上的時間是同步的。下面使用一個例子來演示一下如何訪問時間,並且釋出一個TF變換。開啟一個終端,執行arduino IDE: a

機器學習——Optimizer, 單分類SVM&多分類SVM, 時間序列分析

Optimizer 在《機器學習(一)》中,我們已經指出梯度下降是解決凸優化問題的一般方法。而如何更有效率的梯度下降,就是本節中Optimizer的責任了。 Momentum Momentum是梯度下降法中一種常用的加速技術。其公式為: vt

Python學習 —— 前端之JavaScript

開始 mode mba html 國際 sca 執行 嵌入式 規範 轉載自http://www.cnblogs.com/liwenzhou/p/8004649.html 一、JavaScript概述   1.JavaScript的歷史 1992年Nombas開發出C-mi

初識Leetcode----學習【打家劫舍、快樂數】

①打家劫舍 你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。 給定一個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金

opencv學習:圓檢測

檢測原理: 參考連結:https://www.cnblogs.com/ssyfj/p/9275977.html#一houghcircles方法                     

spring深入學習 IOC 之 屬性填充

doCreateBean() 主要用於完成 bean 的建立和初始化工作,我們可以將其分為四個過程: createBeanInstance() 例項化 bean populateBean() 屬性填充 迴圈依賴的處理 initializeBe

Python3學習:python操作MongoDB增、刪、改、複雜查詢

MongoDB是一個跨平臺的NoSQL,基於Key-Value形式儲存資料。其儲存格式非常類似於Python的字典,因此用Python操作MongoDB會非常的容易。 對Mongo簡單的操作程式碼如下: #encoding:utf=8 import pymongo

Spring 學習——使用 JdbcTemplate

JdbcTemplate 簡介 為了使 JDBC 更加易於使用, Spring 在 JDBC API 上定義了一個抽象層, 以此建立一個 JDBC 存取框架. 作為 Spring JDBC 框架的核心, JDBC 模板的設計目的是為不同型別的 JDBC 操作提供模板方法. 每個模板方

系統學習深度學習--GoogLeNetV4與Inception-ResNet V1,V2

[v4] Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning,top5 error 3.08% 上面那篇論文,主要貢獻如下: 1、在Inception v3

深度學習——SRCNN, DRCN, VDSR

影象超解析度演算法(續) 前DL時代的SR 從訊號處理的角度來說,LR之所以無法恢復成HR,主要在於丟失了影象的高頻資訊。(Nyquist取樣定理) Harry Nyquist,1889~1976,University of North Da

軟體設計模式學習中介者模式

> 對於那些存在物件之間複雜互動關係的系統,中介者模式提供了一種簡化複雜互動的解決方案,即通過引入一箇中介者,將原本物件之間的兩兩互動轉化為每個物件與中介者之間的互動 ## 模式動機 以微信聊天為例,可以使用者與使用者直接聊天,也可以通過微信群聊天。前者的話,使用者要和別的使用者加為好友,即使用者

Android學習路線運用Fragment構建動態UI——創建一個Fragment

動態 app idt 文檔 部分 roi 現實 調用 android學習 你能夠把fragment看成是activity的模塊化部分。它擁有自己的生命周期,接受它自己的輸入事件,你能夠在activity執行時加入或者刪除它(有點像是一個“子activity”。你

Python學習筆記

準備 for ring 價格 python use imp pri exce 使用ElementTree解析XML文件 # 導入Python中內置的處理XML文件的模塊try: import xml.etree.cElementTree as ETexcept Imp

Java學習筆記:類型轉換instanceof關鍵字

方法 png true feed out 實例 strong 運算符 nbsp 基本數據類型轉換: 自動類型轉換:把大類型的數據賦值給大類型的變量(此時的大小指的是容量的範圍) 1 byte b = 12; //byte是一個字節 2 int i = b; //i

Linux學習總結正則三劍客之awk

awkawk 也是流式編輯器,它比sed的功能更強大 1.截取文檔中的某段 awk -F ‘:‘ ‘{print $1}‘ /etc/passwd |head -2-F 指定分割符,不指定以空格或者tab為分隔符print 為打印動作$1 為第一字段, $2 為第二字段,依次類推,$0標示整行那麽打印整個文檔

java基礎學習總結:自己寫一個java.lang.reflect.Proxy代理的實現

     動態代理裡面用到了一個類就是java.lang.reflect.Proxy,這個類是根據代理內容為傳入的介面生成代理用的。本文就自己寫一個Proxy類出來,功能和java.lang.reflect.Proxy一樣,傳入介面、代理內容,生成代理。  

nginx 原始碼學習筆記—— event 模組() ——事件驅動核心ngx_process_events_and_timers

首先繼續回憶下,之前子執行緒執行操作裡面有一個未涉及的內容ngx_process_events_and_timers,今天我們就來研究下這個函式。 本篇文章來自於:http://blog.csdn.net/lengzijian/article/details/7601730 先來看一下第十九

Python小白學習之路—【迭代器】

迭代器 1.迭代器協議 物件必須提供一個 next 方法,執行該方法要麼返回迭代中的下一項,要麼就引起一個Stoplteration異常,以終止迭代(只能往後走不能往前退) 2.可迭代物件 實現了迭代器協議的物件(如何實現:物件內部定義一個_iter_()方法) 協議是一種約定,可迭代物件實現了

Effective_STL 學習筆記 永遠讓比較函式對相等的值返回 false

  除非比較函式總是為相等的值返回 false,否則將會打破所有的標準關聯容器, 不管關聯容器是否允許存在副本(set、map、multiset、multimap) 對於(set、map)使用 less_equal (<=): 1   !( 10A <= 10B ) &a

機器學習筆記:TensorFlow實戰十三遷移學習

1 - 引言 越複雜的神經網路,需要的訓練集越大,ImageNet影象分類資料集有120萬標註圖片,所以才能將152層的ResNet的模型訓練到大約96.%的正確率。但是在真正的應用中,很難收集到如此多的標註資料。即使收集到也需要花費大量人力物力來標註。並且即使有了大量的資料集,要訓練一