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

※2024年初夏 ubloxはRTK事業で失敗したようです、ZED-F9Pは製造中止になるかもしれません。
=>心配なので、Ardusimple社に問い合わせたら、ZED-F9Pはあと5年以上供給するとの回答を得たので一安心しました。

【RTK】Ublox異変=>F9P終わって、NEO-F9Pに移行L1-L5のみ<事業存続の危機か>

読者の皆さんに問いかけたいのは、あなたの行動は、コト作りを前提としたモノ作りになってますか? です。

ソフトバンク系ALES社のNTRIPサービスのテストモニターを引き受けたのはいいですが、ucenter経由では接続は簡単にできて精度も静的測位精度の確認できたのですが、スキー、歩行、回転運動などの動的精度を確認するにはNTRIPをESP32受信しなければなりません。今までは、トラ技10月号付録にあるESP32でのRTK2go.com接続プログラムをブラックボックスで使わせていただいていたのですが、ALESなど商用サービスは最寄りの基準局を使うために現在位置をHTTPで送信してから接続しないと使えませんのでプログラムを変更しないと接続できません。
※2022年6月追記  「ALES接続は、Arduinoのプログラム以外に、ライブラリにパッチをあてる必要があります。」
本プログラムは、阿久津様が公開されているライブラリーにパッチをあてて、動作させているものです。ですので、まずは、阿久津様の
ライブラリーで善意の基準局で、動作するプログラムを作って、動作確認が完了してから、ALES対応にライブラリーにパッチをてて
使ってください。ALESでは、ユーザー向けにBlueToothでRTCM3を配信するスマホアプリを配布してますので、そちらを検討されてもよいと思います。

————————————————
※2024年2月追記
善意の基準局は、サーバーの保守は、管理人様が勤務中で空き時間があればやってくれますが、休日とか深夜になるとできませんし、お願いすることも控えてます。そこで、周辺30km範囲にに2個以上の基準局がある場合は、普段使うメインの基準局以外に予備の基準局での接続もやることで、片方がダウンしていても、大丈夫になります。手動でプログラムを入れ替えて接続しなおしていたので大変手間どっていたのですが、自動切換えできるプログラムを作りました。これならメイン基準局がダウンしていても、自動的に予備基準局に切り替えて接続してくれますので、基準局を気にしないで、測位活動ができます。下記記事にプログラムあります。ESP32系 Arduinoです。

【STA24】RTK2GO基準局自動切換えPgm作った<予備の基準局に自動切換え>


※2021年1月追記
ALES契約前に、デモIDで接続テストさせてもらってプログラムを改良しました。GGAの扱い方を
SPIFFSに記録しておく方法に変更して、ライブラリーも変更しました。

【RTK2021】ALES ichimill NTRIP用に仕様変更<SPIFFSでFLASHにGGA保存>

 

============================================================

※2020年9月追記 ALES個人向けNTRIP接続サービス開始
https://ales-corp.co.jp/start-of-provision/
年間36000円契約で、ソフトバンクNTRIPサーバーが使えるサービスです。本記事で自分の位置をVRSサーバーヘお知らせする(ハンドオーバー)プログラムを作っているのですが、接続初回だけハンドオーバー1回すれば、あとは固定マウントポイントで定期的なハンドオーバー無しで、従来の善意の基準局接続と同様の使い方でできるような仕様を用意されてます。https://ales-corp.co.jp/service-use/
ですので、本記事でプログラムのような毎回接続のプログラムを作らなくても、従来の既存のプログラムを流用するだけで、ソフトバンクALESを利用できるので、高精度(10km以内にマウントポイントがある)測位が実現できます。
月3千円の価値は、ユーザーの使い方によります。私の場合、スキー場で使うので、精度が悪い場合はALESを契約しようかと思います。
===========================================
※2020年12月10日追記
ALESに問い合わせたら、接続の初回だけGGAをサーバーに送信して現在位置を教えて、基準局を決めるハンドオーバー操作が必要だそうです。1回だけやってその後接続している限り、ハンドオーバー無しで使えるそうです。
これなら、F9P MovingBaseで1msecでも遅延したらこけてしまうほど時間がタイトな使い方でも大丈夫だと思います。しかし、初回のGGAをUBX設定のF9Pから得るには、F9Pの設定を変更しなければいけませんので、大変なことになります。そこで、別途PC、スマホからだいたいのGGAをNTRIPマイコンに教えてハンドオーバーさせるか、NTRIPマイコンに安物のGPSを接続させておくか2つの手段で検討してみます。12月末までには、ALES接続プログラム完成させます。
==============================================

 


