2026年2月

What is RTK GPS? In fields like surveying, construction, and agriculture, precision isn’t optional—it’s essential. In many of these tasks, being off by even a few meters can lead to wasted time, costly mistakes, or failed inspections. That’s why professionals turn to high-precision positioning technologies like RTK GPS.

But to understand how RTK delivers centimeter-level results, we first need to look at the system it relies on—GNSS. GNSS provides the global coverage and satellite data that RTK builds upon. It’s the foundation of all satellite-based positioning.

Let’s start with the basics of how GNSS positioning works—and then explore how RTK takes it to the next level.

How does GNSS positioning work?

Global Navigation Satellite Systems, or GNSS, refer to satellite constellations like GPS, GLONASS, Galileo, and BeiDou. These systems provide global satellite positioning services. Many industries — from mobile navigation and logistics to construction and autonomous systems — use them in daily life.

GNSS receivers calculate their position by measuring how long it takes for signals from satellites to reach the receiver. Each signal includes data on satellite location and transmission time. When a receiver picks up signals from at least four satellites, it can determine its position on Earth.

Most standard GNSS receivers, like those in smartphones or drones, offer accuracy in the range of 2 to 4 meters. That’s fine for casual navigation, but for tasks like land surveying, construction layout, or precision agriculture, meter-level accuracy falls short.

That’s where high-precision GNSS positioning techniques like RTK come in.

What is RTK GPS?

RTK, or Real-Time Kinematic, is a positioning method that improves GNSS accuracy from meters down to centimeters. It does this by correcting satellite signal errors in real time.

An RTK system includes two GNSS receivers: a base and a rover. The base station is set at a known location and constantly receives satellite signals. It then sends corrections to the rover, which is the moving unit that needs to determine its accurate position. Because both units are observing the same satellites under nearly identical conditions, the rover can use the base’s corrections to eliminate common errors.

This method allows the rover to deliver precise position data with centimeter-level accuracy. RTK GPS technology is especially useful in surveying, mapping, agriculture, construction, and inspection tasks—where real-time precision is critical.

How RTK works?

When the rover meets the base

The base station can be a local GNSS unit or a remote reference station accessed via an RTK network. The role of the base remains the same—to provide reference data in real time that allows the rover to calculate its position with much greater accuracy.

These GNSS corrections are what make RTK stand apart from traditional GNSS. While standard GNSS relies only on signal timing, RTK takes advantage of a more detailed technique: carrier phase measurement.

Carrier phase and ambiguity resolution

GNSS signals travel as waveforms—RTK doesn’t just measure when the signal arrives, but how many full and partial wave cycles it took to get there. However, in the beginning, the receiver doesn’t know the number of whole cycles. This is called ambiguity.

RTK resolves these ambiguities by comparing signals from both base and rover. Once you resolve it, the system locks onto what’s called a FIX status—meaning the receiver has achieved centimeter-level accuracy.

This step is essential in transforming approximate GPS data into precise positioning.

RTK work with GNSS receivers
How RTK works

Understanding RTK solution statuses

RTK solutions go through different phases as the receiver processes satellite data:

  • SINGLE: No corrections are being received. Accuracy is similar to standard GNSS—several meters.
  • FLOAT: Corrections have begun, but ambiguities aren’t fully resolved. Accuracy improves, but hasn’t yet reached centimeter level.
  • FIX: The receiver now delivers centimeter-accurate positions after resolving ambiguities

Getting to FIX is the ultimate goal in any RTK setup, and maintaining FIX is key to successful high-precision work.

This video will show you how RTK technology works.

How to send RTK corrections from a base to a rover?

RTK corrections can be delivered via different channels, depending on your workflow and environment:

  • Radio: Best for on-site setups without internet. It’s reliable when there’s a direct line of sight between the base and the rover.
  • NTRIP: A protocol that sends corrections over the internet. Perfect for longer distances or when using a network of reference stations.
  • Dual-streaming: Some systems support broadcasting over both radio and internet simultaneously. This ensures corrections stay stable even when one method becomes unreliable.
