1. 基准站选址与架设基础

任务说明

本次实战完成RTK基准站的选址评估与标准架设流程。你将学习选址的量化判断方法,并完成从部件组装到参数配置的完整架设闭环。最终通过接收机状态灯与手簿软件连接结果验证架设是否成功。

选址原则与量化判断

基准站选址直接影响差分数据质量,需同时满足以下条件:

  • 天空视野:周围障碍物仰角不超过15°,保证卫星信号接收
  • 电磁环境:远离大功率发射塔、雷达站至少500m,避开高压线正下方
  • 多路径抑制:远离大面积平整反射面(水面、金属幕墙、停车场)
  • 稳定性:架设点无震动、无沉降,地质坚实
  • 已知点优先:若后续需要厘米级坐标,应架设在已知控制点上

快速判断方法:使用手簿软件查看卫星信噪比(SNR),若视野内卫星SNR均大于35dBHz且无频繁跳变,则选址合格。

设备清单

本次架设所需设备:RTK基准站接收机、电台天线(或4G/5G模块)、三脚架、基座与连接杆、量高尺、手簿(已安装配套软件)、电池与充电器。

标准架设流程

按以下顺序完成架设:

  1. 架设三脚架:展开至合适高度,踩实脚钉,通过圆水准器粗平
  2. 安装基座与连接杆:将基座固定在三脚架头上,旋紧连接杆
  3. 安装接收机:将基准站接收机旋入连接杆顶部,用手旋紧即可,不要使用扳手
  4. 连接天线:将电台天线(或4G天线)接入接收机对应接口,确保拧紧
  5. 精确整平:通过基座上的水准管微调,使气泡居中
  6. 量取天线高:用卷尺从测量标志中心量至接收机天线相位中心标记线,记录斜高或垂直高
  7. 开机与参数配置:开启接收机电源,使用手簿蓝牙连接,配置基准站坐标与数据链参数

关键完整代码:基准站参数配置与状态验证

以下Python脚本模拟基准站开机后的参数配置流程,并验证配置正确性。实际设备操作通过手簿完成,本代码用于理解配置逻辑与自动校验:


import json
import math
from dataclasses import dataclass

@dataclass
class BaseStationConfig:
    """基准站配置参数"""
    lat_deg: float      # 纬度(度)
    lon_deg: float      # 经度(度)
    height_m: float     # 椭球高(米)
    antenna_height_m: float  # 天线斜高(米)
    data_link: str      # 数据链类型: "radio" / "4g"
    radio_channel: int  # 电台频道(radio模式有效)
    baud_rate: int      # 串口波特率
    broadcast_interval_s: int  # 差分数据播发间隔(秒)

def validate_position(lat_deg: float, lon_deg: float) -> bool:
    """验证坐标是否在中国大陆范围内(简单校验)"""
    return 18.0 <= lat_deg <= 54.0 and 73.0 <= lon_deg <= 135.0

def validate_antenna_height(measured_slope_m: float, pole_tilt_deg: float = 0.0) -> float:
    """
    将斜高转换为垂直高。
    当测量方式为斜高且天线杆有倾斜时,需进行余弦修正。
    若为垂直测量,tilt_deg传0即可。
    """
    if pole_tilt_deg == 0.0:
        return measured_slope_m
    return measured_slope_m * math.cos(math.radians(pole_tilt_deg))

def build_config(raw: dict) -> BaseStationConfig:
    """从手簿输入构建配置对象,并执行合法性校验"""
    cfg = BaseStationConfig(
        lat_deg=float(raw["lat"]),
        lon_deg=float(raw["lon"]),
        height_m=float(raw["height"]),
        antenna_height_m=float(raw["antenna_slope"]),
        data_link=raw["link"],
        radio_channel=int(raw.get("channel", 0)),
        baud_rate=int(raw.get("baud", 115200)),
        broadcast_interval_s=int(raw.get("interval", 1)),
    )
    
    # 坐标范围校验
    if not validate_position(cfg.lat_deg, cfg.lon_deg):
        raise ValueError("坐标超出中国大陆范围,请检查输入")
    
    # 天线高合理性校验(通常0.5m~3m)
    if not (0.3 <= cfg.antenna_height_m <= 3.0):
        raise ValueError("天线高超出合理范围(0.3m~3.0m)")
    
    # 数据链参数校验
    if cfg.data_link == "radio" and not (1 <= cfg.radio_channel <= 32):
        raise ValueError("电台频道需在1~32之间")
    if cfg.data_link not in ("radio", "4g"):
        raise ValueError("数据链类型仅支持radio或4g")
    
    return cfg

