카테고리 없음
(bash) 표준입력 받아서 원하는 라인만 출력하기 (while read line)
미친토끼
2025. 3. 20. 10:06
ydlidar_x4_example을 내려받아서, 나의 X2.yaml 파일을 참고해서 yaml 파일을 수정한 다음,
$ ros2 launch ydlidar_x4_example ydlidar_x4_example.launch.py
을 실행하고,
$ ros2 topic echo /scan
를 실행하면 정보가 어지럽게 나온다. 라이다의 거리 측정 정보만 보고 싶은데, intensities 및 여타 정보가 함께 출력되어서 어지럽다.
header:
stamp:
sec: 1742432685
nanosec: 486224000
frame_id: laser_frame
angle_min: -3.1415927410125732
angle_max: 3.1415927410125732
angle_increment: 0.02454369328916073
time_increment: 0.00033467577304691076
scan_time: 0.08567699790000916
range_min: 0.10000000149011612
range_max: 12.0
ranges:
- 0.0
- 0.37599998712539673
- 0.3799999952316284
- 0.38499999046325684
- 0.38999998569488525
- 0.39500001072883606
- 0.4000000059604645
- 0.4059999883174896
...
...
intensities:
- 0.0
- 1008.0
- 1008.0
- 1008.0
- 1008.0
- 1008.0
- 1008.0
- 1008.0
ranges: 정보만 보고 싶어서 간단히 스크립트를 짜보았다.
#!/bin/bash
# 표준 입력으로 받아, 특정 라인(가령 'ranges:') 뒤에 나오는 라인만 출력하고,
# 다른 라인(가령 'intensities') 이후 데이터는 출력하지 않는 스크립트.
# 파일명 ydfilter
# 사용법: ros2 topic echo /scan | ydfilter
# 여기서 주의할 점은, 대괄호 안에서 문자열을 비교할 때, 직접 문자열을 비교해서는 안 되고, 문자열을 변수에 넣어
# 비교해야 한다는 점이다. bash 쉘 스크립트가 막강하지만 규칙이 일관적이지 않아 까다롭니다.
# if [[ $line == "*ranges:*"]] : 이런 비교는 안 됨.
# ranges="*ranges:*"
# if [[ $line == $ranges ]] : 이렇게 변수에 넣어 비교를 해야 함.
is_range=0
RANGES="*ranges:*"
INTEN="*intensities:*"
while read line
do
if [[ $line == $RANGES ]]; then
is_range=1
#echo "I found out ...range..."
fi
if [[ $line == $INTEN ]]; then
is_range=0
#echo "I found out intensities..."
fi
if [[ $is_range == 1 ]]; then
echo $line
fi
done < "${1:-/dev/stdin}"
이제 거리 측정 정보만 cm 단위로 출력되어서 마음에 든다.
ranges:
- 0.0
- 0.375
- 0.3790000081062317
- 0.38199999928474426
- 0.3869999945163727
- 0.3919999897480011
- 0.3959999978542328
- 0.4020000100135803
- 0.40799999237060547
- 0.414000004529953
- 0.42100000381469727
- 0.42800000309944153