Reach RS3 and Reach RX GNSS receivers
Reach RS3 used as a base and Reach RX 

These flexible delivery methods allow users to choose the right setup for their environment—urban, rural, or remote.

What are the differences between RTK solution statuses?

RTK solutions go through different phases as the receiver processes satellite data:

  • SINGLE: No corrections are being received. Accuracy is similar to standard GNSS—several meters.
  • FLOAT: Corrections have begun, but ambiguities aren’t fully resolved. Accuracy improves, but hasn’t yet reached centimeter level.
  • FIX: Ambiguities are resolved, and the receiver is now delivering centimeter-accurate positions.

Getting to FIX is the ultimate goal in any RTK setup, and maintaining FIX is key to successful high-precision work.

How to get the best RTK GPS performance in the field?

RTK depends on specific conditions to perform at its best, including but not limited to a short baseline between the base and rover, a clear view of the sky, and distance from sources of electromagnetic interference to avoid signal distortion.

Baseline

The distance between base and rover, known as the baseline, is a key factor. The closer the two units are, the more similar their satellite observations will be. Long baselines introduce environmental differences—like varying atmospheric conditions—that reduce correction effectiveness. Keeping the baseline short helps maintain the accuracy of RTK.

Baseline between rover and base

Satellite visibility

GNSS relies on a clear sky view. Obstacles like buildings, trees, or terrain features can block or reflect signals, weakening the quality of the data. A clear line of sight to the sky is essential for consistent fixes.

Electromagnetic interference

Electronic equipment, power lines, or heavy machinery can interfere with GNSS signals. Keeping your receiver away from such sources improves reliability and reduces signal noise.

To learn more about factors that affect signal accuracy, read our guide on eight common mistakes in GNSS surveying and how to fix them. 

Where RTK is used?

RTK GPS is now a standard tool across many industries that rely on spatial accuracy:

  • Surveying and mapping: From topographic surveys to construction layout.
  • Precision agriculture: Automating machinery, planting, and soil analysis with sub-inch accuracy.
  • Drone mapping: Enhancing data for orthomosaics and 3D models.
  • Construction: Layout tasks, volume measurement, and quality control.
  • Inspection and infrastructure: Power lines, roads, pipelines, and more.

The wide range of RTK uses highlights its value in turning GNSS from a navigation tool into a precise positioning instrument. This technique transforms GNSS from a general positioning tool into a high-precision system suitable for professional tasks. RTK delivers the accuracy you need—especially when paired with the right tools, like the Emlid Reach RS3 receivers.

If you’re looking to boost efficiency, improve data quality, and unlock centimeter-level results in the field, RTK GPS is the technology to build your workflow on.

Meet the RTK GNSS lineup that makes precision look easy

Need centimeter-level accuracy but don’t want to wrestle with complicated gear, outdated workflows, or fragile equipment? Modern RTK GNSS doesn’t have to feel like a surveying textbook.

Today’s field teams—whether in construction, GIS, engineering, or mapping—need tools that remove friction, not add to it. That means fast setup, reliable all-band RTK performance, and the freedom to move without constantly leveling poles or rechecking points:

Reach RS4 Pro is our most advanced all-band RTK GNSS receiver, combining centimeter-level positioning with dual cameras, AR stakeout, image-based measurements, and tilt compensation. It’s built for teams who want to move faster on site, capture more in one go, and rethink what a GNSS rover can actually do.

Reach RS4 delivers powerful all-band RTK performance with tilt compensation in a streamlined setup—perfect for topographic surveys, design set-out, and everyday fieldwork where precision is non-negotiable.

Reach RX2 is the ultralight RTK rover made for mobility. With tilt compensation and full RTK capability, it’s ideal for GIS mapping, layout, and terrestrial scanning—high accuracy, zero bulk.

FAQs

What’s the difference between GPS and GNSS?
GNSS includes multiple satellite systems—GPS, GLONASS, Galileo, BeiDou—while GPS refers only to the American system. GNSS offers broader coverage and better reliability.

What does RTK mean in GPS?
RTK stands for Real-Time Kinematic. It’s a technique that provides high-precision positioning by correcting GNSS signals in real time.

Can I use RTK without a base station?
Yes and no. You don’t necessarily need to own your local base station. However, you need to connect to a source of corrections data. This could be CORS or a remote reference station—you can connect to it over the internet using the NTRIP protocol.

How accurate is RTK?
With proper setup, RTK provides centimeter-level accuracy—far beyond the meter-level positioning of traditional GPS.

What happens without RTK?
Without RTK, your receiver falls back to standard GNSS, which is only meter-accurate, which may not be sufficient for your surveying tasks.


import rclpy
from rclpy.node import Node
from sensor_msgs.msg import CompressedImage
import cv2
import numpy as np

class CompressedImageSubscriber(Node):
    def __init__(self):
        super().__init__('compressed_image_subscriber')
        self.subscription = self.create_subscription(
            CompressedImage,
            '/image/detected/front_01',  # Replace with your actual topic name
            self.image_callback,
            10)
        self.subscription  # prevent unused variable warning

    def image_callback(self, msg):
        self.get_logger().info(f'Received compressed image with format: {msg.format}')
        
        try:
            # Convert the byte array to a numpy array
            np_arr = np.frombuffer(msg.data, np.uint8)
            
            # Decode the compressed image data using OpenCV
            # The '1' flag means to load the image in color (BGR format for OpenCV)
            cv_image = cv2.imdecode(np_arr, cv2.IMREAD_COLOR)
            
            if cv_image is not None:
                # Display the image in a window
                cv2.imshow("ROS2 Compressed Image View", cv_image)
                cv2.waitKey(1) # Refresh the window every 1ms
            else:
                self.get_logger().error("Failed to decode image")

        except Exception as e:
            self.get_logger().error(f"Error processing image: {e}")

def main(args=None):
    rclpy.init(args=args)
    compressed_image_subscriber = CompressedImageSubscriber()
    rclpy.spin(compressed_image_subscriber)
    
    # Destroy the node explicitly
    compressed_image_subscriber.destroy_node()
    rclpy.shutdown()
    cv2.destroyAllWindows() # Close all OpenCV windows

if __name__ == '__main__':
    main()

Qt中添加VTK窗口并显示点云

我使用的版本是:
VS2019 + QT5.15.2 + VTK9.1

1. 在Qt中添加显示点云的控件

关于添加显示点云控件主要参考了以下链接:salute 链接

1.1 在designer中添加VTK窗口

添加完成之后注意在.sln项目中配置VTK库,否则无法#include <QVTKOpenGLNativeWidget.h>
方法的核心就是将QWidget提升为自定义控件。

QVTKOpenGLNativeWidget 实际上是VTK给写好的一个自定义控件,继承自QWidget类,所以只需要将QWdiget类提升为QVTKOpenGLNativeWidget类就行了

1.用Designer打开项目的界面文件(.ui后缀文件)

2.在左边的控件栏中,将Containers下的“Widget”这个控件拖入到用户界面中,然后右边的对象查看器中就能查到你拖入的QWidget控件对象。
img
3.对该对象点右键,选择“提升为”,提升为可以理解是将QT自带的控件类提升为开发者编写的自定义控件类。而QVTKOpenGLNativeWidget就是VTK编写的自定义控件类。
img
4.然后提升的类名称填上“QVTKOpenGLNativeWidget”,头文件填写“QVTKOpenGLNativeWidget.h”。基类选择QWidget。然后点击“添加”-》“提升”
img
提升的类名称: 指自定义控件的类名称,VTK提供的自定义类名称就是QVTKOpenGLNativeWidget。
头文件: 指自定义控件的头文件,VTK提供的自定义控件类的头文件就是QVTKOpenGLNativeWidget.h。注意大小写。如果不对应的话,会失效。
基类名称: 指自定义的控件类的基类是谁,QVTKOpenGLNativeWidget的基类就是QWidget。选错了也是不行的。
添加: 指保存这个设定,下次可以直接拿来使用,不用重新输入以上信息。
提升: 指将你拖入UI中的QWidget控件,变成你写好的自定义控件类,在这里就是将QWidget类变成QVTKOpenGLNativeWidget类。

