0편 – [robot arm, manipulator 프로젝트][ubuntu 20.04, ros2, gazebo][0] – ros2, gazebo 설치 및 예제 실행
1편 – [robot arm, manipulator 프로젝트][ubuntu 20.04, ros2, gazebo][1] – ros2 publisher subscriber c++, python 구현 및 실행

0. turtleSim 예제

ros2 run turtlesim turtlesim_node

새로운 터미널 열고

ros2 run turtlesim draw_square
Screenshot from 2024 11 27 02 32 37

1. workspace 만들기


mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
cd ~/ros2_ws
rosdep install -i --from-path src --rosdistro foxy -y
colcon build
Screenshot from 2024 11 27 02 33 42

이제 workspace 가 생성되었고 첫번째 build 도 성공하였다.

2. C++ 예제

2.1. package 만들기 (c++)

pip install catkin_pkg
source /opt/ros/foxy/setup.bash
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake --node-name my_node my_package
cd ~/ros2_ws
colcon build
Screenshot from 2024 11 27 02 45 11

이렇게 package 생성된 것을 확인 할 수 있다.

2.2. publisher 노드 구현

source /opt/ros/foxy/setup.bash
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake cpp_pubsub
cd ~/ros2_ws/src/cpp_pubsub/src
wget -O publisher_member_function.cpp https://raw.githubusercontent.com/ros2/examples/foxy/rclcpp/topics/minimal_publisher/member_function.cpp
image 64

위 코드를 실행하면 위 사진과 같은 package.xml 파일을 볼 수 있을 것이다.

image 65

이렇게 수정한다.

image 66

cmakelists.txt 파일은 위와 같은텐데

image 67
cd ~/ros2_ws
colcon build

위 코드 실행하면 이제 build 성공하는 것을 볼 수 있다.

image 68


cd ~/ros2_ws
colcon build
. install/setup.bash
ros2 run cpp_pubsub talker

image 69

talker 라는 publisher 를 성공적으로 실행시켰다.

2.3. subcriber 노드 구현

cd ~/ros2_ws/src/cpp_pubsub/src
wget -O subscriber_member_function.cpp https://raw.githubusercontent.com/ros2/examples/foxy/rclcpp/topics/minimal_subscriber/member_function.cpp

cmakelists.txt 파일 수정해준다.

image 70
cd ~/ros2_ws
colcon build
. install/setup.bash
ros2 run cpp_pubsub listener

새로운 터미널을 열고

source /opt/ros/foxy/setup.bash
cd ~/ros2_ws
. install/setup.bash
ros2 run cpp_pubsub talker
image 71

3. python 예제

3.1. 패키지 생성

cd ~/ros2_ws/src
ros2 pkg create py_pubsub --build-type ament_python --dependencies rclpy std_msgs

cd ~/ros2_ws/src/py_pubsub/py_pubsub 
touch ./{pub.py,sub.py}
image 89

이렇게 패키지와 파일을 생성하였다.

3.2. publisher 노드 구현

import rclpy
from rclpy.node import Node
from rclpy.qos import QoSProfile

from std_msgs.msg import String

class Pub(Node):

    def __init__(self):
        super().__init__('pub')
        qos_profile = QoSProfile(depth=10)
        self.publisher_ = self.create_publisher(String, 'topic', qos_profile)
        timer_period = 0.5  # seconds
        self.timer = self.create_timer(timer_period, self.timer_callback)
        self.count = 0

    def timer_callback(self):
        msg = String()
        msg.data = 'Hello World: %d' % self.count
        self.publisher_.publish(msg)
        self.get_logger().info('Publishing: "%s"' % msg.data)
        self.count += 1


def main(args=None):
    rclpy.init(args=args)
    node = Pub()
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        node.get_logger().info('Keyboard Interrupt (SIGINT)')
    finally:
        node.destroy_node()
        rclpy.shutdown()


if __name__ == '__main__':
    main()

위와 같이 코드를 작성하였다면 이제 py_pubsub 폴더에서 setup.py 를 수정해주어야 합니다.

image 90

처음 상태는 위 사진과 같을 텐데 entry_points 를 수정해주면 됩니다. 추후 sub 할 것 까지 고려해서 수정해주면 아래와 같습니다.

image 91
cd ~/ros2_ws/
colcon build
source /opt/ros/foxy/setup.bash
source ~/ros2_ws/install/local_setup.bash
ros2 run py_pubsub publisher
image 92

3.3. subscriber 노드 구현

import rclpy
from rclpy.node import Node
from rclpy.qos import QoSProfile

from std_msgs.msg import String

class Sub(Node):

    def __init__(self):
        super().__init__('sub')
        qos_profile = QoSProfile(depth=10)
        self.subscriber_ = self.create_subscription(
            String,
            'topic',
            self.listener_callback,
            qos_profile
        )

    def listener_callback(self, msg):
        self.get_logger().info('I heard: "%s"' % msg.data)


def main(args=None):
    rclpy.init(args=args)
    node = Sub()
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        node.get_logger().info('Keyboard Interrupt (SIGINT)')
    finally:
        node.destroy_node()
        rclpy.shutdown()


if __name__ == '__main__':
    main()

위 코드를 sub.py 에 입력하고 같은 방식으로 실행하면

cd ~/ros2_ws/
colcon build
source /opt/ros/foxy/setup.bash
source ~/ros2_ws/install/local_setup.bash
ros2 run py_pubsub subscriber
image 93

위 사진과 같이 python 기반의 기본적인 pub sub 예제를 실행하여 그 결과를 확인해 볼 수 있다.






0 Comments

Leave a Reply