TF學習筆記6(Time Travel with tf)
阿新 • • 發佈:2018-12-24
在上一個教程中,我們討論了tf和time的基本概念。本教程將更進一步,並展示一個最強大的技巧。
1 時間旅行
那麼讓我們回到上一個教程中我們結束的地方。轉到您的教程包:
$ roscd learning_tf
並開啟檔案src / turtle_tf_listener.cpp。看一下第25-30行:
try{ ros::Time now = ros::Time::now(); listener.waitForTransform("/turtle2", "/turtle1", now, ros::Duration(1.0)); listener.lookupTransform("/turtle2", "/turtle1", now, transform);
現在,不要讓第二隻烏龜去第一隻龜現在的地方,讓第二隻烏龜去第一隻烏龜5秒前的地方:
try{ ros::Time past = ros::Time::now() - ros::Duration(5.0); listener.waitForTransform("/turtle2", "/turtle1", past, ros::Duration(1.0)); listener.lookupTransform("/turtle2", "/turtle1", past, transform);
那麼現在,如果你想執行這個,你期望看到什麼?絕對在前5秒內,第二隻烏龜不知道去哪裡,因為我們還沒有第一隻烏龜的5秒歷史。但這5秒後呢?我們試試吧:
$ make or catkin_make
$ roslaunch learning_tf start_demo.launch
你的烏龜是不是像這個螢幕截圖那樣無法控制地駕駛?那麼發生了什麼?
-
問過tf,“ 5秒前/ turtle1的姿勢相對於/ turtle2 5秒前是什麼?” 。這意味著我們根據5秒前第二隻龜的位置以及第一隻龜在5秒前的位置控制第二隻烏龜。
-
我們真正要問的是,"What was the pose of /turtle1 5 seconds ago, relative to the current position of the /turtle2?"
2 lookupTransform的高階API
So how can we ask tf a question like that?
此API使我們能夠明確說明每個座標的轉換時間。這就是程式碼的樣子:
try{
ros::Time now = ros::Time::now();
ros::Time past = now - ros::Duration(5.0);
listener.waitForTransform("/turtle2", now,
"/turtle1", past,
"/world", ros::Duration(1.0));
listener.lookupTransform("/turtle2", now,
"/turtle1", past,
"/world", transform);
lookupTransform()的高階API 有六個引數:
- 將轉換的座標,
- 時間
- 轉換目的座標
- 時間
- 指定不隨時間變化的幀,在本例中為“/ world”座標,
- 用於儲存結果的變數。
請注意,waitForTransform()也有一個基本的和高階的API,就像lookupTransform()一樣。
此圖顯示了tf在後臺執行的操作。在過去,它計算從第一隻烏龜到世界的轉變。
在世界框架中,時間從過去到現在。
現在,tf計算從世界到第二隻烏龜的轉變。
3 檢查結果
讓我們再次執行模擬器,這次使用高階時間旅行API:
$ make or catkin_make
$ roslaunch learning_tf start_demo.launch
是的,第二隻烏龜被引導到5秒前第一隻烏龜的位置!