簡體   English   中英

TF2 轉換找不到實際存在的框架

[英]TF2 transform can't find an actuall existing frame

在我編寫的全局規划器節點中,我有以下初始化代碼

#!/usr/bin/env python
import rospy
import copy
import tf2_ros
import time
import numpy as np
import math
import tf
from math import sqrt, pow
from geometry_msgs.msg import Vector3, Point
from std_msgs.msg import Int32MultiArray
from std_msgs.msg import Bool
from nav_msgs.msg import OccupancyGrid, Path
from geometry_msgs.msg import PoseStamped, PointStamped
from tf2_geometry_msgs import do_transform_point
from Queue import PriorityQueue

class GlobalPlanner():

    def __init__(self):
        print("init global planner")
        self.tfBuffer = tf2_ros.Buffer()
        self.listener = tf2_ros.TransformListener(self.tfBuffer)
        
        
        self.drone_position_sub = rospy.Subscriber('uav/sensors/gps', PoseStamped, self.get_drone_position)
        self.drone_position = []
        self.drone_map_position = []
        self.map_sub = rospy.Subscriber("/map", OccupancyGrid, self.get_map) 
        self.goal_sub = rospy.Subscriber("/cell_tower/position", Point, self.getTransformedGoal)
        self.goal_position = []
        self.goal = Point()
        self.goal_map_position = []
        self.occupancy_grid = OccupancyGrid()
        self.map = []
        self.p_path = Int32MultiArray()

        self.position_pub = rospy.Publisher("/uav/input/position", Vector3, queue_size = 1)
        #next_movement in
        self.next_movement = Vector3
        self.next_movement.z = 3
        self.path_pub = rospy.Publisher('/uav/path', Int32MultiArray, queue_size=1)

        self.width = rospy.get_param('global_planner_node/map_width')
        self.height = rospy.get_param('global_planner_node/map_height')

        #Check whether there is a path plan
        self.have_plan = False
        self.path = []

        self.euc_distance_drone_goal = 100
        self.twod_distance_drone_goal = []
        self.map_distance_drone_goal = []
        
        self.mainLoop()

並且有回調function調用getTransformed目標,會把“cell_tower”框架中的目標position帶到“world”框架中。 哪個看起來像這樣

def getTransformedGoal(self, msg):
        self.goal = msg
        try: 
            #Lookup the tower to world transform
            transform = self.tfBuffer.lookup_transform('cell_tower', 'world', rospy.Time())
            #transform = self.tfBuffer.lookup_transform('world','cell-tower' rospy.Time())
            #Convert the goal to a PointStamped
            goal_pointStamped = PointStamped()
            goal_pointStamped.point.x = self.goal.x
            goal_pointStamped.point.y = self.goal.y
            goal_pointStamped.point.z = self.goal.z
            #Use the do_transform_point function to convert the point using the transform
            new_point = do_transform_point(goal_pointStamped, transform)
            #Convert the point back into a vector message containing integers
            transform_point = [new_point.point.x, new_point.point.y]
            
            #Publish the vector
            self.goal_position = transform_point
        except (tf2_ros.LookupException, tf2_ros.ConnectivityException,  tf2_ros.ExtrapolationException) as e:
            print(e)
            print('global_planner tf2 exception, continuing')

錯誤信息說

"cell_tower" passed to lookupTransform argument target_frame does not exist.

我檢查了 active 和 all 的 RQT plot,這表明當處於活動狀態時,主題 /tf 沒有被節點全局規划器訂閱。 檢查下面的圖片,這是活動的在這里輸入圖片描述

此圖像適用於所有節點(包括非活動節點),請在此處輸入圖像描述

但我實際上已經設置了監聽器,我有另一個節點調用本地規划器,它使用相同的策略並且它適用於該節點,但不適用於全局規划器我不確定這是為什么。

嘗試為您的lookup_transform() function 調用添加超時,因為您的轉換可能在您需要時不可用:

transform = self.tfBuffer.lookup_transform('cell_tower', 'world',rospy.Time.now(), rospy.Duration(1.0))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM