반응형

ROS2 Foxy Fitzroy

 

패키지 노드(publisher) 만들기

 

 

1) ~/robot_ws/src/test1234/setup.py 확인

  1. 위의 경로 파일 재확인
    1. 내용을 모른다면 다시 1편으로
    2. hostramus.tistory.com/112\
 

ROS2 패키지 만들기 - 1 (패키지 생성)

ROS2 FOXY Fitzroy ROS2에서 패키지를 만들기 위한 방법 1) 패키지 생성 cd ~/robot_ws/src ros2 pkg create [패키지명] --build-type ament_python 이전에 만들어 놓은 ROS2 워크스페이스 src에 [패키지명]으로..

hostramus.tistory.com

 

2) 빌드

cd ~/robot_ws
colcon build --symlink-install
  1. 패키지를 생성했으니 빌드
    1. 패키지 생성 꼭 빌드 해야 사용이 가능
    2. --symlink-install
      1. 옵션 사항
      2. 빌드 후 파이썬 파일 수정을 해도 재빌드가 필요 없음
        1. 같은 파일 내에 수정일때 적용
        2. 빌드시 관련 파일(파이썬 등)을 링크로 연결하기에 쉽게 수정이 가능
        3. 결론.. 쓰면 편함

 

3) 노드 환경설정

. ~/robot_ws/install/local_setup.bash

#또는

source ~/robot_ws/install/local_setup.bash
  1. 노드 환경설정
    1. 그냥 한번 입력하면 별 반응도 없이 끝
    2. 출력되는 메세지조차 없음

 

4) 노드 실행

ros2 run test1234 hello_pub
  1. publisher 실행
    1. [INFO]: Published message: Hello World: 1
      1. 위와같이 1초에 하나씩 출력
ros2 run test1234 hello_sub
  1. subscriber 실행
    1. [INFO]: Received message: Hello World: 1
      1. 위와 같은 형식으로 출력
      2. 메세지가 날아올때만 출력

위와 같이 실행되면 완료

 

5) 문제 해결

  1. ros2 run test1234 hello_sub를 실행시켰으나 무반응
    1. 1번 setup.py의 entry points 내용 확인
    2. publisher와 subscriber의 파이썬 파일 확인
      1. 토픽명이 일치하는지 확인
    3. 코드의 오타 확인
  2. hello_suv등의 패키지를 찾지 못함 (탭을 눌렀으나 자동완성이 안되는 경우)
    1. source ~/robot_ws/install/local_setup.bash 실행한 후 확인

 

 

아래 출처의 내용을 수정 변경하였습니다.

개인적 공부를 위해 올린 글로 공부하실분은 아래 링크의 글을 참고하시기 바랍니다.

출처 : 오로카 카페 (cafe.naver.com/openrt/24450)

반응형
반응형

ROS2 Foxy Fitzroy

 

패키지 노드(publisher) 만들기



1) 파이썬 파일 생성

~/robot_ws/src/test1234/test1234
  1. 위 경로에 hello_sub.py 생성

 

2) 전체코드

import rclpy
from rclpy.node import Node
from rclpy.qos import QoSProfile
from std_msgs.msg import String


class HelloworldSubscriber(Node):

    def __init__(self):
        super().__init__('Helloworld_subscriber')
        qos_profile = QoSProfile(depth=10)
        self.helloworld_subscriber = self.create_subscription(
            String, #메세지 타입
            'helloworld', #토픽 이름
            self.subscribe_topic_message, #콜백 함수
            qos_profile)  #QoS 설정

    def subscribe_topic_message(self, msg):
        self.get_logger().info('Received message: {0}'.format(msg.data))

def main(args=None):
    rclpy.init(args=args)
    node = HelloworldSubscriber()  #HelloworldSubscriber 클래스 생성
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        node.get_logger().info('Keyboard Interrupt (SIGINT)')
    finally:
        node.destroy_node()
        rclpy.shutdown()


if __name__ == '__main__':
    main()

코드 출처 : 오로카 카페 - 024 ROS프로그래밍 기초(python)_표윤석)

    def __init__(self):
        super().__init__('Helloworld_subscriber')
        qos_profile = QoSProfile(depth=10)
        self.helloworld_subscriber = self.create_subscription(
            String, #메세지 타입
            'helloworld', #토픽 이름
            self.subscribe_topic_message, #콜백 함수
            qos_profile)  #QoS 설정
  1. self.helloworld_subscriber = self.create_subscription ~
    1. String : 메세지 타입
    2. 'helloworld' : 가져다 쓸 토픽 이름, 앞서 만든 publisher와 이름을 맞춰주어야 함
    3. self.subscribe_topic_message : 콜백 함수
    4. qos_prifile : QoS 설정
    def subscribe_topic_message(self, msg):
        self.get_logger().info('Received message: {0}'.format(msg.data))
  1. self.get_logger().info('Received message: {0}'.format(msg.data))
    1. 데이터가 들어오면 'msg.data'의 값을 '{0}'에 넣어 콘솔창에 출력
