1 文档的学习
这段时间主要在看开发文档,尝试去分析开发文档中关于每个函数的相关信息。
凭借我丰富的词汇量某文档软件的划词翻译,大致了解了GeoCom开发的相关内容:GeoCom的开发总共分为如下的几个模块,我这里按照文档的顺序进行编排。
1.1 AUS:(Alt User)
主要包括"Shift + User"按钮后面的相关函数。
1.2AUT(Automatisation)
自动化。主要包含直接对仪器本身的操控,自动对准棱镜,开启超级搜寻(Power Search)等等。
1.3 BAP(Basic Applications)
主要功能。主要包含设置测量棱镜的目标参数,配置测量方式,测量当前仪器的参数和目标棱镜与仪器的距离等。
1.4 BMM(Basic Man Machine)
基本机器控制。说的是基本机器控制,但是这个里面的东西也太基本了,总共就三个函数,还全是控制仪器发出警告(蜂鸣声)的函数
1.5 COMF与COM(Communication)
数据交流。但是这两个我没弄太明白有什么区别,看图中的内容好像COMF是联系GeoCOM开发客户端(PC,Android等)和GeoCom服务端(仪器)的桥梁。官方给出的含义的描述是,前者主要控制一些基础的交流参数(例如初始化GeoCom接口),后者主要是一些对仪器的基本操作(待机开机,检查仪器设备型号)。前者不能通过ASCII命令行去控制,后者可以。有比较了解的读者可以在评论区指导一下。
1.6 CSV(Central Services)
中央服务。主要是提供关于一些一起的基础数据(例如软件版本,出厂编号,剩余点亮,温度,时间等)感觉这个可以配合温度湿度来修改仪器的一些参数,减少测量误差。
1.7 CTL(Control task)
任务控制。这个在开发文档里面没有提及相关的内容,也没有相关的接口函数。我猜测可能与多线程有关。
1.8 EDM(Electronic Distance Meter)
激光测距。主要用来通过测量激光的相位来计算距离。在BAP模块中有部分功能用到了该模块的功能。
1.9 FTR(File Transfer)
文件传输。名副其实,用来传输文件的模块。
1.10 IMG(Image Processing)
图像处理和加工。主要是处理图像的功能,但是单看函数好像只有对图像的下载和上传,与FTR模块的功能类似。可能可以开发为实时的图传?
1.11 SUP(Supervisor)
管理。只有一个设置函数:设置电源管理模式,在电源即将耗尽时是切换为关机还是待机。
1.12 TMC(Theodolite Measurement and Calculation)
经纬仪的测量与计算。这里面的功能比较多,我还暂时没有看完,大致上包括测量棱镜相对的坐标等等。

讯享网 英文文档读起来实在有点费劲,我在网上找到了一篇相关的中文文档,具体的网址好像找不到了。那个里面介绍了一下整个测量的流程,这个文档也帮了我不少的忙。

2 通过接口自动测量的流程
中文文档中定义了整体测量的一个流程,我根据流程去寻找相应的接口和命令。一个相对比较完整的流程如下:
2.1初始化GeoCom
首先对GeoCom接口的初始化,然后才能对通过GeoCom调用指令(ASCII命令不用进行)

2.2初始化通讯接口
开放通讯接口,然后GeoCom服务端才能接受到指令(ASCII命令不用执行)

2.3将仪器转到指定方向

2.4 精密照准目标

2.5 执行测距动作

2.6 获取角度和距离的测量数据

3 遇到的一些问题
3.1 部分命令成功发送,但是没有响应命令
在上一个日志里面我有提到过发送命令但是没有回执的问题是命令发送的格式不正确,但是这次再次出现了这种情况。比较诡异的是,只有部分命令发送之后没有响应,而且在下一次发送时会同时接受到两次响应命令。这会直接导致我之前这种命令串会停止发送的情况。在排除掉仪器部分的问题之后,我重新去看了一眼源码。
/ * 发送数据 * @param {String} dataStr * @return {Boolean} */ function read(msgCount) {
//clearInterval(setIntervalId); let dataArr = []; let hasdata = false; let datacount = 0; let block = false; let reading = false; //setIntervalId = setInterval(doReadData, 100); var mcount = 0; let start = new Date().getTime(); let last = start; //注意到这行代码,只会读取3s while ((new Date().getTime()) - start < 3000) {
let now = new Date().getTime(); if (now - last > 200) {
last = now; let bres = doReadData(); if (bres) {
mcount++; if (mcount == msgCount) {
break; } } } } function doReadData() {
//console.log('模拟线程:'+t); //setTimeCount++; if (hasdata) return false; if (block) return false; while (invoke(btInStream, "available") != 0) {
hasdata = true; let data = invoke(btInStream, "read"); dataArr.push(data); } if (hasdata && invoke(btInStream, "available") == 0) {
block = true; hasdata = false; //var strResponse = String.fromCharCode.apply(String, dataArr); //strResponse = strResponse.replace('\r','').replace('\n',';'); //console.log('输出结果_E:' + strResponse); options.readDataCallback && options.readDataCallback(dataArr); dataArr = []; block = false; return true; } return false; } } / * 发送数据 * @param {String} dataStr * @return {Boolean} */ function sendData(dataStr) {
if (!state.bluetoothEnable) {
shortToast("蓝牙设备未开启!"); return; } if (!state.isBluetoothConnected) {
shortToast("蓝牙设备未连接!"); return; } if (!btOutStream) {
shortToast("创建输出流失败!"); return; } try {
console.log(dataStr); let bytes = invoke(dataStr, 'getBytes', 'ASCII'); // let bytes = strtoascii(dataStr); btOutStream.write(bytes); //注意到这行代码,会读取两串数据 read(2); } catch (e) {
//alert('发送失败!'+JSON.stringify(e)); return false; } return true; }
讯享网
3.2 仪器定位的问题
以上问题解决之后,就是简单无聊的数据处理了。仪器测得的数据(2082指令)是相对坐标,需要使用矩阵换算的方式来转换为绝对坐标。需要注意的是这个相对坐标原点位于仪器所垂直水平面投影到地表的位置,而不是仪器本身的位置,因此需要扣除一个仪器的当前高度(原谅我实在是没有找到直接设置仪器高度的指令)。解决完数据处理之后进行了一次较为成功的测试。

随后就发现了存在的问题:当两个棱镜距离很近时,会导致精密照准目标(9037指令)出现紊乱,两个棱镜锁定出现问题。如果理论坐标十分准确,转到指定位置后仪器的十字准星准确地定位到棱镜中,则不会出现该问题。但是如果涉及到监测位移这种理论位置本身就不准确,而且指向的目标存在两个距离很近(不是空间含义的距离,是视角含义的距离)的情况,会导致锁定出现紊乱。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/66184.html