3 분 소요

Hits

노트북으로 윈도우랑 리눅스 선택 부팅 가능하도록 설정

공간 확인

윈도우 + x
디스크 관리
(C:)에서 오른쪽 마우스 > 볼륨 축소
축소할 공간 입력(MB)(E): 에 숫자 확인

제어판 열기

윈도우 + R
control 검색

Ubuntu iso 다운로드

ubuntu-20.04.6-desktop-amd64.iso

우분투 설치 디스크

Rufus

20241219_01

노트북 부팅 시 우선순위 변경

부팅 시 USB Disk를 최우선으로 변경하여 삼성 노트북에 리눅스 듀얼 부팅 설치하기
삼성 노트북에서 F2 계속 누르고
BOOT 에서 Secure 에 OFF 를 선택하고 Save 하고 F10 계속 누르고 USB Disk 선택한다.

ROS2 Foxy 설치

Ubuntu 20.04 에 ROS2 foxy 설정

Foxy Docs

~/.bashrc 파일에 작성

# P
alias python='python3'
alias pip='pip3'

# ROS2
alias cw='cd ~/robot_ws'
alias cs='cd ~/robot_ws/src'
alias sb='source ~/.bashrc'
alias si='source ~/robot_ws/install/local_setup.bash'
alias cb='cd ~/robot_ws && colcon build'
alias cbs='cd ~/robot_ws && colcon build --packages-select'

source /opt/ros/foxy/setup.bash
source ~/robot_ws/install/local_setup.bash

export ROS_DOMAIN_ID=37

반영

source ~/.bashrc

ROS 버전 확인

printenv | grep ROS

/*
ROS_VERSION=2
ROS_PYTHON_VERSION=3
ROS_DOMAIN_ID=37
ROS_LOCALHOST_ONLY=0
ROS_DISTRO=foxy
*/

빌드

mkdir -p ~/robot_ws/src
cd ~/robot_ws
ls // src만 있는 상태
colcon build --symlink-install 
ls // 하면 build  install  log  src

패키지 만들기

cd ~/robot_ws/src
ros2 pkg create [패키지명] --build-type [빌드타입] --dependencies [의존하는패키지1] [의존하는패키지n]
ros2 pkg create py_pubsub --build-type ament_python --dependencies rclpy std_msgs
cd py_pubsub/py_pubsub
ls // __init__.py 확인

minimal_pub.py 만들기

# ROS 2 라이브러리 임포트
import rclpy                           # ROS 2 Python 클라이언트 라이브러리
from rclpy.node import Node            # ROS 2 노드 클래스
from std_msgs.msg import String        # ROS 2 표준 메시지 타입(String)


# 퍼블리셔 노드를 정의하는 클래스
class MinimalPublisher(Node):         
   def __init__(self):
       # 부모 클래스(Node)를 초기화하면서 노드 이름을 설정
       super().__init__('minimal_publisher')
      
       # 퍼블리셔 생성
       # - 메시지 타입: String
       # - 토픽 이름: 'hello'
       # - QoS 설정: 큐 크기 10
       self.publisher_ = self.create_publisher(String, 'hello', 10)
      
       # 타이머 설정
       # - 타이머 주기: 0.5초
       # - 타이머 콜백 함수: self.timer_callback
       timer_period = 0.5  # seconds
       self.timer = self.create_timer(timer_period, self.timer_callback)
      
       # 메시지 카운터 초기화
       self.i = 0


   # 타이머 콜백 함수
   # - 0.5초마다 호출되며 메시지를 생성하고 퍼블리셔를 통해 게시
   def timer_callback(self):
       # 새로운 String 메시지 생성
       msg = String()
      
       # 메시지 데이터 설정 (예: 'Hello World: 0')
       msg.data = 'Hello World: %d' % self.i
      
       # 메시지 게시
       self.publisher_.publish(msg)
      
       # 게시된 메시지를 로그로 출력
       self.get_logger().info('Publishing: "%s"' % msg.data)
      
       # 메시지 카운터 증가
       self.i += 1


