环境要求
- Python 3.12
- FastSim
0.1.0a6 - UniRoboSim Core
0.10.0 - UniRoboSim Isaac Lab adapter
0.10.1 - Isaac Lab 3.0 / Isaac Sim 6.0,以及可用显示环境
Run 中明确配置了 launch_profile: visible。
配置
run.yaml 在 Isaac Lab 中创建共享的双关节机械臂。物理和控制频率都是 60 Hz。
joint_1、joint_2 的初始值均为 0,与 linear_path() 生成的第一行一致。
关键代码逐行说明
operation = await simulation.control.submit_joints( # 非阻塞提交。
actor="arm", # Scenario 中的机器人别名。
group="arm", # 公共执行器资源组。
path=linear_path(240), # 60 Hz 下共四秒。
dt=1.0 / 60.0, # 相邻 path 行的时间。
timeout=10.0, # 控制接纳超时。
)
submit_joints() 立即返回 operation handle。240 帧明显长于本例准备执行的 24 帧,因此取消
发生时 chunk 不可能已经正常完成。
status = await operation.status() # 读取可移植进度。
if status.progress.applied_frames >= 24: # 到达指定边界即停止步进。
break
await simulation.single_step() # 精确推进一个物理步。
应用保持 paused,因此每一次推进都来自显式 single_step()。代码不使用 wall-clock sleep
猜测仿真已经执行了多少帧。
cancellation_accepted = await operation.cancel(timeout=5.0)
result = await operation.result(timeout=5.0) # 等待取消终态。
await operation.release() # 释放已结束记录。
cancel() 请求控制权威在控制边界上线性化取消操作。随后 result.status 必须为
cancelled,且 applied_frames 必须小于 planned_frames。
运行
从本案例目录运行:
cd demo/fundamentals/14_cancel_control_operation
fastsim config validate run.yaml --json
python main.py
预期最后输出:
Cancellation accepted: True
Status: cancelled
Frames before cancel: 24
Applied/planned frames: 24/240
取消 operation 不等于关闭 application。result() 之后仍可查询场景、提交新命令、reset
或正常 stop。
验证等级
真实 visible Isaac 已通过。 已使用 Python 3.12、Core 0.10.0、Isaac adapter 0.10.1、
Isaac Lab 3.0 和 Isaac Sim 6.0 运行;原生终态精确为 cancelled,执行帧为 24/240。
Python 语法与 Run 编译也已通过。
常见错误
- 等
result()正常完成后才调用cancel():此时 operation 已是终态,没有活动命令可取消。 - 用 wall-clock
sleep()代替status().progress:物理速度不一定等于墙钟时间。 - 忘记
release():完成记录会一直由 application 持有,直到主动释放或关闭。