새소식

ROS & Robotics

ROS Message Filter : Approximate Time Callback error

  • -

ROS 에서 message filter 의 기능은 서로 다른 주파수로 발행되는 각 토픽들의 Sync 를 맞추는 것입니다. 

저의 경우, /image_raw, /camera_info, /scan , /darknet_ros/bounding_boxes 의 4개의 토픽을 받아서 필터로 들어오도록 하고 있습니다.

하지만, /darknet_ros/bounding_boxes 를 filter 의 인수로 추가하기만 하면 메시지 필터 콜백 함수가 불러와지지 않았습니다. 

/image_raw, /camera_info, /scan 만으로는 문제없이 작동하는 메시지 필터가 **/bounding_box 에 대해서만** 작동하지 않았습니다.

![](https://velog.velcdn.com/images/zzziito/post/5914583d-f32e-40c6-9647-be633b49ea41/image.png)


메시지 필터는 header 의 time stamp 값을 기준으로 토픽을 통과시킵니다

따라서 time stamp 를 확인할 필요가 있습니다. 

rostopic_info 로 두 가지 토픽 (bounding_box, image) 을 rostopic info 로 자세히 확인해 보면 다음과 같은 정보가 출력됩니다. 
![](https://velog.velcdn.com/images/zzziito/post/2125865f-229c-4952-bd99-36cf78fe42d8/image.png)

```python
//bounding_box
---
header:
  seq: 174
  stamp:
    secs: 1669093345
    nsecs: 623516547
  frame_id: "detection"
image_header:
  seq: 92
  stamp:
    secs: 1668230406
    nsecs: 708906199
  frame_id: "camera"
bounding_boxes:
  -
    probability: 0.3576541244983673
    xmin: 219
    ymin: 12
    xmax: 508
    ymax: 300
    id: 72
    Class: "refrigerator"
---
```

```python
//image
---
header:
  seq: 3815
  stamp:
    secs: 1668230396
    nsecs: 590875035
  frame_id: "camera"
height: 480
width: 640
distortion_model: ''
D: []
K: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
R: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
P: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
binning_x: 0
binning_y: 0
roi:
  x_offset: 0
  y_offset: 0
  height: 0
  width: 0
  do_rectify: False
---
```

header/stamp 를 보면 두 토픽의 시간 스탬프가 서로 조금 다른 것을 볼 수 있습니다. 
![](https://velog.velcdn.com/images/zzziito/post/3b74a691-f894-401f-b63f-7e20078a5a63/image.png)


이와 같이 로봇 프로젝트의 경우 센서 데이터 획득 시점과 bag 파일 재생 시점이 달라서 여러 문제들이 생기곤 합니다. 

구글에 찾아보면 이와 같은 문제에 대해서는 크게 두 가지의 해법이 제공됩니다. 

1.  MySyncPolicy 에 들어가는 변수값을 조정하거나, 
2. waitForTransform 에 들어가는 ros::Time(0) 을 ros::Time(now) 로 변경하거나, 

등의 해결 방법을 볼 수 있습니다. (1) 방법은 ApproximateTime 필터의 기준을 완화시켜주고 (2) 방법은 시뮬레이션 타임과 bag record 타임의 시간 차이를 해결해 줄 수 있습니다. 

## 해결 방법

/bounding_box 가 다른 토픽들과 다른 점은, 나머지 세 토픽은 터틀봇에서 데이터셋을 수집할 때 받아온 토픽이지만
이것만은 **darknet_ros 에서 현재 시점으로 발행**하고 있다는 점이었습니다

darknet_ros 의 메인 코드인 YoloObjectDetector.cpp 코드를 다음과 같이 수정했습니다.
![](https://velog.velcdn.com/images/zzziito/post/6f24fc96-5fde-48eb-a4d3-1181d99cccd3/image.png)

이렇게 되면, /image_raw 의 time stamp 와 동일하게 bounding box 가 발행됩니다. 
![](https://velog.velcdn.com/images/zzziito/post/9c55bb7b-5781-4696-b807-a176431ef4d8/image.png)


다음과 같이 정상적으로 콜백 함수를 호출하는 것을 볼 수 있습니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.