5.重命名该窗口控件的对象名,用来写代码的时候识别。网上所见通常命名为“qvtkWidget”
img

6.最后在你的主窗口类下调用ui的成员变量可以成功呼出qvtkWidget这个vtk窗口控件。
img

1.2 直接以代码形式添加vtk窗口

这是最简单的方法了,不要用到.ui文件,不需要用到Designer,直接在代码上用。都不需要提升类,直接包含头文件后拿来用就行。

在MainWindow的构造函数中写代码:(不需要照抄,理解以下几行代码在干嘛即可)

	//初始化VTK窗口,命名为qvtkWidget(原理和QPushButton这种QT自带的控件一样,只是该控件由VTK提供,用法跟QPushButton是一样的)	QVTKOpenGLNativeWidget* qvtkWidget = new QVTKOpenGLNativeWidget();	//初始化VTK的渲染器,平时用的比较多是vtkRenderWindow,但是在QT中要改用vtkGenericOpenGLRenderWindow,实质上与vtkRenderWindow功能一致	vtkGenericOpenGLRenderWindow* renderWindow = vtkGenericOpenGLRenderWindow()::New();	//将渲染器加入到VTK窗口中。可以先写这一行,后续再将准备好的vtkRenderer加入到renderWindow中也是可以同步数据的	qvtkWidget->setRenderWindow(renderWindow);	//创建网格布局,只是为了方便布局,实际上可以直接调用qvtkwidget的baseSize函数指定窗口大小也行	QGridLayout* displayGrid = new QGridLayout(this);	displayGrid->addWidget(qvtkWidget);	this->setLayout(displayGrid);

需要在MainWindow头文件中包含vtkGenericOpenGLRenderWindow.h和QVTKOpenGLNativeWidget.h头文件。
理解上面的代码,自己在MainWindow构造函数中去使用(在其他地方用也没问题,用法一样)

2. 在添加好的控件上显示点云

在添加的控件上显示点云主要参考此链接:salute链接

2.1 代码

    //----------------------------qvtkWidget的初始化-----------------------------------    auto renderer = vtkSmartPointer<vtkRenderer>::New();    auto renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();    renderWindow->AddRenderer(renderer);    viewer.reset(new pcl::visualization::PCLVisualizer(renderer, renderWindow, "viewer", false));    ui->qvtkWidget->setRenderWindow(viewer->getRenderWindow());    //此处qvtkWidget是我这个窗口的名称,自定义的    viewer->setupInteractor(ui->qvtkWidget->interactor(), ui->qvtkWidget->renderWindow());     //----------------------------qvtkWidget的初始化-----------------------------------    //----------------------------初始化点云并显示-------------------------------------    //初始化一个点云    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);    //加载点云文件    if (pcl::io::loadPCDFile("data/ceshi.pcd", *cloud) == -1)    {        std::cout << "打开文件失败" << std::endl;    }    //刷新显示窗口    ui->qvtkWidget->repaint();    //添加点云    viewer->addPointCloud(cloud, "cloud");    //刷新    ui->qvtkWidget->update();    //视角    viewer->resetCamera();    //----------------------------初始化点云并显示-------------------------------------

3. QVTKOpenGLNativeWidget.h的解释

原链接请参考QVTKOpenGLNativeWidget.h源文件

3.1 类QVTKOpenGLNativeWidget的简介:

QVTKOpenGLNativeWidget是QOpenGLWidget的子类,用于在Qt应用程序中承载一个vtkGenericOpenGLRenderWindow。