def main(args=None):
    rclpy.init(args=args)
    node = HelloworldSubscriber()  #HelloworldSubscriber 클래스 생성
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        node.get_logger().info('Keyboard Interrupt (SIGINT)')
    finally:
        node.destroy_node()
        rclpy.shutdown()
  1. node = HelloworldSubscriber() : HelloworldSubscriber 클래스 생성
  2. rclpy.spin(node) : ROS에 노드 spin

 

3) 결론

  1. 특별한 것 없음
  2. publisher와의 차이는 12행에서 'create_publisher', 'create_subscription'만 다르다

 

반응형
반응형

ROS2 Foxy Fitzroy

 

패키지 노드(publisher) 만들기

 

 

1) 파이썬 파일 생성

~/robot_ws/src/test1234/test1234
  1. 위의 경로에 'hello_pub.py'를 생성

 

 

2) 전체 코드

import rclpy
from rclpy.node import Node
from rclpy.qos import QoSProfile
from std_msgs.msg import String


class HelloworldPublisher(Node):

    def __init__(self):
        super().__init__('helloworld_publisher')
        qos_profile = QoSProfile(depth=10)  #QoS 설정, 큐 사이즈 10(10개의 데이터 보관)
        self.helloworld_publisher = self.create_publisher(String, 'helloworld', qos_profile)  #qos_profile속성으로 publisher 생성
        self.timer = self.create_timer(1, self.publish_helloworld_msg)  #timer tick(1초)마다 publish_helloworld_msg 실행
        self.count = 0

    def publish_helloworld_msg(self):
        msg = String()  #메세지 스트링타입
        msg.data = 'Hello World: {0}'.format(self.count)  #메세지 내용
        self.helloworld_publisher.publish(msg)  #메세지 전송
        self.get_logger().info('Published message: {0}'.format(msg.data))  #logger에 메세지 기록
        self.count += 1


def main(args=None):
    rclpy.init(args=args)
    node = HelloworldPublisher()  #클래스 실행
    try:
        rclpy.spin(node)  #ROS에 노드 spin, 프로그램 종료까지 반복
    except KeyboardInterrupt:
        node.get_logger().info('Keyboard Interrupt (SIGINT)')  #종료시 logger에 기록
    finally:
        node.destroy_node()  #노드 종료
        rclpy.shutdown()  #rclpy 종료


if __name__ == '__main__':
  main()

(코드 출처 : 오로카 카페 - 024 ROS프로그래밍 기초(python)_표윤석)

 

    def __init__(self):
        super().__init__('helloworld_publisher')
        qos_profile = QoSProfile(depth=10)  #QoS 설정, 큐 사이즈 10(10개의 데이터 보관)
        self.helloworld_publisher = self.create_publisher(String, 'helloworld', qos_profile)  #qos_profile속성으로 publisher 생성
        self.timer = self.create_timer(1, self.publish_helloworld_msg)  #timer tick(1초)마다 publish_helloworld_msg 실행
        self.count = 0
  1. qos_profile = QoSProfile(depth=10)
    1. QoS 설정
    2. 데이터를 보관해 놓을 큐의 사이즈 지정 (depth=10)
    3. 오로카 ROS 강의 참고 (https://cafe.naver.com/openrt/24319)
  2. self.helloworld_publisher = self.create_publisher(String, 'helloworld', qos_profile)
    1. self.helloworld_publisher : helloworld_publisher라는 이름으로 노드 이름 지정
    2. String : 메세지 타입
    3. 'helloworld' : 토픽 이름
    4. qos_profile : QoS 설정 (현재 큐 사이즈 10으로 설정)
    5. self.timer = self.create_timer(1, self.publish_helloworld_msg) : 타이머를 생성하여 1초에 한번씩 publish_helloworld_msg 실행

 

    def publish_helloworld_msg(self):
        msg = String()  #메세지 스트링타입
        msg.data = 'Hello World: {0}'.format(self.count)  #메세지 내용
        self.helloworld_publisher.publish(msg)  #메세지 전송
        self.get_logger().info('Published message: {0}'.format(msg.data))  #logger에 메세지 기록
        self.count += 1
  1. msg = String() : 메세지를 스트링 타입으로 지정
  2. msg.data = 'Hello world : {0}'.format(self.count) : 메세지 내용 지정
  3. self.helloworld_publisher.publish(msg) : 메세지 전송
  4. self.get_logger().info('Published message : {0}'.format(msg.data)) : 메세지 내용을 콘솔창에 출력

 

def main(args=None):
    rclpy.init(args=args)
    node = HelloworldPublisher()  #클래스 실행
    try:
        rclpy.spin(node)  #ROS에 노드 spin, 프로그램 종료까지 반복
    except KeyboardInterrupt:
        node.get_logger().info('Keyboard Interrupt (SIGINT)')  #종료시 logger에 기록
    finally:
        node.destroy_node()  #노드 종료
        rclpy.shutdown()  #rclpy 종료
  1. rclpy.init(args=args) : 초기화
  2. node = HelloworldPublisher() : 클래스 실행
  3. rclpy.spin(node) : ROS에 노드 spin, 프로그램 종료까지 반복
  4. node.destroy_node() : 노드 종료
  5. rclpy.shutdown() : rclpy 종료

 

3) 결론

  1. 중요 핵심 사항만 있는 코드
  2. 이것만으론 뭘 못하니 여기서 추가 내용을 짜서 공부 할 것
  3. 아래 표시한곳들만 서로 맞춰주면 문제 없음

 

 

