직관적인느낌

ROS기반 sliding mode control 파이썬 코드 본문

공학/ROS

ROS기반 sliding mode control 파이썬 코드

범슐랭 2023. 3. 2. 14:17

우선, sliding mode control은 시스템의 모델을 모른 상태에서도 안정적인 제어가 가능한 방법 중 하나입니다. 이를 위해 보통은 시스템의 오차 상태를 추정하고, 추정된 오차 상태를 이용해 제어를 수행합니다. 이번 예시에서는 ROS의 rospy 모듈을 이용해 간단한 시뮬레이션을 수행하고, sliding mode control을 이용해 로봇을 제어하는 예제를 다루겠습니다.

먼저, 필요한 라이브러리를 설치합니다.

pip install numpy matplotlib rospy

다음으로, **sliding_mode_control.py**라는 파일을 만들고, 아래의 코드를 입력합니다.

#!/usr/bin/env python

import rospy
import numpy as np
import matplotlib.pyplot as plt
from geometry_msgs.msg import Twist
from nav_msgs.msg import Odometry

# 제어 게인
K = np.array([1.0, 1.0])

# 초기 위치와 목표 위치
x0 = np.array([0.0, 0.0])
xg = np.array([5.0, 5.0])

# 초기 속도와 목표 속도
v0 = np.array([0.0, 0.0])
vg = np.array([0.0, 0.0])

# sliding mode control
def control(x, v):
    global K, xg, vg
    e = x - xg
    de = v - vg
    s = de + K * e
    u = -np.sign(s) * np.linalg.norm(s)
    return u

# 오도메트리 콜백 함수
def odom_callback(msg):
    global x0, v0
    x0[0] = msg.pose.pose.position.x
    x0[1] = msg.pose.pose.position.y
    v0[0] = msg.twist.twist.linear.x
    v0[1] = msg.twist.twist.linear.y

# 메인 함수
def main():
    global x0, v0
    rospy.init_node('sliding_mode_control')
    rate = rospy.Rate(10)
    pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10)
    rospy.Subscriber('/odom', Odometry, odom_callback)
    t = []
    x = []
    v = []
    u = []
    while not rospy.is_shutdown():
        # 현재 시간
        t_now = rospy.Time.now().to_sec() - t0
        t.append(t_now)
        # 현재 위치와 속도
        x.append(x0)
        v.append(v0)
        # 제어 입력
        u_now = control(x0, v0)
        u.append(u_now)
        # 메시지 생성 및 발행
        msg = Twist()
        msg.linear.x = u_now
        pub.publish(msg)
        # 0.1초 대기
        rate.sleep()
    # 그래프 출력
    plt.figure(figsize=(10, 8))
    plt.subplot(3, 1)
		plt.plot(t, x)
		plt.title('Position')
		plt.legend(['x', 'y'])
		plt.xlabel('Time (s)')
		plt.ylabel('Position (m)')
		plt.grid(True)
		plt.subplot(3, 1, 2)
		plt.plot(t, v)
		plt.title('Velocity')
		plt.legend(['vx', 'vy'])
		plt.xlabel('Time (s)')
		plt.ylabel('Velocity (m/s)')
		plt.grid(True)
		plt.subplot(3, 1, 3)
		plt.plot(t, u)
		plt.title('Control Input')
		plt.xlabel('Time (s)')
		plt.ylabel('Control Input (m/s^2)')
		plt.grid(True)
		plt.show()
if name == 'main':
# 초기 시간
t0 = rospy.Time.now().to_sec()
main()

위의 코드에서는 먼저, K를 sliding mode control에서 사용할 제어 게인으로 정의합니다.

이어서, x0, v0는 로봇의 초기 위치와 속도를, xg, vg는 목표 위치와 속도를 각각 정의합니다.

그리고, control 함수에서 sliding mode control을 구현합니다. 이 함수는 현재 위치 x와 속도 v를 받아서, sliding mode control에 따라 제어 입력 u를 반환합니다.

그리고, odom_callback 함수는 로봇의 현재 위치와 속도를 측정하고, 이를 x0, v0에 저장합니다.

메인 함수에서는 먼저, ROS 노드를 초기화하고, 발행자와 구독자를 생성합니다. 그리고, t, x, v, u는 각각 시간, 위치, 속도, 제어 입력의 리스트로 초기화합니다.

그리고, 메인 루프에서는 현재 시간을 t_now에 저장하고, x0, v0를 이용해 현재 위치와 속도를 측정합니다. 그리고, control 함수를 이용해 제어 입력 u_now를 계산하고, 이를 /cmd_vel 토픽에 발행합니다. 그리고, t, x, v, u에 현재 값을 추가합니다. 마지막으로, 0.1초 동안 대기합니다.

