lumingyu0423/Sony-Xperia-Hello-SCU

0

stars

3

commits

Python

primary language

Jan 28, 2026

updated

README

Sony Xperia Hello SCU Controller (Python)

Python实现的Sony Xperia Hello机器人SCU (System Control Unit) 控制器。

基于对Android 8.0固件的逆向工程分析实现。

功能特性

  • UART串口通信 (115200, 8N1)
  • 文本协议命令构建
  • 电机控制 (HEAD_TILT/HEAD_PAN/BODY)
  • LED控制 (颈部RGB/眼部led开关)
  • 动作文件解析 (.smd格式)
  • 事件驱动的动作播放
  • 关键帧动画支持
  • 事件监听 (触摸/距离/故障/电源)

安装

pip install -r requirements.txt

快速开始

基本使用

from scu_controller import SCUController, MotorId

scu = SCUController('COM8')  # Windows
# scu = SCUController('/dev/ttyUSB0')  # Linux

if scu.connect():
    # 移动头部
    scu.move_head_pan(45.0, duration_ms=1000)   # 右看45°
    scu.move_head_tilt(-10.0, duration_ms=500)  # 下看10°
    scu.turn_body(90.0, duration_ms=1500)       # 身体右转90°
    scu.home_position()                          # 回到初始位置
    
    # LED控制
    scu.set_neck_led(255, 0, 0)      # 颈部LED红色
    scu.set_eye_led(0x1F, 0x1F)      # 眼睛LED全开 (5个LED段)
    
    # 设置事件监听
    scu.set_touch_listener(lambda: print("触摸!"))
    scu.set_proximity_listener(lambda dirs: print(f"检测到人: {dirs}"))
    
    scu.disconnect()

播放动作文件

from scu_controller import SCUController

scu = SCUController('COM8')
scu.connect()

# 方式1: 直接播放文件
scu.play_motion_file('BA_P_09.smd', on_complete=lambda: print("完成"))

# 方式2: 播放帧数据
from motion_parser import MotionFile
motion = MotionFile('BA_P_09.smd')
if motion.load():
    frame_data = motion.get_fullframe_data()
    scu.play_motion_data(frame_data, motion.header.total_duration_ms)

# 停止播放
scu.stop_motion()

scu.disconnect()

解析动作文件

from motion_parser import MotionFile

motion = MotionFile('BA_S_01.smd')
if motion.load():
    print(f"帧数: {motion.header.frame_count}")
    print(f"帧时间: {motion.header.frame_time}ms")
    print(f"时长: {motion.header.total_duration_ms}ms")
    print(f"资源: {motion.header.resource_list}")
    print(f"有关键帧: {motion.header.has_keyframe}")

命令行工具

# 交互模式
python motion_playback.py -p COM8 -i

# 播放动作文件
python motion_playback.py -p COM8 -m BA_P_09.smd

# 列出动作文件
python motion_playback.py -l --path /path/to/motions

文件结构

python_scu/
├── scu_controller.py   # SCU控制器主类
├── motion_parser.py    # 动作文件解析器
├── motion_playback.py  # 命令行播放工具
├── ANALYSIS.md         # 协议分析文档
├── requirements.txt    # 依赖包
└── README.md           # 说明文档

通信协议

文本协议格式

命令格式: :<CMD>[参数]\r\n
响应格式: :<CMD>:[OK|BF|BE]\r\n
事件格式: <EVT[type][param]

主要命令

命令功能格式
MOS开始播放动作:MOS\r\n
MOC清除动作缓冲:MOC\r\n
MOT传输请求:MOT<帧数>\r\n
MOD发送帧数据:MOD<二进制数据>
P2P点对点移动:P2P<id><pos><dur><curve>\r\n
MCX电机控制:MCX<id><enable>\r\n
GMP获取电机位置:GMP<id>\r\n
MKS开始关键帧:MKS<流ID>\r\n
MKC取消关键帧:MKC<流ID>\r\n
MKL加载关键帧:MKL<流ID><Base64数据>\r\n
LED2颈部LED:LED2<RGB>\r\n
LED4眼睛LED:LED4<左><右>\r\n

事件通知

类型(十六进制)值(十进制)事件
0x80128距离检测 (PROXIMITY)
0x81129触摸检测 (TOUCH)
0x82130电源连接 (AC_CONNECTED)
0x86134动作缓冲就绪 (MOTION_BUFFER)
0x87135动作播放完成 (MOTION_STOP)
0x89137关键帧完成 (KEYFRAME_STOP)
0xE2226过流保护 (OVER_CURRENT)

动作文件格式 (.smd)

