ROS Oneday - turtlebot Topic 다루기

조홍기·2023년 12월 19일

ros

목록 보기
5/8

문제 1) turtlebot 노드 경로 색 바꾸기

ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
ros2 service call /turtle1/set_pen turtlesim/srv/SetPen "{r: 0, g: 255, b: 0, width: 20}"
ros2 service call /turtle1/set_pen turtlesim/srv/SetPen "{r: 255, g: 255, b: 0, width: 10}"
ros2 service call /turtle1/set_pen turtlesim/srv/SetPen "{r: 0, g: 255, b: 255, width: 7}"

ros2 service call /reset std_srvs/srv/Empty

문제 2) 별 그리기

ros2 service call /kill turtlesim/srv/Kill "name: 'turtle1'"
ros2 service call /spawn turtlesim/srv/Spawn "{x: 7, y: 6, theta: 0, name: 'turtle1'}"
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 8, y: 6, theta: -2.5132}"
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 7.190983, y: 5.412215, theta: -1.2566}"
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 7.5, y: 4.4611582, theta: 0}"
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 6.690983, y: 5.048943, theta: 0}"
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 5.881966, y: 4.461158, theta: 0}"
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 6.190983, y: 5.4122147, theta: 0}"
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 5.381966, y: 6, theta: 0}"
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 6.381966, y: 6, theta: 0}"
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 6.690983, y: 6.9510565, theta: 0}"
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 7, y: 6, theta: 0}"

-> 이전 Point에 각도로 cos, sin값 구해서 다음

문제 3) turtlebot 4대 동시에 회전시키기

ros2 service call /reset std_srvs/srv/Empty
ros2 service call /kill turtlesim/srv/Kill "{name: 'turtle1'}"
ros2 service call /spawn turtlesim/srv/Spawn "{x: 6, y: 6, name: 't1'}"
ros2 service call /spawn turtlesim/srv/Spawn "{x: 6, y: 4.5, name: 't2'}"
ros2 service call /spawn turtlesim/srv/Spawn "{x: 6, y: 3, name: 't3'}"
ros2 service call /spawn turtlesim/srv/Spawn "{x: 6, y: 7.5, name: 't4'}"
ros2 topic pub /t1/cmd_vel --rate 1 geometry_msgs/msg/Twist "{linear: {x: 1.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
ros2 topic pub /t2/cmd_vel --rate 2 geometry_msgs/msg/Twist "{linear: {x: 1.5, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
ros2 topic pub /t3/cmd_vel --rate 3 geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
ros2 topic pub /t4/cmd_vel --rate 4 geometry_msgs/msg/Twist "{linear: {x: 2.5, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

문제4) 2번 문제 python 코드로 구현

방법1)

import rclpy as rp
from turtlesim.srv import TeleportAbsolute, Kill, Spawn
from std_srvs.srv import Empty
import time
import numpy as np

def send_request(test_node, req):
    future = cli.call_async(req)
    while not future.done():
        rp.spin_once(test_node)

rp.init()

test_node = rp.create_node('client_test')

cli = test_node.create_client(Empty, '/reset')
req = Empty.Request()
send_request(test_node, req)
cli.destroy()
time.sleep(0.1)

cli = test_node.create_client(Kill, '/kill')
req = Kill.Request()
req.name = 'turtle1'
send_request(test_node, req)
cli.destroy()
time.sleep(0.1)

star_degrees = [
    0,
    -144,
    -72,
    144,
    -144,
    72,
    144,
    0,
    72,
    -72
]

before_x, before_y = 6, 6
star_length = 2


cli = test_node.create_client(Spawn, '/spawn')
req = Spawn.Request()
req.x, req.y = float(before_x), float(before_y)
req.name = 'turtle1'
send_request(test_node, req)
cli.destroy()
time.sleep(0.1)

service_name = '/turtle1/teleport_absolute'
cli = test_node.create_client(TeleportAbsolute, service_name)