메인 루프가 끝나면, 각각의 리스트를 이용해 그래프를 출력합니다.

이제 위의 코드를 실행시켜보겠습니다. 먼저, 터미널에서 아래의 명령어를 입력해 ROS 마스터를 실행시킵니다.


그리고, 새로운 터미널을 열고 아래의 명령어를 입력해 ROS 시뮬레이터를 실행시킵니다.

roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch

다음으로, 새로운 터미널을 열고 sliding_mode_control.py

rosrun my_package sliding_mode_control.py

그러면, 로봇이 목표 위치로 이동하는 과정을 그래프로 확인할 수 있습니다. 이때, 로봇이 이동하는 속도와 가속도는 sliding mode control에 의해 제어됩니다.

코드를 실행시키면서, 터미널에서 로봇의 현재 상태를 확인할 수도 있습니다. 아래의 명령어를 입력해 로봇의 현재 위치와 속도를 확인할 수 있습니다.

rostopic echo /odom

위의 코드에서는 turtlebot3 시뮬레이터를 사용했지만, 실제로 로봇을 사용할 때에도 비슷한 방식으로 sliding mode control을 구현하고 제어 입력을 발행할 수 있습니다.

단지, 실제 로봇에서는 /cmd_vel 토픽 대신에 로봇 제어에 사용되는 토픽을 사용해야 합니다.


Sliding mode control은 매우 강력한 제어 방법론 중 하나이며, 이를 이용하면 로봇의 운동을 매우 정확하게 제어할 수 있습니다. 이 방법론은 모델 불확실성이나 외부 잡음 등에도 강건하며, 이를 이용해 로봇의 안정성을 보장할 수 있습니다.

다만, sliding mode control을 구현하는 것은 다소 복잡하며, 구현 과정에서 다양한 문제점이 발생할 수 있습니다. 이를 해결하기 위해서는 먼저 sliding mode control의 기본 개념과 원리를 이해하고, 이를 실제 로봇에 적용하는 방법을 연구해야 합니다.

또한, sliding mode control은 제어 입력의 크기가 크고 급격하게 변할 수 있기 때문에, 실제 로봇에서 이를 적용할 때에는 로봇의 물리적 제약과 안전 문제를 고려해야 합니다. 이를 위해서는 sliding mode control을 이용한 로봇 제어에 대한 이론과 안전성 평가 방법 등을 깊이 연구해야 합니다.

최근에는 머신러닝과 인공지능 기술의 발전으로, sliding mode control을 보완하고 발전시키는 연구도 진행되고 있습니다. 이를 이용하면, sliding mode control의 성능을 더욱 향상시키고, 로봇 제어에 더욱 정확하고 안정적인 방법을 제공할 수 있습니다.


추가적으로, 

 

최근에는 머신러닝과 인공지능 기술의 발전으로, sliding mode control을 보완하고 발전시키는 연구도 진행되고 있습니다. 예를 들어, 다음과 같은 연구들이 이루어지고 있습니다.

  1. Deep Sliding Mode Control
  2. Deep learning과 sliding mode control을 결합한 Deep Sliding Mode Control (DSMC) 방법론이 제안되었습니다. DSMC는 sliding mode control의 강건성과 딥러닝의 학습 능력을 결합해, 제어 성능을 향상시킬 수 있습니다. 이 방법론은 다양한 로봇 제어 문제에서 좋은 성능을 보이고 있습니다.
  3. Reinforcement Learning based Sliding Mode Control
  4. 강화학습을 이용한 sliding mode control 방법론도 제안되었습니다. 이 방법론은 로봇이 자신의 상태를 학습하고, sliding mode control의 제어 입력을 최적화해가는 과정을 통해, 최적의 제어 입력을 찾아냅니다. 이를 통해, sliding mode control의 성능을 더욱 향상시킬 수 있습니다.
  5. Neural Networks based Sliding Mode Control
  6. 신경망을 이용한 sliding mode control 방법론도 제안되었습니다. 이 방법론은 sliding mode control의 제어 입력을 생성하는데에 신경망을 이용하며, 이를 학습시켜 제어 성능을 향상시킵니다. 이 방법론은 다양한 로봇 제어 문제에서 좋은 성능을 보이고 있습니다.

이러한 새로운 연구들은 sliding mode control의 성능을 더욱 향상시키고, 로봇 제어 분야에서의 응용 가능성을 높여주고 있습니다. 앞으로 머신러닝과 인공지능 기술의 발전으로 sliding mode control을 보완하고, 로봇 제어 분야에서 더욱 발전시킬 것으로 예상됩니다.

728x90
반응형