Isaac Lab tutorials 之添加传感器

机器人传感器在仿真和强化学习中发挥着至关重要的作用。它们不仅为机器人提供了必要的感知能力,还支持了复杂任务的执行和高效学习过程的实现。机器人传感器在仿真与强化学习中至关重要,作为感知外界环境的窗口,它不仅为机器人提供实时数据支持复杂决策与操作,还在仿真环境中模拟真实反馈以优化算法,促进机器人在未知环境中实现高效学习与灵活应对。

那么基于学习的机器人实验场Isaac Lab,如何在里面添加传感器,就是非常重要的事情,且在Isaac Lab里传感器是基于GPU仿真的,获取的数据都是cuda tensor,可以直接用来高效并行训练。

接下来将以ANYmal-C机器人添加传感器为实验:

探索机器人感官世界:为ANYmal-C机器人装备多样传感器

在这个充满科技与想象的博客里,我们将踏上一场奇妙的旅程,一同探索如何为我们的机器人朋友——ANYmal-C,这位拥有12个自由度、四条强健机械腿的“四足勇士”,添上智慧的双眼与敏感的触觉。想象一下,当科技与自然界的灵动结合,会碰撞出怎样令人惊叹的火花?

ANYmal-C:四足机器人的佼佼者

首先,让我们简要回顾一下ANYmal-C这位主角。它不仅仅是一个冰冷的金属框架,而是集先进机械设计与智能算法于一身的杰作。12个自由度赋予了它惊人的灵活性和稳定性,无论是崎岖的山路还是复杂的地形,ANYmal-C都能如履平地,展现出令人叹为观止的适应能力。

视觉的延伸:相机传感器的加入

为了让ANYmal-C能够“看见”周围的世界,我们首先要为它装上相机传感器。这就像是给机器人安上了一双明亮的眼睛,让它能够捕捉环境的视觉信息,无论是识别障碍物、追踪目标还是进行路径规划,都离不开这双“慧眼”。通过高精度的图像处理技术,ANYmal-C能够实时分析周围环境,为自主导航和决策提供宝贵的数据支持。

触觉的细腻:接触传感器的融入

除了视觉,触觉也是机器人感知世界的重要方式。为ANYmal-C装备接触传感器,就像是赋予了它感知触碰和压力的能力。这些传感器分布在机器人的关键部位,如脚底和手臂末端,能够实时监测机器人与环境的接触情况。无论是轻轻触碰地面还是承受重物压力,接触传感器都能准确反馈,帮助ANYmal-C调整姿态、保持平衡,甚至实现精细的操作任务。

传感器的融合:开启智能新篇章

当相机传感器与接触传感器等多元感知设备协同工作时,ANYmal-C的智能化水平将迈上一个新的台阶。这些传感器数据的融合处理,将使得机器人能够更全面地理解周围环境,做出更加精准和智能的决策。无论是探索未知领域、执行救援任务还是参与科研实验,ANYmal-C都将以其卓越的感知能力和智能表现,成为我们不可或缺的伙伴。

在这个充满挑战与机遇的时代,为机器人装备多样传感器,不仅是对技术边界的探索,更是对未来智能生活的一种美好憧憬。让我们携手并进,共同见证机器人世界的无限可能!

Adding sensors on a robot — Isaac Lab documentation (isaac-sim.github.io)icon-default.png?t=N7T8https://isaac-sim.github.io/IsaacLab/source/tutorials/04_sensors/add_sensors_on_robot.html

  • A camera sensor on the head of the robot which provides RGB-D images
    机器人头部的摄像头传感器,提供RGB-D图像;

  • A height scanner sensor that provides terrain height information
    提供地形高度信息的高度扫描仪传感器;

  • Contact sensors on the feet of the robot that provide contact information
    机器人脚上的接触传感器,提供接触信息;

该教程对应于 source/standalone/tutorials/04_sensors 目录中的 add_sensors_on_robot.py 脚本。

运行效果,可以看到添加的三个传感器数据以及传感器可视化数据: 

 Camera sensor

首先看如何添加摄像头传感器,以及支持的配置;

camera = CameraCfg(
    prim_path="{ENV_REGEX_NS}/Robot/base/front_cam",
    update_period=0.1,
    height=480,
    width=640,
    data_types=["rgb", "distance_to_image_plane"],
    spawn=sim_utils.PinholeCameraCfg(
        focal_length=24.0, focus_distance=400.0, horizontal_aperture=20.955, clipping_range=(0.1, 1.0e5)
    ),
    offset=CameraCfg.OffsetCfg(pos=(0.510, 0.0, 0.015), rot=(0.5, -0.5, 0.5, -0.5), convention="ros"),
)

