البرمجة

حل مشكلة ‘global name ‘distance’ is not defined’ في برنامج Python وROS

في البداية، يظهر أن لديك بعض المشكلات في الشيفرة البرمجية التي تحتاج إلى التصحيح. الخطأ الذي تواجهه ينبع من محاولتك استخدام المتغير distance في دالة navigate دون تعريفه كمتغير عام في نطاق واسع. لحل هذه المشكلة، يمكنك إجراء التعديلات التالية في شيفرتك.

أولًا، يُفضل إعادة تسمية دالة distance في دالة nav_dist لتجنب الخلط بين الدالة والمتغير. بعد ذلك، قم بتعريف المتغيرات العالمية داخل دالة run باستخدام الكلمة الرئيسية global لضمان وصولها من خلال الدوال الأخرى.

فيما يلي نسخة معدلة من شيفرتك:

python
#!/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 as np # قمت بتعديل هنا لاستخدام np بدلاً من 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 distance = 0 # قمت بتعريف المتغير هنا lat_dest = 30.210406 long_dest = -92.022914 move_cmd = Twist() turn_cmd = Twist() # باقي الشيفرة كما هو def navigate(): global distance # قمت بإضافة هذا السطر للتأكد من وصول المتغير 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 # باقي الشيفرة كما هو def run(): global pub, distance # قمت بإضافة هذا السطر للتأكد من وصول المتغير 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()

تأكد من تحديث المتغيرات بشكل صحيح وفقًا لاحتياجات البرنامج الخاص بك، وأيضا تأكد من تصحيح الأخطاء الإملائية أو الصياغية الأخرى التي قد تظهر أثناء التعديلات.

المزيد من المعلومات

بالطبع، دعوني أضيف مزيد من المعلومات لتوضيح الشيفرة البرمجية وتساعد في فهم أعماق المشكلة وكيف يتم حلها.

أولاً، يبدو أن هناك استخدامًا مكررًا لاسم المتغير bearing، حيث تم تعريفه كمتغير عام وكذلك كدالة داخلية. يجب تجنب هذا النوع من التضارب في أسماء المتغيرات لتجنب اللبس والأخطاء.

ثانيًا، يمكنك التفكير في استخدام مكتبة math بدلاً من numpy لبعض العمليات البسيطة مثل حساب الجذر التربيعي. فمكتبة math مضمنة في لغة Python وتوفر الوظائف الرياضية الأساسية.

ثالثًا، قمت بتعريف دالة bearing() دون استخدامها في شيفرتك. ربما كنت تنوي استخدامها في المستقبل، ولكن يفضل إما استخدامها أو إزالتها لتجنب اللبس.

أخيرًا، يمكنك أيضًا إضافة تعليقات إضافية في الشيفرة لشرح أو توضيح بعض الأجزاء الرئيسية والمهام التي يقوم بها البرنامج.

في النهاية، يتعين عليك فحص جميع الأقسام في شيفرتك للتأكد من أن المتغيرات تم تعريفها واستخدامها بشكل صحيح، وأن الدوال والمكتبات تتناسب مع بعضها البعض بشكل صحيح.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر