跳转至

Dynamics ViewModel

controller.presentation.view_models.dynamics_view_model

动力学视图模型 - Presentation层 订阅 RobotStateDomainService,实现力矩补偿和示教记录

DynamicsViewModel

DynamicsViewModel(command_hub_service: CommandHubService, robot_state_service: RobotStateDomainService, dynamic_service: DynamicDomainService, teach_record_service: TeachRecordDomainService, record_repository: RecordRepository, parent: Optional[object] = None)

Bases: BaseViewModel

动力学视图模型。

订阅 RobotStateDomainService,实现力矩补偿和示教记录。

职责: 1. 处理示教模式切换 2. 订阅力矩补偿请求(数据驱动) 3. 计算并发送力矩补偿 4. 管理示教记录的录制、保存、播放

属性:

名称 类型 描述
recording_state_changed pyqtSignal

记录状态变化信号。

record_list_updated pyqtSignal

记录列表更新信号。

command_hub CommandHubService

命令中心服务。

robot_state RobotStateDomainService

机械臂状态服务。

dynamic_service DynamicDomainService

动力学服务。

teach_record_service TeachRecordDomainService

示教记录服务。

record_repository RecordRepository

记录仓储。

初始化动力学视图模型。

参数:

名称 类型 描述 默认
command_hub_service CommandHubService

命令中心服务。

必需
robot_state_service RobotStateDomainService

机械臂状态服务。

必需
dynamic_service DynamicDomainService

动力学服务。

必需
teach_record_service TeachRecordDomainService

示教记录服务。

必需
record_repository RecordRepository

记录仓储。

必需
parent Optional[object]

父对象。

None
源代码位于: src/controller/controller/presentation/view_models/dynamics_view_model.py
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
def __init__(
    self,
    command_hub_service: CommandHubService,
    robot_state_service: RobotStateDomainService,
    dynamic_service: DynamicDomainService,
    teach_record_service: TeachRecordDomainService,
    record_repository: RecordRepository,
    parent: Optional[object] = None):
    """初始化动力学视图模型。

    Args:
        command_hub_service: 命令中心服务。
        robot_state_service: 机械臂状态服务。
        dynamic_service: 动力学服务。
        teach_record_service: 示教记录服务。
        record_repository: 记录仓储。
        parent: 父对象。
    """
    super().__init__(parent)
    self.command_hub = command_hub_service
    self.robot_state = robot_state_service
    self.dynamic_service = dynamic_service
    self.teach_record_service = teach_record_service
    self.record_repository = record_repository

    # 订阅力矩补偿请求信号(数据驱动,不是定时器)
    self.robot_state.torque_compensation_requested.connect(
        self._on_torque_compensation_requested
    )

    # 订阅记录服务的信号
    self.teach_record_service.recording_state_changed.connect(
        self.recording_state_changed.emit
    )
    self.teach_record_service.record_added.connect(
        self._on_record_added
    )
    self.teach_record_service.record_deleted.connect(
        self._on_record_deleted
    )

    # 连接记录定时器到状态更新
    record_timer = self.teach_record_service.get_record_timer()
    record_timer.timeout.connect(self._on_record_timer_timeout)

    # 加载已存在的记录
    self._load_records_from_file()

toggle_teaching_mode

toggle_teaching_mode(command_dict: dict)

切换示教模式。

参数:

名称 类型 描述 默认
command_dict dict

命令字典,包含 control 和 mode。

必需
源代码位于: src/controller/controller/presentation/view_models/dynamics_view_model.py
86
87
88
89
90
91
92
93
94
95
96
97
def toggle_teaching_mode(self, command_dict: dict):
    """切换示教模式。

    Args:
        command_dict (dict): 命令字典,包含 control 和 mode。
    """
    # 1. 发送串口命令
    self.command_hub.command_distribution(command_dict)

    # 2. 更新状态服务的示教模式标志
    is_enable = (command_dict['control'] == 0x07)
    self.robot_state.set_teaching_mode(is_enable)

send_torque

send_torque(torque_values: list)

发送力矩控制命令。

参数:

名称 类型 描述 默认
torque_values list

