d-robotics 077f2eacf1 feat(skills): add taiyang servo dance skill
Add PWM-based servo control skill for RDK nodes with hardware servo support.

Changes:
- Add taiyang skill with SKILL.md and servo_dance.py script
- Update Dockerfile and Containerfile to include taiyang skill
- Update SOUL.md with skill constraints documentation

The skill controls two servos via /sys/class/pwm interface and must run on node side only.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-22 15:36:54 +08:00

79 lines
2.1 KiB
Python

#!/usr/bin/env python3
"""
太阳!- 双舵机舞动脚本
让舵机像太阳升起一样充满活力地挥动
"""
import time
import os
import sys
PWM0 = "/sys/class/pwm/pwmchip0/pwm0"
PWM1 = "/sys/class/pwm/pwmchip0/pwm1"
PERIOD = 20000000 # 20ms = 50Hz
def init_pwm():
"""初始化两个PWM通道"""
for pwm in [PWM0, PWM1]:
try:
with open(os.path.join(pwm, "period"), "w") as f:
f.write(str(PERIOD))
with open(os.path.join(pwm, "duty_cycle"), "w") as f:
f.write("1500000") # 中心位置 90°
with open(os.path.join(pwm, "enable"), "w") as f:
f.write("1")
except Exception as e:
print(f"Error initializing {pwm}: {e}")
sys.exit(1)
def set_angle(pwm, angle):
"""设置舵机角度 (0-180°)"""
duty = int(1000000 + (angle / 180.0) * 1000000)
with open(os.path.join(pwm, "duty_cycle"), "w") as f:
f.write(str(duty))
def wave_pattern():
"""波浪模式:两舵机反向运动"""
for a in range(0, 181, 30):
set_angle(PWM0, a)
set_angle(PWM1, 180 - a)
time.sleep(0.2)
for a in range(180, -1, -30):
set_angle(PWM0, a)
set_angle(PWM1, 180 - a)
time.sleep(0.2)
def sync_pattern():
"""同步模式:两舵机同步运动"""
for a in [0, 90, 180, 90]:
set_angle(PWM0, a)
set_angle(PWM1, a)
time.sleep(0.3)
def stop_pwm():
"""停止PWM输出"""
set_angle(PWM0, 90)
set_angle(PWM1, 90)
time.sleep(0.3)
for pwm in [PWM0, PWM1]:
with open(os.path.join(pwm, "enable"), "w") as f:
f.write("0")
def main():
print("🌞 太阳!- 舵机舞动开始")
print("=" * 40)
init_pwm()
try:
while True:
print("🌊 波浪模式...")
wave_pattern()
print("🎯 同步模式...")
sync_pattern()
except KeyboardInterrupt:
print("\n停止舞动...")
stop_pwm()
print("🌞 太阳落山了,再见!")
if __name__ == "__main__":
main()