아래 출처의 내용을 수정 변경하였습니다.

개인적 공부를 위해 올린 글로 공부하실분은 아래 링크의 글을 참고하시기 바랍니다.

출처 : 오로카 카페 (cafe.naver.com/openrt/24450)

 

 

 

반응형
반응형

ROS2 FOXY Fitzroy

 

ROS2에서 패키지를 만들기 위한 방법

 

 

1) 패키지 생성

cd ~/robot_ws/src
ros2 pkg create [패키지명] --build-type ament_python
  1. 이전에 만들어 놓은 ROS2 워크스페이스 src에 [패키지명]으로 패키지를 생성
  2. '--build-type ament_python'
    1. 파이썬으로 패키지를 생성할것이기에 ament_python으로 빌드하도록 설정
  3. src 폴더내에 [패키지명]으로 된 폴더가 생성됨
  4. ros2 pkg create [패키지명] --build-type ament_python --dependencies rclpy std_msgs
    1. 패키지 생성시 의존성을 한번에 설정하는 방법
      1. 현재 rclpy와 std_msgs가 추가됨
      2. 아래 package.xml에서 설명

 

2) package.xml 설정

# 기본 생성 파일

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>test1234</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="lee@todo.todo">lee</maintainer>
  <license>TODO: License declaration</license>

  <test_depend>ament_copyright</test_depend>
  <test_depend>ament_flake8</test_depend>
  <test_depend>ament_pep257</test_depend>
  <test_depend>python3-pytest</test_depend>

  <export>
    <build_type>ament_python</build_type>
  </export>
</package>

 

  1. 의존 패키지
    1. 의존 패키지 내용을 적는 부분
    2. 실행시킬 패키지가 사용하는 라이브러리라 생각하면 됨
    3. 위의 패키지 생성에서 뒤에 '--dependencies rclpy std_msgs'를 붙인 경우 이미 의존 패키지 설정이 되어 있음
  2. 빌드 타입
    1. 우린 파이썬으로 만들것이기에 빌드 타입이 'ament_python'으로 설정되어 있음
      1. 위에서 '--build-type ament_python'으로 설정되었기에 건드릴것 없음
  3. 포인트
    1. 의존 패키지 내용 잘 확인 할것
      1. 위에 패키지 생성시 안적었으면 여기다 적으면 됨
    2. 빌드 타입 확인 할 것
      1. 파이썬인지 cpp(ament_cmake)인지 확인 할 것

 

3) setup.py

# 기본 내용

from setuptools import setup

package_name = 'test1234'

setup(
    name=package_name,
    version='0.0.0',
    packages=[package_name],
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='lee',
    maintainer_email='lee@todo.todo',
    description='TODO: Package description',
    license='TODO: License declaration',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
        ],
    },
)
  1. entry_points
    1. 여기에 패키지 노드 이름 작성
      1. 나중에 실행시 ros2 run test1234 hello_pub 또는 ros2 run test1234 hello_sub 로 실행
    2. 노드 이름과 파이썬 파일을 연결

 