req = TeleportAbsolute.Request()


for degree in star_degrees:
    req.x = before_x + star_length * np.cos(degree * np.pi/180)
    req.y = before_y + star_length * np.sin(degree * np.pi/180)

    send_request(test_node, req)

    before_x = req.x
    before_y = req.y

cli.destroy()
test_node.destroy_node()

방법2

import rclpy as rp
from turtlesim.srv import TeleportAbsolute, Kill, Spawn
from std_srvs.srv import Empty
import time
import numpy as np

def send_request(test_node, req):
    future = cli.call_async(req)
    while not future.done():
        rp.spin_once(test_node)

rp.init()

test_node = rp.create_node('client_test')

cli = test_node.create_client(Empty, '/reset')
req = Empty.Request()
send_request(test_node, req)
cli.destroy()
time.sleep(0.1)

cli = test_node.create_client(Kill, '/kill')
req = Kill.Request()
req.name = 'turtle1'
send_request(test_node, req)
cli.destroy()
time.sleep(0.1)

star_points = 5
before_x, before_y = 6, 6
star_length = 2
degree = -144

cli = test_node.create_client(Spawn, '/spawn')
req = Spawn.Request()
req.x, req.y = float(before_x), float(before_y)
req.name = 'turtle1'
send_request(test_node, req)
cli.destroy()
time.sleep(0.1)

service_name = '/turtle1/teleport_absolute'
cli = test_node.create_client(TeleportAbsolute, service_name)

req = TeleportAbsolute.Request()


for i in range(star_points):
    req.x = before_x + star_length * np.cos(degree * np.pi/180)
    req.y = before_y + star_length * np.sin(degree * np.pi/180)

    send_request(test_node, req)

    before_x = req.x
    before_y = req.y
    degree += -144

cli.destroy()
test_node.destroy_node()

문제 5) 문제 3번 subscriber 만들어서 4개 Pose값 가져오기

import rclpy
from rclpy.node import Node
from turtlesim.msg import Pose

class Subscriber(Node) :
  def __init__(self) :
    super().__init__('subscriber')
    self.sub1 = self.create_subscription(
      Pose, # 임포트 된 메시지 타입 
      '/t1/pose', # 토픽리스트에서 조회한 토픽 주소
      self.callback1,
      10)
    self.sub2 = self.create_subscription(
      Pose, # 임포트 된 메시지 타입 
      '/t2/pose', # 토픽리스트에서 조회한 토픽 주소
      self.callback2,
      10)
    self.sub3 = self.create_subscription(
      Pose, # 임포트 된 메시지 타입 
      '/t3/pose', # 토픽리스트에서 조회한 토픽 주소
      self.callback3,
      10)
    self.sub4 = self.create_subscription(
      Pose, # 임포트 된 메시지 타입 
      '/t4/pose', # 토픽리스트에서 조회한 토픽 주소
      self.callback4,
      10)

  def callback1(self, msg) :
    x = msg.x
    y = msg.y
    print(f"turtle_name: t1 X: {x} , Y: {y}")

  def callback2(self, msg) :
    x = msg.x
    y = msg.y
    print(f"turtle_name: t2 X: {x} , Y: {y}")

  def callback3(self, msg) :
    x = msg.x
    y = msg.y
    print(f"turtle_name: t3 X: {x} , Y: {y}")

  def callback4(self, msg) :
    x = msg.x
    y = msg.y
    print(f"turtle_name: t4 X: {x} , Y: {y}")

def main(args=None) :
  rclpy.init(args=args)
  node = Subscriber()
  
  try :
    rclpy.spin(node)
  except KeyboardInterrupt :
    node.get_logger().info('Stopped by Keyboard')
  finally :
    node.destroy_node()
    rclpy.shutdown()


if __name__ == '__main__' :
  main()

profile
ROS, Python, Cpp 공부 중입니다.

0개의 댓글