首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ROS如何使用从一个回调函数到另一个回调函数的值

ROS如何使用从一个回调函数到另一个回调函数的值
EN

Stack Overflow用户
提问于 2021-05-21 01:53:27
回答 1查看 724关注 0票数 1

对不起,英语不是我的母语。我希望你能正确理解我的问题。

我使用的是带有ROS Melodic的Ubuntu 18.04。我尝试从mapCallbackodometryCallback函数中获取数据,并在SampleTree函数中使用这些值。当我运行下面的代码a have时,我想返回frontCones数组作为结果,但我的输出是空数组。如何让SampleTree函数获取在mapCallbackodometryCallback函数中发布的值,并在循环中使用这些数据来返回frontCones数组?

下面是我的代码:

代码语言:javascript
复制
# !/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")
EN

回答 1

Stack Overflow用户

发布于 2021-05-25 15:12:42

通过在回调函数中打印新的地图信息,确保self.map Check中的值确实在更新。

另请添加:

代码语言:javascript
复制
if __name__ == "__main__"():
    inst = Test()
    inst.SampleTree()
    try:
        rospy.spin()
    except KeyboardInterrupt:
        print("Shutting down")

除非被中断,否则rospy.spin()将在无限循环中执行代码。

建议:

您可以为函数命名

代码语言:javascript
复制
def getFrontConeObstacles(self, frontDist):

而不是

代码语言:javascript
复制
def getFrontConeObstacles(self, map, frontDist):

因为您可以很容易地在类中访问self.map。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67625614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档