# External Vision & Estimator Velocity Mismatch

**URL:** <https://discuss.px4.io/t/external-vision-estimator-velocity-mismatch/47857>\
**Category:** PX4 Autopilot\
**Created:** [November 11, 2025, 7:18am UTC](https://discuss.px4.io/t/external-vision-estimator-velocity-mismatch/47857 "2025-11-11T07:18:30Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![PH\_LaiBon](https://discuss.px4.io/letter_avatar_proxy/v4/letter/p/9d8465/32.png) [@PH\_LaiBon](https://discuss.px4.io/u/PH_LaiBon)\
**Post date:** [November 11, 2025, 7:18am UTC](https://discuss.px4.io/t/external-vision-estimator-velocity-mismatch/47857/1 "2025-11-11T07:18:30Z")

</div>

Nihao guys,

PX4 version: 1.14.2  
EKF2\_EV\_CTRL: 9 (Horizontal + Yaw)  
Log URL: [https://review.px4.io/plot\_app?log=0162163c-9f74-47aa-bf94-c63f24da29c1](https://review.px4.io/plot_app?log=0162163c-9f74-47aa-bf94-c63f24da29c1)

I am currently working on VIO outdoor autonomous flight under mission mode via External Vision. I specifically published nav\_msgs/Odometry message to mavros/odometry/out.

I assumed the coordinate system in MAVROS should all be in ENU convention, thus I further confirmed the coordination system of my VIO algorithm is in ENU convention and is also aligned with world frame since I had written a static transform to handle the transformation between {map} frame of MAVROS to {global} frame of visual algorithm. Below is my tf tree.

 ![OPV_tf](https://discuss.px4.io/uploads/default/original/3X/0/a/0a6076d3d1610ac9ad20d63ad831b96c9951bb25.jpeg)

And here are my uORB topics. You can see the value between visual odometry and estimator are almost aligned but with an exact sign difference. I feel like this issue is not related to ENU to NED transformation. Please feel free to tell me what is the root cause of this problem.

 ![Screenshot from 2025-11-11 13-34-40](https://discuss.px4.io/uploads/default/original/3X/8/6/86275d31abac604110680552f98580f851089a63.png)

 ![Screenshot from 2025-11-11 13-33-31](https://discuss.px4.io/uploads/default/original/3X/6/1/610470c15ff67affbac353972b82cdc282f102e1.png)

Thanks for reading my question.

Best,  
PH Lai

---

<div class="post-metadata">

**Author:** ![PH\_LaiBon](https://discuss.px4.io/letter_avatar_proxy/v4/letter/p/9d8465/32.png) [@PH\_LaiBon](https://discuss.px4.io/u/PH_LaiBon)\
**Post date:** [November 21, 2025, 10:27am UTC](https://discuss.px4.io/t/external-vision-estimator-velocity-mismatch/47857/2 "2025-11-21T10:27:29Z")

</div>

@bresch may you help me take a look? Thanks!

---

<div class="post-metadata">

**Author:** ![PH\_LaiBon](https://discuss.px4.io/letter_avatar_proxy/v4/letter/p/9d8465/32.png) [@PH\_LaiBon](https://discuss.px4.io/u/PH_LaiBon)\
**Post date:** [December 3, 2025, 2:31am UTC](https://discuss.px4.io/t/external-vision-estimator-velocity-mismatch/47857/3 "2025-12-03T02:31:48Z")

</div>

@Jaeyoung-Lim Maybe you can help me on this? I’s be grateful. Thanks in advance.

---

<div class="post-metadata">

**Author:** ![edvard](https://discuss.px4.io/user_avatar/discuss.px4.io/edvard/32/20010_2.png) [@edvard](https://discuss.px4.io/u/edvard)\
**Post date:** [December 3, 2025, 10:18pm UTC](https://discuss.px4.io/t/external-vision-estimator-velocity-mismatch/47857/4 "2025-12-03T22:18:41Z")

</div>

I assume your xyz and rpy are already aligned since you’re not showing them. Are you aware of the `velocity_frame` on the UORB topic [VehicleOdometry](https://docs.px4.io/v1.16/en/msg_docs/VehicleOdometry) (which I assume this is converted to internally)?

There is both a `pose_frame` and `velocity_frame` on VehicleOdometry, while it seems like there is only a `child_frame_id` on the [nav\_msgs/Odometry](https://docs.ros.org/en/noetic/api/nav_msgs/html/msg/Odometry.html)?

I assume there is similar conversion logic in the ROS case like for mavlink: [src/modules/mavlink/mavlink\_receiver.cpp#L1349](https://github.com/PX4/PX4-Autopilot/blob/e3f05f1bbe484d1c96c23dcf6f1a08f2037fbc2e/src/modules/mavlink/mavlink_receiver.cpp#L1349) it might be worth looking into:)

---

<div class="post-metadata">

**Author:** ![edvard](https://discuss.px4.io/user_avatar/discuss.px4.io/edvard/32/20010_2.png) [@edvard](https://discuss.px4.io/u/edvard)\
**Post date:** [December 3, 2025, 10:32pm UTC](https://discuss.px4.io/t/external-vision-estimator-velocity-mismatch/47857/5 "2025-12-03T22:32:46Z")

</div>

I’m not familiar with MAVROS, but it seems to me like you can follow the enums from [mavros/mavros\_extras/src/plugins/odom.cpp at b85baa6d057cf7092cd26b3bd777d1e01258b08b · mavlink/mavros · GitHub](https://github.com/mavlink/mavros/blob/b85baa6d057cf7092cd26b3bd777d1e01258b08b/mavros_extras/src/plugins/odom.cpp#L275) to [PX4-Autopilot/src/modules/mavlink/mavlink\_receiver.cpp at e3f05f1bbe484d1c96c23dcf6f1a08f2037fbc2e · PX4/PX4-Autopilot · GitHub](https://github.com/PX4/PX4-Autopilot/blob/e3f05f1bbe484d1c96c23dcf6f1a08f2037fbc2e/src/modules/mavlink/mavlink_receiver.cpp#L1444) to figure out how your velocities are being transformed.
