配置键盘/鼠标控制#
IR-SIM 支持读取键盘与鼠标输入,以手动控制机器人。
键盘控制配置参数#
在键盘控制模式下,机器人的行为由用户操作,YAML 中的行为设置会被忽略。IR-SIM 默认使用 pynput 全局键盘钩子;若 pynput 不可用,则自动回退到 Matplotlib 图窗键盘事件后端。可通过以下命令安装 pynput:
pip install pynput
要启用键盘控制,只需在 world 部分将 control_mode 设为 keyboard。示例如下:
import irsim
env = irsim.make()
for i in range(1000):
env.step()
env.render(0.05)
if env.done():
break
env.end()
world:
height: 50
width: 50
control_mode: 'keyboard'
obstacle_map: 'cave.png'
mdownsample: 2
robot:
- kinematics: {name: 'acker'}
shape: {name: 'rectangle', length: 4.6, width: 1.6, wheelbase: 3}
state: [5, 5, 0, 0]
goal: [40, 40, 0]
vel_max: [4, 1]
plot:
show_trail: True
traj_color: 'g'
show_trajectory: True
show_goal: False
sensors:
- name: 'lidar2d'
range_min: 0
range_max: 20
angle_range: 3.14
number: 100
alpha: 0.4
键盘控制按键映射#
按键 |
功能 |
|---|---|
|
前进 |
|
后退 |
|
左转 (diff/acker) / 左平移 (omni/omni_angular) |
|
右转 (diff/acker) / 右平移 (omni/omni_angular) |
|
左旋转 (omni_angular) |
|
右旋转 (omni_angular) |
|
降低最大角速度 |
|
提升最大角速度 |
|
降低最大线速度 |
|
提升最大线速度 |
|
切换当前控制的机器人 ID |
|
重置环境 |
|
暂停/继续仿真 |
|
退出环境(设置 quit 标志) |
|
切换键盘/自动控制 |
|
重新加载环境 |
|
调试环境(Mac 请按 fn+F5) |
|
保存当前图像 |
环境状态控制#
空格键可依据当前状态在“Pause”和“Running”之间切换。如果环境尚未进入 Running,首次按下可能会将其置为 Running。
可通过 env.status 属性查看环境当前状态:
import irsim
env = irsim.make()
for i in range(1000):
env.step()
env.render(0.05)
# Check current status
print(f"Environment status: {env.status}")
if env.done():
break
env.end()
选择键盘后端(pynput vs Matplotlib)#
默认后端:
pynput(全局键盘钩子,Matplotlib 窗口聚焦时生效)。若未安装,IR-SIM 会自动回退到mpl。备选后端:
mpl(Matplotlib 图窗键盘事件),只要图窗获得焦点即可,无需额外依赖。
可在 YAML 根节点添加 keyboard 段落,以配置后端与关键参数:
world:
control_mode: 'keyboard'
gui:
keyboard:
backend: 'pynput' # 'pynput' (default) or 'mpl'
global_hook: true # capture keys globally (may require OS permissions)
key_id: 0 # initial robot control id
# key_lv_max: 3.0 # maximum linear velocity
# key_ang_max: 1.0 # maximum angular velocity
# key_lv: 0.0 # initial linear velocity
# key_ang: 0.0 # initial angular velocity
鼠标控制#
IR-SIM 支持通过鼠标缩放环境并跟踪鼠标位置,默认开启。你可以例如用鼠标左键设置机器人的目标点。
import irsim
env = irsim.make()
for i in range(10000):
env.step()
env.render(0.05, show_goal=False)
if env.mouse_left_pos is not None:
env.robot.set_goal(env.mouse_left_pos)
if env.done():
break
env.end()
world:
height: 50
width: 50
step_time: 0.1
sample_time: 0.1
offset: [0, 0]
collision_mode: 'stop'
control_mode: 'auto'
plot:
saved_figure:
bbox_inches: null
robot:
- kinematics: {name: 'diff'}
shape: {name: 'circle', radius: 1}
state: [5, 5, 0]
vel_max: [4, 1]
behavior: {name: 'dash'}
plot:
show_trajectory: True
traj_color: 'g'
show_goals: True
sensors:
- name: 'lidar2d'
range_min: 0
range_max: 20
angle_range: 3.14
number: 100
noise: False
std: 1
angle_std: 0.2
offset: [0, 0, 0]
alpha: 0.4
obstacle:
- number: 10
distribution: {name: 'manual'}
shape:
- {name: 'polygon', random_shape: true, center_range: [5, 10, 40, 30], avg_radius_range: [0.5, 2]}
鼠标控制映射#
鼠标操作 |
功能 |
|---|---|
移动鼠标 |
跟踪鼠标位置并更新显示坐标 |
鼠标中键 |
重置缩放至默认视图 |
滚轮上滑 |
以鼠标位置为中心放大 |
滚轮下滑 |
以鼠标位置为中心缩小 |
鼠标位置属性#
属性 |
类型 |
说明 |
|---|---|---|
|
|
左键点击位置 (x, y) |
|
|
右键点击位置 (x, y) |
|
|
当前鼠标位置 (x, y) |