Main Content

Simulink와 Gazebo 간의 연동 시뮬레이션 수행하기

이 예제에서는 Simulink™와 Gazebo 간에 동기화된 시뮬레이션을 설정하여 명령을 전송하고 Gazebo에서 데이터를 수신하는 방법을 보여줍니다.

Gazebo 시뮬레이션 환경 설정하기

이 예제의 경우 Gazebo가 포함된 자체 Linux 환경을 사용하십시오. 또는 ROS와 Gazebo가 포함된 가상 머신에서 제공되는 가상 머신을 다운로드하십시오. 가상 머신(VM)에서 필요한 Gazebo 플러그인은 /home/user/src/GazeboPlugin. 에 있습니다.

Linux VM에 대한 자세한 내용과 Gazebo가 포함된 자체 Linux 환경을 설정하기 위한 요구 사항은 Gazebo 시뮬레이션 환경의 요구 사항과 제한 사항 항목을 참조하십시오.

VM 설정에서 [Accelerate 3D graphics]를 비활성화하십시오. VM 설정에서 VM > Settings > Hardware > Display로 이동하여 [Accelerate 3D graphics]를 비활성화합니다.

자체 Linux 환경을 사용하는 경우 수동으로 Gazebo 플러그인 설치하기의 단계를 따릅니다. 그 외의 경우, Gazebo 시뮬레이션 환경 시작하기로 이동합니다.

수동으로 Gazebo 플러그인 설치하기

플러그인 소스 코드를 zip 패키지 형식으로 받습니다. 다음 함수는 현재 작업 디렉터리에 GazeboPlugin이라는 폴더를 만들어 GazeboPlugin.zip으로 압축합니다.

packageGazeboPlugin

GazeboPlugin.zip을 Linux 머신에 다음 요구 사항을 충족하도록 복사합니다.

Linux 플랫폼에서 패키지의 압축을 풉니다. 이 예제에서는 /home/user/src/GazeboPlugin에 압축을 풉니다.

터미널에서 다음 명령을 실행하여 플러그인을 컴파일합니다.

cd /home/user/src/GazeboPlugin

build 폴더가 이미 있으면 제거합니다.

rm -r build

플러그인을 설치합니다.

mkdir build
cd build
cmake ..
make

플러그인의 위치는 /home/user/src/GazeboPlugin/export/lib/libGazeboCoSimPlugin.so입니다.

생성된 플러그인을 호스트 컴퓨터에서 제거합니다.

if exist('GazeboPlugin', 'dir')
    rmdir('GazeboPlugin', 's');
end

if exist('GazeboPlugin.zip', 'file')
    delete('GazeboPlugin.zip');
end

Gazebo 시뮬레이션 환경 시작하기

VM 또는 자체 Linux 운영 체제에서 터미널을 열고 다음 명령을 실행하여 Gazebo 시뮬레이터를 시작합니다.

cd /home/user/src/GazeboPlugin/export
export SVGA_VGPU10=0
gazebo ../world/multiSensorPluginTest.world --verbose

이러한 명령은 다음 요소가 있는 Gazebo 시뮬레이터를 시작합니다.

  • 2개의 레이저 거리 측정기: hokuyo0, hokuyo1

  • 2개의 RGB 카메라: camera0, camera1

  • 2개의 심도 카메라: depth_camera0, depth_camera1

  • 2개의 IMU 센서: imu0, imu1

  • 단위 상자 모델: unit_box

multiSensorPluginTest.world/home/user/src/GazeboPlugin/world 폴더에 있습니다. 이 world 파일에는 .xml 본문의 다음 행을 사용하여 Simulink와 연동 시뮬레이션하기 위한 Gazebo 플러그인이 있습니다.

<plugin name="GazeboPlugin" filename="lib/libGazeboCoSimPlugin.so"><portNumber>14581</portNumber></plugin>

filename 필드는 컴파일된 Gazebo 플러그인의 위치를 가리켜야 합니다. 이 경로는 Gazebo가 실제 시작되는 위치의 상대 경로일 수 있습니다. 또는 다음을 실행하여 Gazebo 플러그인 검색 경로에 추가할 수도 있습니다.

export GAZEBO_PLUGIN_PATH=${GAZEBO_PLUGIN_PATH}:/home/user/src/GazeboPlugin/export

Gazebo 연동 시뮬레이션 구성하기

