120 lines
3.7 KiB
Markdown
120 lines
3.7 KiB
Markdown
# 地形生成工具
|
||
|
||
## 使用
|
||
1. 首先安装依赖
|
||
```bash
|
||
pip3 install noise opencv-python numpy
|
||
```
|
||
2. 打开 terrain_generator.py 修改开头的配置,这里以 Go2 机器人为例
|
||
```python
|
||
|
||
# 机器人目录
|
||
ROBOT = "go2"
|
||
|
||
# 输入的场景文件
|
||
INPUT_SCENE_PATH = "./scene.xml"
|
||
|
||
# 输出的
|
||
OUTPUT_SCENE_PATH = "../unitree_robots/" + ROBOT + "/scene_terrain.xml"
|
||
```
|
||
3. 运行
|
||
```bash
|
||
cd terrain_tool
|
||
python3 ./terrain_generator.py
|
||
```
|
||
程序将输出地形场景文件到`/unitree_robots/go2/scene_terrain.xml`。接着可以修改仿真器的配置文件`simulate/config.yaml`,将场景改为刚刚生成的 `scene_terrain.xml`:
|
||
```yaml
|
||
robot_scene: "scene_terrain.xml"
|
||
```
|
||
如果使用的是基于 python 的仿真器,则修改`simulate_python/config.py`:
|
||
```python
|
||
ROBOT_SCENE = "../unitree_robots/" + ROBOT + "/scene_terrain.xml"
|
||
```
|
||
之后运行 unitree_mujoco 仿真器,可以看到所生成的地形。
|
||
|
||
# 函数解释
|
||
用户可以利用 `terrain_generator.py` 自行添加所需的地形,以下是函数解释。
|
||
|
||
##### 1. `AddBox`
|
||
添加立方体,参数:
|
||
``` python
|
||
position=[1.0, 0.0, 0.0] # 中心位置
|
||
euler=[0.0, 0.0, 0.0] # 姿态
|
||
size=[0.1, 0.1, 0.1] # 尺寸,长宽高
|
||
```
|
||
##### 2. `AddGeometry`
|
||
添加几何体, 参数:
|
||
``` python
|
||
position=[1.0, 0.0, 0.0] # 中心位置
|
||
euler=[0.0, 0.0, 0.0] # 姿态
|
||
size=[0.1, 0.1, 0.1] # 尺寸,部分几何体只需要用到前两个参数
|
||
geo_type="cylinder" # 几何体类型,支持"plane", "sphere", "capsule", "ellipsoid", "cylinder", "box"
|
||
```
|
||
|
||
##### 3. `AddStairs`
|
||
添加楼梯,参数:
|
||
```python
|
||
init_pos=[1.0, 0.0, 0.0] # 靠近地面的台阶的位置
|
||
yaw=0.0 # 楼梯朝向
|
||
width=0.2 # 台阶宽度
|
||
height=0.15 # 台阶高度
|
||
length=1.5 # 台阶长度
|
||
stair_nums=10 #台阶数量
|
||
```
|
||
|
||
##### 4. `AddSuspendStairs`
|
||
添加悬浮楼梯,参数:
|
||
```python
|
||
init_pos=[1.0, 0.0, 0.0] # 靠近地面的台阶的位置
|
||
yaw=0.0 # 楼梯朝向
|
||
width=0.2 # 台阶宽度
|
||
height=0.15 # 台阶高度
|
||
length=1.5 # 台阶长度
|
||
gap=0.1 # 悬浮间隙
|
||
stair_nums=10 # 台阶数量
|
||
```
|
||
|
||
##### 5. `AddRoughGround`
|
||
添加杂乱地形,通过随机排列立方体实现杂乱的地形,参数:
|
||
```python
|
||
init_pos=[1.0, 0.0, 0.0] # 第一个立方体的位置
|
||
euler=[0.0, -0.0, 0.0], # 地形相对于世界的欧拉角
|
||
nums=[10, 10], # 在 x 和 y 方向上的立方体个数
|
||
box_size=[0.5, 0.5, 0.5], # 立方体的尺寸
|
||
box_euler=[0.0, 0.0, 0.0], # 立方体的姿态
|
||
separation=[0.2, 0.2], # 立方体在 x 和 y 方向上的间隔
|
||
box_size_rand=[0.05, 0.05, 0.05], # 立方体尺寸的随机增量
|
||
box_euler_rand=[0.2, 0.2, 0.2], # 立方体姿态的随机增量
|
||
separation_rand=[0.05, 0.05] # 立方体间隔的随机增量
|
||
```
|
||
|
||
##### 6.`AddPerlinHeighField`
|
||
基于 Perlin 噪声生成高程图地形,参数:
|
||
```python
|
||
position=[1.0, 0.0, 0.0], # 地形中心位置
|
||
euler=[0.0, -0.0, 0.0], # 地形相对于世界的欧拉角
|
||
size=[1.0, 1.0], # 地形长宽
|
||
height_scale=0.2, # 地形最大高度
|
||
negative_height=0.2, # z 轴负方向高度
|
||
image_width=128, # 地形高程图像素尺寸
|
||
img_height=128,
|
||
smooth=100.0, # 噪声平滑度
|
||
perlin_octaves=6 # Perlin 噪声参数
|
||
perlin_persistence=0.5
|
||
perlin_lacunarity=2.0
|
||
output_hfield_image="height_field.png" # 输出的高程图名称
|
||
```
|
||
|
||
##### 7. `AddHeighFieldFromImage`
|
||
基于给定的图像生成地形
|
||
```python
|
||
position=[1.0, 0.0, 0.0] # 地形中心位置
|
||
euler=[0.0, -0.0, 0.0], # 地形相对于世界的欧拉角
|
||
size=[2.0, 1.6], # 地形长宽
|
||
height_scale=0.02, # 地形最大高度
|
||
negative_height=0.1, # z 轴负方向高度
|
||
input_img="./unitree_robot.jpeg" # 输入的图像路径
|
||
output_hfield_image="height_field.png", # 输出的高程图名称
|
||
image_scale=[1.0, 1.0], # 缩放图像比例
|
||
invert_gray=False # 反转像素
|
||
``` |