第十五讲、Isaaclab中在机器人上添加传感器
0 前言
官方教程:https://isaac-sim.github.io/IsaacLab/main/source/tutorials/04_sensors/add_sensors_on_robot.html
Isaacsim+Isaaclab安装:https://blog.csdn.net/m0_47719040/article/details/146389391?spm=1001.2014.3001.5502
传感器有助于智能体感受不同的环境信息,包括本体感受及外部感受。例如,可以使用摄像头传感器获取环境的视觉信息、可以使用接触传感器获取机器人与环境的接触信息。
在本教程中,我们将学习如何为机器人添加不同的传感器。本教程将使用 ANYmal-C
机器人,该机器人是一个四足机器人,拥有12个自由度(四条腿每条腿3个自由度)。该机器人配备以下传感器:
- 机器人头部的摄像头传感器可以提供RGB-D图像
- 提供地形高度信息的高度扫描仪传感器
- 机器人脚上的接触传感器提供接触信息
教程对应的脚本为add_sensors_on_robot.py
在scripts/tutorials/04_sensors
目录下。
运行该程序:
- 进入安装 isaac lab 时创建的conda虚拟环境
- 在该环境下进入 isaac sim文件夹中运行
source setup_conda_env.sh
- 终端中输入
./isaaclab.sh -p scripts/tutorials/04_sensors/add_sensors_on_robot.py --num_envs 2 --enable_cameras
运行你的代码。
与之前的教程类似,我们将资源和传感器添加到场景中。所有传感器都继承自
sensors.SensorBase
类,并通过各自的配置类进行配置。每个传感器实例都可以定义自己的更新周期,即传感器更新的频率。更新周期以秒为单位,通过sensors.SensorBaseCfg.update_period
属性指定。
1 场景配置
将地面、灯光、机器人及传感器添加到场景中,该处使用 第七讲、在Isaaclab中使用交互式场景 中的方法创建场景。
# 使用配置类装饰器定义场景配置
@configclass
class SensorsSceneCfg(InteractiveSceneCfg):"""配置带传感器的机器人场景"""# 地面配置(继承自基础资产配置)ground = AssetBaseCfg(prim_path="/World/defaultGroundPlane", # USD场景中的prim路径spawn=sim_utils.GroundPlaneCfg() # 使用预定义的地面平面配置)# 环境光源配置dome_light = AssetBaseCfg(prim_path="/World/Light", # 光源prim路径spawn=sim_utils.DomeLightCfg(intensity=3000.0, # 光照强度(流明)color=(0.75, 0.75, 0.75) # RGB颜色值(归一化)))# 机器人配置(使用ANYMAL-C的预设配置)robot: ArticulationCfg = ANYMAL_C_CFG.replace( # 继承并修改基础配置prim_path="{ENV_REGEX_NS}/Robot" # 使用正则表达式命名空间动态生成路径)# ---------- 传感器配置部分 ----------# 前视RGB-D相机配置camera = CameraCfg(prim_path="{ENV_REGEX_NS}/Robot/base/front_cam", # 相机安装位置update_period=0.1, # 更新周期0.1秒(10Hz)height=480, width=640, # 图像分辨率640x480data_types=["rgb", "distance_to_image_plane"], # 采集RGB和深度数据spawn=sim_utils.PinholeCameraCfg( # 针孔相机模型参数focal_length=24.0, # 焦距(毫米)focus_distance=400.0, # 对焦距离(单位米)horizontal_aperture=20.955,# 水平孔径(毫米)clipping_range=(0.1, 1.0e5)# 可视范围(0.1m~100km)),offset=CameraCfg.OffsetCfg( # 安装位姿偏移pos=(0.510, 0.0, 0.015), # 位置偏移(X,Y,Z)米rot=(0.5, -0.5, 0.5, -0.5), # 四元数旋转(ROS坐标系约定)convention="ros" # 使用ROS坐标系规范))# 地形高度扫描仪配置(基于射线投射)height_scanner = RayCasterCfg(prim_path="{ENV_REGEX_NS}/Robot/base", # 安装基座位置update_period=0.02, # 50Hz高速更新offset=RayCasterCfg.OffsetCfg(pos=(0.0, 0.0, 20.0) # 扫描仪安装高度20米),attach_yaw_only=True, # 仅跟随机器人偏航角旋转,无需考虑机器人的横滚和俯仰pattern_cfg=patterns.GridPatternCfg( # 扫描模式配置resolution=0.1, # 0.1米点间距size=[1.6, 1.0] # 扫描范围1.6m X 1.0m),debug_vis=True, # 启用调试可视化mesh_prim_paths=["/World/defaultGroundPlane"] # 扫描目标地面)# 足端接触力传感器配置contact_forces = ContactSensorCfg(prim_path="{ENV_REGEX_NS}/Robot/.*_FOOT", # 正则匹配所有足部关节update_period=0.0, # 每物理步都更新(200Hz)history_length=6, # 保留最近6次接触数据debug_vis=True # 显示接触力矢量)
2 相机传感器
相机传感器可以通过sensors.CameraCfg
进行配置。官方文档:https://isaac-sim.github.io/IsaacLab/main/source/api/lab/isaaclab.sensors.html#isaaclab.sensors.CameraCfg
摄像机传感器的配置包括以下参数:
- spawn:要创建的 USD 相机类型。可以是
PinholeCameraCfg
或FisheyeCameraCfg
。 - offset:相机传感器与父级图元的偏移量。
- data_types:要捕获的数据类型。可以是rgb、distance_to_image_plane、normals或 USD 相机传感器支持的其他类型。
为了将 RGB-D 摄像头传感器安装到机器人头部,我们需要指定相对于机器人基座的偏移量(CameraCfg.OffsetCfg
)。
# 前视RGB-D相机配置camera = CameraCfg(prim_path="{ENV_REGEX_NS}/Robot/base/front_cam", # 相机安装位置update_period=0.1, # 更新周期0.1秒(10Hz),这意味着相机传感器以 10Hz 的频率更新height=480, width=640, # 图像分辨率640x480data_types=["rgb", "distance_to_image_plane"], # 采集RGB和深度数据spawn=sim_utils.PinholeCameraCfg( # 针孔相机模型参数focal_length=24.0, # 焦距(毫米)focus_distance=400.0, # 对焦距离(单位米)horizontal_aperture=20.955,# 水平孔径(毫米)clipping_range=(0.1, 1.0e5)# 可视范围(0.1m~100km)),offset=CameraCfg.OffsetCfg( # 安装位姿偏移pos=(0.510, 0.0, 0.015), # 位置偏移(X,Y,Z)米rot=(0.5, -0.5, 0.5, -0.5), # 四元数旋转(ROS坐标系约定)convention="ros" # 使用ROS坐标系规范))
3 高度扫描仪传感器
高度扫描仪传感器使用NVIDIA Warp
光线投射内核实现虚拟传感器。通过sensors.RayCasterCfg
可以指定透射光线模式等。官方文档:https://isaac-sim.github.io/IsaacLab/main/source/api/lab/isaaclab.sensors.html#isaaclab.sensors.RayCasterCfg
在本教程中,基于射线投射的高度扫描仪安装在机器人的基座框架上。射线的图案使用pattern属性指定。对于均匀的网格图案,我们使用 指定图案网格(GridPatternCfg)。
debug_vis
参数是控制是否可以可视化射线击中网格的点。
# 地形高度扫描仪配置(基于射线投射)height_scanner = RayCasterCfg(prim_path="{ENV_REGEX_NS}/Robot/base", # 安装基座位置update_period=0.02, # 50Hz高速更新offset=RayCasterCfg.OffsetCfg(pos=(0.0, 0.0, 20.0) # 扫描仪安装高度20米),attach_yaw_only=True, # 仅跟随机器人偏航角旋转,无需考虑机器人的横滚和俯仰pattern_cfg=patterns.GridPatternCfg( # 扫描模式配置resolution=0.1, # 0.1米点间距size=[1.6, 1.0] # 扫描范围1.6m X 1.0m),debug_vis=True, # 启用调试可视化mesh_prim_paths=["/World/defaultGroundPlane"] # 扫描目标地面)
debug_vis
参数改为False,可以看到网格状消失。
4 接触式传感器
通过sensors.ContactSensorCfg
,我们可以指定想要获取接触信息的prim。官方文档:https://isaac-sim.github.io/IsaacLab/main/source/api/lab/isaaclab.sensors.html#isaaclab.sensors.ContactSensorCfg
在本教程中,我们将接触式传感器连接到机器人的脚上。机器人的脚分别命名为"LF_FOOT"、"RF_FOOT"、"LH_FOOT"
和"RH_FOOT"
。我们传递一个正则表达式".*_FOOT"来简化prim路径的指定。
# 足端接触力传感器配置contact_forces = ContactSensorCfg(prim_path="{ENV_REGEX_NS}/Robot/.*_FOOT", # 正则匹配所有足部关节update_period=0.0, # 每物理步都更新(200Hz)history_length=6, # 保留最近6次接触数据debug_vis=True # 显示接触力矢量)
5 运行模拟循环
该部分基本与之前的代码是一致的,具体详解可以参考
第六讲、Isaaclab中与可变物体交互