world를 생성할때 population
tag를 사용하면 오브젝트를 하나씩 배치하지 않고 일정한 규칙을 지정하여 생성하거나 랜덤으로 배치 할 수 있는 기능을 가진다. 실습을 통해 population
의 사용법을 알아보자.
population
tag를 이용하여 world
파일을 작성 한 뒤 gazebo에서 어떤 식으로 나타나는지 확인하고 각각의 코드가 어떤식으로 동작하는지 알아보겠다.
🌍population.world
<?xml version="1.0" ?>
<sdf version="1.5">
<world name="default">
<!-- A global light source -->
<include>
<uri>model://sun</uri>
</include>
<!-- A ground plane -->
<include>
<uri>model://ground_plane</uri>
</include>
<!-- +X barriers -->
<population name="barriers_population">
<model name="jersey_barrier_1">
<include>
<static>true</static>
<uri>model://jersey_barrier</uri>
</include>
</model>
<pose>0 19 0.3 0 0 0</pose>
<box>
<size>40 40 0.01</size>
</box>
<model_count>10</model_count>
<distribution>
<type>linear-x</type>
</distribution>
</population>
<!-- -X barriers -->
<population name="barriers_population">
<model name="jersey_barrier_2">
<include>
<static>true</static>
<uri>model://jersey_barrier</uri>
</include>
</model>
<pose>0 -21.5 0.3 0 0 0</pose>
<box>
<size>40 40 0.01</size>
</box>
<model_count>10</model_count>
<distribution>
<type>linear-x</type>
</distribution>
</population>
<!-- +Y barriers -->
<population name="barriers_population">
<model name="jersey_barrier_3">
<include>
<static>true</static>
<uri>model://jersey_barrier</uri>
<pose>0 0 0 0 0 1.57</pose>
</include>
</model>
<pose>19 0 0.3 0 0 0</pose>
<box>
<size>40 40 0.01</size>
</box>
<model_count>10</model_count>
<distribution>
<type>linear-y</type>
</distribution>
</population>
<!-- -Y barriers -->
<population name="barriers_population">
<model name="jersey_barrier_4">
<include>
<static>true</static>
<uri>model://jersey_barrier</uri>
<pose>0 0 0 0 0 1.57</pose>
</include>
</model>
<pose>-21.5 0 0.3 0 0 0</pose>
<box>
<size>40 40 0.01</size>
</box>
<model_count>10</model_count>
<distribution>
<type>linear-y</type>
</distribution>
</population>
<!-- random models population -->
<population name="construction_barrel_population">
<model name="construction_barrel">
<include>
<static>false</static>
<uri>model://construction_barrel</uri>
</include>
</model>
<pose>0 0 0.2 0 0 0</pose>
<box>
<size>30 30 0.01</size>
</box>
<model_count>100</model_count>
<distribution>
<type>random</type>
</distribution>
</population>
</world>
</sdf>
실행화면을 보면 사각형 형태로 둘러싼 바리케이드와 내부에 꼬깔이 여러개 배치되어 있는 것을 확인 할 수 있다.
아래에 population
에서 사용가능한 tag
를 설명하였고, 바리케이트 및 꼬깔이 어떤식으로 배치되었는지 살펴보자.
🗒테그 목록
1.
population
-population
객체의 이름을 지정할 수 있다.
2.model
- 객체의 모델을 정의하는데 사용된다.
3.include
- 모델에 필요한 소스를 불러오거나 ,속성을 정의 하는데 사용된다.
4.pose
- 시뮬레이션에서 오브젝트의 초기위치 또는 방향을 설정한다.
5.box
- 시뮬레이션에서 객체가 위치할 영역을 설정한다.
6.model_count
- 시뮬레이션에서 만들 모델의 수를 정의한다.
7.distribution
- 개체를 배포할 방법을 지정한다 (ex : random , uniform, grid, linear-x,linear-y,linear-z)
🚧바리케이스 생성코드
<population name="barriers_population">
<model name="jersey_barrier_1">
<include>
<static>true</static>
<uri>model://jersey_barrier</uri>
</include>
</model>
<pose>0 19 0.3 0 0 0</pose>
<box>
<size>40 40 0.01</size>
</box>
<model_count>10</model_count>
<distribution>
<type>linear-x</type>
</distribution>
</population>
우선 population
의 name은 barriers_population
이고 ,
model
name 은 jersey_barrier_1
이다.
static
이 true
이므로 고정된 성질을 가진다.
uri
에 해당되는 모델 jersey_barrier
을 불러온다.
pose
모델의 초기 위치는 xyz
= 0 19 0.3 pry
= 0 0 0 으로 회전 값은 따로 부여하지 않았다.
box
테그는 객체가 위치할 영역으로 40*40 으로 설정하였다.
model_count
값이 10이므로 10개의 바리케이트가 설치될 것이다.
distribution
== linear-x 이므로 x축으로 일렬로 배열한다.
해당 내용으로 x축 및 y축으로 총 4개의 population
의 pose
, distribution
값을 바꾸면서 구성할 수 있었고 , y축 바리케이트는 include
의 pose
중 pry
= 0 0 1.57 을 부여해 모델이 Y축으로 향하게 배치할 수 있었다.
위 실행화면을 보면 첫번째 실행화면과 두번째 실행화면의 바리케이트 배치는 같으나 꼬깔의 배치가 다른 것을 확인 할 수 있다.
그이유는 아래의 코드를 보면서 확인해보자.
🚧꼬깔 생성코드
<!-- random models population -->
<population name="construction_barrel_population">
<model name="construction_barrel">
<include>
<static>false</static>
<uri>model://construction_barrel</uri>
</include>
</model>
<pose>0 0 0.2 0 0 0</pose>
<box>
<size>30 30 0.01</size>
</box>
<model_count>100</model_count>
<distribution>
<type>random</type>
</distribution>
</population>
차이점은 distribution
이부분의 값이 random
으로 설정되어있기 때문이다.
random
값을 부여하면 지정된 범위 내에 랜덤으로 해당 객체를 생성하게 된다.