def generate_rtcm_config(cfg: BaseStationConfig) -> dict:
    """生成接收机内部配置指令(模拟)"""
    return {
        "cmd": "SET_BASE_POSITION",
        "lat_deg": round(cfg.lat_deg, 9),
        "lon_deg": round(cfg.lon_deg, 9),
        "height_m": round(cfg.height_m, 4),
        "antenna_height_m": round(cfg.antenna_height_m, 4),
        "data_link": cfg.data_link,
        "radio_channel": cfg.radio_channel if cfg.data_link == "radio" else None,
        "baud_rate": cfg.baud_rate,
        "broadcast_interval_s": cfg.broadcast_interval_s,
    }

def verify_config(cfg: BaseStationConfig, actual_rtcm: dict) -> bool:
    """验证实际生成的RTCM配置与预期一致"""
    expected = generate_rtcm_config(cfg)
    # 浮点比较使用近似判断
    for key in ["lat_deg", "lon_deg", "height_m", "antenna_height_m"]:
        if abs(expected[key] - actual_rtcm[key]) > 1e-6:
            return False
    return (expected["data_link"] == actual_rtcm["data_link"] and
            expected["radio_channel"] == actual_rtcm["radio_channel"] and
            expected["baud_rate"] == actual_rtcm["baud_rate"] and
            expected["broadcast_interval_s"] == actual_rtcm["broadcast_interval_s"])

# ===== 最小调用入口 =====
if __name__ == "__main__":
    # 模拟手簿输入(实际由用户在软件中填写)
    user_input = {
        "lat": "39.904200",       # 北京某已知点纬度
        "lon": "116.407400",      # 经度
        "height": "45.600",       # 椭球高(米)
        "antenna_slope": "1.850", # 实测斜高(米)
        "link": "radio",
        "channel": "8",
        "baud": "115200",
        "interval": "1",
    }
    
    # 执行配置构建与校验
    config = build_config(user_input)
    print(f"配置校验通过:坐标({config.lat_deg:.6f}, {config.lon_deg:.6f}),天线高{config.antenna_height_m:.3f}m")
    
    # 生成RTCM配置指令
    rtcm_cmd = generate_rtcm_config(config)
    print("RTCM配置指令生成:")
    print(json.dumps(rtcm_cmd, indent=2, ensure_ascii=False))
    
    # 模拟接收机返回的确认配置(实际由设备回传)
    device_ack = rtcm_cmd.copy()  # 实际场景中此数据来自接收机回读
    ok = verify_config(config, device_ack)
    print(f"配置一致性验证:{'通过' if ok else '失败'}")

运行与验证方法

运行方式:将上述代码保存为 base_station_config.py,在Python 3.8+环境执行 python base_station_config.py。

预期输出(由代码逻辑直接推出):


配置校验通过:坐标(39.904200, 116.407400),天线高1.850m
RTCM配置指令生成:
{
  "cmd": "SET_BASE_POSITION",
  "lat_deg": 39.9042,
  "lon_deg": 116.4074,
  "height_m": 45.6,
  "antenna_height_m": 1.85,
  "data_link": "radio",
  "radio_channel": 8,
  "baud_rate": 115200,
  "broadcast_interval_s": 1
}
配置一致性验证:通过

判定标准:程序正常结束且输出“配置一致性验证:通过”,说明参数配置逻辑正确。若修改输入为非法坐标(如纬度95),程序应抛出ValueError并提示原因。

实机架设验证

完成上述模拟验证后,在真实设备上按以下步骤确认架设成功:

  • 状态灯检查:接收机电源灯常亮,卫星灯开始闪烁(搜索卫星),1~3分钟后转为常亮(已锁定卫星)
  • 数据链指示:电台模式时TX灯随差分数据播发同步闪烁;4G模式时网络灯常亮
  • 手簿连接测试:手簿软件中显示基准站坐标与设置一致,且能看到差分信号强度指示
  • 流动站验证:开启流动站接收机,若手簿显示“固定解”(Fixed)且平面精度因子(PDOP)小于3,则基准站架设成功

常见问题与处理

  • 卫星灯不转常亮:检查周围是否有遮挡,等待2~3分钟;若仍无法锁定,考虑更换架设点
  • 电台TX灯不闪:确认频道与流动站一致,检查天线连接是否牢固
  • 手簿无法连接:确认蓝牙已配对,接收机编号输入正确
  • 固定解长时间无法获得:检查基准站坐标是否准确(已知点架设时),或流动站距离是否超过数据链覆盖范围