ROS 시뮬레이션 환경에서 자율 주행 실현

자율 주행 차 실습 (자율 주행 차 실습 ) 튜토리얼을 읽은 후 많은 친구들이 자율 주행 차를 배울 때 실험에 적합한 ROS 로봇 섀시가 없었고, 실습 운영 기회가 부족하고, 깊이 배우지 못했다는 메시지를 남겼습니다. . 섀시 문제에 대해서는 메카 넘 휠 섀시 제작에 대한 튜토리얼도 공유했으며, 재료가있는 학생들은 (ROS 메카 넘 휠 섀시 생산)을 참조 할 수 있습니다 .
섀시 문제를 해결하는 또 다른 방법이 있습니다. 우리는 ROS에서 제공하는 시뮬레이션 환경을 통해이 자율 주행 차량의 프레임 워크를 이해할 수 있습니다. ROS에는 pr2, turtlebot, turtlebot3 및 기타 로봇과 같은 많은 로봇 시뮬레이션 모델이 있습니다. 환경에는 전망대와 무대가 포함됩니다. 그런 다음 일부 친구는 다음과 같이 질문 할 수 있습니다. 시뮬레이션 환경에서 로봇을 제어하는 ​​것과 실제 로봇간에 큰 차이가 있습니까? ROS에서 제공하는 시뮬레이션 로봇 모델은 실제 로봇과 거의 다르지 않아 기본적으로 시뮬레이션 환경의 효과를 얻을 수 있습니다. 더 나은 라이더를 사용하면 매핑 효과가 더 좋을 수 있습니다. 자율 주행 차의 틀을 이해할 때 실제 로봇이 작동하지 않는 문제를 해결하기 위해. 우리는 Turtlebot의 시뮬레이션 모델을 사용하여 자동차의 자율 내비게이션을 실현하는 방법에 대한 자습서를 작성했습니다.

실제 ROS 섀시에는 세 가지 주요 기능이 있습니다.

  • 1. "/ cmd_vel"주제에 대한 제어 데이터 수신
  • 2. odom 주행 데이터 게시
  • 3. 라이더 또는 비전 카메라의 데이터 / 스캔 제공

따라서 시뮬레이션 환경에서 로봇을 사용하여 "/ cmd_vel"토픽 데이터를 수신하고, 시뮬레이션 환경에서 로봇 움직임을 제어하고, 시뮬레이션 로봇이 공개 한 odom 주행 토픽 및 라이더 데이터를 수신하는 한 시뮬레이션 모델을 사용하여 "대체"할 수 있습니다. 실제 로봇.

아이디어를 설명한 후 실제 운영 링크 (시스템 환경 Ubuntu 1604 + ROS Kinect 코드 )를 시작합니다.

1. Turtlebot 스테이지 시뮬레이션 환경

ROS에서 일반적으로 사용되는 시뮬레이션 환경에는 gazebo와 stage의 두 가지 종류가 있습니다. Gazebo는 더 강력하지만 가상 머신에서 원활하게 실행되지 않습니다. 여기에서는 먼저 자율 주행 차의 각 링크를 구성하기위한 무대 시뮬레이션 환경의 사용을 단계별로 소개하고, 두 번째 부분에서는 가제보를 사용하여 시뮬레이션하는 방법을 소개합니다.

1.1 무대 환경 설치

먼저 다음 명령 줄을 통해 종속성을 설치하고 실행합니다.

sudo apt-get install ros-kinetic-turtlebot-gazebo
sudo apt-get install ros-kinetic-turtlebot-simulator

설치가 완료되면 다음 명령을 사용하여 터틀 봇 스테이지 시뮬레이션 환경을 시작하고 먼저 직관적으로 스테이지 시뮬레이션 환경과 자율 탐색 기능을 느낍니다.

 roslaunch turtlebot_stage turtlebot_in_stage.launch

스테이지 시뮬레이션을 시작하면 다음 인터페이스가 표시됩니다.
여기에 사진 설명 삽입
하나는 익숙한 RVIZ 인터페이스이고 다른 하나는 터틀 봇 스테이지 시뮬레이션 환경입니다. 2D 투시가 마음에 들지 않으면 스테이지 창에서 뷰-> 투시 카메라를 선택할 수 있습니다. 화각이 3D로 전환됩니다.

여기에 사진 설명 삽입
RVIZ에서 "2D Nav Goal"을 클릭하고 자동차가이 지점까지 자동으로 달릴 수 있도록 목표 지점을 설정합니다 ( HD )