시뮬레이션된 센서에서 센서 데이터를 수신하는 방법과 Simulink에서 단위 상자 모델을 작동하는 방법을 보여주는 performCoSimulationWithGazebo 모델을 엽니다.

open_system("performCoSimulationWithGazebo")

모델을 시뮬레이션하기 전에 Gazebo Pacer 블록을 사용하여 Gazebo 연동 시뮬레이션을 구성합니다.

hilite_system('performCoSimulationWithGazebo/Gazebo Pacer')

블록을 열고 Gazebo 네트워크와 시뮬레이션 설정 구성 링크를 클릭합니다.

open_system('performCoSimulationWithGazebo/Gazebo Pacer')

네트워크 주소 드롭다운에서 Custom을 선택합니다. Linux 머신의 IP 주소를 입력합니다. Gazebo의 디폴트 포트14581입니다. 응답 제한 시간을 10초로 설정합니다.

테스트 버튼을 클릭하여 실행 중인 Gazebo 시뮬레이터와의 연결을 테스트합니다.

센서 데이터 가져오기

Gazebo Read 블록을 사용하여 다음의 3가지 센서에서 특정 토픽에 대한 데이터를 가져옵니다.

  • IMU, /gazebo/default/imu0/link/imu/imu

  • 라이다 스캔, /gazebo/default/hokuyo0/link/laser/scan

  • RGB 카메라, /gazebo/default/camera0/link/camera/image

IMU 측정값을 표시하고 MATLAB® 함수 블록을 사용하여 라이다 스캔과 RGB 이미지를 시각화합니다.

Gazebo 모델 작동하기

Gazebo Apply Command 블록을 사용하여 단위 상자에 z 방향의 일정한 힘을 적용해 1m/s2의 가속도를 일으킵니다. Gazebo Blank Message를 사용하여 빈 ApplyLinkWrench 메시지를 만듭니다. Bus Assignment 블록을 사용하여 unit_box/link 엔터티에 힘을 적용할 메시지의 요소를 지정합니다. Gazebo Read를 사용하여 상자의 ground truth 자세를 출력합니다. 1초 동안의 상자의 변위는 0.5m에 가까워야 합니다.

연동 시뮬레이션 수행하기

연동 시뮬레이션을 시작하려면 실행을 클릭합니다. 스텝 앞으로를 사용하여 시뮬레이션 스텝을 앞으로 이동할 수도 있습니다. 스텝 뒤로는 연동 시뮬레이션 동안 지원되지 않습니다.

시뮬레이션이 실행되는 동안 Gazebo 시뮬레이터와 Simulink 시간이 동기화됩니다.

이 모델은 MATLAB Function 블록과 MATLAB 플로팅 기능을 사용하여 Gazebo 센서 데이터를 시각화합니다. 다음은 Gazebo 카메라에서 얻은 이미지 데이터의 스냅샷입니다.

다음은 라이다 스캔 이미지의 스냅샷입니다.

단위 상자 블록의 z 방향 위치에 대한 시간 플롯은 데이터 인스펙터를 사용하여 볼 수 있습니다. 블록은 시간에 따른 일정한 가속도로 인해 포물선 모양을 따라갑니다.

시뮬레이션이 종료했을 때 단위 상자의 위치는 1.001이므로 변위는 0.5001인데, 이는 예상값인 0.5와 약간 다릅니다. 그 이유는 Gazebo 물리 엔진에서의 오차 때문입니다. 이 오차를 줄이려면 Gazebo 물리 엔진의 최대 스텝 크기를 더 작게 만드십시오.

시간 동기화

연동 시뮬레이션 중에는 언제든지 일시 중지를 사용하여 Simulink와 Gazebo 시뮬레이터를 일시 중지할 수 있습니다.

참고: Gazebo는 시뮬레이션의 시간 스텝 하나 앞에서 일시 중지합니다.

이는 다음과 같은 연동 시뮬레이션 시간 시퀀스 때문입니다.

센서 데이터와 액추에이션 명령은 정확한 시간 스텝에서 교환됩니다. 실행은 Gazebo 스텝을 먼저 실행한 다음 Simulink 스텝을 실행합니다. 시뮬레이션 실행은 여전히 t+1에 있으며, 모델을 재개하기 전까지 Simulink는 이전 스텝 시간에 머무릅니다.

다음 단계