Nao机器人Socket拍照传服务器报错求助:AttributeError异常
问题描述
尝试让Nao机器人作为客户端与PC服务器建立Socket连接,实现拍照并将图像发送至服务器,已将Python脚本部署在Choregraphe的行为盒子中,但运行后报错。
客户端代码
class MyClass(GeneratedClass): def __init__(self): GeneratedClass.__init__(self) def onLoad(self): #put initialization code here pass def onUnload(self): #put clean-up code here pass def onInput_onStart(self): import socket import pickle import sys HOST = '192.168.0.233' # The server's hostname or IP address PORT = 8002 # The port used by the server #Establish connection s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) #Call ALVideoDevice service session = self.session() camSession = session.service("ALVideoDevice") resolution = 2 #VGA colorSpace = 11 #RGB fps = 5 nameId = camSession.subscribeCamera("cameratest",0,resolution,colorSpace,fps) #Get camera image naoImage = camSession.getImageRemote(nameId) camSession.releaseImage(nameId) camSession.unsubscribe(nameId) try: #Send buffer size size = sys.getsizeof(pickle.dumps(naoImage[6])) s.send(str(size)) #Send image to server s.send(pickle.dumps(naoImage[6]) + b'[END OF IMAGE]') #Get emotion response from server emotion=b"" emotion = s.recv(1024) self.logger.info(emotion) except Exception as e: pass finally: s.close() self.output_emotion(emotion) self.onStopped() pass
报错信息
[ERROR] behavior.box :_safeCallOfUserMethod:130 _Behavior__lastUploadedChoregrapheBehaviorbehavior_12771477760:/clientnao_1: Traceback (most recent call last): File "/opt/aldebaran/lib/python2.7/site-packages/albehavior.py", line 120, in _safeCallOfUserMethod func() File "<string>", line 56, in onInput_onStart File "/opt/aldebaran/lib/python2.7/site-packages/ialbehavior.py", line 166, in <lambda> __getattr__ = lambda self, name: _swig_getattr(self, behavior, name) File "/opt/aldebaran/lib/python2.7/site-packages/ialbehavior.py", line 74, in _swig_getattr return _swig_getattr_nondynamic(self, class_type, name, 0) File "/opt/aldebaran/lib/python2.7/site-packages/ialbehavior.py", line 69, in _swig_getattr_nondynamic return object.__getattr__(self, name) AttributeError: type object 'object' has no attribute '__getattr__'
问题分析与修复
错误根源
报错核心原因是调用self.logger.info(emotion)时,Choregraphe的GeneratedClass实例并不支持logger属性,当前运行环境中不存在该属性,触发了属性查找错误。此外代码还有几个潜在问题需要修正。
修复步骤
- 替换
self.logger.info为Choregraphe行为类原生支持的self.log()方法,用于输出日志。 - 提前初始化
s和emotion变量,避免finally块中引用未定义的变量(比如连接建立失败时s未被赋值)。 - 发送缓冲区大小时,将字符串转为字节流(
str(size).encode('utf-8')),确保和服务器的字节通信一致。 - 异常处理不要直接
pass,添加错误日志便于调试。 - 确保Socket连接在异常场景下也能正常关闭。
修正后的代码
class MyClass(GeneratedClass): def __init__(self): GeneratedClass.__init__(self) def onLoad(self): # 初始化代码 pass def onUnload(self): # 清理代码 pass def onInput_onStart(self): import socket import pickle import sys HOST = '192.168.0.233' # 服务器IP地址 PORT = 8002 # 服务器端口 emotion = b"" s = None try: # 建立Socket连接 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) # 调用ALVideoDevice服务获取摄像头数据 session = self.session() camSession = session.service("ALVideoDevice") resolution = 2 # VGA分辨率 colorSpace = 11 # RGB色彩空间 fps = 5 # 帧率 nameId = camSession.subscribeCamera("cameratest", 0, resolution, colorSpace, fps) naoImage = camSession.getImageRemote(nameId) camSession.releaseImage(nameId) camSession.unsubscribe(nameId) # 序列化图像数据并发送大小 image_data = pickle.dumps(naoImage[6]) size = sys.getsizeof(image_data) s.send(str(size).encode('utf-8')) # 发送图像数据及结束标记 s.send(image_data + b'[END OF IMAGE]') # 接收服务器响应 emotion = s.recv(1024) self.log(emotion.decode('utf-8')) except Exception as e: # 输出错误日志 self.log(f"Error: {str(e)}") finally: # 确保Socket连接关闭 if s: s.close() self.output_emotion(emotion) self.onStopped()
内容的提问来源于stack exchange,提问作者nada nada
相关产品推荐
相关产品推荐

