ROS 공부 제12탄: 센싱과 이동

# 프로그래밍 ROS < 감지 및 이동 >



소개



하나의 참고서에 따라 ROS(Robot Operating System)를 어려움 없이 다루는 것이 목적이다. 그 제 12 탄으로서 센싱과 이동을 다룬다.

환경



가상 환경





소프트
VMware Workstation 15

실장 RAM
2GB

OS
우분투 64비트

ISO 파일
ubuntu-mate-20.04.1-desktop-amd64.iso



컴퓨터





장치
MSI

프로세서
Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz 2.50GHz

실장 RAM
8.00GB(7.89GB 사용 가능)

OS
Windows (Windows 10 Home, 버전: 1909)



ROS





Distribution
noetic

프로그래밍 언어
파이썬 3.8.5

시뮬레이션
gazebo


작업



이전과 전회에서 센싱과 이동에 대해 배웠습니다. 이번에는 그들을 사용하여 특정 작업을 통해 조합에 대한 이해를 깊게합니다. 다음은 작업의 흐름도를 보여줍니다.


거리의 부분을 센서로 계측하고, 그에 의한 이동을 실시한다.

구현



아래에 소스 코드가 나와 있습니다. 이 프로그램을 실행할 때 gazebo에서 turtlebot을 시작한 상태에서 수행됩니다.

wanderbot.py
#! /usr/bin/env python3

import rospy
from geometry_msgs.msg import Twist
from sensor_msgs.msg import LaserScan

def scan_callback(msg):
    """読み取ったセンサデータをグローバル変数に渡すことで,プログラム全体でその情報を扱えるようにする"""
    global g_range_ahead
    g_range_ahead = msg.ranges[len(msg.ranges)//2]  #正面の距離をグローバル変数に格納


g_range_ahead = 1   #初期値
scan_sub = rospy.Subscriber('scan', LaserScan, scan_callback)   #センサデータの購読
cmd_vel_pub = rospy.Publisher('cmd_vel', Twist, queue_size = 1) #移動トピックの配信準備

rospy.init_node('wanderbot')    #ノードの初期化

state_change_time = rospy.Time.now()    #現在時刻を記録
driving_forward = True  #直進可能と仮定
rate = rospy.Rate(10)   #10Hz

#ctrlキーが押されるまでループ
while not rospy.is_shutdown():

    #直進可
    if driving_forward:
        #条件1と2を満たすか
        if (g_range_ahead < 0.8 or rospy.Time.now() > state_change_time):
            driving_forward = False #直進不可
            state_change_time = rospy.Time.now() + rospy.Duration(5)    #rosの基準で5duration先の時刻を現在時刻とする → 5durationの間回転を続けるということ

    #直進不可
    else:
        #方向転換が終了したか
        if rospy.Time.now() > state_change_time:
            driving_forward = True  #直進可能
            state_change_time = rospy.Time.now() + rospy.Duration(30)   #rosの基準で30duration先の時刻を現在時刻とする → 30durationの間直進を続けるということ


    twist = Twist() #全体を0で初期化するために毎回Twistインスタンスを生成    これにより,以下では動かしたい要素のみの変更で済む

    #直進可能 → 直線方向の速度1
    if driving_forward:
        twist.linear.x = -1

    #直進不可 → 方向転換 → 回転の速度(z軸周り)1
    else:
        twist.angular.z = 1

    cmd_vel_pub.publish(twist)  #移動トピックを配信

    rate.sleep()    #10Hz(=0.1秒)待つ

결과



그 결과, 여기저기 이동하는 로봇이 완성되었다. 그 상태를 이하에 나타낸다.


감상



전회와 전회에서 배운 twist 에 의한 이동과 LaserScan 를 이용한 센싱을 어떻게 조합하는가 하는 것을 wanderbot을 사용하여 배웠다. 특히 센싱에 의해 읽은 데이터는 글로벌 변수에 저장함으로써 조건에 그 데이터를 이용하거나 할 수 있으므로, 조건부의 이동 프로그램의 실현이 가능하다는 것을 확인할 수 있었다.

참고문헌



프로그래밍 ROS Python으로 로봇 애플리케이션 개발
      Morgan Quigley, Brian Gerkey, William D.Smart
                   河田 卓志
         마츠다 아키히로, 후쿠지 마사키, 유타니 테츠오
               오일러리 재팬 발행

좋은 웹페이지 즐겨찾기