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
河田 卓志
마츠다 아키히로, 후쿠지 마사키, 유타니 테츠오
오일러리 재팬 발행
Reference
이 문제에 관하여(ROS 공부 제12탄: 센싱과 이동), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Yuya-Shimizu/items/66dd6fa254957ca773e9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이전과 전회에서 센싱과 이동에 대해 배웠습니다. 이번에는 그들을 사용하여 특정 작업을 통해 조합에 대한 이해를 깊게합니다. 다음은 작업의 흐름도를 보여줍니다.
거리의 부분을 센서로 계측하고, 그에 의한 이동을 실시한다.
구현
아래에 소스 코드가 나와 있습니다. 이 프로그램을 실행할 때 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
河田 卓志
마츠다 아키히로, 후쿠지 마사키, 유타니 테츠오
오일러리 재팬 발행
Reference
이 문제에 관하여(ROS 공부 제12탄: 센싱과 이동), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Yuya-Shimizu/items/66dd6fa254957ca773e9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)