[ROS2] Mapping 실습, neuronbot2 활용

TaerinLog·2025년 10월 2일

선행 작업

1. neuronbot2 환경 구성

2. Cartographer 패키지 내 노드명 변경

  • ROS2에서 Cartographer 패키지를 빌드할 때, 지도를 생성하고 토픽으로 발행하는 노드의 실행 파일 이름이 변경됨

  • 구분변경 전 (ROS 1 또는 구형 설정)변경 후 (ROS 2 표준 및 최신 Cartographer)
    Executableoccupancy_grid_nodecartographer_occupancy_grid_node
  • neuronbot2/neuronbot2_slam/launch/cartographer_launch.py


Node(
            package='cartographer_ros',
            executable='occupancy_grid_node', <- cartographer_occupancy_grid_node로 변경, 이름은 변경해줘도 되고 안해줘도 됨
            name='occupancy_grid_node',
            output='screen',
            parameters=[{'use_sim_time': use_sim_time}],
            arguments=['-resolution', resolution, '-publish_period_sec', publish_period_sec]),

Cartographer SLAM

  • LiDAR 스캔 및 오도메트리(Odometry)데이터를 사용하여 실시간으로 주변 환경의 지도를 만들고 동시에 로봇 자신의 위치를 추정하는 구글의 오픈 소스 라이브러리

Mapping

1. 시뮬레이션 환경 다운

  • AWS Robotics GitHub: https://github.com/aws-robotics/

  • 저장소의 여러 버전 중 ROS 2 환경에 맞춰진 버전(ros2 브랜치)을 선택하여 다운로드
    git clone https://github.com/aws-robotics/aws-robomaker-small-house-world.git -b ros2

  • 패키지 빌드
    colcon build --symlink-install --packages-select aws_robomaker_small_house_world

  • 환경 테스트
    ros2 launch aws_robomaker_small_house_world view_small_house.launch.py

환경이 제대로 렌더링되지 않을 경우
export LIBGL_ALWAYS_SOFTWARE=1
→ GPU 대신 CPU로 OpenGL 소프트웨어 렌더링을 강제하여 해결

2. 시뮬레이션 환경에 neuronbot2 스폰하기

  • [작업 파일] neuronbot2/neuronbot2_gazebo/launch/neuronbot2_world.launch.py
  • Gazebo가 로봇 모델 외에 외부 월드 모델도 찾을 수 있도록 경로를 확장
[변경 전]
    gazebo_model_path = os.path.join(get_package_share_directory('neuronbot2_gazebo'), 'models')
    if 'GAZEBO_MODEL_PATH' in os.environ:
        os.environ['GAZEBO_MODEL_PATH'] += ":" + gazebo_model_path
    else :
        os.environ['GAZEBO_MODEL_PATH'] = gazebo_model_path


[변경 후]
    gazebo_model_path = os.path.join(get_package_share_directory('neuronbot2_gazebo'), 'models')
    world_model_path = os.path.join(get_package_share_directory('aws_robomaker_small_house_world'), 'models')
    
    if 'GAZEBO_MODEL_PATH' in os.environ:
    	# 기존 경로에 로봇 모델과 월드 모델 경로를 모두 콜론(:)으로 추가합니다.
        os.environ['GAZEBO_MODEL_PATH'] += ":" + gazebo_model_path + ":" + world_model_path
    else :
        os.environ['GAZEBO_MODEL_PATH'] = gazebo_model_path
  • 어느 가상 환경을 로드할지 설정
[변경 전]
 world = os.path.join(
        get_package_share_directory('neuronbot2_gazebo'),
        'worlds',
        'mememan_world.model'
    )

[변경 후]
# aws-robomaker-small-house-world/worlds/small_house.world을 로드해야 함

world = os.path.join(
        get_package_share_directory('aws_robomaker_small_house_world'),
        'worlds',
        'small_house.world'
    )
  • neuronbot2 스폰 테스트
    ros2 launch neuronbot2_gazebo neuronbot2_world.launch.py

3. Cartographer 노드 실행

  • Cartographer slam 노드 실행 (RViz2 시각화 도구를 자동으로 실행)
    ros2 launch neuronbot2_slam cartographer_launch.py open_rviz:=true use_sim_time:=true

4. 로봇을 움직여 매핑 시작

  • 로봇 제어 시작
    ros2 run teleop_twist_keyboard teleop_twist_keyboard

5. 매핑된 지도 저장

ros2 run nav2_map_server map_saver_cli -f <map_dir>/<map_name>
  • 현재 폴더에 지도 저장
    ros2 run nav2_map_server map_saver_cli -f small_house
profile
taerin

0개의 댓글