prim_path为添加的摄像头prim路径地址;

update_period为摄像头帧率;

height 和 width 为图像分辨率;

data_types配置摄像头传感器数据类型,可以是 rgbdistance_to_image_plane(深度depth)normals 或USD Camera传感器支持的其他数据类型;

spawn为摄像头类型配置,支持USD摄像头配置,可以是PinholeCameraCfg或者FisheyeCameraCfg

offset为相机传感器与父prim的偏移;

具体摄像头类型详细如内参的配置等等,模拟真实的摄像头: 

omni.isaac.lab.sim.spawners — Isaac Lab documentation (isaac-sim.github.io)icon-default.png?t=N7T8https://isaac-sim.github.io/IsaacLab/source/api/lab/omni.isaac.lab.sim.spawners.html#omni.isaac.lab.sim.spawners.sensors.PinholeCameraCfg Pinhole摄像头(针孔摄像头)与Fisheye摄像头(鱼眼摄像头)的主要参数区别在于视场角、畸变程度、成像模型及应用场景。Pinhole摄像头具有较小的视场角和较低的畸变,适用于需要高精度成像的场合;而Fisheye摄像头则以其超大的视场角和显著的畸变效果为特点,广泛应用于全景摄影、监控安防等领域。两者在成像模型和具体应用场景上也有所不同。

Pinhole摄像头(针孔摄像头)与Fisheye摄像头(鱼眼摄像头)在配置上存在显著的区别,这些区别主要体现在镜头类型、视角、成像效果以及应用场景等方面。

一、镜头类型

  • Pinhole摄像头:通常采用标准的针孔镜头,这种镜头的设计使其具有较小的视角,通常用于需要隐蔽拍摄的场合。针孔摄像头一般结构简单,体积小,便于隐藏和携带。
  • Fisheye摄像头:使用鱼眼镜头,这是一种具有超广角视野的特殊镜头。鱼眼镜头通常具有较大的弧度,接近于球面,因此能够捕捉到接近甚至达到180度的视角范围内的图像。

二、视角

  • Pinhole摄像头:由于采用标准针孔镜头,其视角相对较小,通常只能捕捉到镜头前方的有限范围内的图像。
  • Fisheye摄像头:以其超广角视野为特点,能够覆盖更大的场景范围,甚至可以实现全景拍摄。然而,这种超广角视野的代价是拍摄对象的变形,尤其是边缘部分的景物会呈现出明显的扭曲效果。

三、成像效果

  • Pinhole摄像头:成像效果相对自然,物体变形较小,能够较好地还原拍摄场景的真实面貌。但由于视角有限,可能无法捕捉到全部需要的信息。
  • Fisheye摄像头:成像效果具有独特的鱼眼效果,能够展现出一种特殊的视觉冲击力。但需要注意的是,由于超广角视野带来的物体变形,尤其是边缘部分的扭曲,可能会影响到图像的真实性和可用性。

四、应用场景

  • Pinhole摄像头:由于其隐蔽性和较小的视角,通常用于需要隐蔽拍摄的场合,如暗访调查取证、家庭监控等。此外,一些高端的针孔摄像头还具备高清画质、远程监控等功能,能够满足更多样化的需求。
  • Fisheye摄像头:由于其超广角视野和独特的成像效果,通常用于需要拍摄大范围场景的场合,如体育赛事直播、全景摄影、VR拍摄等。此外,鱼眼镜头还可以用于艺术创作和科学研究中,以展现独特的视觉效果和数据分析。

综上所述,Pinhole摄像头与Fisheye摄像头在镜头类型、视角、成像效果以及应用场景等方面存在明显的区别。在选择时,需要根据具体的需求和场景来选择合适的摄像头配置。

Contact sensor

研究下来最复杂的个人觉得是接触传感器,contact sensor,首先要在你的机器人Usd文件配置那里 activate_contact_sensors=True

因为这里会检查,否则contact sensor添加会失败:

然后配置你想要添加碰撞传感器的prim,这里可以配置的参数比较多,如传感器更新速率、历史数据长度、是否debug显示、是否记录物体的有碰撞或无碰撞时间等;

contact_sensor: ContactSensorCfg = ContactSensorCfg(
    prim_path="/World/envs/env_.*/Robot/body", update_period=0.01, history_length=10, debug_vis=False, track_pose=True, track_air_time=True
)

 接触传感器可以读取的数据是ContactSensorData,包含非常多有用的数据,如接触时间、接触力大小,这些可以用于机器人的碰撞检测、碰撞程度分析等;

 关于碰撞的设置与可视化

