技术视界 | 青龙机器人训练地形详解(三):复杂地形精讲之台阶

在前两篇中,我们依次讲解了“如何创建一个地形”以及“如何将地形添加到训练环境中”。从基础出发,逐步构建机器人可交互的三维仿真环境。在机器人强化学习训练中,地形的复杂度决定了策略的泛化能力,仅靠 jump_plat 和 jump_pit 等基础地形,难以满足真实场景下的鲁棒性需求。今天,我们将进入更复杂的训练场景:台阶地形与金字塔形台阶地形,它们是机器人强化学习中不可或缺的“能力测试场”。


为什么选择“台阶地形”?

台阶结构在现实生活中十分常见,比如楼梯、斜坡、道路突起等,都是非连续地形的体现。通过引入台阶地形,不仅能有效模拟这些真实障碍场景,也能显著提高机器人在以下几个方面的能力:一方面,它能锻炼策略在不同地形结构中的泛化表现,确保学习的动作在新地形上依旧可用;另一方面,台阶对平衡与协调的要求更高,有助于强化机器人姿态控制系统。

面对阶梯变化的地形,机器人必须依赖更精确的地形感知和动作决策机制,从而训练出更强大的感知能力。更重要的是,经过复杂地形训练的策略通常具有更强的鲁棒性,可以有效降低摔倒或失误的发生率,提高在现实世界部署的可靠性。

图片来自互联网


基础台阶地形(Stairs Terrain)

基础台阶地形的实现逻辑其实非常清晰,核心依旧是对 terrain.height_field_raw 数组中地形高度值的直接操作。在每一次迭代中,通过将一段水平方向上的高度值叠加,逐渐堆叠形成多个“阶梯”。例如:


def stairs_terrain(terrain, step_width, step_height):"""Generate a stairsParameters:terrain (terrain): the terrainstep_width (float):  the width of the step [meters]step_height (float):  the height of the step [meters]Returns:terrain (SubTerrain): update terrain"""# switch parameters to discrete unitsstep_width = int(step_width / terrain.horizontal_scale)step_height = int(step_height / terrain.vertical_scale)num_steps = terrain.width // step_widthheight = step_heightfor i in range(num_steps):terrain.height_field_raw[i * step_width: (i + 1) * step_width, :] += heightheight += step_heightreturn terrain

其中,step_width 控制每一级台阶的水平宽度,而 step_height 控制垂直高度的增长幅度。随着循环进行,地形高度逐渐升高,形成稳定的阶梯结构。如果传入负值的 step_height 参数,还可以生成“下楼梯”的情境,丰富了机器人训练的地形类型。

添加图片注释,不超过 140 字(可选)

不过,这种简单台阶的最大问题在于它的“拼接性”较差。当台阶地形与其他类型的地形拼接时,可能会出现突兀的高度差。这种地形不连续性在训练中会造成策略不稳定,甚至导致机器人频繁摔倒,降低训练效率。


金字塔台阶地形(Pyramid Stairs):结构过渡的优雅解法

在训练地形中直接使用台阶地形是不可取的,因为会出现地形不连续的情况,一块地形与其接壤的地形会出现非常大的高度差,导致机器人在训练中非常容易摔倒。为了解决台阶结构之间突变的问题,引入“金字塔台阶”是一种更为合理的解决方案。它的核心理念是用一种环形递进的方式,使地形的高度逐层递增,从而在空间上实现更自然的过渡。

 

其实现方式是:在每次 while 循环中,将地形的有效区域从四周逐步向中心收缩,同时逐步抬高高度值,最终形成一个以中心平台为顶点的金字塔状阶梯结构。这一过程不仅确保了地形的连续性,还为机器人在中心区域停留、观察或进行任务切换提供了良好的平台基础。实现逻辑如下:

def pyramid_stairs_terrain(terrain, step_width, step_height, platform_size=1.):"""Generate stairsParameters:terrain (terrain): the terrainstep_width (float):  the width of the step [meters]step_height (float): the step_height [meters]platform_size (float): size of the flat platform at the center of the terrain [meters]Returns:terrain (SubTerrain): update terrain"""# switch parameters to discrete unitsstep_width = int(step_width / terrain.horizontal_scale)step_height = int(step_height / terrain.vertical_scale)platform_size = int(platform_size / terrain.horizontal_scale)height = 0start_x = 0stop_x = terrain.widthstart_y = 0stop_y = terrain.lengthwhile (stop_x - start_x) > platform_size and (stop_y - start_y) > platform_size:start_x += step_widthstop_x -= step_widthstart_y += step_widthstop_y -= step_widthheight += step_heightterrain.height_field_raw[start_x: stop_x, start_y: stop_y] = heightreturn terrain

可以看到,在每次 while 循环的迭代中:

- start_x 和 start_y 增加 step_width,即从左下到中心(以上为x轴正方向,右为y轴正方向)。

- stop_x 和 stop_y 减少 step_width,即从右上向中心。

- height 增加 step_height,表示生成的阶梯高度不断增加。

最终形成中心平台+阶梯上升的金字塔结构。这种结构不仅能单独使用,还可以通过多个金字塔拼接组合出自然过渡的大面积复杂地形,非常适合策略迁移和鲁棒性测试。逻辑图解如下:

 


实践应用建议

在实际应用中,我们建议根据不同的训练目标选用不同的地形类型。

例如,在早期阶段,可使用 jump_pit 或 jump_flat 地形作为基础步态和跳跃动作的训练场景。在需要训练机器人应对高度变化时,台阶地形是理想选择,能有效测试策略的爬升能力与协调性。而金字塔台阶则更适合用于设计连续过渡地形或核心区域的多场景整合。通过将多个金字塔结构拼接在一起,还能形成更为复杂、可控的过渡环境,进一步检验策略的稳定性与适应性。

从模拟到现实的桥梁

台阶与金字塔台阶地形的引入,不仅丰富了训练环境的复杂性,也帮助我们更接近真实世界中机器人的使用场景。合理设计地形,是让机器人“聪明地行动”的第一步。结合高质量策略与结构合理的训练环境,我们将能训练出在多种真实环境中都能稳定运行的机器人。

在理解了台阶与金字塔台阶之后,我们即将进入下一个重要的复杂地形——斜坡。它在机器人行走稳定性、动态平衡和落足规划中扮演关键角色,是强化学习任务中不可跳过的一环,敬请期待《复杂地形精讲(四):斜坡》篇~

欢迎加入 OpenLoong 开源社区https://www.openloong.org.cn/cn/signup?utm_source=referral&utm_medium=csdn&utm_campaign=tech&utm_content=250508探索人形机器人技术,共享创新成果,在这里一起见证开源的力量!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/79994.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/79994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL之索引结构,为何要用B+树

索引的目的就是为了提高查询效率 索引的结构是B树,那么说到B树,必须提一下其他三种结构,分别是:二叉查找树、平衡二叉树、B树 我们来看看各自的结构特征 二叉查找树 特点:任何节点的左子节点的值都小于当前节点的值,右…

3.2.3 掌握RDD转换算子 - 2. 过滤算子 - filter()

在本节课中,我们深入学习了Spark RDD的过滤算子filter()。filter()算子能够通过指定的函数对RDD中的元素进行筛选,返回一个满足条件的新RDD,通常新RDD的元素个数会比源RDD少。通过案例演示,我们掌握了如何使用filter()来过滤列表中…

vue3使用轮播图组件swiper

一、在swiper的官网源码下载地址 下载Swiper - Swiper中文网 二、官网浏览轮播图类型地址 Swiper演示 - Swiper中文网 三、swiper配置参数地址 中文api - Swiper中文网 四、在vue3项目引入swiper npm install swiper 五、在vue3中使用 官网vue3中使用:Swiper…

MySQL优化-MySQL故障排查与监控

MySQL优化-MySQL故障排查与监控 一、MySQL监控 实时了解数据库的运行状态,通过不同的监控指标,识别潜在问题并进行预防。常见得到MySQL监控指标包括:连接数、缓存池命中率、磁盘I/O、查询执行情况等。 1、监控数据库状态变量 MySQL的状态…

【MongoDB篇】MongoDB的分片操作!

目录 引言第一节:分片核心概念:为什么要分片?它是什么? 🤔💥🚀第二节:分片架构的“三大金刚”:核心组件解析 🧱🧠🛣️第三节&#xff…

C++ 函数类型及实用例题

请各位大佬一键三连支持一下 目录 请各位大佬一键三连支持一下 1. 无参数无返回值函数 2. 有参数无返回值函数 3. 无参数有返回值函数 4. 有参数有返回值函数 5. 函数重载 6. 递归函数 7. 带默认参数的函数 8. 内联函数 下面我将介绍 C 中不同类型的函数,…

AtCoder Beginner Contest 404 A-E 题解

还是ABC好打~比ARC好打多了&#xff08; 题解部分 A - Not Found 给定你一个长度最大25的字符串&#xff0c;任意输出一个未出现过的小写字母 签到题&#xff0c;map或者数组下标查询一下就好 #include<bits/stdc.h>using namespace std;#define int long long #def…

trae ai编程工具

Trae&#xff0c;致力于成为真正的 AI 工程师&#xff08;The Real Al Engineer&#xff09;。Trae 旗下的 AI IDE 产品&#xff0c;以智能生产力为核心&#xff0c;无缝融入你的开发流程&#xff0c;与你默契配合&#xff0c;更高质量、高效率完成每一个任务。 版本差异 国内…

