冯梦华的日常

广州的天气

六月份的时候在广州谋求了一份工作,公司不是很大,但氛围还挺好的,就是有些在学校实验室的感觉,幸得除我之外还有另一位实习同事,他是研究生毕业的,所学的是测绘,公司的主营业务也正是这一方向,而我则是以实习软件工程师的身份入职。

入职的时候也正是暑假开始,以往的暑假我都在家里晃晃度日,从小学到大学毕业,十多年的时间,眨眼就要工作了,时间就像是加速了一样,我现在仍能回想起小学的时候和小区里的好朋友一起玩泥巴过家家的场景,如今则真的要像一个成年人那样去自己生活了,即感慨又缅怀。说起家,我的恋家情绪其实并不严重,因为大学是从广西到哈尔滨上学,离家远,所以平时的短假是不够时间回家的,四年里也习惯了这种离家的感觉,加之现在有视频聊天,怎么样都不会太过恋家的。

入职的时候在广州这边的城中村租了一个小单间,房价 900 多一个月,但主要是水电好贵(水 5元/吨 · 电 1.5元/度), 以后有钱要狠狠搬家,现在做饭都很困难,因为没有厨房,可惜我的寒暑假磨练的厨艺了,并且今日去外面吃了青椒炒肉,居然和我水平一样,离谱的是要 19 块,当真是不便宜呢。


前段时间广州受到了季风气候的影响,下了一个星期的雨,感觉房间和衣服都霉臭霉臭的,并且阴天笼罩着使得每个人感觉都很不开心,那段时间也是我工作极为不顺的日子,但索性也都撑过来了,但还是有些后怕的,当然并非是工作方面的,而是生活!比如我的内裤和袜子在那段时间里就几乎就没有干过,要不是我带来广州的内裤和袜子多,还真的连门都出不了,所有感觉买一个烘干机还是很有必要的,回南天我想它必能发挥无比大的用处。所以也在想要不要买些一次性袜子和内裤作为应急之物,省得下雨回南时湿漉漉的,发霉到了极致,长小蘑菇可就不雅了。

说起应急之物,储备些药物似乎很有必要呢。

药物

1. 外伤

小型的擦伤创可贴+碘伏似乎就能搞定,更严重的伤口想必还是得去看医生,所以买一盒创可贴、棉签、碘伏

2. 退烧止疼药

毕竟是从新冠时代过来的,发烧止疼用「对乙酰氨基酚」和「布洛芬」我想就足够了,另外加一只体温计。

3. 病毒性感冒

这个似乎无药可治,还是以预防为主吧,前段时间还听说新冠又在广州蔓延,早上挤地铁时还看到有人戴 N95 口罩呢,事情的真假不得而知,总之戴口罩还是没有错的,避免病毒传播。所以,买些口罩在地铁的时候戴戴。

感冒按照以往的经验,不发烧即意味着一个星期便好,只不过中间很难受,发烧则可以尝试一下退烧药,若是反复烧则去医院抽血检查一下,想必是病毒太猛了,抽血针对性杀掉它们。

RTCM 1005 解析

前言

RTCM 是一种普遍采用的数据传输格式,它是由国际海运事业无线电技术委员会提出的,用于制定在差分全球导航定位系统和实时动态操作时使用的标准。

下面是技术规范文档:

第一个文档是官方的,包含了很多的细节,但是需要付费,虽说有其他方式获得,但版权原因还是不在此贴出;

第二个文档是北云科技的,中文文档虽说少了一些细节,但终究方便阅读,虽然本文不会参考它 :)

文档解读

RTK的消息类型有很多,初看会很懵,但在只要找到自己想要了解的消息类型即可,在文档的 3.2 节 Message Type Summary 中有详细的介绍,本文主要关注 1005 这个消息类型,它由 19 个字节也就是 152 个比特构成,它主要包含基准站位置数据信息,也就是基站的 ECEF 的坐标。

Screenshot from 2024-08-05 09-41-51.png

在正式阅读之前,还需要了解一下数据结构和类型,在文档的 3.3节 Data Types 有详细的介绍:

数据类型很好理解,它规定了数据的范围和构成,后面写程序做转换的时候要严格按照本节的数据结构来实现。

image.png

下面是这个协议具体的内容, 后面会详细分析:

image.png


解算

下面给出一段 RTCM 1005 的原始码流,它是十六进制的 ASCII :

D3 00 13 3E D7 D3 02 02 98 0E DE EF 34 B4 BD 62 AC 09 41 98 6F 33 36 0B 98

在手动计算之前,还需要了解一下它在传输时候的格式,RTCM 数据以帧的形式的传输