4) 결론

  1.  패키지 생성
    1. 어려울것 없음
    2. 실수로 옵션 빼먹어도 package.xml에서 수정 가능
      1. 단 '--build-type ament_python'빼먹으면 패키지 폴더내에 생성되는 파일이 다름
      2. 잘 확인해서 생성할것
  2.  package.xml
    1. 의존 패키지 확인이 매우 중요
    2. 나머지 내용은 저작자, 라이센스 등 부수적 내용
      1. 추후에 찾아서 배포판을 만들시 자세히 작성
  3. setup.py
    1. 'entry_points'에 사용할 노드명, 경로 잘 입력할 것

 

 

아래 출처의 내용을 수정 변경하였습니다.

개인적 공부를 위해 올린 글로 공부하실분은 아래 링크의 글을 참고하시기 바랍니다.

출처 : 오로카 카페 (cafe.naver.com/openrt/24450)

반응형
반응형

파이썬 matplotlib로 파이그래프 그리고 설정하기

 

1. 목표

  • 파이 그래프(도넛, 원형 그래프)를 그린다
  • 파이그래프에 그림자, 값, 효과를 설정한다

2. 전체코드

import matplotlib.pyplot as plt

label = ['Korea', 'German', 'Sweden', 'France', 'Italy']
pop = [51821669	, 82379121, 10255102, 65712057, 59575231]
wg = {'width': 0.6, 'edgecolor': 'b', 'linewidth':3}

plt.pie(pop, labels=label, autopct='%.1f%%',
        explode=[0, 0.05, 0, 0, 0], shadow=True,
        wedgeprops=wg, startangle=10)

plt.show()

 

3. 뜯어보기

wg = {'width': 0.6, 'edgecolor': 'b', 'linewidth':3}
  • 파이 그래프에서 사용되는 속성을 dict형식으로 미리 표현한다.

    • width : 0.6

      • 도넛 모양의 그래프를 그릴때 사용한다

      • 도넛의 중심부의 크기를 설정한다

      • 0.6은 절대 값이아닌 전체 크기의 60%를 뜻한다.

    • edgecolor : b

      • 파이 그래프 각 조각의 테두리 색을 설정한다.

      • 'b'이므로 blue로 설정된다

    • linewidth : 3

      • 파이 그래프 각 조각의 테두리 두께를 설정한다.

plt.pie(pop, labels=label, autopct='%.1f%%',
        explode=[0, 0.05, 0, 0, 0], shadow=True,
        wedgeprops=wg, startangle=10)
  • pop

    • 파이를 그릴 데이터를 입력한다

  • label

    • 각 파트의 라벨을 입력한다.

  • autopct = '%.1f%%'

    • 각 파이 조각의 비율을 표시한다.

    • 0.1f이기에 소수점 1자리까지 표시한다.

  • explode=[0, 0.05, 0, 0, 0]

    • 중심에서 떨어져 있는 효과를 준다.

    • 특정 데이터를 강조할때 사용한다

  • shadow=True

    • 그림자 효과를 넣는다

  • wedgeprops=wg

    • 위에서 설정한 wg라는 dict값으로 설정한다

  • startangle=10

    • 처음 시작 각도를 10도부터 시작한다 (기준점은 12시방향이 0도다)

 

4. 결과

반응형
반응형

파이썬 matplotlib 범례 설정하기

 

 

1. 목표

  • 범례를 넣고 위치, 폰트, 색상등을 설정한다
  • x, y축의 범위를 설정한다

2. 전체코드

import matplotlib.pyplot as plt

label = ['Korea', 'German', 'Sweden', 'France', 'Italy']
pop = [5182, 8237, 1025, 6571, 5957]
pop2 = [3224, 6119, 800, 5077, 5369]

plt.plot(label, pop)
plt.plot(label, pop2)
# plt.legend([2020, 1970], loc='upper right', ncol=2, fontsize=10, labelcolor='#008000')
plt.legend([2020, 1970], loc='upper right', ncol=1, fontsize=10, labelcolor='#008000')

plt.axis([-1,5,0,10000])

plt.show()

 

3. 뜯어 보기

plt.legend([2020, 1970], loc='upper right', ncol=2, fontsize=10, labelcolor='#008000')
  • [2020, 1970]

    • 2가지 범례의 이름이다.

    • plt.plot에서 값을 넣은 순서대로 명칭이 정해진다.

  • loc='upper right'

    • location을 설정한다.

    • 설정하지 않으면 자동으로 적절한 위치에 배치된다.

  • ncol=2

    • 범례를 표시할때 열의 개수를 정한다.

    • 범례가 2개일 경우 ncol=2이면 1행 2열로 2개의 범례를 출력한다.

    • 아래 결과 그림 참고

