Skip to content

[Gazebo] /rbq/odometry의 header.stamp가 --sim 옵션에서도 wall clock인 이슈 #6

Description

@mqjinwon

현상

시뮬(--sim)에서 DdsBridge가 게시하는 /rbq/odometry, /rbq/imu, /rbq/joint_statesheader.stamp가 Unix wall clock이다.

같은 버스에서 sensor_bridge(ros_gz_bridge, use_sim_time: true)가 게시하는 /rbq/imu/IMU_state stamp는 /clock과 같다.

시간축이 둘이다. 시뮬 시각이 벽시계보다 느려지면 odom stamp는 벽을 따라가고 /clock은 뒤처진다.

재현

--sim 스택과 물리 시뮬을 띄운 뒤:

ros2 topic echo /clock --once
ros2 topic echo /rbq/imu/IMU_state --field header.stamp --once
ros2 topic echo /rbq/odometry --field header.stamp --once
ros2 topic info /rbq/odometry -v

/rbq/odometry publisher는 _CREATED_BY_BARE_DDS_APP_. ROS 노드가 아니라 use_sim_time 파라미터가 없다.

같은 세션, 4 s 간격 예:

Δstamp
/clock 4.15 s
/rbq/odometry 4.50 s

코드

rbq_sdk_cpp/include/Timer.hpp:

static double GetTime() {
    std::chrono::time_point<std::chrono::system_clock> t =
        std::chrono::system_clock::now();
    auto timestamp = std::chrono::duration_cast<std::chrono::nanoseconds>(
        t.time_since_epoch()).count();
    return (timestamp * 1.0e-9);
}

--sim과 무관하게 Unix epoch다.

scripts/sim.bash--sim은 물리 시뮬 연결이다. stamp를 /clock으로 바꾸는 플래그는 없다.

sensor_bridge.launch.pyros_gz_bridgeuse_sim_time: True. /rbq/imu/IMU_state는 이 경로. /rbq/odometry는 DdsBridge payload라 타지 않는다.

기대

--sim이면 /rbq/odometryheader.stamp/clock과 같은 시간축이도록 설정하기.

  • /clock과의 차이가 시간에 따라 커지지 않는다 (dt_odom ≈ dt_clock).

stamp를 채우는 곳은 --sim일 때의 Timer::GetTime() 또는 DdsBridge. 시뮬 시각 소스는 이미 받는 sim tick이거나 /clock. /clock 전에는 stamp를 올리지 않거나, 첫 clock 이후부터 맞춘다.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions