Вы должны сначала проверить, что преобразование действительно допустимо. Посмотрите на дерево TF с помощью следующей команды, чтобы увидеть, что на самом деле в дереве есть путь между двумя ссылками:
rosrun rqt_tf_tree rqt_tf_tree
Есть еще одна утилита, которая делает то же самое, что выводит в файл PDF:
rosrun tf view_frames
Как только вы убедитесь, что ваше дерево выглядит так, как ожидалось, вы можете двигаться дальше с моей следующей рекомендацией. В общем, я обнаружил, что эти поиски TF никогда не были очень надежными. Вы часто нажимаете на этот блок, кроме блока, когда ваш узел запускается впервые, потому что первоначально может существовать исключение LookupException до тех пор, пока не будет получено достаточное количество сообщений TF, или могут быть старые данные в очередях, и вы получите исключение ExtrapolationException. Это может произойти, даже если все в вашем дереве TF имеет двойственное отношение. Более надежный способ - продолжать попытки поиска, пока не получите желаемое:
position = None
quaternion = None
while position is None and quaternion is None:
try:
position, quaternion = listener.lookupTransform("/base_link", "/head_plate_frame", rospy.Time())
except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException):
print("Not working")
pass
Если вы сделаете это, я также мог бы порекомендовать добавить проверку тайм-аута, чтобы она проходила только через это время, пока цикл не достигнет некоторого ограничения по времени, чтобы вы не ожидали вечность. Они сделали это немного приятнее для работы в tf2 , есть вызов поиска со встроенным тайм-аутом, так что вы можете покончить с циклом while, и он будет просто пытаться искать преобразование до ваш тайм-аут Здесь является хорошим примером этого.