web-dev-qa-db-fra.com

TypeError: l'objet 'numpy.float64' n'est pas appelable?

Je ne peux pas comprendre pourquoi je reçois cette erreur. Toute aide serait appréciée.

Ce code est destiné à la navigation autonome de base d'un petit véhicule tout terrain. Pour une raison quelconque, il est pris dans les fonctions de calcul de cap et de relèvement. J'ai essayé de placer l'un ou l'autre premier dans la fonction d'exécution, et il fait la même chose.

Je suis assez peu expérimenté avec le python, c'est donc quelque chose de simple que je néglige.

#!/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 __== '__main__':
    try:
        while not rospy.is_shutdown():
            run()
    except rospy.ROSInterruptException:
        rospy.loginfo("stopped")
        pass

Voici le résultat complet:

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

Merci

5
Ronnie Kisor

Vous ne pouvez pas utiliser le même nom de variable pour une fonction et un float (dans le même espace de noms). Et vous avez tous deux défini une fonction bear et une variable bear pointant vers un float. Vous devez changer l'un des deux noms.

11
Roberto

Faux, si faux !!! :)

def bear(y,z):
    global bear
    ....
1
hpaulj