plt.axis([-1,5,0,10000])
  • 축의 표시 범위를 설정한다.

  • [-1, 5, 0, 10000]

    • 앞에서부터 x-min, x-max, y-min, y-max이다.

4. 결과

반응형
반응형

파이썬 matplotlib 두개의 그래프 동시 표시하기

 

 

1. 목표

  • 한 화면에 두개의 그래프 표시하기

  • 각 포인트에 데이터값(좌표) 표시하기

 

2. 전체 코드

import matplotlib.pyplot as plt
import numpy as np

plt.title('chapter 01')
plt.ylabel('Y axis')
plt.xlabel('X axis')

t1 = np.arange(0, 5, 1)
t2 = np.arange(0, 5, 1)

plt.subplot(211)
plt.pie(t1)

plt.subplot(212)
plt.plot(t2, np.cos(t2), 'r--')

for i, txt in enumerate(t2):
    plt.text(t2[i]+0.1, np.cos(t2[i]), str(np.cos(t2[i])), fontsize=10)

plt.show()

 

3. 뜯어보기

plt.subplot(211)
plt.pie(t1)
  • 한 화면에 2개 이상의 차트를 출력할 때 subplot을 사용한다.

  • plt.pie(t1)을 이용하여 t1데이터로 파이그래프(원형 그래프)를 그린다.

for i, txt in enumerate(t2):
    plt.text(t2[i]+0.1, np.cos(t2[i]), str(np.cos(t2[i])), fontsize=10)
  • plt.plot에서 그린 t2에 대한 코사인 그래프에 각 포인트값을 표시한다.

  • enumerate()는 리스트의 인덱스 번호와 내용을 같이 출력한다.

  • plt.text는 차트에 글자를 출력한다.

    • plt.annotation()을 사용해서도 값을 표시 할 수있지만 폰트 조정이 안된다.

  • 't2[i] + 0.1, np.cos(t2[i])'는 글자가 쓰여질 위치를 선택한다.

  • 'str(np.cos(t2[i]))'는 출력할 값을 뜻한다.

    • str()은 두번째 인수와 구분하여 설명하기 위해 사용했을뿐 없이 사용해도 무관하다.

 

4. 결과

반응형
반응형

파이썬(Python) matplotlib 선 그래프에서 포인트 모양 변경, 선 색, 선 종류 변경

 

 

1. 목표

  • matplotlib에서 각 데이터 포인트의 표시 모양을 변경

  • 선 그래프에서 선 색상 변경하기

  • 선 그래프에서 선 종류 변경하기

  • numpy의 arange 사용하기

 

2. 전체 코드

import matplotlib.pyplot as plt
import numpy as np

plt.title('Chapter 02')
plt.ylabel('Y axis')
plt.xlabel('X axis')

t = np.arange(0.0, 5.0, 0.2)
print(t)
print(type(t))

plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')

plt.show()

 

 

3. 뜯어 보기

import numpy as np
  • numpy를 import한다

  • 아래에서 사용될 arange(0.0, 5.0, 0.2)를 사용하기위해 import한다.

t = np.arange(0., 5., 0.2)
  • numpy를 이용하여 [0, 0.2, 0.4 ..... 4.6,, 4.8]의 값을 만든다.

  • aa = [i / 10 for i in range(1,50,1)] 로 대체해서 쓸 수 있다.

    • 단 부동소수점 문제가 생길 수 있다.

plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
  • 3개의 그래프를 그린다

    • t, t, 'r--'

      • t값을 x축, y축 값으로 삼아서 그래프를 그린다.

      • 'r'은 선의 색 Red를 뜻한다.

      • '--' 대쉬선 (점선)을 뜻한다.

    • t, t**2, 'bs'

      • t값을 x축, t**2값(t의 2제곱)을 y축 값으로 그래프를 그린다.

      • 'b'는 선의 색 blue를 뜻한다.

      • 's'는 squrae의 약자로 각 포인트를 사각 점으로 표시한다.

    • t, t**3, 'g^'

      • t값을 x축 t**3(t의 3제곱)을 y축 값으로 그래프를 그린다.

      • 'g'는 선의 색 green을 뜻한다.

      • '^'는 삼각형 모양으로 각 포인트를 표시한다.

plt.show()
  • 위에서 그린 그래프를 출력한다.

 

4. 결과

반응형

+ Recent posts