image.png

  • Preamble : 同步码(8 bits) , 11010011 ,其十六进制为 ‘D3’
  • Reserved : 保留(6 bits),000000,十六进制为 00
  • Message Length: 长度(10 bits),数据信息的长度,以字节数表示
  • Variable Length Data Message(0-1023 bytes): 可变长数据消息,长度不定,最大 1023 bytes
  • CRC:校验(24 bits)

所以 RCTM 1005 每帧大致长这样: 1101 0011 0000 00 + 长度 + 数据 + 校验

开头固定为 : 1101 0011 0000 00 ,十六进制就是 D30 ,我们再回头看一下原始码流:

D3 00 13 3E D7 D3 02 02 98 0E DE EF 34 B4 BD 62 AC 09 41 98 6F 33 36 0B 98

前三个十六进制 ASCII 码 我们就能解析出来了,后面紧跟着的是消息长度,它使用 10 个 bit 存储

Hex: D3 00 13
Binary: 1101 0011 0000 0000 0001 0011

所以,同步码 + 保留 + 长度 总共就用了 24 个 bit ,也就是 3 个字节

接下来就是可变长度的数据消息了,下面的表格就是 1005 类型的数据内容:

DATA FIELD                                  DF NUMBER   DATA TYPE   NO. OF BITS
-------------------------------------------------------------------------------
Message Number ("1005"=0011 1110 1101)      DF002       uint12      12
Reference Station ID                        DF003       uint12      12
Reserved for ITRF Realization Year          DF021       uint6       6
GPS Indicator                               DF022       bit(1)      1
GLONASS Indicator                           DF023       bit(1)      1
Reserved for Galileo Indicator              DF024       bit(1)      1
Reference-Station Indicator                 DF141       bit(1)      1
Antenna Reference Point ECEF-X              DF025       int38       38
Single Receiver Oscillator Indicator        DF142       bit(1)      1
Reserved                                    DF001       bit(1)      1
Antenna Reference Point ECEF-Y              DF026       int38       38
Quarter Cycle Indicator                     DF364       bit(2)      2
Antenna Reference Point ECEF-Z              DF027       int38       38
-------------------------------------------------------------------------------
TOTAL                                                               152

Message Number (“1005”=0011 1110 1101)

它的长度 12 个比特,也就是 3 个 Hex Ascii 码:

Hex: 3E D
Bin: 0011 1110 1101
Dec: 1005

将十六进制的 3ED Ascii 码转换为 十进制的数字,我们可以看到它正好是 1005

Reference Station ID

Hex: 7 D3
Bin: 0111 1101 0011
Dec: 2003

Reserved for ITRF Realization Year

Hex:02 02 Bin:0000 001 00000 0010(取前 6 位 ,也就是 0000 00 = 0)

GPS Indicator

Hex: 02 02

Bin:0000 00**1 **00000 0010 (取第 7 位 ,也就是 1)

GLONASS Indicator

Hex: 02 02

Bin:0000 0010 0000 0010 (取第 8 位 ,也就是 0)

Reserved for Galileo Indicator

Hex: 02 02

Bin:0000 0010 0000 0010 (取第 9 位 ,也就是 0)

Reference-Station Indicator

Hex: 02 02

Bin:0000 0010 0000 0010 (取第 10 位 ,也就是 0)

Antenna Reference Point ECEF-X

它的长度是 38 bits

Hex: 02 98 0E DE EF

Bin: 0000 0010 1001 1000 0000 1110 1101 1110 1110 1111

Dec: 11141045999

Single Receiver Oscillator Indicator

Hex: 34

Bin: 0011 0100 (取第 1 位, 也就是0)

Reserved

Hex: 34

Bin: 0011 0100 (取第 2 位, 也就是0)

Antenna Reference Point ECEF-Y

它的长度是 38 bits

Hex: 34 B4 BD 62 AC

Bin: 0011 0100 1011 0100 1011 1101 0110 0010 1010 1100

二进制最高位是 1 ,为负数,所以要取反再加1

补码: 10 1011 0100 1011 0100 0010 1001 1101 0101 0100

除去第一位的符号位,后面加粗的就是实际的数值

Bin: 0 1011 0100 1011 0100 0010 1001 1101 0101 0100

Hex: 4B 4B 42 9D 54

Dec: 48507297108

加上符号位就是 -48507297108

Quarter Cycle Indicator

Hex: 09

Bin: 00 00 1001(取前两位, 也就是 00)

Antenna Reference Point ECEF-Z

Hex : 09 41 98 6F 33

Bin: 0000 1001 0100 0001 1001 1000 0110 1111 0011 0011

Dec: 39755214643


