1. 程式人生 > >TF學習筆記6(Time Travel with tf)

TF學習筆記6(Time Travel with tf)

在上一個教程中,我們討論了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

random.png

你的烏龜是不是像這個螢幕截圖那樣無法控制地駕駛?那麼發生了什麼?

  • 問過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 有六個引數:

  1. 將轉換的座標,
  2. 時間
  3. 轉換目的座標
  4. 時間
  5. 指定不隨時間變化的幀,在本例中為“/ world”座標,
  6. 用於儲存結果的變數。

請注意,waitForTransform()也有一個基本的和高階的API,就像lookupTransform()一樣。

time_travel.png

此圖顯示了tf在後臺執行的操作。在過去,它計算從第一隻烏龜到世界的轉變。

在世界框架中,時間從過去到現在。

現在,tf計算從世界到第二隻烏龜的轉變。

3 檢查結果

讓我們再次執行模擬器,這次使用高階時間旅行API:

  $ make  or catkin_make
  $ roslaunch learning_tf start_demo.launch

是的,第二隻烏龜被引導到5秒前第一隻烏龜的位置!