力矩值列表(6个关节)。

必需
源代码位于: src/controller/controller/presentation/view_models/dynamics_view_model.py
 99
100
101
102
103
104
105
106
107
108
109
110
def send_torque(self, torque_values: list):
    """发送力矩控制命令。

    Args:
        torque_values (list): 力矩值列表(6个关节)。
    """
    command_dict = {
        'control': 0x06,  # 力矩控制
        'mode': 0x0A,     # 周期力矩模式
        'torque': torque_values
    }
    self.command_hub.command_distribution(command_dict)

toggle_recording

toggle_recording()

切换记录状态(开始/停止)。

源代码位于: src/controller/controller/presentation/view_models/dynamics_view_model.py
142
143
144
145
146
147
148
149
150
151
152
def toggle_recording(self):
    """切换记录状态(开始/停止)。"""
    if self.teach_record_service.is_recording():
        # 停止记录
        record_name = self.teach_record_service.stop_recording()
        if record_name:
            # 保存到文件
            self._save_records_to_file()
    else:
        # 开始记录
        self.teach_record_service.start_recording()

delete_record

delete_record(record_name: str) -> bool

删除指定记录。

参数:

名称 类型 描述 默认
record_name str

记录名称。

必需

返回:

名称 类型 描述
bool bool

是否删除成功。

源代码位于: src/controller/controller/presentation/view_models/dynamics_view_model.py
154
155
156
157
158
159
160
161
162
163
164
165
166
def delete_record(self, record_name: str) -> bool:
    """删除指定记录。

    Args:
        record_name (str): 记录名称。

    Returns:
        bool: 是否删除成功。
    """
    success = self.teach_record_service.delete_record(record_name)
    if success:
        self._save_records_to_file()
    return success

run_record

run_record(record_name: str)

运行指定记录(播放示教轨迹)。

流程: 1. 获取示教记录的角度列表 2. 委托给 CommandHubService 处理

参数:

名称 类型 描述 默认
record_name str

记录名称。

必需
源代码位于: src/controller/controller/presentation/view_models/dynamics_view_model.py
168
169
170
171
172
173
174
175
176
177
178
179
180
def run_record(self, record_name: str):
    """运行指定记录(播放示教轨迹)。

    流程:
    1. 获取示教记录的角度列表
    2. 委托给 CommandHubService 处理

    Args:
        record_name (str): 记录名称。
    """
    angles_list = self.teach_record_service.get_record(record_name)
    if angles_list:
        self.command_hub.run_teach_record(angles_list)

reverse_record

reverse_record(record_name: str) -> Optional[str]

反转指定记录。

参数:

名称 类型 描述 默认
record_name str

记录名称。

必需

返回:

类型 描述
Optional[str]

Optional[str]: 新记录名称,失败返回 None。

源代码位于: src/controller/controller/presentation/view_models/dynamics_view_model.py
182
183
184
185
186
187
188
189
190
191
192
193
194
def reverse_record(self, record_name: str) -> Optional[str]:
    """反转指定记录。

    Args:
        record_name (str): 记录名称。

    Returns:
        Optional[str]: 新记录名称,失败返回 None。
    """
    new_name = self.teach_record_service.reverse_record(record_name)
    if new_name:
        self._save_records_to_file()
    return new_name

get_record_names

get_record_names() -> List[str]

获取所有记录名称。

返回:

类型 描述
List[str]

List[str]: 记录名称列表。

源代码位于: src/controller/controller/presentation/view_models/dynamics_view_model.py
196
197
198
199
200
201
202
def get_record_names(self) -> List[str]:
    """获取所有记录名称。

    Returns:
        List[str]: 记录名称列表。
    """
    return self.teach_record_service.get_record_names()

is_recording

is_recording() -> bool

查询是否正在记录。

返回:

名称 类型 描述
bool bool

是否正在记录。

源代码位于: src/controller/controller/presentation/view_models/dynamics_view_model.py
204
205
206
207
208
209
210
def is_recording(self) -> bool:
    """查询是否正在记录。

    Returns:
        bool: 是否正在记录。
    """
    return self.teach_record_service.is_recording()