목표: 목표 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 파일을 빌드할 필요 없이 바로 실행할 수 있다. 다음 명령어로 해당 월드를 열 수 있다.