【L-RTK】NTRIP-VRS接続プログラム初期動作できた<ALES仮想基準局へ接続>

ソフトバンク系ALES社のNTRIPサービスのテストモニターを引き受けたのはいいですが、ucenter経由では接続は簡単にできて精度も静的測位精度の確認できたのですが、スキー、歩行、回転運動などの動的精度を確認するにはNTRIPをESP32受信しなければなりません。今までは、トラ技10月号付録にあるESP32でのRTK2go.com接続プログラムをブラックボックスで使わせていただいていたのですが、ALESなど商用サービスはVRS(仮想基準局)を採用しているのでプログラムを変更しないと接続できません。
私のマイコンプログラミングは、ライブラリーをそのまま使ってきたのでライブラリーの中身を変更するのは初めてですので、基本的な知識を調べさせていただきました。

●ソフトウェア著作権の扱い
著作権の基本知識はここにありました。
本記事のプログラムは、トラ技2019年10月号付録の記事
「Wi-Fi マイコンESP32とキットで作るポータブル基準局」阿久津 愛貴 氏
の記事を参考に阿久津氏作のESP32用ArduinoIDEライブラリー
GLAY-AK2/NTRIP-client-for-Arduino
https://github.com/GLAY-AK2/NTRIP-client-for-Arduino

ライブラリ内にあるライセンス ファイルをみると
 LGPL3.0(GNU Lesser General Public License v3.0)でした。
この意味をこちらの解説で読んで理解しました。
https://nacika.com/entry/2013/01/02/102645/

ポイント1:元となるソフトウェアの出典元の明示とLGPL3.0ライセンスの明示
ポイント2:どこをどう改編したのかのreadme記録
を守れば、著者の阿久津氏の意図に沿ったものになると理解いたしました。

●基本知識
NTRIP ver1.0の資料PDFをダウンロードします。
http://www.wsrn3.org/CONTENT/Reference/Reference_NTRIP-V1-Tech-paper.pdf

 NTRIPサーバーとの通信を判り易く説明されているブログ記事もあります。
以前から教えていただいて感謝しております。

●上記資料を読んで理解したこと

■VRS(仮想基準局)接続手順
1stStep:Authorization

2ndStep:GPGGA送信して現在位置のMountPointを選択してもらう

3rdStep:RTCMデータを受信

4thStep:RTCMデータをF9P Baseへシリアル送信

●ライブラリー変更やったこと
①NTRIP Casterとの通信はHTTPを使って送受信を行います。
=>私はHTTPのプログラミングをしたことがないので基本から学習したので
接続成功まで3日かかってしまいました。
参考にさせていただいたサイト:https://www.yoheim.net/blog.php?q=20120611

➁Authorization
ALESのテストIDとパスとマウントポイントを指定してALES NTRIPサーバーへ
ログインする操作です。
これは、GLAY-AK2ライブラリーでは NTRIP_client.cppの
bool NTRIPClient::reqRaw 関数内で動作してました。これはややこしいので
そのまま使わせていただきました。

③GPGGAの送信
これは、具体的にどうするかはこちらのブログの解説をそのまま使わせていただきました
作者様には感謝です。https://blog.misatowater.com/entry/tech/ntrip/basic

ということで、このHTTP リクエスト文を①Authorization処理の直後に挿入しました。赤字が追加した行
変更点1:関数の引数にchar* ggaを追加して、mainからggaセンテンスを渡す。
変更点2:Authorization終了後GGA sendするHTTP リクエスト文を挿入
Body部にGPGGAセンテンスをいれて送信することでNTRIPサーバーに
自分の現在位置を知らせて、近くの実マウントポイント局のRTCMデータを
送信してもらう手続きをします。