거북이


이제이 별도의 구성 단계 노드, gmapping 매핑 노드 및 탐색 노드를 살펴 보겠습니다. 실제로 이러한 내용은 turtlebot_stage 패키지의 turtlebot_in_stage.launch 파일에 설명되어 있으며 시작 파일을 직접 볼 수도 있습니다.

1.2 Turtlebot 시뮬레이션 환경의 gmapping 매핑

1 catkin_ws / src 디렉토리에 실험 파일을 저장할 패키지를 만듭니다.

catkin_create_pkg my_turtlebot_nav roscpp rospy std_msgs
cd my_turtlebot_nav 
mkdir launch
cd launch

2 다음으로 시작 폴더 아래에 "turtlebot_stage.launch"라는 파일을 만들고 다음 내용을 채 웁니다.

<?xml version="1.0"?>
<launch>
  <arg name="base"       default="$(optenv TURTLEBOT_BASE kobuki)"/>  <!-- create, rhoomba -->
  <arg name="stacks"     default="$(optenv TURTLEBOT_STACKS hexagons)"/>  <!-- circles, hexagons -->
  <arg name="3d_sensor"  default="$(optenv TURTLEBOT_3D_SENSOR kinect)"/>  <!-- kinect, asus_xtion_pro -->

  <!-- Name of the map to use (without path nor extension) and initial position -->
  <arg name="map_file"       default=" $(env TURTLEBOT_STAGE_MAP_FILE)"/> <!-- robopark_plan -->
  <arg name="world_file"     default=" $(env TURTLEBOT_STAGE_WORLD_FILE)"/>
  <arg name="initial_pose_x" default="2.0"/>
  <arg name="initial_pose_y" default="2.0"/>
  <arg name="initial_pose_a" default="0.0"/>

  <param name="/use_sim_time" value="true"/>

  <!--  ******************** Stage ********************  -->
  <node pkg="stage_ros" type="stageros" name="stageros" args="$(arg world_file)">
    <param name="base_watchdog_timeout" value="0.5"/>
    <remap from="odom" to="odom"/>
    <remap from="base_pose_ground_truth" to="base_pose_ground_truth"/>
    <remap from="cmd_vel" to="mobile_base/commands/velocity"/>
    <remap from="base_scan" to="scan"/>
  </node>

  <!--  ***************** Robot Model *****************  -->
  <include file="$(find turtlebot_bringup)/launch/includes/robot.launch.xml">
    <arg name="base" value="$(arg base)" />
    <arg name="stacks" value="$(arg stacks)" />
    <arg name="3d_sensor" value="$(arg 3d_sensor)" />
  </include>
  <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher">
    <param name="use_gui" value="true"/>
  </node>

  <!-- Command Velocity multiplexer -->
  <node pkg="nodelet" type="nodelet" name="mobile_base_nodelet_manager" args="manager"/>
  <node pkg="nodelet" type="nodelet" name="cmd_vel_mux" args="load yocs_cmd_vel_mux/CmdVelMuxNodelet mobile_base_nodelet_manager">
    <param name="yaml_cfg_file" value="$(find turtlebot_bringup)/param/mux.yaml"/>
    <remap from="cmd_vel_mux/output" to="mobile_base/commands/velocity"/>
  </node>

</launch>

3 방금 생성 한 시작 파일을 시작합니다

cd catkin_ws/
source devel/setup.bash
roslaunch my_turtlebot_nav turtlebot_stage.launch 

방금 사용한 데모와 비교하면 시작할 스테이지 창이 하나 뿐이고 시작할 다른 탐색 노드가 없습니다. 이것은 로봇을 시작할 때와 동일한 섀시와 동일합니다. 여기에서는 turtlebot과 함께 제공되는 키보드 원격 제어 노드를 사용하여 시뮬레이션 환경에서 키보드를 사용하여 로봇의 움직임을 제어 할 수 있는지 테스트합니다 .4
여기에 사진 설명 삽입
새 창을 만들고 다음 명령을 입력합니다.

roslaunch turtlebot_teleop keyboard_teleop.launch 

