Turtlebot bringup에서 Lost sync with device, restarting 에러

안녕하세요. 현재 저는 (조이스틱+우노)와 remote pc를 시리얼 포트로 연결하고, remote pc와 turtlebot3와는 ssh로 통신중입니다.

  1. roscore를 실행
  2. ssh my_id@192.xxx.xxx.xxx 실행
    2.1 roslaunch turtlebot3_bringup turtlebot3_robot.launch 실행
  3. turtlebot3_teleop_key 실행
  4. rosserial 실행
    과 같은 순으로 실행했습니다.

문제1. 조이스틱을 움직이면 약 1분 뒤에 터틀봇이 움직입니다.
문제2. 그러다가 갑자기 'Lost sync with device, restarting이라는 에라가 발생합니다.

turtlebot3와 remote pc에서 소프트웨어 업데이트 및 펌웨어 업데이트를 다 했는데도 저런 에라가 뜨네요.
해결 방법을 알려주시면 정말 감사합니다.

image
image
image
image

<기존 코드>
#!/usr/bin/env python

import rospy
from geometry_msgs.msg import Twist
from std_msgs.msg import String

BURGER_MAX_LIN_VEL = 0.5
BURGER_MAX_ANG_VEL = 2.84

WAFFLE_MAX_LIN_VEL = 0.26
WAFFLE_MAX_ANG_VEL = 1.82

LIN_VEL_STEP_SIZE = 0.05
ANG_VEL_STEP_SIZE = 0.1

msg = “”"
Control Your TurtleBot3!

Moving around:
w
a s d
x

w/x : increase/decrease linear velocity (Burger : ~ 0.22, Waffle and Waffle Pi : ~ 0.26)
a/d : increase/decrease angular velocity (Burger : ~ 2.84, Waffle and Waffle Pi : ~ 1.82)

space key, s : force stop

CTRL-C to quit
“”"

e = “”"
Communications Failed
“”"

def vels(target_linear_vel, target_angular_vel):
return “currently:\tlinear vel %s\t angular vel %s \n” % (target_linear_vel, target_angular_vel)

def makeSimpleProfile(output, input, slop):
if input > output:
output = min(input, output + slop)
elif input < output:
output = max(input, output - slop)
else:
output = input
return output

def constrain(input, low, high):
if input < low:
input = low
elif input > high:
input = high
else:
input = input
return input

def checkLinearLimitVelocity(vel):
if turtlebot3_model == “burger”:
vel = constrain(vel, -BURGER_MAX_LIN_VEL, BURGER_MAX_LIN_VEL)
elif turtlebot3_model == “waffle” or turtlebot3_model == “waffle_pi”:
vel = constrain(vel, -WAFFLE_MAX_LIN_VEL, WAFFLE_MAX_LIN_VEL)
else:
vel = constrain(vel, -BURGER_MAX_LIN_VEL, BURGER_MAX_LIN_VEL)
return vel

def checkAngularLimitVelocity(vel):
if turtlebot3_model == “burger”:
vel = constrain(vel, -BURGER_MAX_ANG_VEL, BURGER_MAX_ANG_VEL)
elif turtlebot3_model == “waffle” or turtlebot3_model == “waffle_pi”:
vel = constrain(vel, -WAFFLE_MAX_ANG_VEL, WAFFLE_MAX_ANG_VEL)
else:
vel = constrain(vel, -BURGER_MAX_ANG_VEL, BURGER_MAX_ANG_VEL)
return vel

def joystick_callback(msg):
global target_linear_vel, target_angular_vel, status

key = msg.data
if key == 'w':
    target_linear_vel = checkLinearLimitVelocity(target_linear_vel + LIN_VEL_STEP_SIZE)
    status += 1
    print(vels(target_linear_vel, target_angular_vel))
elif key == 'x':
    target_linear_vel = checkLinearLimitVelocity(target_linear_vel - LIN_VEL_STEP_SIZE)
    status += 1
    print(vels(target_linear_vel, target_angular_vel))
elif key == 'a':
    target_angular_vel = checkAngularLimitVelocity(target_angular_vel + ANG_VEL_STEP_SIZE)
    status += 1
    print(vels(target_linear_vel, target_angular_vel))
elif key == 'd':
    target_angular_vel = checkAngularLimitVelocity(target_angular_vel - ANG_VEL_STEP_SIZE)
    status += 1
    print(vels(target_linear_vel, target_angular_vel))
elif key == ' ' or key == 's':
    target_linear_vel = 0.0
    control_linear_vel = 0.0
    target_angular_vel = 0.0
    control_angular_vel = 0.0
    print(vels(target_linear_vel, target_angular_vel))
else:
    if key == '\x03':
        rospy.signal_shutdown("User request")

if status == 20:
    print(msg)
    status = 0

if name == “main”:
rospy.init_node(‘turtlebot3_teleop’) # ROS 노드 초기화
pub = rospy.Publisher(‘cmd_vel’, Twist, queue_size=5) # 퍼블리셔 생성
rospy.Subscriber(‘joy’, String, joystick_callback) # 서브스크라이버 생성 및 콜백 함수 등록

turtlebot3_model = rospy.get_param("model", "burger")

status = 0
target_linear_vel = 0.0
target_angular_vel = 0.0
control_linear_vel = 0.0
control_angular_vel = 0.0

try:
    print(msg)
    while not rospy.is_shutdown():

        twist = Twist()
        control_linear_vel = makeSimpleProfile(control_linear_vel, target_linear_vel, (LIN_VEL_STEP_SIZE / 2.0))
        twist.linear.x = control_linear_vel
        twist.linear.y = 0.0
        twist.linear.z = 0.0

        control_angular_vel = makeSimpleProfile(control_angular_vel, target_angular_vel, (ANG_VEL_STEP_SIZE / 2.0))
        twist.angular.x = 0.0
        twist.angular.y = 0.0
        twist.angular.z = control_angular_vel

        pub.publish(twist)

