2024. 9. 27. 15:23ㆍROS2/URDF
1. URDF를 Gazebo에서 로딩하기
아래 명령을 실행해서 'src/urdf_tutorial/urdf/robot_2.xacro' 파일을 'src/urdf_tutorial/urdf/robot_3.xacro'파일로 복사
$ cd ~/ch2_ws
$ cp src/urdf_tutorial/urdf/robot_2.xacro src/urdf_tutorial/urdf/robot_3.xacro
다음은 robot_3.launch.py를 만들고 robot_2.launch.py에서 'robot_2.xacro'를 robot_3.xacro로 바꿔준다.
그 이후 첫 번째 터미널에서 아래 명령을 실행해서 'robot_state_publisher'를 실행
이때 use_sim_time 옵션을 true로 설정해서 simulation mode를 활성화
# Teminal 1
cd ~/ch2_ws
colcon build --symlink-install
source install/setup.bash
ros2 launch urdf_tutorial robot_3.launch.py use_sim_time:=true
# Terminal 2
ros2 launch gazebo_ros gazebo.launch.py
urdf 정보를 읽어오지 못했기 때문에 아무것도 뜨지않는다
ros2 run gazebo_ros spawn_entity.py -topic robot_description -entity with_robot
ROS 2의 /robot_description 토픽에서 로봇 모델을 읽고, Gazebo에 "with_robot"이라는 이름으로 로봇을 생성하는 역할
로봇이 나오게 된다.
여기서 ROS를 실행하고 gazebo를 실행하고 spawn하는 과정이 귀찮기 때문에 이 과정을 하나의 script로 만들어서 한꺼번에 실행할 수 있도록 한다. sim.launch.py를 만들고 아래와 같이 편집
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch_ros.actions import Node
def generate_launch_description():
package_name = "urdf_tutorial"
rsp = IncludeLaunchDescription(
PythonLaunchDescriptionSource(
[os.path.join(get_package_share_directory(package_name), "launch", "robot_3.launch.py")]
),
launch_arguments={"use_sim_time": "true"}.items(),
)
# Include the Gazebo launch file, provided by the gazebo_ros package
gazebo = IncludeLaunchDescription(
PythonLaunchDescriptionSource(
[os.path.join(get_package_share_directory("gazebo_ros"), "launch", "gazebo.launch.py")]
),
)
# Run the spawner node from the gazebo_ros package. The entity name doesn't really matter if you only have a single robot.
spawn_entity = Node(
package="gazebo_ros",
executable="spawn_entity.py",
arguments=["-topic", "robot_description", "-entity", "with_robot"],
output="screen",
)
# Launch them all!
return LaunchDescription(
[
rsp,
gazebo,
spawn_entity,
]
)
robot_3.xacro 파일도 수정하여 gazebo가 색깔을 출력할 수 있도록 함
실행 중인 모든 프로그램을 종료한 뒤 첫 번째 터미널에서 아래 명령을 실행해서 'sim.launch.py'를 실행
cd ~/ch2_ws
colcon build --symlink-install
source install/setup.bash
ros2 launch urdf_tutorial sim.launch.py
이렇게 한번에 나오게 된다!!!!
그 다음 주행을 하기 위한 gazebo 플러그인을 사용한다.
gazebo.xacro파일을 생성 후 아래 내용을 추가한다.
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
<gazebo>
<plugin name="diff_drive" filename="libgazebo_ros_diff_drive.so">
<!-- Wheel Information -->
<left_joint>left_wheel_joint</left_joint>
<right_joint>right_wheel_joint</right_joint>
<wheel_separation>0.35</wheel_separation>
<wheel_diameter>0.1</wheel_diameter>
<!-- Limits -->
<max_wheel_torque>200</max_wheel_torque>
<max_wheel_acceleration>10.0</max_wheel_acceleration>
<!-- Output -->
<odometry_frame>odom</odometry_frame>
<robot_base_frame>base_link</robot_base_frame>
<publish_odom>true</publish_odom>
<publish_odom_tf>true</publish_odom_tf>
<publish_wheel_tf>true</publish_wheel_tf>
</plugin>
</gazebo>
</robot>
그 다음 robot_3.xacro 파일 마지막에 아래 내용을 추가해준다.
<xacro:include filename="gazebo.xacro"/>
저장 후 실행
$ ros2 run teleop_twist_keyboard teleop_twist_keyboard
조인트 유형 | 운동 방식 | 주 사용 예 |
prismatic | 선형 운동 | 자동화 기계, 로봇 팔 조정 |
continuous | 무한 | 로봇 팔 회전, 카메라 팬 |
revolute | 제한된 회전 | 로봇 관절 |
fixed | 고정 | 구조적 연결 |
floating | 6자유도 | 드론 프레임 |
URDF 추가 팁
xacro에 대해 알아보자
urdf파일을 간편하게 만들어주는 도구?라고 생각하면 되는데
예를 들어
<link name="base_link">
<visual>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
<material name="blue"/>
</visual>
<collision>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
</collision>
</link>
이렇게 적어놓으면 실린더의 길이와 반지름을 두 번 지정했다. 그리고 수치를 수정할때 두 번 다 수정을 해줘야한다.
그런데 xacro를 사용하게 되면
<xacro:property name="width" value="0.2" />
<xacro:property name="bodylen" value="0.6" />
<link name="base_link">
<visual>
<geometry>
<cylinder radius="${width}" length="${bodylen}"/>
</geometry>
<material name="blue"/>
</visual>
<collision>
<geometry>
<cylinder radius="${width}" length="${bodylen}"/>
</geometry>
</collision>
</link>
이렇게 위쪽에 값을 정의하면 나중에 수정할때 정의한 부분만 수정해주면 된다.
그리고 정의된 name들은 ${name} 내용을 대체하게 되고 ${}는 다른 텍스트와 결합할 수도 있다.
<xacro:property name=”robotname” value=”marvin” />
<link name=”${robotname}s_leg” />
<link name=”marvins_leg” />
그리고 임의로 복잡한 표현식도 구축할 수 있다.
<cylinder radius="${wheeldiam/2}" length="0.1"/>
<origin xyz="${reflect*(width+.02)} 0 0.25" />
매크로를 매개변수화 하게 되면
<xacro:macro name="default_inertial" params="mass">
<inertial>
<mass value="${mass}" />
<inertia ixx="1e-3" ixy="0.0" ixz="0.0"
iyy="1e-3" iyz="0.0"
izz="1e-3" />
</inertial>
</xacro:macro>
이렇게 되는데 하나의 블록이라고 생각하면 된다.
코드와 함께 사용하면 아래와 같이 된다.
<xacro:macro name="blue_shape" params="name *shape">
<link name="${name}">
<visual>
<geometry>
<xacro:insert_block name="shape" />
</geometry>
<material name="blue"/>
</visual>
<collision>
<geometry>
<xacro:insert_block name="shape" />
</geometry>
</collision>
</link>
</xacro:macro>
<xacro:blue_shape name="base_link">
<cylinder radius=".42" length=".01" />
</xacro:blue_shape>
- 블록 매개변수를 지정하려면 매개변수 이름 앞에 별표를 포함한다
- insert_block 명령을 사용하여 블록을 삽일할 수 있다.
- 원하는 만큼 블록을 삽입
'ROS2 > URDF' 카테고리의 다른 글
ROS2 URDF(4) (0) | 2024.10.04 |
---|---|
ROS2 URDF(3) (0) | 2024.09.30 |
ROS2 6일차(1) URDF (0) | 2024.09.27 |
ROS2 5일차(2) URDF (0) | 2024.09.26 |
ROS2 5일차(1) URDF (0) | 2024.09.26 |