# 메인 함수
def main(args=None):
   # ROS 2 초기화
   rclpy.init(args=args)
  
   # 퍼블리셔 노드 인스턴스 생성
   minimal_publisher = MinimalPublisher()
  
   # 노드를 실행하여 퍼블리싱 시작
   rclpy.spin(minimal_publisher)
  
   # 실행이 종료되면 노드를 명시적으로 파괴 (선택 사항)
   minimal_publisher.destroy_node()
  
   # ROS 2 종료
   rclpy.shutdown()


# 엔트리 포인트: 이 파일이 메인 프로그램으로 실행될 때만 main() 호출
if __name__ == '__main__':
   main()

cd .. 한 후에 setup.py 에서 ‘talker = py_pubsub.minimal_pub:main’, 만 추가

entry_points={
        'console_scripts': [
                'talker = py_pubsub.minimal_pub:main',
        ],
},

cd py_pubsub 한 후에 minimal_sub.py 에

# ROS 2 라이브러리 임포트
import rclpy                           # ROS 2 Python 클라이언트 라이브러리
from rclpy.node import Node            # ROS 2의 기본 노드 클래스
from std_msgs.msg import String        # ROS 2 표준 메시지 타입(String)


# 구독자 노드를 정의하는 클래스
class MinimalSubscriber(Node):


   def __init__(self):
       # 부모 클래스(Node)를 초기화하면서 노드 이름을 설정
       super().__init__('minimal_subscriber')  # 노드 이름을 'minimal_subscriber'로 설정
      
       # 구독자 생성
       # - 메시지 타입: String
       # - 토픽 이름: 'hello'
       # - 콜백 함수: self.listener_callback
       # - QoS 설정: 메시지 대기열 크기 10
       self.create_subscription(
           String,                    # 구독할 메시지 타입 (std_msgs.msg.String)
           'hello',                   # 구독할 토픽 이름
           self.listener_callback,    # 메시지를 수신할 때 호출되는 콜백 함수
           10                         # QoS: 메시지 대기열 크기
       )


   # 메시지 수신 시 호출되는 콜백 함수
   def listener_callback(self, msg):
       # 수신한 메시지 내용을 ROS 2 로그로 출력
       # msg.data는 String 메시지의 데이터 필드
       self.get_logger().info('I heard: "%s"' % msg.data)


# 메인 함수
def main(args=None):
   # ROS 2 초기화
   rclpy.init(args=args)
  
   # 구독자 노드 인스턴스 생성
   minimal_subscriber = MinimalSubscriber()
  
   # 노드를 실행하여 토픽 메시지를 대기 (구독)
   rclpy.spin(minimal_subscriber)
  
   # 실행이 끝나면 노드를 명시적으로 파괴 (선택 사항)
   minimal_subscriber.destroy_node()
  
   # ROS 2 종료
   rclpy.shutdown()


# 엔트리 포인트: 이 파일이 메인 프로그램으로 실행될 때만 main() 호출
if __name__ == '__main__':
   main()

cd .. 한 후에 setup.py 에 ‘listener = py_pubsub.minimal_sub:main’, 추가

entry_points={
        'console_scripts': [
                'talker = py_pubsub.minimal_pub:main',
                'listener = py_pubsub.minimal_sub:main',
        ],
},

cd ~/robot_ws 가서 워크 스페이스의 노드 패키지 빌드

colcon build --symlink-install

cd ~/robot_ws 가서 특정 패키지만 선택하여 빌드

colcon build --symlink-install --packages-select py_pubsub

source 반영

source ~/robot_ws/install/local_setup.bash

talker 실행

ros2 run py_pubsub talker

listenter 실행

ros2 run py_pubsub listener 

topic 확인

ros2 topic list

/*
/hello
/parameter_events
/rosout
*/
ros2 topic type /hello

/*
std_msgs/msg/String
*/

태그:

카테고리:

업데이트:

Comments