feat: add presets manager
This commit is contained in:
parent
a3958b79ec
commit
ea1dfc4e0e
@ -21,6 +21,11 @@ type Device interface {
|
|||||||
// --- 新增 ---
|
// --- 新增 ---
|
||||||
PoseExecutor // 嵌入 PoseExecutor 接口,Device 需实现它
|
PoseExecutor // 嵌入 PoseExecutor 接口,Device 需实现它
|
||||||
GetAnimationEngine() *AnimationEngine // 获取设备的动画引擎
|
GetAnimationEngine() *AnimationEngine // 获取设备的动画引擎
|
||||||
|
|
||||||
|
// --- 预设姿势相关方法 ---
|
||||||
|
GetSupportedPresets() []string // 获取支持的预设姿势列表
|
||||||
|
ExecutePreset(presetName string) error // 执行预设姿势
|
||||||
|
GetPresetDescription(presetName string) string // 获取预设姿势描述
|
||||||
}
|
}
|
||||||
|
|
||||||
// Command 代表一个发送给设备的指令
|
// Command 代表一个发送给设备的指令
|
||||||
|
@ -24,6 +24,7 @@ type L10Hand struct {
|
|||||||
mutex sync.RWMutex
|
mutex sync.RWMutex
|
||||||
canInterface string // CAN 接口名称,如 "can0"
|
canInterface string // CAN 接口名称,如 "can0"
|
||||||
animationEngine *device.AnimationEngine // 动画引擎
|
animationEngine *device.AnimationEngine // 动画引擎
|
||||||
|
presetManager *device.PresetManager // 预设姿势管理器
|
||||||
}
|
}
|
||||||
|
|
||||||
// 在 base 基础上进行 ±delta 的扰动,范围限制在 [0, 255]
|
// 在 base 基础上进行 ±delta 的扰动,范围限制在 [0, 255]
|
||||||
@ -91,6 +92,14 @@ func NewL10Hand(config map[string]any) (device.Device, error) {
|
|||||||
hand.animationEngine.Register(NewL10WaveAnimation())
|
hand.animationEngine.Register(NewL10WaveAnimation())
|
||||||
hand.animationEngine.Register(NewL10SwayAnimation())
|
hand.animationEngine.Register(NewL10SwayAnimation())
|
||||||
|
|
||||||
|
// 初始化预设姿势管理器
|
||||||
|
hand.presetManager = device.NewPresetManager()
|
||||||
|
|
||||||
|
// 注册 L10 的预设姿势
|
||||||
|
for _, preset := range GetL10Presets() {
|
||||||
|
hand.presetManager.RegisterPreset(preset)
|
||||||
|
}
|
||||||
|
|
||||||
// 初始化组件
|
// 初始化组件
|
||||||
if err := hand.initializeComponents(config); err != nil {
|
if err := hand.initializeComponents(config); err != nil {
|
||||||
return nil, fmt.Errorf("初始化组件失败:%w", err)
|
return nil, fmt.Errorf("初始化组件失败:%w", err)
|
||||||
@ -333,3 +342,39 @@ func (h *L10Hand) Disconnect() error {
|
|||||||
log.Printf("🔌 设备 %s 已断开", h.id)
|
log.Printf("🔌 设备 %s 已断开", h.id)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --- 预设姿势相关方法 ---
|
||||||
|
|
||||||
|
// GetSupportedPresets 获取支持的预设姿势列表
|
||||||
|
func (h *L10Hand) GetSupportedPresets() []string { return h.presetManager.GetSupportedPresets() }
|
||||||
|
|
||||||
|
// ExecutePreset 执行预设姿势
|
||||||
|
func (h *L10Hand) ExecutePreset(presetName string) error {
|
||||||
|
preset, exists := h.presetManager.GetPreset(presetName)
|
||||||
|
if !exists {
|
||||||
|
return fmt.Errorf("预设姿势 '%s' 不存在", presetName)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("🎯 设备 %s (%s) 执行预设姿势: %s", h.id, h.GetHandType().String(), presetName)
|
||||||
|
|
||||||
|
// 执行手指姿态
|
||||||
|
if err := h.SetFingerPose(preset.FingerPose); err != nil {
|
||||||
|
return fmt.Errorf("执行预设姿势 '%s' 的手指姿态失败: %w", presetName, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果有手掌姿态数据,也执行
|
||||||
|
if len(preset.PalmPose) > 0 {
|
||||||
|
time.Sleep(20 * time.Millisecond) // 短暂延时
|
||||||
|
if err := h.SetPalmPose(preset.PalmPose); err != nil {
|
||||||
|
return fmt.Errorf("执行预设姿势 '%s' 的手掌姿态失败: %w", presetName, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("✅ 设备 %s 预设姿势 '%s' 执行完成", h.id, presetName)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPresetDescription 获取预设姿势描述
|
||||||
|
func (h *L10Hand) GetPresetDescription(presetName string) string {
|
||||||
|
return h.presetManager.GetPresetDescription(presetName)
|
||||||
|
}
|
||||||
|
82
device/models/l10_presets.go
Normal file
82
device/models/l10_presets.go
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
package models
|
||||||
|
|
||||||
|
import "hands/device"
|
||||||
|
|
||||||
|
// GetL10Presets 获取 L10 设备的所有预设姿势
|
||||||
|
func GetL10Presets() []device.PresetPose {
|
||||||
|
return []device.PresetPose{
|
||||||
|
// 基础姿势
|
||||||
|
{
|
||||||
|
Name: "fist",
|
||||||
|
Description: "握拳姿势",
|
||||||
|
FingerPose: []byte{64, 64, 64, 64, 64, 64},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "open",
|
||||||
|
Description: "完全张开姿势",
|
||||||
|
FingerPose: []byte{192, 192, 192, 192, 192, 192},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "pinch",
|
||||||
|
Description: "捏取姿势",
|
||||||
|
FingerPose: []byte{120, 120, 64, 64, 64, 64},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "thumbsup",
|
||||||
|
Description: "竖起大拇指姿势",
|
||||||
|
FingerPose: []byte{64, 192, 192, 192, 192, 64},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "point",
|
||||||
|
Description: "食指指点姿势",
|
||||||
|
FingerPose: []byte{192, 64, 192, 192, 192, 64},
|
||||||
|
},
|
||||||
|
|
||||||
|
// 数字手势
|
||||||
|
{
|
||||||
|
Name: "1",
|
||||||
|
Description: "数字 1 手势",
|
||||||
|
FingerPose: []byte{192, 64, 192, 192, 192, 64},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "2",
|
||||||
|
Description: "数字 2 手势",
|
||||||
|
FingerPose: []byte{192, 64, 64, 192, 192, 64},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "3",
|
||||||
|
Description: "数字 3 手势",
|
||||||
|
FingerPose: []byte{192, 64, 64, 64, 192, 64},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "4",
|
||||||
|
Description: "数字 4 手势",
|
||||||
|
FingerPose: []byte{192, 64, 64, 64, 64, 64},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "5",
|
||||||
|
Description: "数字 5 手势",
|
||||||
|
FingerPose: []byte{192, 192, 192, 192, 192, 192},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "6",
|
||||||
|
Description: "数字 6 手势",
|
||||||
|
FingerPose: []byte{64, 192, 192, 192, 192, 64},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "7",
|
||||||
|
Description: "数字 7 手势",
|
||||||
|
FingerPose: []byte{64, 64, 192, 192, 192, 64},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "8",
|
||||||
|
Description: "数字 8 手势",
|
||||||
|
FingerPose: []byte{64, 64, 64, 192, 192, 64},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "9",
|
||||||
|
Description: "数字 9 手势",
|
||||||
|
FingerPose: []byte{64, 64, 64, 64, 192, 64},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
45
device/preset.go
Normal file
45
device/preset.go
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
package device
|
||||||
|
|
||||||
|
// PresetPose 定义预设姿势的结构
|
||||||
|
type PresetPose struct {
|
||||||
|
Name string // 姿势名称
|
||||||
|
Description string // 姿势描述
|
||||||
|
FingerPose []byte // 手指姿态数据
|
||||||
|
PalmPose []byte // 手掌姿态数据(可选)
|
||||||
|
}
|
||||||
|
|
||||||
|
// PresetManager 预设姿势管理器
|
||||||
|
type PresetManager struct{ presets map[string]PresetPose }
|
||||||
|
|
||||||
|
// NewPresetManager 创建新的预设姿势管理器
|
||||||
|
func NewPresetManager() *PresetManager {
|
||||||
|
return &PresetManager{
|
||||||
|
presets: make(map[string]PresetPose),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterPreset 注册一个预设姿势
|
||||||
|
func (pm *PresetManager) RegisterPreset(preset PresetPose) { pm.presets[preset.Name] = preset }
|
||||||
|
|
||||||
|
// GetPreset 获取指定名称的预设姿势
|
||||||
|
func (pm *PresetManager) GetPreset(name string) (PresetPose, bool) {
|
||||||
|
preset, exists := pm.presets[name]
|
||||||
|
return preset, exists
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSupportedPresets 获取所有支持的预设姿势名称列表
|
||||||
|
func (pm *PresetManager) GetSupportedPresets() []string {
|
||||||
|
presets := make([]string, 0, len(pm.presets))
|
||||||
|
for name := range pm.presets {
|
||||||
|
presets = append(presets, name)
|
||||||
|
}
|
||||||
|
return presets
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPresetDescription 获取预设姿势的描述
|
||||||
|
func (pm *PresetManager) GetPresetDescription(name string) string {
|
||||||
|
if preset, exists := pm.presets[name]; exists {
|
||||||
|
return preset.Description
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user