私のマイコンプログラミングは、ライブラリーをそのまま使ってきたのでライブラリーの中身を変更するのは初めてですので、基本的な知識を調べさせていただきました。

●ソフトウェア著作権の扱い
著作権の基本知識はここにありました。
本記事のプログラムは、トラ技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サーバーとの通信を判り易く説明されているブログ記事もあります。
以前から教えていただいて感謝しております。

※2021年正月に作成したRTCMの資料も追加します。

【RTK2021】RTCM3フレームの抽出法学習<つかみどころがない規格>

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

■接続手順
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()は、
https://gist.github.com/dj1711572002/0308bcc750129e3f66f11b0d05b95cf2

#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月中旬に公開します。
※2023年10月追記 
読者様がソースのダウンロードしたいとのことでしたので、本プログラムを
実用化した記事があります、その中で、公開しているソースがありますのでご参考にしていただければ幸いです。
記事:
【RTk2021】NTRIPレシーバーにGPS基板追加<ichimill接続完成>
ソース;このソースは、GGAを別付けの小型GPSから取得して、M5StickCのSPIFFSに記憶させておきます。そうすれば、F9Pから、GGAを取得する手間がないし、ALES接続時にGGAを毎回測定する必要がないので、手間がないです。GISTにおいてあります。
https://gist.github.com/dj1711572002/8b431088ad170bb26c23cde5b48b9a7a

 

 

◎重要 善意の基準局の場合 RTK2GO接続が2022年秋から変更

【RTK22】RTK2GO.COMのNTRIP接続方法が変わった<NC_NAGANO様に感謝>

 

 

カテゴリー: RTK

2 thoughts on “【L-RTK】NTRIP_CASTER接続プログラム初期動作できた<ALES基準局へ接続>”

  1. はじめまして。
    コメント失礼いたします。
    こちらの記事を読み、参考にさせていただきたいと考えております。
    最後に書いてある「●以後 F9P…」のZIPは公開されていますか?
    公開されていましたら、教えていただけると幸いです。

    1. 2m3a1様
      コメント有難うございます。信州MAKERS管理人です。
      ※1:記事下部に追加しておきましたが、動作するかわかりませんので、自己責任でトライしてください。(ALES契約、私は解約してしまいましたので現在は試せません)
      https://gist.github.com/dj1711572002/0308bcc750129e3f66f11b0d05b95cf2
      ※2:
      ALESでは、接続用のアンドロイドスマホ用のプログラムを提供してます。BlueToothで、RTCM3を送信してくれるのでマイコンで受信してF9Pに流し込めば
      ALES接続ができるはずです。私も一度やってみたのですが、BlueToothが動かなくて断念しました。ALESはサポートしてくれませんでしたが、最近はユーザーが
      増えてるので、サポートしてくれるかもしれません。

      ※3: 本プログラムは、ライブラリーにパッチをあてるという難しい使い方をしてますので、動作保証はありません。過去にもトライされてダメだった方がおります。
      まずは、善意の基準局との接続プログラムを十分試してみて、慣れてから、ALES接続にトライされたほうがよいです。

      ※4:この基本プログラムを発展させてスキー計測システムに組み込んだ記事がこちらにあります。
      t.ly/-Q6pL

       

コメントを残す

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