┌────────────────┬────────────────────────────────────┐
│ 偏移 (字节)     │ 内容                                │
├────────────────┼────────────────────────────────────┤
│ 0-7            │ "SONY:SMD" 魔数                     │
│ 8-15           │ "BRTX0001" 版本号                   │
│ 16-19          │ 动作数据偏移                         │
│ 20-23          │ 动作数据大小                         │
│ 24-27          │ 帧数                                │
│ 28-31          │ 帧时间 (ms)                         │
│ 32-35          │ 资源使用标志 (位掩码)                │
│ 36-39          │ 关键帧数据偏移                       │
│ 40+            │ 动作帧数据 (每帧16字节)              │
└────────────────┴────────────────────────────────────┘

资源使用标志 (resource_usage) 位掩码

Bit资源
bit 01NECK_LED (颈部LED)
bit 12EYE_LED (眼睛LED)
bit 24HEAD_PAN (头部水平电机)
bit 38HEAD_TILT (头部俯仰电机)
bit 416BODY (身体电机)

电机ID

ID名称说明
0HEAD_TILT头部垂直倾斜
1HEAD_PAN头部水平旋转
2BODY机身旋转

预设动作列表

睡眠动作 (BA_S_*)

  • BA_S_01.smd - 睡眠待机 (循环)
  • BA_S_02.smd - 检测人体后醒来
  • BA_S_03.smd - 进入睡眠

姿态动作 (BA_P_*)

  • BA_P_01.smd - 倾听状态 (循环)
  • BA_P_02.smd - 空闲待机 (循环)
  • BA_P_03.smd - 呼吸动作 (循环)
  • BA_P_09.smd - 眨眼
  • BA_P_17.smd - 初始位置/归位

交互动作 (BA_O_*)

  • BA_O_03.smd - 抱歉/未听清
  • BA_O_05.smd - 告别
  • BA_O_06.smd - 触摸屏幕反应

导航动作 (BA_N_*)

  • BA_N_01.smd - 打招呼
  • BA_N_04.smd - 四处张望 (循环)

无聊动作 (BA_Bore_*)

  • BA_Bore_01.smd ~ BA_Bore_14.smd (随机播放)

注意事项

  1. 硬件连接: 确保正确连接UART串口
  2. 波特率: 115200, 8N1
  3. 动作文件: 需要从设备提取原始动作文件
  4. 播放流程: 大文件分批传输,由EVT8600事件驱动

许可证

仅供学习研究使用,请尊重Sony的知识产权。

Contributors

lumingyu0423

3 commits

lumingyu0423/Sony-Xperia-Hello-SCU

0

stars

3

commits

Python

primary language

Jan 28, 2026

updated

README

Sony Xperia Hello SCU Controller (Python)

Python实现的Sony Xperia Hello机器人SCU (System Control Unit) 控制器。

基于对Android 8.0固件的逆向工程分析实现。

功能特性

  • UART串口通信 (115200, 8N1)
  • 文本协议命令构建
  • 电机控制 (HEAD_TILT/HEAD_PAN/BODY)
  • LED控制 (颈部RGB/眼部led开关)
  • 动作文件解析 (.smd格式)
  • 事件驱动的动作播放
  • 关键帧动画支持
  • 事件监听 (触摸/距离/故障/电源)

安装

pip install -r requirements.txt

快速开始

基本使用

from scu_controller import SCUController, MotorId

scu = SCUController('COM8')  # Windows
# scu = SCUController('/dev/ttyUSB0')  # Linux

if scu.connect():
    # 移动头部
    scu.move_head_pan(45.0, duration_ms=1000)   # 右看45°
    scu.move_head_tilt(-10.0, duration_ms=500)  # 下看10°
    scu.turn_body(90.0, duration_ms=1500)       # 身体右转90°
    scu.home_position()                          # 回到初始位置
    
    # LED控制
    scu.set_neck_led(255, 0, 0)      # 颈部LED红色
    scu.set_eye_led(0x1F, 0x1F)      # 眼睛LED全开 (5个LED段)
    
    # 设置事件监听
    scu.set_touch_listener(lambda: print("触摸!"))
    scu.set_proximity_listener(lambda dirs: print(f"检测到人: {dirs}"))
    
    scu.disconnect()

播放动作文件

from scu_controller import SCUController

scu = SCUController('COM8')
scu.connect()

# 方式1: 直接播放文件
scu.play_motion_file('BA_P_09.smd', on_complete=lambda: print("完成"))

# 方式2: 播放帧数据
from motion_parser import MotionFile
motion = MotionFile('BA_P_09.smd')
if motion.load():
    frame_data = motion.get_fullframe_data()
    scu.play_motion_data(frame_data, motion.header.total_duration_ms)

# 停止播放
scu.stop_motion()

scu.disconnect()

解析动作文件

from motion_parser import MotionFile

