ROS2 1일차 Gazebo 월드 생성 및 모델

2024. 9. 19. 15:38ROS2/기초

모델 불러오기

git clone http://github.com/osrf/gazebo_models

1. /.gazebo/models 폴더에 model 파일 옮김

 

Models 구조

1. model.config

2. model.sdf (structure, physical informations ...)

  • pose (X Y Z R P Y) : 설치 될 때 위치(자동 생성 시)
  • static (true or false) : true는 고정 false는 움직임
  • link(inertial, collision, visual)
  • inertial: 모델의 물리적 성질(질량과 관성)을 정의합니다.
  • collision: 모델의 물리적 충돌 영역을 정의하여 시뮬레이션 중 충돌을 처리합니다.
  • visual: 모델의 시각적 외관을 정의하여 시뮬레이션에서 모델이 어떻게 보일지를 결정합니다.

Gazebo ROS 2 통합 패키지 설치

1. ros2는 ros1과 다르게 통합 패키지 설치가 필요함

sudo apt update
sudo apt install ros-foxy-gazebo-ros-pkgs

 

2. 환경 설정 (패키지 설치 후, ros2 환경 설정 파일을 소스하여 패키지 경로가 제대로 설정되었는지 확인)

source /opt/ros/foxy/setup.bash

 

3. 설치 확인

ros2 pkg list | grep gazebo_ros

 

Gazebo 및 Gazebo ROS 패키지 실행

1. Gazebo 서버와 클라이언트 실행

ros2 launch gazebo_ros gzserver.launch.py
ros2 launch gazebo_ros gzclient.launch.py

 

 

2. spawn_entity 서비스를 사용하여 모델 스폰

 

ROS2에서는 spawn_entity.py 스크립트를 사용하여 Gazebo에 모델 스폰 가능 gazebo_ros 패키지에 포함되어 있으며,

터미널에서 서비스 호출을 통해 모델을 스폰할 수 있음

ros2 run gazebo_ros spawn_entity.py -file /path/to/your/model.sdf -entity my_model -x 1 -y 2 -z 0.5

 

각 옵션 설명:

  • -file /path/to/your/model.sdf: 스폰할 모델의 SDF 파일 경로입니다.
  • -entity my_model: 스폰할 모델의 이름입니다.
  • -x 1 -y 2 -z 0.5: 모델이 스폰될 좌표입니다. (따로 지정하지 않으면 sdf내부에 있는 좌표로 생성)

박스 모델 생성

cd ~/abc_ws/src/studying_gazebo
mkdir -p models/box_model
cd models/box_model
touch model.config
touch model.sdf

 

1. model.config

<?xml version="1.0"?>

<model>
    <name>Box Model</name>
    <version>1.0</version>
    <sdf version="1.6">model.sdf</sdf>

    <author>
        <name>ch</name>
        <email>abc@gmail.com</email>
    </author>

    <description>
        A simple box model
    </description>
</model>

 

2. model.sdf

<?xml version='1.0'?>
<sdf version="1.4">
    <model name="box_model">
        <pose>0 0 0.5 0 0 0</pose>
        <static>false</static>
        <link name="link">
            <inertial>
                <mass>1.0</mass>
                <inertia>
                    <ixx>0.083</ixx>
                    <ixy>0.0</ixy>
                    <ixz>0.0</ixz>
                    <iyy>0.083</iyy>
                    <iyz>0.0</iyz>
                    <izz>0.083</izz>
                </inertia>
            </inertial>
            <collision name="collision">
                <geometry>
                    <box>
                        <size>1 1 1</size>
                    </box>
                </geometry>
            </collision>
            <visual name="visual1">
                <geometry>
                    <box>
                        <size>1 1 1</size>
                    </box>
                </geometry>
            </visual>
        </link>
    </model>
</sdf>

 

이후 마우스로 불러오고 싶으면 Gazebo insert > add path > 폴더 추가

 

collision 설정했을때와 하지 않았을때 차이

<?xml version='1.0'?>
<sdf version="1.4">
    <model name="box_model">
        <pose>0 0 0.5 0 0 0</pose>
        <static>false</static>
        <link name="link">
            <inertial>
                <mass>1.0</mass>
                <inertia>
                    <ixx>0.083</ixx>
                    <ixy>0.0</ixy>
                    <ixz>0.0</ixz>
                    <iyy>0.083</iyy>
                    <iyz>0.0</iyz>
                    <izz>0.083</izz>
                </inertia>
            </inertial>
            <collision name="collision">
                <geometry>
                    <box>
                        <size>1 1 1</size>
                    </box>
                </geometry>
            </collision>
            <visual name="visual1">
                <geometry>
                    <box>
                        <size>1 1 1</size>
                    </box>
                </geometry>
            </visual>
            <visual name="visual2">
                <pose>0 0 1 0 0 0</pose>
                <geometry>
                    <cylinder>
                        <radius>0.25</radius>
                        <length>1.5</length>
                    </cylinder>
                </geometry>
            </visual>
        </link>
    </model>
</sdf>

위 코드는 박스위에 원기둥을 생성하고 박스는 collision을 true하고 원기둥은 false 설정

view탭에서 collision을 체크하면 바닥과 박스까지 주황색이 됨.

그리고 다른 물체 생성시 원기둥은 통과하지만 박스는 충돌이 일어남

 

 

'ROS2 > 기초' 카테고리의 다른 글

ROS2 2일차(5) tf2  (0) 2024.09.20
ROS2 2일차(4) topic 프로그래밍  (0) 2024.09.20
ROS2 2일차(3) topic  (0) 2024.09.20
ROS2 2일차(2) launch  (0) 2024.09.20
ROS2 2일차(1) node  (0) 2024.09.20