except Exception as ex:
    print(e)
    print("Exception:", ex)

finally:
    twist = Twist()
    twist.linear.x = 0.0
    twist.linear.y = 0.0
    twist.linear.z = 0.0
    twist.angular.x = 0.0
    twist.angular.y = 0.0
    twist.angular.z = 0.0
    pub.publish(twist)

<수정한 코드>
#!/usr/bin/env python

import rospy
import sys, select, os
from geometry_msgs.msg import Twist
from std_msgs.msg import String

BURGER_MAX_LIN_VEL = 0.22
BURGER_MAX_ANG_VEL = 2.84

WAFFLE_MAX_LIN_VEL = 0.26
WAFFLE_MAX_ANG_VEL = 1.82

LIN_VEL_STEP_SIZE = 0.01
ANG_VEL_STEP_SIZE = 0.1

msg = “”"
Control Your TurtleBot3!

Moving around:
w
a s d
x

w/x : increase/decrease linear velocity (Burger : ~ 0.22, Waffle and Waffle Pi : ~ 0.26)
a/d : increase/decrease angular velocity (Burger : ~ 2.84, Waffle and Waffle Pi : ~ 1.82)

space key, s : force stop

CTRL-C to quit
“”"

e = “”"
Communications Failed
“”"
turtlebot3_model = rospy.get_param(“model”, “burger”)

key = None

pub = rospy.Publisher(‘cmd_vel’, Twist, queue_size=10)

target_linear_vel = 0.0
target_angular_vel = 0.0
control_linear_vel = 0.0
control_angular_vel = 0.0

def vels(target_linear_vel, target_angular_vel):
return “currently:\tlinear vel %s\t angular vel %s \n” % (target_linear_vel, target_angular_vel)

def makeSimpleProfile(output, input, slop):
if input > output:
output = min(input, output + slop)
elif input < output:
output = max(input, output - slop)
else:
output = input
return output

def constrain(input, low, high):
if input < low:
input = low
elif input > high:
input = high
else:
input = input
return input

def checkLinearLimitVelocity(vel):
if turtlebot3_model == “burger”:
vel = constrain(vel, -BURGER_MAX_LIN_VEL, BURGER_MAX_LIN_VEL)
elif turtlebot3_model == “waffle” or turtlebot3_model == “waffle_pi”:
vel = constrain(vel, -WAFFLE_MAX_LIN_VEL, WAFFLE_MAX_LIN_VEL)
else:
vel = constrain(vel, -BURGER_MAX_LIN_VEL, BURGER_MAX_LIN_VEL)
return vel

def checkAngularLimitVelocity(vel):
if turtlebot3_model == “burger”:
vel = constrain(vel, -BURGER_MAX_ANG_VEL, BURGER_MAX_ANG_VEL)
elif turtlebot3_model == “waffle” or turtlebot3_model == “waffle_pi”:
vel = constrain(vel, -WAFFLE_MAX_ANG_VEL, WAFFLE_MAX_ANG_VEL)
else:
vel = constrain(vel, -BURGER_MAX_ANG_VEL, BURGER_MAX_ANG_VEL)
return vel

def mid_control():
rospy.init_node(‘turtlebot3_teleop_keyboard’, anonymous=True)
rospy.Subscriber(‘joy’, String, getkey)

def twist_reset():
twist = Twist()
twist.linear.x = 0.0
twist.linear.y = 0.0
twist.linear.z = 0.0
twist.angular.x = 0.0
twist.angular.y = 0.0
twist.angular.z = 0.0
pub.publish(twist)

def getkey(data):
global key, target_linear_vel, target_angular_vel, control_linear_vel, control_angular_vel, pub

r = rospy.Rate(1)
key = data.data
rospy.loginfo(rospy.get_caller_id() + 'key: %s', key)

if key == 'w':
    target_linear_vel = checkLinearLimitVelocity(target_linear_vel + LIN_VEL_STEP_SIZE)
    print(vels(target_linear_vel, target_angular_vel))

elif key == 'x':
    target_linear_vel = checkLinearLimitVelocity(target_linear_vel - LIN_VEL_STEP_SIZE)
    print(vels(target_linear_vel, target_angular_vel))

elif key == 'a':
    target_angular_vel = checkAngularLimitVelocity(target_angular_vel + ANG_VEL_STEP_SIZE)
    print(vels(target_linear_vel, target_angular_vel))

elif key == 'd':
    target_angular_vel = checkAngularLimitVelocity(target_angular_vel - ANG_VEL_STEP_SIZE)
    print(vels(target_linear_vel, target_angular_vel))

elif key == ' ' or key == 's':
    target_linear_vel = 0.0
    control_linear_vel = 0.0
    target_angular_vel = 0.0
    control_angular_vel = 0.0
    print(vels(target_linear_vel, target_angular_vel))

twist = Twist()
control_linear_vel = makeSimpleProfile(control_linear_vel, target_linear_vel, (LIN_VEL_STEP_SIZE / 2.0))
twist.linear.x = control_linear_vel
twist.linear.y = 0.0
twist.linear.z = 0.0

control_angular_vel = makeSimpleProfile(control_angular_vel, target_angular_vel, (ANG_VEL_STEP_SIZE / 2.0))
twist.angular.x = 0.0
twist.angular.y = 0.0
twist.angular.z = control_angular_vel

pub.publish(twist)

if name == “main”:

mid_control()

rospy.on_shutdown(twist_reset)

rospy.spin()

이렇게 코드를 수정하니 모든 문제가 해결되었습니다. 그런데 왜 기존 코드는 안되었던 걸까요?