motion = MotionFile('BA_S_01.smd')
if motion.load():
    print(f"帧数: {motion.header.frame_count}")
    print(f"帧时间: {motion.header.frame_time}ms")
    print(f"时长: {motion.header.total_duration_ms}ms")
    print(f"资源: {motion.header.resource_list}")
    print(f"有关键帧: {motion.header.has_keyframe}")

命令行工具

# 交互模式
python motion_playback.py -p COM8 -i

# 播放动作文件
python motion_playback.py -p COM8 -m BA_P_09.smd

# 列出动作文件
python motion_playback.py -l --path /path/to/motions

文件结构

python_scu/
├── scu_controller.py   # SCU控制器主类
├── motion_parser.py    # 动作文件解析器
├── motion_playback.py  # 命令行播放工具
├── ANALYSIS.md         # 协议分析文档
├── requirements.txt    # 依赖包
└── README.md           # 说明文档

通信协议

文本协议格式

命令格式: :<CMD>[参数]\r\n
响应格式: :<CMD>:[OK|BF|BE]\r\n
事件格式: <EVT[type][param]

主要命令

命令功能格式
MOS开始播放动作:MOS\r\n
MOC清除动作缓冲:MOC\r\n
MOT传输请求:MOT<帧数>\r\n
MOD发送帧数据:MOD<二进制数据>
P2P点对点移动:P2P<id><pos><dur><curve>\r\n
MCX电机控制:MCX<id><enable>\r\n
GMP获取电机位置:GMP<id>\r\n
MKS开始关键帧:MKS<流ID>\r\n
MKC取消关键帧:MKC<流ID>\r\n
MKL加载关键帧:MKL<流ID><Base64数据>\r\n
LED2颈部LED:LED2<RGB>\r\n
LED4眼睛LED:LED4<左><右>\r\n

事件通知

类型(十六进制)值(十进制)事件
0x80128距离检测 (PROXIMITY)
0x81129触摸检测 (TOUCH)
0x82130电源连接 (AC_CONNECTED)
0x86134动作缓冲就绪 (MOTION_BUFFER)
0x87135动作播放完成 (MOTION_STOP)
0x89137关键帧完成 (KEYFRAME_STOP)
0xE2226过流保护 (OVER_CURRENT)

动作文件格式 (.smd)

┌────────────────┬────────────────────────────────────┐
│ 偏移 (字节)     │ 内容                                │
├────────────────┼────────────────────────────────────┤
│ 0-7            │ "SONY:SMD" 魔数                     │
│ 8-15           │ "BRTX0001" 版本号                   │
│ 16-19          │ 动作数据偏移                         │
│ 20-23          │ 动作数据大小                         │
│ 24-27          │ 帧数                                │
│ 28-31          │ 帧时间 (ms)                         │
│ 32-35          │ 资源使用标志 (位掩码)                │
│ 36-39          │ 关键帧数据偏移                       │
│ 40+            │ 动作帧数据 (每帧16字节)              │
└────────────────┴────────────────────────────────────┘

资源使用标志 (resource_usage) 位掩码

Bit资源
bit 01NECK_LED (颈部LED)
bit 12EYE_LED (眼睛LED)
bit 24HEAD_PAN (头部水平电机)
bit 38HEAD_TILT (头部俯仰电机)
bit 416BODY (身体电机)

电机ID

ID名称说明
0HEAD_TILT头部垂直倾斜
1HEAD_PAN头部水平旋转
2BODY机身旋转

预设动作列表

睡眠动作 (BA_S_*)

  • BA_S_01.smd - 睡眠待机 (循环)
  • BA_S_02.smd - 检测人体后醒来
  • BA_S_03.smd - 进入睡眠

姿态动作 (BA_P_*)

  • BA_P_01.smd - 倾听状态 (循环)
  • BA_P_02.smd - 空闲待机 (循环)
  • BA_P_03.smd - 呼吸动作 (循环)
  • BA_P_09.smd - 眨眼
  • BA_P_17.smd - 初始位置/归位

交互动作 (BA_O_*)

  • BA_O_03.smd - 抱歉/未听清
  • BA_O_05.smd - 告别
  • BA_O_06.smd - 触摸屏幕反应

导航动作 (BA_N_*)

  • BA_N_01.smd - 打招呼
  • BA_N_04.smd - 四处张望 (循环)

无聊动作 (BA_Bore_*)

  • BA_Bore_01.smd ~ BA_Bore_14.smd (随机播放)

注意事项

  1. 硬件连接: 确保正确连接UART串口
  2. 波特率: 115200, 8N1
  3. 动作文件: 需要从设备提取原始动作文件
  4. 播放流程: 大文件分批传输,由EVT8600事件驱动

许可证

仅供学习研究使用,请尊重Sony的知识产权。

See what people are saying

Contributors

lumingyu0423

3 commits

Languages

Python

100.0%