Web 架构之前后端分离

文章目录 思维导图一、引言二、前后端分离的概念代码示例&#xff08;简单的前后端分离交互&#xff09;后端&#xff08;使用 Python Flask 框架&#xff09;前端&#xff08;使用 JavaScript 和 jQuery&#xff09; 三、前后端分离的优势3.1 提高开发效率3.2 代码可维护性增强…

理解 Elasticsearch 的评分机制和 Explain API

作者&#xff1a;来自 Elastic Kofi Bartlett 深入了解 Elasticsearch 的评分机制并探索 Explain API。 想获得 Elastic 认证吗&#xff1f;查看下一期 Elasticsearch Engineer 培训的时间&#xff01; Elasticsearch 拥有大量新功能&#xff0c;帮助你为你的使用场景构建最佳…

Jupyter Notebook / Lab 疑难杂症记:从命令找不到到环境冲突与网络阻塞的排查实录

Jupyter Notebook / Lab 疑难杂症记&#xff1a;从命令找不到到环境冲突与网络阻塞的排查实录 摘要&#xff1a; 本文记录了一次复杂的 Jupyter Notebook / Lab 故障排查过程。从最初的“command not found”错误出发&#xff0c;我们深入挖掘了可执行文件存在的矛盾、conda 环…

C++之set和map的运用

目录 序列式容器和关联式容器 熟识set 在STL中的底层结构&#xff1a; set的构造和迭代器 set的增删查 multiset和set的差异 练习题&#xff1a; 熟识map map类的介绍 pair类型介绍 map的构造 map的增删查 map的数据修改 测试样例&#xff1a; multimap和map的差…

【Bluedroid】蓝牙 SDP(服务发现协议)模块代码解析与流程梳理

本文深入剖析Bluedroid蓝牙协议栈中 SDP&#xff08;服务发现协议&#xff09;服务记录的全生命周期管理流程&#xff0c;涵盖初始化、记录创建、服务搜索、记录删除等核心环节。通过解析代码逻辑与数据结构&#xff0c;揭示各模块间的协作机制&#xff0c;包括线程安全设计、回…

【实战项目】简易版的 QQ 音乐:一

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;能自我实现简易版的 QQ 音乐。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a…

Linux_进程退出与进程等待

一、进程退出 ‌退出场景‌ ‌正常终止‌&#xff1a;代码执行完毕且结果符合预期&#xff08;退出码为 0&#xff09;。‌异常终止‌&#xff1a;运行结果错误&#xff08;退出码非 0&#xff09;或进程被信号强制终止。&#xff08;如 SIGINT 或 SIGSEGV&#xff09;。 ‌退…

GD32F407单片机开发入门(二十八)USB口介绍及CDC类虚拟串口通讯详解及源码

文章目录 一.概要二.USB2.0基本介绍及虚拟串口介绍三.GD32单片机USB模块框图四.GD32单片机USB设备模式五.GD32F407VET6 USB设备CDC类六.配置一个USB虚拟串口收发例程七.工程源代码下载八.小结 一.概要 GD32F407VET6USB虚拟串口是一种采用GD32F407VET6单片机&#xff0c;通过US…

MySQL 主从配置超详细教程

文章目录 前言一、安装 MySQL二、主服务器&#xff08;Master&#xff09;配置三、从服务器&#xff08;Slave&#xff09;配置四、测试主从复制五、注意事项 前言 MySQL 主从配置是一种实用的数据库架构&#xff0c;主服务器处理写入操作&#xff0c;从服务器负责只读操作&am…

Python爬虫实战:获取百度学术专题文献数据并分析,为读者课题研究做参考

一、引言 在信息爆炸的当下,学术研究需要大量相关资料支撑。百度学术作为重要学术资源平台,蕴含丰富学术文献。利用爬虫技术获取百度学术特定主题文章数据,能为学术研究提供全面、及时信息。本研究旨在用 Python 实现对百度学术 “主题爬虫” 相关文章的爬取,并对数据深入…

手撕基于AMQP协议的简易消息队列-6(服务端模块的编写)

在MQServer中编写服务端模块代码 在MQServer中编写makefile文件来编译服务端模块 .PHONY: server CFLAG -I../ThirdLib/lib/include LFLAG -L../ThirdLib/lib/lib -lgtest -lprotobuf -lsqlite3 -pthread -lmuduo_net -lmuduo_base -lz server:server.cpp ../MQCommon/messag…

linux tar命令详解。压缩格式对比

1.压缩格式对比 压缩格式命令选项文件扩展名压缩率速度无压缩-cvf.tar无最快gzip-czvf.tar.gz中等较快bzip2-cjvf.tar.bz2较高较慢xz-cJvf.tar.xz最高最慢 9. 更多参考 【Linux基础】文件压缩tar命令指南tar压缩方式对比