bool NTRIPClient::reqRaw(char* host,int &port,char* mntpnt,char* user,char* psw,char* gga)
{
if(!connect(host,port))return false;
String p=”GET /”;
String auth=””;
Serial.println(“Request NTRIP”);p = p + mntpnt + String(” HTTP/1.1\r\n”
“User-Agent: NTRIPClient for Arduino v1.0\r\n”
);if (strlen(user)==0) {
p = p + String(
“Accept: */*\r\n”
“Connection: close\r\n”
);
}
else {
auth = base64::encode(String(user) + String(“:”) + psw);
#ifdef Debug
Serial.println(String(user) + String(“:”) + psw);
#endifp = p + String(“Authorization: Basic “);
p = p + auth;
p = p + String(“\r\n”);
}
p = p + String(“\r\n”);
print(p);
#ifdef Debug
Serial.println(p);
#endif
unsigned long timeout = millis();
while (available() == 0) {
if (millis() – timeout > 20000) {
Serial.println(“Client Timeout !”);
return false;
}
delay(1000);
}
char buffer[50];
readLine(buffer,sizeof(buffer));
if(strncmp((char*)buffer,”ICY 200 OK”,10))
{
Serial.print((char*)buffer);
return false;
}
delay(1000);//=================GGA send==========================
println(“GET/HTTP/1.1”);
println(“User-Agent: NTRIPClient for Arduino v1.0”);
println(“Accept: */*”);
println(“Connection: close”);
println();
print(gga+ String(“\r\n”));//Body GGA sendSerial.println(gga);

return true;
}


●はまった点
 当初ggaを引数でなく定数で送信したときは動作していました。
print(“$GNGGA,064702.40,3612.27794,N,13756.95425,E,5,12,0.83,609.1,M,36.7,M,0.0,0000*6F\n\r”);
と送信してすんなり接続してRTCMデータを受信できたのですが、
関数の引数としてchar* gga  に代えると動作しなくなりました
  pirntln(gga) では動作しませんでした。
ここではまってしまって1日半試行錯誤した結果 上記赤字の

  print(gga+ String(“\r\n”));  //Body GGA send

で見事に接続してRTCMデータ受信成功しました。
原因推定:wifi.hのprintlnが”\n\r”と同じ動作をしないのではないかと思います。
GLAY-AK2でもprintlnを使わないですべて”\n\r”を文末につけてプログラムしてたので
それをならって書いたら動作しましたので、たぶんESP32のWIFIの癖ではないかと理解してます。中華CPUの癖ではないでしょうか?

●arduinoのmain()は、

#include <NTRIPClient.h>

/*
* NTRIP client for Arduino Ver. 1.0.0
* NTRIPClient Sample
* Request Source Table (Source Table is basestation list in NTRIP Caster)
* Request Reference Data
*
*
*/

//#include <ESP8266WiFi.h> //Need for ESP8266
#include <WiFi.h> //Need for ESP32

const char* ssid = “xxxxx”;// 自分のWIFのSSID
const char* password = “ppppppp”;//WIRIのパスワード

char c;
char* host =”IPadress or URL”;//”RTK2go.com”etc
int httpPort = 2101; //port 2101 is default port of NTRIP caster
char* mntpnt =”MountPoint”;//;// “JP_BIZSTATION”etc
char* user =”ID”;// login ID
char* passwd =”pass”;// pass
char buffer[100];

NTRIPClient ntrip_c;
WiFiClient client;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);//PC接続している線
Serial2.begin(115200,SERIAL_8N1,16,17);//*******(baudrate,config,RX,TX)*******ESP32とF9Pを接続している線
delay(10);
Serial.print(“Connecting to “);
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(“.”);
}
Serial.println(“WiFi connected”);
Serial.println(“IP address: “);
Serial.println(WiFi.localIP());
//==============GGA recieve ここは未だ動作させてません=================================
/* while(1){
if (Serial2.available() > 0) { // 受信したデータが存在する
c=Serial2.read();
Serial.print(c);
}
}
*/
//=============================================
/*
Serial.println(“Requesting SourceTable.”);
if(ntrip_c.reqSrcTbl(host,httpPort)){
char buffer[512];
delay(5);
while(ntrip_c.available()){
ntrip_c.readLine(buffer,sizeof(buffer));
Serial.print(buffer);
}
}
else{
Serial.println(“SourceTable request error”);
}
Serial.print(“Requesting SourceTable is OK\n”);
ntrip_c.stop(); //Need to call “stop” function for next request.
*/
Serial.println(“Requesting MountPoint’s Raw data”);
char ggac[]={“$GNGGA,064702.40,3612.27794,N,13756.95425,E,5,12,0.83,609.1,M,36.7,M,0.0,0000*6F”};//仮に与えたGGAデータ
Serial.print(“ggac size=”);
Serial.println(sizeof(ggac));
if(!ntrip_c.reqRaw(host,httpPort,mntpnt,user,passwd,ggac)){  //ここで、ライブラリにAuthorizationさせます。ggaも送ります。
delay(15000);
ESP.restart();
}

Serial.println(“Requesting MountPoint is OK”);
}

void loop() {
// put your main code here, to run repeatedly:

while(ntrip_c.available()) {
char ch = ntrip_c.read();
Serial2.print(ch);
Serial.print(ch,HEX);

}
delay(10);
}

●動作確認
家の前のアンテナ(北半分が見えない)でだいたい3-4cmくらいでFIXしたので
今までのRTK2Go  JP_BIZSTATIONと変わらない精度がでましたので、OKとします。

●以後
F9PからGGAを受信して、NTRIP VRSへ自動的に送信する部分をプログラム動作確認したのちに ライブラリーとプログラムとライセンス関係ファイルをZIPで本ブログで公開させていただきます。スキー場で測定して、動作確認を十分した後で間違いなく動作しているを確認したあとですので4月中旬に公開します。

  

 

カテゴリー: RTK

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です