You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:35:21