이때 "i, u, o, k"로 로봇의 움직임을 제어 할 수 있습니다. 이것은 Founder Turtlebot 로봇을 시작하는 것과 같습니다.이 로봇은 '방'에서 실행됩니다.이 로봇은 cmd_vel 주제 데이터를 수용 할 수 있습니다. 로봇의 레이저 센서에서 주행 데이터와 데이터를 게시합니다. 레이저 데이터는 rostopic list와 같은 명령어를 통해 볼 수 있습니다 .5
여기에 사진 설명 삽입
이러한 로봇은 로봇이 가지고 다니는 레이저 센서를 사용하여 매핑 작업을하는데 익숙한 gmapping 매핑 방식을 사용하는 것이 편리하고 간단합니다. gmapping.launch라는 새 파일을 만들고 다음 내용을 입력합니다.

<?xml version="1.0"?>
<launch>
  <arg name="scan_topic" default="scan" />
  <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
    <param name="odom_frame" value="odom"/>
    <param name="base_frame" value="base_link"/>
    <param name="map_frame" value="map"/>

    <!-- Process 1 out of every this many scans (set it to a higher number to skip more scans)  -->
    <param name="throttle_scans" value="1"/>
    <param name="map_update_interval" value="5.0"/> <!-- default: 5.0 -->

    <!-- The maximum usable range of the laser. A beam is cropped to this value.  -->
    <param name="maxUrange" value="5.0"/>

    <!-- The maximum range of the sensor. If regions with no obstacles within the range of the sensor should appear as free space in the map, set maxUrange < maximum range of the real sensor <= maxRange -->
    <param name="maxRange" value="10.0"/>

    <param name="sigma" value="0.05"/>
    <param name="kernelSize" value="1"/>
    <param name="lstep" value="0.05"/>
    <param name="astep" value="0.05"/>
    <param name="iterations" value="5"/>
    <param name="lsigma" value="0.075"/>
    <param name="ogain" value="3.0"/>
    <param name="minimumScore" value="0.0"/>
    <!-- Number of beams to skip in each scan. -->
    <param name="lskip" value="0"/>

    <param name="srr" value="0.01"/>
    <param name="srt" value="0.02"/>
    <param name="str" value="0.01"/>
    <param name="stt" value="0.02"/>

    <!-- Process a scan each time the robot translates this far  -->
    <param name="linearUpdate" value="0.1"/>

    <!-- Process a scan each time the robot rotates this far  -->
    <param name="angularUpdate" value="0.05"/>

    <param name="temporalUpdate" value="-1.0"/>
    <param name="resampleThreshold" value="0.5"/>

    <!-- Number of particles in the filter. default 30        -->
    <param name="particles" value="10"/>

<!-- Initial map size  -->
    <param name="xmin" value="-10.0"/>
    <param name="ymin" value="-10.0"/>
    <param name="xmax" value="10.0"/>
    <param name="ymax" value="10.0"/>

    <!-- Processing parameters (resolution of the map)  -->
    <param name="delta" value="0.02"/>

    <param name="llsamplerange" value="0.01"/>
    <param name="llsamplestep" value="0.01"/>
    <param name="lasamplerange" value="0.005"/>
    <param name="lasamplestep" value="0.005"/>

    <remap from="scan" to="$(arg scan_topic)"/>
  </node>
</launch>

6 다음으로 각각 3 개의 터미널을 열고 스테이지 노드를 시작하고 gmapping 노드는 원격 제어를 사용하여 Turtlebot의 움직임을 원격으로 제어하고 환경에서지도를 스캔합니다.

roslaunch my_turtlebot_nav turtlebot_stage.launch 
roslaunch turtlebot_teleop keyboard_teleop.launch 
roslaunch my_turtlebot_nav gmapping.launch 

키보드 "i, u, o, k"를 사용하여 로봇을 제어하여 방을 이동하고지도를 스캔합니다. (실제로 몇 번 스캔 한 결과 로봇이 회전 할 때이 gmapping이 변형 된 것처럼 보입니다. 실제 물체에서 달리는 것만 큼 좋지 않습니다.이 시뮬레이션 환경이 Kinect 데이터가 레이저 데이터로 변환되는 이유 인 것으로 추정됩니다. , 그리고 우리가 실제로 사용하는 라이더는 모두 360 도입니다.) 여기에 몇 가지 더 좋은지도가 있습니다. ┭┮﹏┭┮
여기에 사진 설명 삽입
HD 비디오

turtlebot 빌드 맵

7 map_server를 사용하여 맵을 저장합니다.

rosrun map_server map_saver -f test

이때 현재 디렉토리에 "test"로 시작하는 두 개의 파일이 있음을 알 수 있습니다.
여기에 사진 설명 삽입

1.3 Turtlebot 시뮬레이션 환경에서 탐색

turtlebot_navigation.launch 파일을 만들고 다음 내용을 채 웁니다.