请注意,QVTKOpenGLNativeWidget只能与vtkGenericOpenGLRenderWindow一起使用。
这是因为QOpenGLWidget希望接管窗口管理和OpenGL上下文的创建。
使用vtkXRenderWindow或vtkWin32RenderWindow(以及其他特定于平台的vtkRenderWindow子类)进行可靠工作非常棘手且充满问题。

由于QVTKOpenGLNativeWidget使用QOpenGLWidget来创建OpenGL上下文,
它使用QSurfaceFormat(使用QOpenGLWidget::setFormat或QSurfaceFormat::setDefaultFormat进行设置)来创建适当的窗口和上下文。
您可以使用QVTKOpenGLNativeWidget::copyToFormat获取适用于vtkRenderWindow的QSurfaceFormat。

QVTKOpenGLNativeWidget的典型用法如下:

// 在初始化QApplication之前,设置默认的表面格式。QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());vtkNew<vtkGenericOpenGLRenderWindow> window;QPointer<QVTKOpenGLNativeWidget> widget = new QVTKOpenGLNativeWidget(...);widget->SetRenderWindow(window.Get());// 如果使用任何标准视图例如vtkContextView,则可以执行以下操作。vtkNew<vtkContextView> view;view->SetRenderWindow(window.Get());// 您可以继续使用`window`作为常规vtkRenderWindow,包括添加渲染器、演员等。

3.2 OpenGL上下文:

在QOpenGLWidget(QVTKOpenGLNativeWidget的父类)中,所有渲染都发生在帧缓冲对象中。因此,在渲染代码中必须小心,永远不要直接重新绑定默认帧缓冲,即ID为0。

QVTKOpenGLNativeWidget创建了一个内部的QOpenGLFramebufferObject,独立于父类创建的QOpenGLFramebufferObject,用于vtkRenderWindow进行渲染。
这种显式的双缓冲在避免VTK中仅在临时后备缓冲区上进行的渲染时(例如进行选择时)破坏在屏幕上组合的结果时非常有用。

3.3 处理渲染和绘制:

QWidget子类(包括QOpenGLWidget和QVTKOpenGLNativeWidget)在QWidget::paint中显示其内容,以响应绘制事件。
QOpenGLWidget子类应在QOpenGLWidget::paintGL中进行OpenGL渲染。
QWidget可能由于各种原因接收到绘制事件,包括小部件获得焦点/失去焦点,UI中的其他小部件(例如状态栏中的QProgressBar)的更新等。

在VTK应用程序中,每当vtkRenderWindow需要更新以进行新的渲染时,可以通过在其上调用vtkRenderWindow::Render来完成。
设置在渲染窗口上的vtkRenderWindowInteractor确保随着对影响渲染结果的交互发生,它会调用渲染窗口上的Render。

由于Qt中的paint可能被调用得比需要的频繁,我们避免了每次发生这种情况时可能昂贵的vtkRenderWindow::Render调用。相反,QVTKOpenGLNativeWidget依赖于VTK应用程序在需要更新渲染时在渲染窗口上调用vtkRenderWindow::Render。
paintGL只是将由最近一次渲染调用vtkRenderWindow::Render渲染的结果传递给Qt窗口系统以在屏幕上组合。

在某些情况下,可能仍然需要在paint中进行渲染,例如如果窗口的大小被调整或Qt必须重新创建OpenGL上下文。
在这些情况下,QVTKOpenGLNativeWidget::paintGL可以通过调用QVTKOpenGLNativeWidget::renderVTK请求进行渲染。

3.4 注意事项:

QVTKOpenGLNativeWidget不支持立体声,请使用QVTKOpenGLStereoWidget以获取立体声渲染支持。

QVTKOpenGLNativeWidget针对Qt版本5.5及以上版本进行了优化。

参考:QVTKOpenGLStereoWidget QVTKRenderWidget


URL: https://markhedleyjones.com/projects/calibration-checkerboard-collection



Calibration Checkerboard Collection

