ROS의 공부 제11탄:센싱-LaserScan
#프로그래밍 ROS< 감지-LaserScan >
소개
하나의 참고서에 따라 ROS(Robot Operating System)를 어려움 없이 다루는 것이 목적이다. 그 제 11탄으로서 센싱-LaserScan을 다룬다.
환경
가상 환경
소프트
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에 장착 된 깊이 카메라를 사용하여 레이저 스캔과 같은 의사 센서 데이터를 처리합니다. (이것은 비용 절감을 위해 진짜 레이저 스캐너는 탑재하지 않은 것 같다)
이전 (htps : // 이 m / 유야 시미즈 / ms / f6 a fb00fd37019540 또는 5)과 마찬가지로 turtlebot을 gazebo에서 시작한 다음 rostopic list
를 사용하여 turtlebot의 사양을 확인합니다. 그 때의 모습은 다음과 같습니다.
빨간색으로 표시된 것처럼 /scan
의 주제가 있습니다. 또한 rostopic echo /scan
를 실행하여 처리하려는 데이터가 어떻게 전달되는지 확인할 수 있습니다. 그 때의 모습은 다음과 같습니다.
몇 가지 매개 변수가 있음을 알 수 있습니다. 여기에 배포 된 것을 구독하면 센서 데이터를 처리 할 수 있습니다.
센서 데이터 처리
여기서 간단히 센서 데이터의 취급을 기록해 둔다.
레이저 스캔과 같은 데이터로 거리뿐만 아니라 방향도 구할 수 있습니다. 그 공식을 보여줍니다.
방향
bearing = msg.angle_min + i * msg.angle_max / len(msg.ranges)
로봇 바로 앞의 가장 가까운 장애물까지의 거리 : 범위 배열의 중앙 요소
range_ahead = msg.ranges[len(msg.ranges)//2]
스캐너에서 감지 한 가장 가까운 장애물까지의 거리 : 범위 배열의 최소값
closest_range = min(msg.ranges)
구현
여기서는 센서 데이터를 읽는 것이 목적이기 때문에 단순히 읽은 데이터를 print
로 수치를 가시화하는 예를 구현한다. 다음은 소스 코드와 그 때의 출력을 보여줍니다.
소스 코드
range_ahead.py#! /usr/bin/env python3
import rospy
from sensor_msgs.msg import LaserScan #レーザスキャンを扱うメッセージ
def scan_callback(msg):
range_ahead = msg.ranges[len(msg.ranges)//2] #ロボットの真正面にある障害物までの距離 ranges配列の中央要素
print(f"range ahead: {range_ahead:.1f}") #正面にある障害物までの距離を表示
rospy.init_node('range_ahead') #'range_ahead'というノードを生成・初期化
scan_sub = rospy.Subscriber('scan', LaserScan, scan_callback) #'scan'トピックをLaserScan型で購読し,scan_callback関数を呼び出す
rospy.spin() #ループ
출력
출력으로 표시된 수치는 gazebo에서 직접 turtlebot을 적절히 움직였을 때의 값이며, 센서는 그림에 ahead라고 하는 방향이 정면과 같다.
감상
이번에 센서의 취급을 배웠다. 로봇을 다룰 때 매우 중요해지는 곳이다. 다음 번은 지난번 배운 이동과 이번에도 센서를 조합한 보다 실천적인 것을 배운다는 것은 매우 기대된다.
참고문헌
프로그래밍 ROS Python으로 로봇 애플리케이션 개발
Morgan Quigley, Brian Gerkey, William D.Smart
河田 卓志
마츠다 아키히로, 후쿠지 마사키, 유타니 테츠오
오일러리 재팬 발행
Reference
이 문제에 관하여(ROS의 공부 제11탄:센싱-LaserScan), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Yuya-Shimizu/items/413b57b0305597be35be
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#! /usr/bin/env python3
import rospy
from sensor_msgs.msg import LaserScan #レーザスキャンを扱うメッセージ
def scan_callback(msg):
range_ahead = msg.ranges[len(msg.ranges)//2] #ロボットの真正面にある障害物までの距離 ranges配列の中央要素
print(f"range ahead: {range_ahead:.1f}") #正面にある障害物までの距離を表示
rospy.init_node('range_ahead') #'range_ahead'というノードを生成・初期化
scan_sub = rospy.Subscriber('scan', LaserScan, scan_callback) #'scan'トピックをLaserScan型で購読し,scan_callback関数を呼び出す
rospy.spin() #ループ
Reference
이 문제에 관하여(ROS의 공부 제11탄:센싱-LaserScan), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Yuya-Shimizu/items/413b57b0305597be35be텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)