주요 콘텐츠

Gazebo에서 Simulink로 차동 구동 로봇 제어하기

이 예제에서는 Simulink®를 사용하여 Gazebo 연동 시뮬레이션에서 차동 구동 로봇을 제어하는 방법을 보여줍니다. 로봇은 자세와 바퀴 인코더 위치를 읽음으로써 일련의 웨이포인트를 따라가고 이를 구동하기 위한 토크 제어 명령을 생성합니다.

VM 실행하기

Simulink와 Gazebo 간의 연동 시뮬레이션 수행하기의 지침에 따라 Gazebo를 사용하여 가상 머신(VM)을 다운로드합니다.

Gazebo World

이 예제에서는 VM에 제공된 세계인 differentialDriveRobot.world를 디폴트 물리 설정이 있는 간단한 지면 평면으로 사용합니다. 이 세계는 내장된 제어기가 Simulink로부터 제공되는 토크와 경쟁하지 않도록 디폴트 제어기가 제거된 Pioneer 로봇을 사용합니다. Pioneer 로봇은 디폴트 Gazebo 설치 시 사용 가능합니다. Simulink와 Gazebo 간의 연동 시뮬레이션 수행하기에 자세히 설명되어 있듯이 Gazebo 플러그인은 Simulink와의 연결에 필요한 플러그인을 참조합니다.

Gazebo 차동 구동 로봇 아이콘을 더블 클릭합니다.

또는 터미널에서 다음 명령을 실행합니다.

cd /home/user/src/GazeboPlugin/export 
export SVGA_VGPU10=0 
gazebo ../world/differentialDriveRobot.world

Gazebo 시뮬레이터가 열리지 않으면 플러그인을 다시 설치해야 할 수 있습니다. Simulink와 Gazebo 간의 연동 시뮬레이션 수행하기에서 수동으로 Gazebo 플러그인 설치하기 항목을 참조하십시오.

모델 개요

모델을 엽니다.

open_system('GazeboDifferentialDriveControl') 

모델에는 4개 섹션이 있습니다.

  • Gazebo Pacer

  • 센서 데이터 읽기

  • 이동 로봇 제어

  • Gazebo로 액추에이션 데이터 전송

Gazebo Pacer

이 섹션에서는 Gazebo와의 연결을 설정합니다. Gazebo Pacer 블록을 더블 클릭하여 파라미터를 연 다음 Gazebo 네트워크와 시뮬레이션 설정 구성 링크를 클릭합니다. 그러면 대화 상자가 열립니다.

VM의 IP 주소를 지정합니다. 기본적으로 Gazebo는 14581 포트에 연결됩니다. 테스트 버튼을 클릭하여 Gazebo와의 연결을 확인합니다.

테스트에 성공하지 못할 경우 Simulink와 Gazebo 간의 연동 시뮬레이션 수행하기에서 지침을 확인하고 Gazebo가 제대로 구성되었으며 연결된 세계가 실행 중인지 확인합니다.

Gazebo 센서 출력

센서는 Gazebo로부터 읽어온 센서 데이터를 출력하여 적절한 Simulink 블록에 전달합니다. XY 그래프는 현재 로봇 위치를 플로팅하고, 자세 데이터는 시뮬레이션 출력에 저장됩니다.

Read Gazebo Sensors 서브시스템은 로봇 자세 데이터와 바퀴 센서 데이터를 추출합니다. 자세 데이터는 xy 좌표 그리고 방향에 대한, 요소를 4개 가진 쿼터니언입니다. 바퀴 속도는 바퀴가 회전하는 동안 바퀴 위치의 변화 속도를 기반으로 계산됩니다.

이동 로봇 제어

이동 로봇 제어 섹션에서는 일련의 목표 웨이포인트, 현재 자세, 현재 바퀴 속도를 받아 로봇이 웨이포인트를 추적하는 경로를 따르도록 제어하는 데 필요한 바퀴 토크를 출력합니다.

세 가지 주요 컴포넌트가 있습니다.

Pure Pursuit 블록은 현재 주어진 자세에서 고정 속도로 웨이포인트를 따라가는 데 필요한 이동체 속도와 이동체의 방향 각속도를 지정하는 제어기입니다.

Set Wheel Speed MATLAB Function 블록은 차동 구동 로봇 기구학을 사용하여 이동체 속도와 방향 각속도를 다음과 같이 왼쪽 바퀴 속도와 오른쪽 바퀴 속도로 변환합니다.

ϕ˙L=1r(v-d2)

ϕ˙R=1r(v+d2)

ϕ˙Lϕ˙R은 왼쪽 바퀴 속도와 오른쪽 바퀴 속도, v는 이동체 속도, 는 이동체 방향 각속도, d는 차륜 거리, r은 바퀴 반경입니다. 또한 이 MATLAB® Function에는 바퀴 속도를 조절하는 코드도 포함되어 있습니다. Pure Pursuit 블록은 이동 내내 고정 속도를 사용하기 때문에 MATLAB Function 블록 내부에는 if 문이 두 개 있습니다. 첫 번째는 로봇이 특정 거리 임계값 내에 있을 때 목표까지의 거리에 비례하는 속도로 속도를 줄입니다. 두 번째 if 문은 로봇이 좁은 임계값 내에 있을 때 로봇을 멈춥니다. 이를 통해 로봇은 부드럽게 멈출 수 있습니다.

마지막으로 Pioneer Wheel Control 서브시스템은 비례 제어기를 사용하여 원하는 바퀴 속도를 토크로 변환합니다.

액추에이터 토크 명령

모델의 마지막 섹션에서는 제어기에서 생성된 토크 명령을 받아 Gazebo Co-Simulation Library의 블록을 사용하여 Simulink로 보냅니다.

이 블록의 각 서브시스템 내부에서는 조인트 토크를 올바른 조인트에 할당하기 위해 Bus Assignment 블록이 사용됩니다.

예를 들어, 위에 표시된 Left Wheel Gazebo Torque Command 서브시스템 내부에서는 ApplyJointTorque 명령 유형이 포함된 Gazebo 빈 메시지가 버스 유형을 지정하는 데 사용됩니다. Gazebo Select Entity 블록이 모델과 조인트 이름을 제공하며, 이 블록은 Gazebo 세계의 왼쪽 바퀴와 관련된 조인트인 left_wheel_hinge에 연결됩니다. 토크는 전체 스텝 시간인 0.01초 동안 적용되며, 이러한 입력값은 정수로 제공되어야 하기 때문에 나노초 단위로 지정됩니다. 버스의 출력값은 Gazebo Apply Command 블록으로 전달됩니다.

로봇 시뮬레이션하기

모델을 실행하려면 웨이포인트를 초기화하고 샘플 시간을 다음과 같이 설정합니다.

waypoints = [0 0; 4 2; 3 7; -3 6];
sampleTime = 0.01;

재생 버튼을 클릭하거나 sim 명령을 사용하여 모델을 실행합니다. 로봇은 실행 중에 Gazebo 내에서 이동해야 하며, XY 플롯은 Simulink에서 관측된 자세를 업데이트합니다.

Figure는 일련의 웨이포인트와 로봇의 최종 실행 경로를 플로팅합니다.