일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 강화학습
- 카트폴
- 딥러닝
- JavaScript
- pandas
- 리액트네이티브
- App
- python
- expo
- 데이터분석
- FirebaseV9
- kaggle
- 조코딩
- 강화학습 기초
- 크롤링
- React
- 머신러닝
- Ros
- ReactNative
- TeachagleMachine
- 전국국밥
- clone coding
- 앱개발
- 정치인
- redux
- 클론코딩
- Instagrame clone
- selenium
- 사이드프로젝트
- coding
- Today
- Total
qcoding
2)[turtlebot 코드정리] slam 코드 정리 본문
* 저번글에서 gazebo를 통해 실제 모델과 환경을 불러왔으며, 이번에는 지도 작성을 위하여 Slam 코드를 정리해본다.
저번 글에서 gazebo를 통해서 시뮬레이션 상에 실제 모델을 불러왔다. gazeobo 모델만 사용한 뒤 rag_graph를 통해서 topic 및 node를 확인하면 아래와 같다.
여기서 topic 내용을 살펴보면 아래와 같다. 여기서 보면 gazebo 여러 센서값들을 보내주고 있는 것을 볼 수 있다. 또한 실제 시뮬레이션 상에서 로봇이 움직이기 위해서 속도지령값을 구독하고 있다.
// cmd_vel
-> 명령을 받는 지령값
opic info /cmd_vel
Type: geometry_msgs/Twist
Publishers: None
Subscribers:
* /gazebo (http://localhost:36543/)
// odom
-> gazebo에서 로봇의 위치를 확인하는 odometry
opic info /odom
Type: nav_msgs/Odometry
Publishers:
* /gazebo (http://localhost:36543/)
Subscribers: None
// imu
-> imu (관성센서) 값
opic info /imu
Type: sensor_msgs/Imu
Publishers:
* /gazebo (http://localhost:36543/)
Subscribers: None
// scan
-> lidar를 통한 laserScan값
opic info /scan
Type: sensor_msgs/LaserScan
Publishers:
* /gazebo (http://localhost:36543/)
Subscribers: None
//tf
-> transfomation 값
opic info /tf
Type: tf2_msgs/TFMessage
Publishers:
* /gazebo (http://localhost:36543/)
Subscribers: None
결국 gazebo는 여러 센서값들을 실제 동작할 수 있도록 수행해주는 시뮬레이션 환경이라는 것을 다시한번 확인할 수 있다.
이제 slam을 통해서 지도 작성하는 것을 살펴보도록 하자.
1) 코드실행
// turtlebot에서는 기본적으로 slam 방법 중 gmapping 방법을 사용하고 있다.
roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping
2) 실행 파일 정리
-> gazebo와 마찬가지로 roscd를 통해서 turtlebot3_slam 패키지로 들어가서 실행파일 들을 확인하도록 하자
실행파일을 확인하면 launch 폴더에서 실행파일이 들어있다고 생각할 수 있으며, bag은 센서데이터를 저장할 수 있는 폴더이며, riviz는 센서값들과 로봇의 지도생성을 시각화할 수 있는 tool이라고 생각하면 된다.
launch 폴더로 들어가서 turtlebot3_slam.launch 파일을 확인해 보도록 하자.
<launch>
<!-- Arguments -->
<arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
<arg name="slam_methods" default="gmapping" doc="slam type [gmapping, cartographer, hector, karto, frontier_exploration]"/>
<arg name="configuration_basename" default="turtlebot3_lds_2d.lua"/>
<arg name="open_rviz" default="true"/>
<!-- TurtleBot3 -->
<include file="$(find turtlebot3_bringup)/launch/turtlebot3_remote.launch">
<arg name="model" value="$(arg model)" />
</include>
<!-- SLAM: Gmapping, Cartographer, Hector, Karto, Frontier_exploration, RTAB-Map -->
<include file="$(find turtlebot3_slam)/launch/turtlebot3_$(arg slam_methods).launch">
<arg name="model" value="$(arg model)"/>
<arg name="configuration_basename" value="$(arg configuration_basename)"/>
</include>
<!-- rviz -->
<group if="$(arg open_rviz)">
<node pkg="rviz" type="rviz" name="rviz" required="true"
args="-d $(find turtlebot3_slam)/rviz/turtlebot3_$(arg slam_methods).rviz"/>
</group>
</launch>
위에서 크게 보면 3가지의 형태의 파일이 실행된다.
1) turtlebot3_remote.launch 파일로 arg는 model 이름을 받고 있다.
2) turtlebot3_$(arg slam_methods).launch 파일로 여기서는 gmapping 을 사용하고 있으며, arg로는 model명과 lua 파일을 받는 데, lua 파일은 정확히는 모르겠지만 slam 시 사용되는 parameter를 변경할 수 있는 파일로 생각된다.
3) riviz 패키지가 실행되며, slam 방법에 따라 각각 다른 rviz 파일이 생성되는 것을 볼수있다.
우선 remote.launch 파일부터 순서대로 확인해보자.
2-1) turtlebot3_remote.launch
-> 아래 주석을 보면 이해가 가겠지만 결국 remote 파일은 urdf파일을 불러와서 robot_state_publisher가 사용하여 tf를 발행하기 위함이다.
<launch>
<arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
<arg name="multi_robot_name" default=""/>
// description 파일 내용은 아래에 있으며, 해당 역활은 urdf파일을 불러오는 것
// roslaunch description.launch.xml model:=waffle로 실행가능한 파일임.
<include file="$(find turtlebot3_bringup)/launch/includes/description.launch.xml">
<arg name="model" value="$(arg model)" />
</include>
// robot_state_publisher의 역활은 tf을 생성해 주는 것으로 위의 파일에서 desciprtion.launch.xml을 보면
// robot_description 값에 urdf_file을 넣어주는데 이는 robot_state_publihser가 이값을 사용하기 때문이다.
// 즉 urdf 파일을 사용하여 tf 값을 생성한다고 생각하면된다.
<node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher">
<param name="publish_frequency" type="double" value="50.0" />
<param name="tf_prefix" value="$(arg multi_robot_name)"/>
</node>
</launch>
// description.launch.xml 파일
// 여기서 로봇에 대한 urdf 파일을 가져온다.
// urdf 파일에는 좌표게에 대한 정의가 되어 있다.
// 여기서 보면 결국 urdf_file을 불러와서 robot_description에 넣어주는 데 이는 robot_state_publisher가 실행될때
// robot_description을 사용하기 떄문이다.
<launch>
<arg name="model"/>
<arg name="urdf_file" default="$(find xacro)/xacro --inorder '$(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro'" />
<param name="robot_description" command="$(arg urdf_file)" />
</launch>
* 참고로 waffle urdf 파일의 코드를 넣는다. 여기서 관심있게 보는 부분은 <link>이며 이는 각각의 tf 좌표계를 의미하며,
base_footprint -> base_link -> wheel_left_joint / wheel_right_joint
-> imu_link / base_scan / camera_link 로 구성되어 있다.
<?xml version="1.0" ?>
<robot name="turtlebot3_waffle" xmlns:xacro="http://ros.org/wiki/xacro">
<xacro:include filename="$(find turtlebot3_description)/urdf/common_properties.xacro"/>
<xacro:include filename="$(find turtlebot3_description)/urdf/turtlebot3_waffle.gazebo.xacro"/>
<xacro:property name="r200_cam_rgb_px" value="0.005"/>
<xacro:property name="r200_cam_rgb_py" value="0.018"/>
<xacro:property name="r200_cam_rgb_pz" value="0.013"/>
<xacro:property name="r200_cam_depth_offset" value="0.01"/>
<link name="base_footprint"/>
<joint name="base_joint" type="fixed">
<parent link="base_footprint"/>
<child link="base_link" />
<origin xyz="0 0 0.010" rpy="0 0 0"/>
</joint>
<link name="base_link">
<visual>
<origin xyz="-0.064 0 0.0" rpy="0 0 0"/>
<geometry>
<mesh filename="package://turtlebot3_description/meshes/bases/waffle_base.stl" scale="0.001 0.001 0.001"/>
</geometry>
<material name="light_black"/>
</visual>
<collision>
<origin xyz="-0.064 0 0.047" rpy="0 0 0"/>
<geometry>
<box size="0.266 0.266 0.094"/>
</geometry>
</collision>
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="1.3729096e+00"/>
<inertia ixx="8.7002718e-03" ixy="-4.7576583e-05" ixz="1.1160499e-04"
iyy="8.6195418e-03" iyz="-3.5422299e-06"
izz="1.4612727e-02" />
</inertial>
</link>
<joint name="wheel_left_joint" type="continuous">
<parent link="base_link"/>
<child link="wheel_left_link"/>
<origin xyz="0.0 0.144 0.023" rpy="-1.57 0 0"/>
<axis xyz="0 0 1"/>
</joint>
<link name="wheel_left_link">
<visual>
<origin xyz="0 0 0" rpy="1.57 0 0"/>
<geometry>
<mesh filename="package://turtlebot3_description/meshes/wheels/left_tire.stl" scale="0.001 0.001 0.001"/>
</geometry>
<material name="dark"/>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.018" radius="0.033"/>
</geometry>
</collision>
<inertial>
<origin xyz="0 0 0" />
<mass value="2.8498940e-02" />
<inertia ixx="1.1175580e-05" ixy="-4.2369783e-11" ixz="-5.9381719e-09"
iyy="1.1192413e-05" iyz="-1.4400107e-11"
izz="2.0712558e-05" />
</inertial>
</link>
<joint name="wheel_right_joint" type="continuous">
<parent link="base_link"/>
<child link="wheel_right_link"/>
<origin xyz="0.0 -0.144 0.023" rpy="-1.57 0 0"/>
<axis xyz="0 0 1"/>
</joint>
<link name="wheel_right_link">
<visual>
<origin xyz="0 0 0" rpy="1.57 0 0"/>
<geometry>
<mesh filename="package://turtlebot3_description/meshes/wheels/right_tire.stl" scale="0.001 0.001 0.001"/>
</geometry>
<material name="dark"/>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.018" radius="0.033"/>
</geometry>
</collision>
<inertial>
<origin xyz="0 0 0" />
<mass value="2.8498940e-02" />
<inertia ixx="1.1175580e-05" ixy="-4.2369783e-11" ixz="-5.9381719e-09"
iyy="1.1192413e-05" iyz="-1.4400107e-11"
izz="2.0712558e-05" />
</inertial>
</link>
<joint name="caster_back_right_joint" type="fixed">
<parent link="base_link"/>
<child link="caster_back_right_link"/>
<origin xyz="-0.177 -0.064 -0.004" rpy="-1.57 0 0"/>
</joint>
<link name="caster_back_right_link">
<collision>
<origin xyz="0 0.001 0" rpy="0 0 0"/>
<geometry>
<box size="0.030 0.009 0.020"/>
</geometry>
</collision>
<inertial>
<origin xyz="0 0 0" />
<mass value="0.005" />
<inertia ixx="0.001" ixy="0.0" ixz="0.0"
iyy="0.001" iyz="0.0"
izz="0.001" />
</inertial>
</link>
<joint name="caster_back_left_joint" type="fixed">
<parent link="base_link"/>
<child link="caster_back_left_link"/>
<origin xyz="-0.177 0.064 -0.004" rpy="-1.57 0 0"/>
</joint>
<link name="caster_back_left_link">
<collision>
<origin xyz="0 0.001 0" rpy="0 0 0"/>
<geometry>
<box size="0.030 0.009 0.020"/>
</geometry>
</collision>
<inertial>
<origin xyz="0 0 0" />
<mass value="0.005" />
<inertia ixx="0.001" ixy="0.0" ixz="0.0"
iyy="0.001" iyz="0.0"
izz="0.001" />
</inertial>
</link>
<joint name="imu_joint" type="fixed">
<parent link="base_link"/>
<child link="imu_link"/>
<origin xyz="0.0 0 0.068" rpy="0 0 0"/>
</joint>
<link name="imu_link"/>
<joint name="scan_joint" type="fixed">
<parent link="base_link"/>
<child link="base_scan"/>
<origin xyz="-0.064 0 0.122" rpy="0 0 0"/>
</joint>
<link name="base_scan">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<mesh filename="package://turtlebot3_description/meshes/sensors/lds.stl" scale="0.001 0.001 0.001"/>
</geometry>
<material name="dark"/>
</visual>
<collision>
<origin xyz="0.015 0 -0.0065" rpy="0 0 0"/>
<geometry>
<cylinder length="0.0315" radius="0.055"/>
</geometry>
</collision>
<inertial>
<mass value="0.114" />
<origin xyz="0 0 0" />
<inertia ixx="0.001" ixy="0.0" ixz="0.0"
iyy="0.001" iyz="0.0"
izz="0.001" />
</inertial>
</link>
<joint name="camera_joint" type="fixed">
<origin xyz="0.064 -0.065 0.094" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="camera_link"/>
</joint>
<link name="camera_link">
<visual>
<origin xyz="0 0 0" rpy="1.57 0 1.57"/>
<geometry>
<mesh filename="package://turtlebot3_description/meshes/sensors/r200.dae" />
</geometry>
</visual>
<collision>
<origin xyz="0.003 0.065 0.007" rpy="0 0 0"/>
<geometry>
<box size="0.012 0.132 0.020"/>
</geometry>
</collision>
<!-- This inertial field needs doesn't contain reliable data!! -->
<!-- <inertial>
<mass value="0.564" />
<origin xyz="0 0 0" />
<inertia ixx="0.003881243" ixy="0.0" ixz="0.0"
iyy="0.000498940" iyz="0.0"
izz="0.003879257" />
</inertial>-->
</link>
<joint name="camera_rgb_joint" type="fixed">
<origin xyz="${r200_cam_rgb_px} ${r200_cam_rgb_py} ${r200_cam_rgb_pz}" rpy="0 0 0"/>
<parent link="camera_link"/>
<child link="camera_rgb_frame"/>
</joint>
<link name="camera_rgb_frame"/>
<joint name="camera_rgb_optical_joint" type="fixed">
<origin xyz="0 0 0" rpy="-1.57 0 -1.57"/>
<parent link="camera_rgb_frame"/>
<child link="camera_rgb_optical_frame"/>
</joint>
<link name="camera_rgb_optical_frame"/>
<joint name="camera_depth_joint" type="fixed">
<origin xyz="${r200_cam_rgb_px} ${r200_cam_rgb_py + r200_cam_depth_offset} ${r200_cam_rgb_pz}" rpy="0 0 0"/>
<parent link="camera_link"/>
<child link="camera_depth_frame"/>
</joint>
<link name="camera_depth_frame"/>
<joint name="camera_depth_optical_joint" type="fixed">
<origin xyz="0 0 0" rpy="-1.57 0 -1.57"/>
<parent link="camera_depth_frame"/>
<child link="camera_depth_optical_frame"/>
</joint>
<link name="camera_depth_optical_frame"/>
</robot>
2-2) turtlebot3_$(arg slam_methods).launch 여기서는 gmapping사용
-> 여기서는 직접적으로 gamming 패키지를 실행시킨다. arg로는 base_frame / odom_frame/ map_frame을 설정하고 이는 각각 gammping 패키지로 들어가게 되며, gamming parameter는 gmapping_params.yaml 을 통해 불러오게 된다.
직접적으로 gmapping 패키지 내용은 다루지 않으며 필요시 roscd gmapping으로 들어가서 확인하면 될 듯하다.
<launch>
<!-- Arguments -->
<arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
<arg name="configuration_basename" default="turtlebot3_lds_2d.lua"/>
<arg name="set_base_frame" default="base_footprint"/>
<arg name="set_odom_frame" default="odom"/>
<arg name="set_map_frame" default="map"/>
<!-- Gmapping -->
<node pkg="gmapping" type="slam_gmapping" name="turtlebot3_slam_gmapping" output="screen">
<param name="base_frame" value="$(arg set_base_frame)"/>
<param name="odom_frame" value="$(arg set_odom_frame)"/>
<param name="map_frame" value="$(arg set_map_frame)"/>
<rosparam command="load" file="$(find turtlebot3_slam)/config/gmapping_params.yaml" />
</node>
</launch>
아래의 params는 gmapping 수행 시 필요한 parameter로 적절하게 튜닝하려면 공식가이드를 확인 후 사용자에 맞게 설정하면 된다.
//gmapping_params.yaml
map_update_interval: 2.0
maxUrange: 3.0
sigma: 0.05
kernelSize: 1
lstep: 0.05
astep: 0.05
iterations: 5
lsigma: 0.075
ogain: 3.0
lskip: 0
minimumScore: 50
srr: 0.1
srt: 0.2
str: 0.1
stt: 0.2
linearUpdate: 1.0
angularUpdate: 0.2
temporalUpdate: 0.5
resampleThreshold: 0.5
particles: 100
xmin: -10.0
ymin: -10.0
xmax: 10.0
ymax: 10.0
delta: 0.05
llsamplerange: 0.01
llsamplestep: 0.01
lasamplerange: 0.005
lasamplestep: 0.005
2-3) turtlebot3_$(arg slam_methods).rviz 파일
-> rviz 파일의 설정을 하는 부분으로 rivz 실행시에 어떤 값들을 확인할 것인지에 대한 정보이다. 처음 설정을 잘해놓으면 좋지만 안되는 부분이 있어서 riviz환경에서 수동으로 변경할 수도 있다. Link에 대해서 보면 위에서 말한 urdf에 들어간 tf frame과 동일한 것을 볼 수 있다.
Panels:
- Class: rviz/Displays
Help Height: 78
Name: Displays
Property Tree Widget:
Expanded:
- /TF1/Frames1
- /Map1
Splitter Ratio: 0.594406009
Tree Height: 715
- Class: rviz/Selection
Name: Selection
- Class: rviz/Tool Properties
Expanded:
- /2D Pose Estimate1
- /2D Nav Goal1
- /Publish Point1
Name: Tool Properties
Splitter Ratio: 0.588679016
- Class: rviz/Views
Expanded:
- /Current View1
Name: Views
Splitter Ratio: 0.5
- Class: rviz/Time
Experimental: false
Name: Time
SyncMode: 0
SyncSource: LaserScan
Visualization Manager:
Class: ""
Displays:
- Alpha: 0.5
Cell Size: 1
Class: rviz/Grid
Color: 160; 160; 164
Enabled: true
Line Style:
Line Width: 0.0299999993
Value: Lines
Name: Grid
Normal Cell Count: 0
Offset:
X: 0
Y: 0
Z: 0
Plane: XY
Plane Cell Count: 100
Reference Frame: map
Value: true
- Alpha: 1
Class: rviz/RobotModel
Collision Enabled: false
Enabled: true
Links:
All Links Enabled: true
Expand Joint Details: false
Expand Link Details: false
Expand Tree: false
Link Tree Style: Links in Alphabetic Order
base_footprint:
Alpha: 1
Show Axes: false
Show Trail: false
base_link:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
base_scan:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
caster_back_link:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
imu_link:
Alpha: 1
Show Axes: false
Show Trail: false
wheel_left_link:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
wheel_right_link:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
Name: RobotModel
Robot Description: robot_description
TF Prefix: ""
Update Interval: 0
Value: true
Visual Enabled: true
- Class: rviz/TF
Enabled: false
Frame Timeout: 15
Frames:
All Enabled: true
Marker Scale: 1
Name: TF
Show Arrows: true
Show Axes: true
Show Names: true
Tree:
{}
Update Interval: 0
Value: false
- Alpha: 1
Autocompute Intensity Bounds: true
Autocompute Value Bounds:
Max Value: 10
Min Value: -10
Value: true
Axis: Z
Channel Name: intensity
Class: rviz/LaserScan
Color: 0; 255; 0
Color Transformer: FlatColor
Decay Time: 0
Enabled: true
Invert Rainbow: false
Max Color: 255; 255; 255
Max Intensity: 11799
Min Color: 0; 0; 0
Min Intensity: 0
Name: LaserScan
Position Transformer: XYZ
Queue Size: 10
Selectable: true
Size (Pixels): 3
Size (m): 0.0300000007
Style: Flat Squares
Topic: /scan
Unreliable: false
Use Fixed Frame: true
Use rainbow: true
Value: true
- Class: rviz/Image
Enabled: false
Image Topic: /raspicam_node/image
Max Value: 1
Median window: 5
Min Value: 0
Name: Image
Normalize Range: true
Queue Size: 2
Transport Hint: compressed
Unreliable: false
Value: false
- Alpha: 0.699999988
Class: rviz/Map
Color Scheme: map
Draw Behind: false
Enabled: true
Name: Map
Topic: /map
Unreliable: false
Use Timestamp: false
Value: true
Enabled: true
Global Options:
Background Color: 48; 48; 48
Default Light: true
Fixed Frame: map
Frame Rate: 30
Name: root
Tools:
- Class: rviz/Interact
Hide Inactive Objects: true
- Class: rviz/MoveCamera
- Class: rviz/Select
- Class: rviz/FocusCamera
- Class: rviz/Measure
- Class: rviz/SetInitialPose
Topic: /initialpose
- Class: rviz/SetGoal
Topic: /move_base_simple/goal
- Class: rviz/PublishPoint
Single click: true
Topic: /clicked_point
Value: true
Views:
Current:
Angle: -1.57079637
Class: rviz/TopDownOrtho
Enable Stereo Rendering:
Stereo Eye Separation: 0.0599999987
Stereo Focal Distance: 1
Swap Stereo Eyes: false
Value: false
Invert Z Axis: false
Name: Current View
Near Clip Distance: 0.00999999978
Scale: 100
Target Frame: map
Value: TopDownOrtho (rviz)
X: 0
Y: 0
Saved: ~
Window Geometry:
Displays:
collapsed: false
Height: 1027
Hide Left Dock: false
Hide Right Dock: true
Image:
collapsed: false
QMainWindow State: 000000ff00000000fd00000004000000000000016a0000035cfc0200000009fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006600fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c00610079007301000000430000035c000000df00fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000a0049006d006100670065000000020f000001900000001800ffffff000000010000010f0000035cfc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a0056006900650077007300000000430000035c000000b800fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000004ff0000003efc0100000002fb0000000800540069006d00650100000000000004ff0000022400fffffffb0000000800540069006d006501000000000000045000000000000000000000038f0000035c00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
Selection:
collapsed: false
Time:
collapsed: false
Tool Properties:
collapsed: false
Views:
collapsed: true
Width: 1279
X: 0
Y: 0
3) 실행화면
-> 실행을 시키면 아래와 같은 화면이 되며 지도를 생성하기 위해 로봇을 움직여야 한다. 아래의 파일을 실행시켜서 지도를 작성하면 된다.
// 수동조작
-control launch
roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
// 자동주행
roslaunch turtlebot3_gazebo turtlebot3_simulation.launch
'Ros' 카테고리의 다른 글
[Ros Web] rosapi를 활용한 Topic /Node List 받아오기 #3 (6) | 2022.05.13 |
---|---|
[Ros Web] Roslib , Ros2djs를 활용한 web interface 만들기 #2 코드설명 (0) | 2022.05.12 |
[Ros Web] Roslib , Ros2djs를 활용한 web interface 만들기 #1 전체코드 (4) | 2022.05.12 |
3)[turtlebot_코드정리] navigation (0) | 2022.02.24 |
1) [Turtlebot3 코드정리]gazebo를 통한 시뮬레이션 환경 (0) | 2022.02.24 |