到此为止,手动结算就已完成,若是关注 ECEF XYZ 的取值,则需要回看数据类型,它们的数据类型是 DF025、DF026、DF027

image.png

这张图详细地说明了 ECEF XYZ 的数据类型,数据范围,数据处理

其中,它是 int38 的有符号38位整数,数据是 0.0001 m

上面我们算得的数,都应做一个处理:

ECEF-X : 11141045999 * 0.0001 = 1114104.5999m

ECEF-Y: 48507297108*0.0001= -4850729.7108m

ECEF-Z:39755214643*0.0001 = 3975521.4643m

(完)

地理坐标转换

近些日子的工作频繁接触到了大地测量中的各种知识,在编写程序的时候更是涉及各种地理坐标的转换,虽然没有深入去学习其核心的变化原理,但是简单地使用现存的公式配合程序进行计算还是可以做到的,以下是有关知识的记录。

1.名词解释

1.1 LLA 坐标系

LLA 坐标是地理坐标系中的一种表示方法,LLA 代表经纬度和高度(Latitude, Longitude, and Altitude),它通常用于描述地球表面上的位置。

  • Latitude (纬度):表示从地球赤道向北或向南的角度,范围是 -90° 到 +90°。正值表示北纬,负值表示南纬。
  • Longitude (经度):表示从本初子午线(通常是通过格林尼治的子午线)向东或向西的角度,范围是 -180° 到 +180°。正值表示东经,负值表示西经。
  • Altitude (高度):表示相对于平均海平面的高度,可以是正值(高于海平面)或负值(低于海平面)。

LLA 坐标系也叫全球地理坐标系、大地坐标系、WGS-84坐标系。纬度和经度的数值可以以多种不同的单位或格式出现:

  • 六十进制度:度、分、秒:40° 26′ 46“ N 79° 58′ 56” W
  • 度和十进制分:40° 26.767′ N 79° 58.933′ W
  • 十进制度: +40.446 -79.982

横纬竖经,在计算的过程中,主要也是将之转换为十进制来计算的,以下是计算公式: $$ decimal = degress + \frac{minutes}{60} + \frac{seconds}{3600} $$

关于 WGS-84 ( World Geodetic System 1984,1984年世界大地测量系统),它是目前全球范围内使用最广泛的地理坐标系统和地球模型,由美国国防部制定和维护,主要用于全球定位系统(GPS)和各种地理信息系统(GIS)。

WGS-84 有几个关键常量用于定义参考椭球体的形状和尺寸,这些常量包括半长轴、半短轴、扁率和离心率等:

  • 半长轴 (A):椭球体的赤道半径
    • 其值为 $ 6378137.0 $ 米。
  • 半短轴 (B):椭球体的极半径
    • 其计算公式为: $ B = A*(1-F) $
    • 其值为 $ 6356752.3142 $ 米
  • 扁率 (F):描述椭球体扁平程度的参数
    • 其计算公式为:$ F = \frac{A-B}{A}$
    • 其值为:1/298.257223563
  • 第一离心率 (E):描述椭球体形状的一种参数,反映了椭球体的偏离程度
    • 其计算公式:$ E = \sqrt{1 - (\frac{B}{A}) ^2} $
    • 其值约为: 0.0818191908426
  • 第一离心率的平方 (E²):减少计算所用
    • 其中值约为: 0.00669437999014

1.2 ECEF坐标系

ECEF(Earth-Centered, Earth-Fixed)坐标系是一种三维笛卡尔坐标系,用于表示地球上的位置。ECEF 坐标系也称为地心地固坐标系,它的原点位于地球质心,并且随着地球的自转而旋转。

  • X 轴:指向穿过地球赤道与本初子午线(通过格林尼治的子午线)交点的方向。
  • Y 轴:指向穿过地球赤道与东经90度子午线交点的方向。
  • Z 轴:指向北极方向,与地球自转轴一致。

ECEF 坐标系提供了一个统一的三维坐标框架,可以精确地表示地球表面和近地空间的任何位置。

1.3 ENU坐标系

ENU(East-North-Up)坐标系是一种局部笛卡尔坐标系,用于表示相对于某个参考点的三维位置。

  • ENU 坐标系的原点通常位于地球表面的某个参考点,该点的地理坐标为 (Latitude, Longitude, Altitude)。
  • E 轴(东向轴):指向地平线的东方。
  • N 轴(北向轴):指向地平线的北方。
  • U 轴(上向轴):垂直向上,指向天空。

2. 坐标系转换

2.1 从 LLA 坐标到 ECEF 坐标

