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
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
이제 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
이렇게 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
위 코드를 실행하면 위 사진과 같은 package.xml 파일을 볼 수 있을 것이다.
이렇게 수정한다.
cmakelists.txt 파일은 위와 같은텐데
cd ~/ros2_ws
colcon build
위 코드 실행하면 이제 build 성공하는 것을 볼 수 있다.
cd ~/ros2_ws
colcon build
. install/setup.bash
ros2 run cpp_pubsub talker
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 파일 수정해준다.
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
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}
이렇게 패키지와 파일을 생성하였다.
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 를 수정해주어야 합니다.
처음 상태는 위 사진과 같을 텐데 entry_points 를 수정해주면 됩니다. 추후 sub 할 것 까지 고려해서 수정해주면 아래와 같습니다.
cd ~/ros2_ws/
colcon build
source /opt/ros/foxy/setup.bash
source ~/ros2_ws/install/local_setup.bash
ros2 run py_pubsub publisher
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
위 사진과 같이 python 기반의 기본적인 pub sub 예제를 실행하여 그 결과를 확인해 볼 수 있다.
0 Comments