높낮이에 따른 imu 데이터값의 변화를 알기 위해서 정현파 형태의 지면을 생성할 필요가 있었다.
Gazebo World 의 sdf 파일에서 heightmap 은 지형 모델링을 위해 사용되는 텍스쳐 이미지이다. 이 텍스쳐 이미지는 지형의 높이 값을 나타내며, 지형의 모양과 높이 정보를 포함한다.
Heightmap 은 회색조 이미지로 표시되며, 각 픽셀의 밝기 값은 해당 위치의 지형 높이를 나타낸다. 더 밝은 픽셀은 높은 곳을 나타내며, 더 어두운 픽셀은 낮은 곳을 나타낸다.
import os
import numpy as np
from PIL import Image
# 이미지 크기와 sin 함수의 주기, 진폭, 위상 등을 설정
width = 129
height = 129
period = 10
amplitude = 0.1
phase = 0
y, x = np.indices((height, width))
data = amplitude * np.sin(2 * np.pi * (1.0 / period) * x + phase)
img = Image.fromarray(np.uint8(data * 255))
path = os.path.expanduser('/usr/share/gazebo-11/media/sin_wave.png')
img.save(path)
이 코드를 실행하면 다음과 같은 이미지가 생성된다. 이때 주의할 것은 이미지의 크기가 129x129 사이즈여야 한다는 것이다.
Gazebo 에서 불러올 수 있는 world 는
/usr/share/gazebo/media 에 저장할 수 있다.
ㄴ gazebo-11
ㄴ models
ㄴ sin_wave
ㄴ model.config
ㄴ model.sdf
다음과 같이 구성하면 gazebo 환경에서 모델을 불러올 수 있다. 이때 model.sdf 에서 아까 만든 사진의 uri 부분만 수정해 주면 된다.
<?xml version="1.0"?>
<model>
<name>Sine Wave</name>
<version>1.0</version>
<sdf version="1.5">model.sdf</sdf>
<author>
<name>zzziito</name>
</author>
<description>
sine-wave ground
</description>
</model>
<?xml version="1.0" ?>
<sdf version="1.5">
<model name="heightmap">
<static>true</static>
<link name="link">
<collision name="collision">
<geometry>
<heightmap>
<uri>file://media/sin_wave.png</uri>
<size>10 10 0.1</size>
<pos>0 0 0</pos>
</heightmap>
</geometry>
<surface>
<contact>
<collide_bitmask>0xffff</collide_bitmask>
</contact>
</surface>
</collision>
<visual name="visual">
<geometry>
<heightmap>
<use_terrain_paging>false</use_terrain_paging>
<texture>
<diffuse>file://media/materials/textures/dirt_diffusespecular.png</diffuse>
<normal>file://media/materials/textures/flat_normal.png</normal>
<size>1</size>
</texture>
<texture>
<diffuse>file://media/materials/textures/grass_diffusespecular.png</diffuse>
<normal>file://media/materials/textures/flat_normal.png</normal>
<size>1</size>
</texture>
<texture>
<diffuse>file://media/materials/textures/fungus_diffusespecular.png</diffuse>
<normal>file://media/materials/textures/flat_normal.png</normal>
<size>1</size>
</texture>
<blend>
<min_height>2</min_height>
<fade_dist>5</fade_dist>
</blend>
<blend>
<min_height>4</min_height>
<fade_dist>5</fade_dist>
</blend>
<uri>file://media/sin_wave.png</uri>
<size>10 10 0.1</size>
<pos>0 0 0</pos>
</heightmap>
</geometry>
</visual>
</link>
</model>
</sdf>
그러면 이와 같이 sine wave 모양의 높낮이를 가지는 바닥을 생성할 수 있다.