这里约定LLA的经度为 $\phi$,纬度为 $\lambda $,海拔为 $ h $, 选取 WGS-84 坐标系参数,$a$和$b$分别是是赤道半径(半长轴)和极半径(半短轴),$e^2 = 1 - \frac{b^2}{a^2}$是偏心率的平方, $f=1-\frac{b}{a} $ 是基准椭球体的极扁率。 $$ \begin{align} X& = (N(\phi) + h) cos \phi cos\lambda \\\\ Y& = (N(\phi) + h) cos \phi sin\lambda \\\\ Z& = (\frac{b^2}{a^2}N(\phi) + h)sin\phi \\\\ &=((1-e^2)N(\phi) +h)sin\phi \\\\ &=((1-f)^2N(\phi)+h)sin\phi \end{align} $$ 其中 $$ \begin{align} N(\phi) = \frac{a^2}{\sqrt{a^2cos^2\phi + b^2sin^2\phi}} = \frac{a}{\sqrt{1-e^2sin^2\phi}} \end{align} $$

2.2 从 ECEF 到 LLA坐标

将 ECEF 坐标 (X, Y, Z) 转换为经纬度和高度 (Latitude, Longitude, Altitude) 需要迭代计算。 $$ \begin{align} \lambda = atan2(Y,X) \end{align} $$

其中,atan2 是反正切函数

$\lambda$ 是唯一能直接算出的,其余的纬度和高度的转换所要涉及 N 的循环关系 $$ \begin{align} \frac{Z}{p}cot\phi = 1 - \frac{e^2N}{N+h} \\\\ h = \frac{p}{cos\phi} -N \end{align} $$ 其中,如公式$(6)$所示,N 的变化取决于 $\phi$ 的值

纬度和高度需要迭代求解, 例如,从第一个猜测 h≈0 开始,然后更新 N。

其流程是这样的:

  1. 猜测 h = 0,通过公式$(8) $ 可以推算 $cot\phi = \frac{(1-e^2)p}{Z} $ 求解出一个$\phi_1$
  2. 将 $\phi_1$ 带入公式 $(6)$,求解出 $N$
  3. 将 $N$ 带入公式$(9)$ 求解出 $h$
  4. 将 $h$ 带入公式$(8)$ 求解出一个新的 $\phi_2$
  5. 如果 $\phi_1$和$\phi_2$足够接近,则说明迭代出了一个正确的值,如果不是,则需要回到第2步继续迭代。

2.3 从 ECEF 到 ENU 坐标

ENU 坐标又称为站心坐标,6也就是局部坐标,这个坐标需要一个局部参考点。在实际例子中,这个参考点通常是雷达、基站这些地方。

如果基站位于 ${X_0,Y_0,Z_0}$,测站位于 ${X_1,Y_1,Z_1}$

$$ \begin{bmatrix} e\\\\ n\\\\ u \end{bmatrix}= \begin{bmatrix} -sin\lambda_0& cos\lambda_0 & 0\\\\ -sin\phi_0cos\lambda_0& -sin\phi_0sin\lambda_0 &cos\phi_0 \\\\ cos\phi_0cos\lambda_0& cos\phi_0sin\lambda_0 & sin\phi_0 \end{bmatrix} \begin{bmatrix} X_1 -X_0\\\\ Y_1-Y_0\\\\ Z_1-Z_0 \end{bmatrix} $$

(完)

NAS 组建计划

近些日子看了很多有关机械硬盘的视频,遂萌生了组一台NAS的想法。

目前我其实是有类NAS的备份系统的,使用的是一台OrangePi 1G RAM ,老实说这个派内存买小了,而且它似乎没有硬件解码,导致我用它解析视频的时候有些吃力,所以在考虑要不要换回x86的cpu 重新组一台 NAS,大机箱还能放很多的机械硬盘。

Orange Pi 配合 Cloudflare 和 frp 进行内网穿透,虽然速度慢了一些,但是确实也不是不能用,配合 Syncthing 这种去中心化的同步工具使用下来也是挺好的,所以我再想什么呢,是新配一个 itx 大小的电脑,还是说重新考虑一个内存大一些的 ARM Pi。

这段时间将两种方案都写出来好好考虑考虑。

(未完)

归于心

今天是6月7日,果然还是得工作,不工作闲下来就乱想东西


抑郁的情绪最近确实一直困扰着我,现实对我的压迫越来越大,我真的好害怕,恐惧且畏缩贯穿了我这几年的每一个决定,即使是那些看着很勇敢的行为,深究下来不过也就是为了逃避。我真的像舟之行于大海,摇摇荡荡也找不到可以依靠的地方,原来可以避风的港口催促着我离开,我害怕大雨,我感觉我一碰到这些就会被刮得零落。

