类型错误:'numpy.float64'对象不可调用?

6

我不明白为什么会出现这个错误,请帮忙看一下。

这段代码是用于小型全地形车的基本自主导航。由于某种原因,它在计算航向和方位的函数中卡住了。我尝试过先在run函数中放置其中一个函数,但结果还是一样。

我对Python相当不熟悉,很可能是我忽略了一些简单的问题。

#!/usr/bin/env python

import rospy
from geometry_msgs.msg import Twist
from geometry_msgs.msg import Vector3Stamped
from geometry_msgs.msg import Vector3
from math import radians
from sensor_msgs.msg import NavSatFix
import time
import numpy

lat = 0.0
lon = 0.0
x = 0.0
y = 0.0
z = 0.0
head = 0.0
bear = 0.0


###########################################################
destLat = 30.210406
#                                   Destination
destLon = -92.022914
############################################################


class sub():

    def __init__(self):
        rospy.init_node('Test1', anonymous=False)
        rospy.Subscriber("/imu_um6/mag", Vector3Stamped, self.call_1)
        rospy.Subscriber("/gps/fix", NavSatFix, self.call_2)

    def call_1(self, mag):
        global x
        global y
        global z
        x = mag.vector.x
        y= mag.vector.y
        z= mag.vector.z
    
    def call_2(self, gps):
        global lat
        global lon

        lat = gps.latitude
        lon = gps.longitude

def head(lat, lon):
    global head
    # Define heading here
    head = numpy.rad2deg(numpy.arctan2(z, y)) + 90
    print(head)


def bear(y,z):
    global bear
    # Define bearing Here
    dLon = destLon - lon
    vert = numpy.sin(dLon) * numpy.cos(destLat)
    horiz = numpy.cos(lat)*numpy.sin(destLat) - numpy.sin(lat)*numpy.cos(destLat)*numpy.cos(dLon)
    bear = (numpy.rad2deg(numpy.arctan2(vert, horiz)) + 360) % 360
    print(bear)


def nav(head, bear, destLat, destLon):
    # Do Navigation Here
    pub = rospy.Publisher('/husky_velocity_controller/cmd_vel', Twist, queue_size=10)
    move_cmd = Twist()
    turn_cmd = Twist()

    move_cmd.linear.x = 2
    turn_cmd.angular.z = radians(45)

    turn_angle = head - bear
#   Prettify the angle 
    if (turn_angle > 180):
        turn_angle -= 360
    elif (turn_angle < -180):
        turn_angle += 360
    else:
        turn_angle = turn_angle

    if (abs(lat-destLat)<.0005 and abs(lon-destLon)<.0005):
        pub.publish(Twist())
        r.sleep()
    else:
        if (abs(turn_angle) < 8):
            pub.publish(move_cmd)
            rospy.spin()
        else:
            pub.publish(turn_cmd)
            r = rospy.Rate(5);
            r.sleep()
    


def shutdown(self):
    rospy.loginfo("Stop Husky")
    cmd_vel.publish(Twist())
    rospy.sleep(1)


def run():
    sub()
    bear(y,z)
    head(lat,lon)
    nav(head, bear, destLat, destLon)
    print('here')



if __name__ == '__main__':
    try:
        while not rospy.is_shutdown():
            run()
    except rospy.ROSInterruptException:
        rospy.loginfo("stopped")
        pass

这是完整的输出:
163.11651134
90.0
here
Traceback (most recent call last):
  File "classTest.py", line 117, in <module>
    run()
  File "classTest.py", line 107, in run
    bear(y,z)
TypeError: 'numpy.float64' object is not callable

请注意,run 只能运行一次;第二次调用会遇到不同的 bear(和 head)。我会尝试摆脱这种使用 globals 保存状态的方法。将状态保存为类对象的属性更好。但我不确定这对于 rosby 调用会有什么影响。 - hpaulj
2个回答

17

在同一命名空间中,您不能将函数和浮点型变量使用相同的变量名。您定义了一个名为bear的函数和一个指向浮点数的bear变量。您需要更改其中一个名称。


3
错误,非常错误!!! :)
def bear(y,z):
    global bear
    ....

2
虽然我完全同意这个观点,但我不确定这个答案是否清楚地回答了提问者的问题。 - Uyghur Lives Matter
本身它可能不是原因。即使没有“global”,您也可能会遇到此错误。但是这些行的并置指向在使用标识符“bear”时出现了一些有趣的问题。也许程序员习惯于将变量和函数保留在不同的命名空间中的语言。此外,过度使用“global”是常见的新手错误。 - hpaulj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接