官方设置文档:

刚体模拟- Omniverse Extensions最新文档 --- Rigid-Body Simulation — Omniverse Extensions latest documentation (nvidia.com)icon-default.png?t=N7T8https://docs.omniverse.nvidia.com/extensions/latest/ext_physics/rigid-bodies.html?highlight=CCD#collision-settings在isaac sim里将碰撞可视化与具体设置操作:

 我们是在四个FOOT上面添加碰撞传感器,可以看到推是由一个可见的Mesh和两个用于碰撞检测的mesh组成,可见Mesh没有collider属性,对collisions添加

基于ray-cast的Height scanner

ray-cast光线投射器使用一组光线来检测与场景中网格的碰撞,从而模拟类似激光雷达的功能。射线在传感器的局部坐标系中定义。传感器可以配置为以给定的光线模式对一组网格进行光线投射。

使用NVIDIA Warp光线投射内核实现;

NVIDIA/warp: A Python framework for high performance GPU simulation and graphics (github.com)icon-default.png?t=N7T8https://github.com/NVIDIA/warpNVIDIA Warp是一个由NVIDIA推出的开发者框架,具有多功能性,根据应用领域的不同,其功能和特点也有所差异。在图形和视觉计算领域,NVIDIA Warp是一个开源、跨平台的光线追踪库,提供高效灵活的光线追踪解决方案,支持广泛的光线追踪功能,并可通过多线程优化实现高性能。而在数据生成与空间计算领域,NVIDIA Warp则是一个基于内核的代码生成框架,支持可微分编程,专为空间计算而构建,提供高性能模拟功能,并支持跨平台使用。无论是图形渲染、数据生成还是空间计算,NVIDIA Warp都旨在为开发者提供高效、灵活的工具和平台。

这是具体的光线投射传感器配置:

height_scanner = RayCasterCfg(
    # 传感器所加在的prim位置
    prim_path="{ENV_REGEX_NS}/Robot/base",
    # 传感器更新频率
    update_period=0.02,
    # 传感器帧相对于其父帧的偏移姿态
    # The offset pose of the sensor's frame from the sensor's parent frame.
    offset=RayCasterCfg.OffsetCfg(pos=(0.0, 0.0, 20.0)),
    # 光线的起始位置和方向是否仅跟踪偏航方向。
    # 由于我们只关心高度信息,因此不需要考虑机器人的侧倾和俯仰,所以attach_yaw_only设置为True
    attach_yaw_only=True,
    # 定义局部光线起始位置和方向的图案。
    # The pattern that defines the local ray starting positions and directions.
    pattern_cfg=patterns.GridPatternCfg(resolution=0.1, size=[1.6, 1.0]),
    # 是否显示可视化的markers用于调试
    debug_vis=True,
    # The list of mesh primitive paths to ray cast against.
    mesh_prim_paths=["/World/defaultGroundPlane"],
)

这里比较重要的一个配置参数是pattern_cfg,这个定义了pattern的类型,以及具体参数,比如这里定义的是GridPatternCfg,网格图案由彼此平行的射线构成,它们跨越传感器局部坐标中的2D网格,从 (-length/2, -width/2) 到 (length/2, width/2) ,由配置中的 size = (length, width) 和 resolution 参数定义。

还有一个是mesh_prim_paths,这个应该是与ray cast交互碰撞的mesh组定义,如这里的地面,因为使用ray cast来测高度;

 从 ray-cast 传感器获取到的数据比较简单为RayCasterData,里面包含的 ray_hits_w 为射线击中的mesh在世界坐标系中的位置;

其它(IMU和Lidar等)

IMU和Lidar的目前还都是分支,还没有合并进来,

一个IMU传感器似乎开发了7个月以上了,我服了这个效率....

Adds `IMU` sensor by pascal-roth · Pull Request #619 · isaac-sim/IsaacLab (github.com)

Lidar似乎还是用的ray-cast实现的,这个是基于碰撞的,也获取不到点云强度信息,应该使用RTX Lidar这种更好的方法,好在他们似乎意识到这个问题了:

Adds lidar pattern for raycaster sensor by pascal-roth · Pull Request #616 · isaac-sim/IsaacLab (github.com)

Feature/lidar sensor by LukasVindbjerg · Pull Request #532 · isaac-sim/IsaacLab (github.com)


Isaac Lab比较新,欢迎加QQ群一起交流学习:723139415

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值