Ronnie Kisor Ronnie Kisor - 7 months ago 74
Python Question

global name 'distance' is not defined

I'm new to python and ros, and I'm having a little issue at the moment. I'm sure it's a simple error on my part, but I can't figure it out.

I've searched and found similar situations, but I'm not sure how to implement the solutions given to other answers on my code.

Please ignore any 'crappiness' in my code that does not directly contribute to the issue. I just need this project to run as quickly as possible.

#!/usr/bin/env python

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

global distance
global pub
global dest_lat
global dest_long
global move_cmd
global turn_cmd
global bearing
global heading
global initial_bearing
global cur_lat
global prev_lat
global cur_long
global prev_long

bearing = 0

################################################################################
lat_dest = 30.210406
# DESTINATION COORDINATES
long_dest = -92.022914
################################################################################

move_cmd = Twist()
turn_cmd = Twist()

def nav_dist(navsat):
R = 6373000 # Radius of the earth in m
cur_lat = navsat.latitude
cur_long = navsat.longitude
dLat = cur_lat - lat_dest
dLon = cur_long - long_dest
x = dLon * numpy.cos((lat_dest+cur_lat)/2)
distance = numpy.sqrt(x**2 + dLat**2) * R
return distance


def bearing():
if (bearing == 0):
bearing = initial_bearing
return bearing
else:
bearing = calculate_bearing(cur_lat, prev_lat, cur_long, prev_long)
return bearing


def calculate_bearing(lat1, lat2, long1, long2):
dLon = long2 - long1
y = np.sin(dLon) * np.cos(lat2)
x = np.cos(lat1)*np.sin(lat2) - np.sin(lat1)*np.cos(lat2)*np.cos(dLon)
bearing = (np.rad2deg(np.arctan2(y, x)) + 360) % 360
return bearing

def calculate_nav_angle(lat1, lat_dest, long1, long_dest):
dLon = long_dest - long1
y = np.sin(dLon) * np.cos(lat_dest)
x = np.cos(lat1)*np.sin(lat_dest) - np.sin(lat1)*np.cos(lat_dest)*np.cos(dLon)
heading = (np.rad2deg(np.arctan2(y, x)) + 360) % 360
return heading

def navigate(distance, nav_angle):
turn_cmd.angular.z = radians(bearing - heading)
move_cmd.linear.x = distance
pub.publish(turn_cmd)
time.sleep(.01)
pub.publish(move_cmd)
time.sleep(.001)

prev_long = cur_long
prev_lat = cur_lat

###############################################################################################

################################# callbacks and run #################################

###############################################################################################

def call_nav(navsat):
rospy.loginfo("Latitude: %s", navsat.latitude) #Print GPS co-or to terminal
rospy.loginfo("Longitude: %s", navsat.longitude)
nav_dist(navsat)
time.sleep(.001)


def call_bear(bearing):
rospy.loginfo("Bearing: %s", bearing.vector) #Print mag reading for bearing
x = -bearing.vector.y
y = bearing.vector.z
initial_bearing = numpy.arctan2(y, x)
return initial_bearing

def run():
pub = rospy.Publisher('/husky_velocity_controller/cmd_vel', Twist)
rospy.Subscriber("/imu_um6/mag", Vector3Stamped, call_bear)
rospy.Subscriber("/gps/fix", NavSatFix, call_nav)
rospy.init_node('navigate_that_husky')

rospy.spin()

if __name__ == '__main__':
run()
navigate(distance, nav_angle)


and here is the error

Traceback (most recent call last):
File "NewTest.py", line 111, in <module>
navigate(distance, nav_angle)
NameError: global name 'distance' is not defined


how might I fix this? I appreciate any help.

Answer

In your function you are redefining your global variable distance as a local one