Gazebo height map 을 이용하여 sine 모양 world 만들기

지토·2023년 4월 30일
0
post-thumbnail

높낮이에 따른 imu 데이터값의 변화를 알기 위해서 정현파 형태의 지면을 생성할 필요가 있었다.

Heightmap

Gazebo World 의 sdf 파일에서 heightmap 은 지형 모델링을 위해 사용되는 텍스쳐 이미지이다. 이 텍스쳐 이미지는 지형의 높이 값을 나타내며, 지형의 모양과 높이 정보를 포함한다.

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 에 불러오기

Gazebo 에서 불러올 수 있는 world 는
/usr/share/gazebo/media 에 저장할 수 있다.

ㄴ gazebo-11
  	ㄴ models
      	ㄴ sin_wave
          	ㄴ model.config
          	ㄴ model.sdf
      

다음과 같이 구성하면 gazebo 환경에서 모델을 불러올 수 있다. 이때 model.sdf 에서 아까 만든 사진의 uri 부분만 수정해 주면 된다.

model.config

<?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>

model.sdf

<?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 모양의 높낮이를 가지는 바닥을 생성할 수 있다.

참고

  1. 동영상
  2. Create a new world with a custom seabed

0개의 댓글