본문 바로가기

Simulation/CARLA

ROS2 기초

Autoware를 CARLA와 연동시키는 과정에서 여러 문제가 발생하고 있는데,

이 문제들을 해결하기 위해서는 먼저 Autoware가 기반으로 하고 있는 ROS2에 대해 먼저 이해할 필요가 있어 학습을 진행함.

 

 

ROS는 패키지를  단위로 동작함

 

시뮬레이션, 임베디드통신, 시각화 등 다양한 Tool

 

ROS는 OS가 아니라 개발을 편리하게 해주는 프레임워크라고 할 수 있다.

 

기존  ROS1은 TCP UDP 방식으로 보안성 취약함.

ROS2는 DDS(publish-subscribe) 방식을 사용 - 이미 산업에서 사용되고 있기 때문에 검증됨.

 

성능에서도 레이턴시 우수함.

 

 

rosdep install 명령어는 src 폴더에서 종속성이 잇는 패키지들을 모두 설치해준다. (대신 개발자들이 src에 잘 명시해둔 경우에만 작동)

 

workspace에서 src를 colcon을 통해 빌드 완료된 경우 build, install log 와 같은 완전한 디렉토리 구조를 갖게된다.

 

 

그런데 아래와 같이 CARLA와 Autoware의 지원환경이 다른데, 어떤 것을 기준으로 해야할지 모르겠다. 찾아보니 Foxy에서는 autoware 빌드 이슈가 있다고하니, LTS 버전은 아니지만 그나마 유사한 환경인 galactic으로 하는수밖에 없을 것 같다. galactic와 carla 사용시 어떤 문제가 발생할지는 모르겠지만..

CARLA : Ubuntu 20.04/ ROS2 Foxy

Autoware : Ubuntu 20.04/ ROS2 Galactic   or   Ubuntu 22.04/ ROS2 Humble

 

 

Node와 Package

 Node는 ROS2의 동작 기본 단위이고 Package는 프로젝트의 단위이다.

package에는 관련 라이브러리, 설정 파일 등을 포함하며, 기능 단위로 분리시킨 모듈이라고 할 수 있다. 또한, colon은 패키지를 빌드하는 툴이다.

 

node의 실행은 ros2 run 패키지명 파일명

 

luanch

여러 node 들을 한번에 수행하기 위한 수단. 각 터미널마다 하나의 노드를 실행해야하는 불편함 개선. + 파라미터 등을 프로그래밍으로 작성가능하므로 편리하다.

기존에 ROS1에서 xml 문법을 사용햇지만, ROS2 에서는 Python 문법을 사용한다.(*.launch.py 형식)

 

launch 파일의 실행은 아래와 같은 형식으로 수행한다.

ros2 launch 패키지명 launch파일명

 

launch 파일 내부에서는 generate_launch_description을 반드시 정의해야하며, 내부에서는 LaunchDescription을 리턴해야한다. 리턴할 시, 직접 정의한 노드 또는 커맨드를 이용해 실행시킬 수 있다.

def generate_launch_description():
    # ...
    return LaunchDescription(
        [
        robot_state_publisher_node, # 노드로 실행
          ExecuteProcess( # 커맨드로 실행 
                cmd=["gazebo", "--verbose", world, "-s", "libgazebo_ros_factory.so"],
                output="screen",
            )
        ]
    )
```

 

참고로 Node 정의시 arguments와 parameter는 yml, yaml 파일에서 설정해두며, launch 파일에서 import하여 사용할 수 있다. (파라미터명: 값 과 같은 형식)

 

 

 

Topic

  토픽은 메시지를 주고 받는데, 메시지가 각 데이터의 타입이라고 할 수 있다. topc 관련 커맨드.

ros2 topic list

ros2 topic info

ros2 interface show geometry_msgs/msg/Twist   (특정 메세지 타입)

ros2 topic pub --rate 1 메세지 타입 값

 

 

Topic - Python

import rclpy    - ROS2 프로그래밍(python)

from rclpy.node import Node

from geometry_msgs.msg import Twist

 

 

ROS2는 클래스 형태로 node를 개발할 것을 권장한다. 여기서 각 클래스는 Node 클래스를 상속받아 정의한다.

node 이름을 super().__init("노드이름")으로 정의한다. 추가적으로 여기서 Node 클래스의 기본기능들이 모두 상속 및 정의됨.

퍼블리셔 노드와 서브스크라이브 노드를 작성하여 메세지를 생성, 수신할 수 있다.

 

create_publisher,create_subscription

 

 

노드 생성 예시

self.autoware_universe_vehicle_control_subscriber = self.ros2_node.create_subscription(
	AckermannControlCommand, 'control/command/control_cmd', self.on_autoware_universe_vehicle_control,
	qos_profile=QoSProfile(depth=1))
            
            
self.sensing_cloud_publisher = self.ros2_node.create_publisher(PointCloud2, '/carla_pointcloud', 10)

 

 

 

'Simulation > CARLA' 카테고리의 다른 글

Autoware installation  (0) 2023.01.20
ROS2 기초(2)  (0) 2023.01.13
Carla Autoware (3)- dependencies 설치  (0) 2023.01.09
Carla Autoware(2)-CUDA/cuDNN/TensorRT 설치  (0) 2023.01.05
Carla Autoware(1)-ROS2 설치  (0) 2022.11.24