问题描述
抱歉,英语不是我的母语。我希望你能正确理解我的问题。
我使用 Ubuntu 18.04 和 ROS Melodic。我正在尝试从 mapCallback
和 odometryCallback
函数中获取数据并在 SampleTree
函数中使用这些值。当我运行下面的代码时,我想返回 frontCones 数组作为结果,但我的输出是空数组。如何使 SampleTree
函数采用在 mapCallback
和 odometryCallback
函数中发布的值并在循环中使用此数据返回 frontCones 数组?
这是我的代码:
# !/usr/bin/python
import rospy
from nav_msgs.msg import odometry
from egn_messages.msg import Map
from tf.transformations import euler_from_quaternion
odometry = odometry()
map = Map()
class Test:
def __init__(self):
rospy.init_node('test_node')
rospy.Subscriber('/map1',Map,self.mapCallback)
rospy.Subscriber('/odometry',odometry,self.odometryCallback)
self.map = []
self.carPosX = 0.0
self.carPosY = 0.0
self.carPosYaw = 0.0
def odometryCallback(self,odometry):
orientation_q = odometry.pose.pose.orientation
orientation_list = [orientation_q.x,orientation_q.y,orientation_q.z,orientation_q.w]
(roll,pitch,yaw) = euler_from_quaternion(orientation_list)
self.carPosX = odometry.pose.pose.position.x
self.carPosY = odometry.pose.pose.position.y
self.carPosYaw = yaw
def mapCallback(self,map):
self.map = map
def SampleTree(self):
if not self.map:
print
'map is empty,return'
return
frontConesdist = 12
frontCones = self.getFrontConeObstacles(frontConesdist)
print(frontCones)
def getFrontConeObstacles(self,frontdist):
if not map:
return []
headingVector = [1.0,0]
behinddist = 0.5
carPosBehindPoint = [self.carPosX - behinddist * headingVector[0],self.carPosY - behinddist * headingVector[1]]
frontdistSq = frontdist ** 2
frontConeList = []
for cone in map.cones:
if (headingVectorOrt[0] * (cone.y - carPosBehindPoint[1]) - headingVectorOrt[1] * (
cone.x - carPosBehindPoint[0])) < 0:
if ((cone.x - self.carPosX) ** 2 + (cone.y - self.carPosY) ** 2) < frontdistSq:
frontConeList.append(cone)
return frontConeList
if __name__ == "__main__":
inst = test()
inst.SampleTree()
try:
rospy.spin()
except KeyboardInterrupt:
print("Shutting down")
解决方法
通过在回调函数中打印新的地图信息,确保 self.map 中的值实际上正在更新。
同时添加:
if __name__ == "__main__"():
inst = Test()
inst.SampleTree()
try:
rospy.spin()
except KeyboardInterrupt:
print("Shutting down")
rospy.spin() 将在无限循环中执行代码,除非被中断。
建议:
你可以给函数命名
def getFrontConeObstacles(self,frontDist):
代替
def getFrontConeObstacles(self,map,frontDist):
因为您可以轻松访问类中的 self.map。