<?xml version="1.0"?>
<launch>
  <arg name="initial_pose_x" default="2.0"/>
  <arg name="initial_pose_y" default="2.0"/>
  <arg name="initial_pose_a" default="0.0"/>

  <!--  ************** Navigation  ***************  -->
  <include file="$(find my_turtlebot_nav)/launch/include/move_base.launch.xml"/>

  <!--  ****** Maps *****  -->
  <arg name="map_file" default="$(find my_turtlebot_nav)/map/maze.yaml"/>
  <node name="map_server" pkg="map_server" type="map_server" args="$(arg map_file)">
    <param name="frame_id" value="/map"/>
  </node>
 

  <include file="$(find my_turtlebot_nav)/launch/include/amcl.launch.xml">
    <arg name="scan_topic" value="scan"/>
    <arg name="use_map_topic" value="true"/>
    <arg name="initial_pose_x" value="$(arg initial_pose_x)"/>
    <arg name="initial_pose_y" value="$(arg initial_pose_y)"/>
    <arg name="initial_pose_a" value="$(arg initial_pose_a)"/>
  </include>

  <!--  **************** Visualisation ****************  -->
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find my_turtlebot_nav)/rviz/robot_navigation.rviz"/>
</launch>

여기서 AMCL과 move_base는 별도의 파일로 구성되어 있습니다. 제가 사용하는 모든 패키지를이 github 주소 에 넣습니다. 직접 다운로드하거나 turtlebot_navigation 패키지에서 직접 복사 할 수 있습니다.

roslaunch my_turtlebot_nav turtlebot_stage.launch 
roslaunch my_turtlebot_nav turtlebot_navigation.launch 

RVIZ의 "2D Nav Goal"을 사용하여 목표 지점을 설정하면 자동차가 자동으로 목표 지점까지 달릴 수 있습니다. HD video link

터틀 봇 이동 기지

2. 가제보 시뮬레이션 환경

위에서 소개 한 무대 시뮬레이션 환경을 바탕으로, 먼저 가제보 시뮬레이션 환경을 사용하여 자율 주행 차량의 각 링크를 단계별로 구성하는 방법을 소개합니다.

1. 종속성 설치 :

sudo apt-get install ros-kinetic-turtlebot
sudo apt-get install ros-kinetic-turtlebot-*

2. turtlebot Gazebo 시뮬레이션 노드를 시작하면 다음 인터페이스를 볼 수 있습니다.

roslaunch turtlebot_gazebo turtlebot_world.launch

여기에 사진 설명 삽입
(참고 : gazebo를 열 수없는 경우 다운로드 한 모델 패키지가 불완전한 것일 수 있습니다. "Gazebo는 ROS에서 모델 파일을로드 할 수 없습니다" 블로그를 참조 하여 수정할 수 있습니다.)
3. 테스트 시뮬레이션 환경으로서 정상적으로 작동하는지 여부, 또한 Turtlebot의 키보드 패키지를 사용하여 gazebo 시뮬레이션 모델이 "cmd_vel"주제에 대한 데이터를 수용 할 수 있는지 테스트합니다.
키보드 원격 제어 노드 시작

roslaunch turtlebot_teleop keyboard_teleop.launch

Turtlebot Gazebo 시뮬레이션 노드 시작

roslaunch turtlebot_gazebo turtlebot_world.launch

지금까지 우리는 기본적으로 로봇 섀시를 시뮬레이션하기 위해 gazebo를 사용하는 것을 깨달았습니다. 상단 구성 요소는 무대 환경에서 구성한 파일에 따라 직접 사용할 수 있습니다. ( 참고 : 맵을 다시 빌드하고 AMCL에서 맵 파일을 교체해야합니다. )

이 작업은 모두를위한 숙제로 남겨주세요.

  • 1. gazebo에서 turtlebot을 제어하도록 방금 구성한 my_turtlebot_nav 패키지를 사용하여 2D 탐색을 수행합니다.
  • 2. ROS 스테이지 시뮬레이션과 가제보 시뮬레이션의 차이점은 무엇입니까?
  • 3. gazeboz에서 다른 세계 모델 파일 사용
    여기에 사진 설명 삽입

github 에서 코드 다운로드에 실패한 경우 댓글란 에 이메일을 남겨 주시면 추후 이메일로 보내드릴 예정입니다.

자율 내비게이션 차량 인 [email protected] 친구와 토론을 환영합니다.

추천

출처blog.csdn.net/crp997576280/article/details/102983855