Calibration Checkerboard Collection

Free camera calibration checkerboards for computer vision research and robotics applications. Compatible with OpenCV, ROS camera_calibration, and other computer vision libraries. Download high-quality PDF checkerboards in A4, A3, A2, and A1 formats with no watermarks or advertising.

Disable any page scaling or automatic page fitting when printing, otherwise the checker dimensions will be incorrect.


Generate Your Own Checkerboards

Generates Scalable Vector Graphic (SVG) files, which can be edited using free software such as Inkscape.


mm
mm
mm
A4 - 25mm squares - 10x7 vertices, 11x8 squares
Click to open as SVG — then print (Ctrl+P) to save as PDF

8x6 Checkerboards

A4 Checkerboards

A3 Checkerboards

A2 Checkerboards

A1 Checkerboards

A1 - 20mm squares - 41x28 vertices, 42x29 squaresA1 - 25mm squares - 32x22 vertices, 33x23 squaresA1 - 30mm squares - 27x18 vertices, 28x19 squaresA1 - 35mm squares - 23x15 vertices, 24x16 squaresA1 - 40mm squares - 20x13 vertices, 21x14 squaresA1 - 45mm squares - 17x12 vertices, 18x13 squaresA1 - 50mm squares - 15x10 vertices, 16x11 squaresA1 - 55mm squares - 14x9 vertices, 15x10 squaresA1 - 60mm squares - 13x8 vertices, 14x9 squaresA1 - 65mm squares - 11x8 vertices, 12x9 squaresA1 - 70mm squares - 11x7 vertices, 12x8 squaresA1 - 75mm squares - 10x6 vertices, 11x7 squaresA1 - 80mm squares - 8x6 vertices, 9x7 squaresA1 - 80mm squares - 9x6 vertices, 10x7 squaresA1 - 85mm squares - 8x5 vertices, 9x6 squaresA1 - 90mm squares - 8x5 vertices, 9x6 squaresA1 - 95mm squares - 7x5 vertices, 8x6 squaresA1 - 100mm squares - 7x4 vertices, 8x5 squaresA1 - 105mm squares - 7x4 vertices, 8x5 squaresA1 - 110mm squares - 6x4 vertices, 7x5 squaresA1 - 115mm squares - 6x4 vertices, 7x5 squaresA1 - 120mm squares - 6x4 vertices, 7x5 squaresA1 - 125mm squares - 5x3 vertices, 6x4 squaresA1 - 130mm squares - 5x3 vertices, 6x4 squaresA1 - 135mm squares - 5x3 vertices, 6x4 squaresA1 - 140mm squares - 5x3 vertices, 6x4 squaresA1 - 145mm squares - 4x3 vertices, 5x4 squaresA1 - 150mm squares - 4x2 vertices, 5x3 squaresA1 - 155mm squares - 4x2 vertices, 5x3 squaresA1 - 160mm squares - 4x2 vertices, 5x3 squaresA1 - 165mm squares - 4x2 vertices, 5x3 squaresA1 - 170mm squares - 3x2 vertices, 4x3 squaresA1 - 175mm squares - 3x2 vertices, 4x3 squaresA1 - 180mm squares - 3x2 vertices, 4x3 squaresA1 - 185mm squares - 3x2 vertices, 4x3 squaresA1 - 190mm squares - 3x2 vertices, 4x3 squares




1、Depth Anything V2

https://github.com/DepthAnything/Depth-Anything-V2



2、Prior Depth Anything

https://github.com/SpatialVision/Prior-Depth-Anything



3、Metric3D V2

https://github.com/YvanYin/Metric3D?tab=readme-ov-file



4、ZoeDepth

https://github.com/isl-org/ZoeDepth


5、MiDaS

https://github.com/isl-org/MiDaS



6、Depth Pro

https://github.com/apple/ml-depth-pro


7、DepthCrafter

https://github.com/Tencent/DepthCrafter



8、Marigold

https://github.com/prs-eth/Marigold