原本不是这样的,至少在暴风雨来得没有那么频繁的以前,我有听说过“锚”,这是船不再前进时为了不被风浪推走而固定时所用到的,我没有勇气也没有能力再向前,后退又是不被允许,所以只能依靠着锚固定着,不让这些浪催促着移动位置,然而问题就是出现在这些锚上面,我开始恐惧现实,锚开始不起作用了,我能清晰地感受到那种抑郁的情绪,就像心里始终有一股失落的云笼罩着,莫名地害怕,莫名地心怯。具体体现在现实中无论是好的还是坏的事情,我都不想去接触,不想接触人,不想接触事。我很明白这样的情绪是不对的,但是不这样,我的心就好慌……

寓形宇内复几时,曷不委心任去留,我真的无法再劝慰自己努力地面对现实。

胶片图集 (一)

许久没有写一些博文了,请原谅我,因为生活比较单调,加上最近有一些抑郁的情绪,目前仍然在调整当中。虽然生活千篇一律,但是偶尔也是有出去晒太阳的,也是有好好生活的。

我最近拍了很多的胶片,于是打算放到这里来,让大家看看~

正文

这是一个用半幅胶片机拍摄的,黑白的负片,加上半格画幅带来的画质损失,使得这幅照片拥有一种恰到好处的感觉。拍摄的时间是哈尔滨的冬季,可以看到路上都是雪,周围的树木也光秃秃的,黑白拍摄树枝有时候会很杂乱,但是这幅照片倒还好。

这张照片是我的第一卷胶片,当时买了 Canon Demi 初代半格相机,寻思着玩一玩吧,结果一发不可收拾!拿着这台相机在学校到处拍摄,从那时候开始,我彻底爱上了胶片。胶片是一种延迟的体验,一卷胶卷大约能拍32张,而半格则更多了(画幅相对于135mm裁切了一半),也就是需要拍满72张才能取下胶卷,而且拍完无法立即查看,需要送给冲洗店老板冲扫,这又往往还需等待一个礼拜的时间。

通过胶片,我记录下的照片常常成为我生活的缩影,它介于严肃与不严肃之间,而其本身的质感往往让人感到温暖和怀旧,我后面又陆陆续续买了 佳能 QL17 旁轴、佳能 kiss 1单反、佳能 eos55 单反等,就我而言,单反相对更加容易掌控,其功能与镜头的选择也更加丰富。

与现代相机一样,胶片相机也需要在拍摄时选择光圈,需要权衡景深的大小,而慢速快门则要考虑画面是否会受到抖动的影响,不同的是一旦按下快门则无法修改,一张底片就此定格。


下面这张图的猫猫很可爱的,当时我走过去的时候它主动地帖帖我了,或许是想要我给他挠痒,围着我走了一圈,然后贴在我的鞋边!我怎么能抗拒得了这样的诱惑呢!我充分地挠了挠它的猫猫头后,它也享受地走开了,之后我便去其他地方了,再回来就看到它在边躲太阳边休息。

于是我立马掏出了相机,幸好我有 28-105 的变焦镜头,不用靠得特别近也能拍摄。虽说猫猫看起来很可爱,但它们可听不懂我们人类的话,靠得太近了,惹恼了它可就不愉快了,索性就在不远处保持着距离拍摄。


小灯笼和小狮子

虚化带来的好处就是主体很清晰,消除背景细节,可以营造出更为干净、简洁的画面


这张是在龙母庙拍的,主要是测试一下我新买的镜头 40mm 2.8 光圈全开的虚化效果 。


这张是半格机拍的, ILFORD PAN 100 好歹也是 100 感光度的胶卷了,但是拍出来还是出现了很明显的颗粒。难道半格相机还得使用 ISO 50 的 5203 拍摄会比较好吗?但是这又出现了一个问题,demi是估焦的,拍摄近物时,往往需要缩小光圈以达到超焦距的效果,然而使用 50 ISO后,便不太能使用小光圈了,因为这可能会导致画面抖动或者欠曝,真是难以抉择呢。


接下来的这三张,是我家城市的骑楼城,梧州的河东许多的老建筑特别有历史的底蕴,我很喜欢在这里拍摄黑白的照片,当然彩色的照片也非常好看,有一种不一样的质感。


这张图我觉得很棒噢,当时很顺利地抓拍了,其实等车再开过去一些些会好很多呢。


最后想说的是,我最近有在尝试自己冲洗黑白胶卷噢,听起来是挺复杂的,但是实际做起来非常的简单,而且特别有成就感,但就不在这篇文章叙述多言了,之后会再写一篇的。

(完)