목표: 목표 Waypoint 까지 장애물을 우회하는 드론을 만들자!!
(현재 Recall study의 마지막 포인트입니다.)
예상 공부 시간: 8시간
A* 알고리즘, 하이브리드 A* 알고리즘
새로운 SDF 월드 만들기와 장애물 세팅
우리가 2~4 챕터에 진행된 월드의 sdf 파일은 다음 경로에 저장되어있다.
cp ~/PX4-Autopilot/Tools/simulation/gz/worlds/default.sdf ~/PX4-Autopilot/Tools/simulation/gz/worlds/default.sdf
여기서 worlds 디렉토리 외에 12개의 worlds가 기본으로 지원해준다. 허나 우리는 custom 월드를 만들거기 때문에 gedit을 통해 월드를 만들어주자.
gedit obstacle_avoidance.sdf
현재 우리는 default 월드에서 장애물만 두 개 추가한 새로운 월드를 만들 거기 때문에, default 내용의 것들을 복붙해도 된다.
cp ~/PX4-Autopilot/Tools/simulation/gz/worlds/default.sdf ~/PX4-Autopilot/Tools/simulation/gz/worlds/obstacle_avoidance.sdf
default 내용을 복사 후 붙여넣기 했으면 이제 장애물을 만들어보자. 여기서는 장애물을 ‘ㄱ’자 형태로 만들것이며 Gazebo 좌표로 (Z축 방향이 양수) (7,0,5)에서 크기가 10110m 벽, (2,-5,5)에서 크기가 11010m 벽을 생성할 것이다. (좌표는 질량 중심이라고 생각하면 됩니다.)
cat << 'EOF' > ~/PX4-Autopilot/Tools/simulation/gz/worlds/obstacle_avoidance.sdf
<?xml version="1.0" encoding="UTF-8"?>
<sdf version="1.9">
<world name="obstacle_avoidance"> <!-- world name 틀리면 안 돌아갑니다.-->
<plugin name="gz::sim::systems::Physics" filename="gz-sim-physics-system"/>
<plugin name="gz::sim::systems::UserCommands" filename="gz-sim-user-commands-system"/>
<plugin name="gz::sim::systems::SceneBroadcaster" filename="gz-sim-scene-broadcaster-system"/>
<plugin name="gz::sim::systems::Contact" filename="gz-sim-contact-system"/>
<plugin name="gz::sim::systems::Sensors" filename="gz-sim-sensors-system">
<render_engine>ogre2</render_engine>
</plugin>
<physics type="ode">
<max_step_size>0.004</max_step_size>
<real_time_factor>1.0</real_time_factor>
<real_time_update_rate>250</real_time_update_rate>
</physics>
<gravity>0 0 -9.8</gravity>
<magnetic_field>6e-06 2.3e-05 -4.2e-05</magnetic_field>
<atmosphere type="adiabatic"/>
<scene>
<grid>false</grid>
<ambient>0.4 0.4 0.4 1</ambient>
<background>0.7 0.7 0.7 1</background>
<shadows>true</shadows>
</scene>
<model name="ground_plane">
<static>true</static>
<link name="link">
<collision name="collision">
<geometry><plane><normal>0 0 1</normal><size>1 1</size></plane></geometry>
<surface><friction><ode/></friction><bounce/><contact/></surface>
</collision>
<visual name="visual">
<geometry><plane><normal>0 0 1</normal><size>500 500</size></plane></geometry>
<material><ambient>0.8 0.8 0.8 1</ambient><diffuse>0.8 0.8 0.8 1</diffuse><specular>0.8 0.8 0.8 1</specular></material>
</visual>
</link>
</model>
<light name="sunUTC" type="directional">
<pose>0 0 500 0 -0 0</pose>
<cast_shadows>true</cast_shadows>
<intensity>1</intensity>
<direction>0.001 0.625 -0.78</direction>
<diffuse>0.904 0.904 0.904 1</diffuse>
<specular>0.271 0.271 0.271 1</specular>
<attenuation><range>2000</range><linear>0</linear><constant>1</constant><quadratic>0</quadratic></attenuation>
</light>
<spherical_coordinates>
<surface_model>EARTH_WGS84</surface_model>
<world_frame_orientation>ENU</world_frame_orientation>
<latitude_deg>47.397971057728974</latitude_deg>
<longitude_deg> 8.546163739800146</longitude_deg>
<elevation>0</elevation>
</spherical_coordinates>
<model name='first_wall'>
<static>true</static>
<pose>7 0 5 0 0 0</pose>
<link name='link'>
<collision name='collision'><geometry><box><size>1 10 10</size></box></geometry></collision>
<visual name='visual'>
<geometry><box><size>1 10 10</size></box></geometry>
<material><ambient>0.5 0.0 0.0 1</ambient><diffuse>0.8 0.0 0.0 1</diffuse><specular>0.8 0.8 0.8 1</specular></material>
</visual>
</link>
</model>
<model name='second_wall'>
<static>true</static>
<pose>2 -5 5 0 0 0</pose>
<link name='link'>
<collision name='collision'><geometry><box><size>10 1 10</size></box></geometry></collision>
<visual name='visual'>
<geometry><box><size>10 1 10</size></box></geometry>
<material><ambient>0.0 0.0 0.5 1</ambient><diffuse>0.0 0.0 0.8 1</diffuse><specular>0.8 0.8 0.8 1</specular></material>
</visual>
</link>
</model>
</world>
</sdf>
EOF
이제 sdf 파일을 빌드할 필요 없이 바로 실행할 수 있다. 다음 명령어로 해당 월드를 열 수 있다.