• 公開日:2021年08月31日
  • | 更新日:2022年11月30日

ミリ波の技適を取ってみた! [第3話:技適取得のためのソフトウェア]

はじめに

前回はミリ波レーダの評価ボードを使用したサンプルコードのビルド環境の構築とROSアプリケーションの実行までの流れをご説明させていただきました。
今回は、サンプルコードを修正し、技適取得のためのソフトウェアを作成するまでの手順を、以下の流れでご紹介させていただきます。

サンプルコードの修正(その1)

技適では認証を受けたときと同じ技術基準で動作する必要があり、技適取得後にソフトウェア等の変更により、送信電波の出力が大きくならないようにしておくことが要求されます。
今回使用しているROSのアプリケーションでは、以下のコンフィグレーションファイルを読み込んでミリ波レーダのChripを設定する仕組みとなっておりますので、外部からChirp設定を変更できないように、予めサンプルコードにChirp設定を組み込んでおく修正を行いました。
/home/{username}/catkin_ws/src/ti_mmwave_rospkg/cfg/6843AOP_3d.cfg

修正するファイルの準備

以下のファイルをコピーし、以下のようにCCSのプロジェクトにペーストします。
C:\ti\mmwave_sdk_03_05_00_04\packages\ti\utils\cli\src\cli.c

cfgファイルの設定を埋め込み

以下のようにcli.cのCLI_task()に配列データを読み込む処理を追加します。

※以下の色付き部分が主な修正箇所です。


  1. static void CLI_task(UArg arg0, UArg arg1)
  2. {
  3.     uint8_t cmdString[256];
  4.     char* tokenizedArgs[CLI_MAX_ARGS];
  5.     char* ptrCLICommand;
  6.     char delimitter[] = ” \r\n”;
  7.     uint32_t argIndex;
  8.     CLI_CmdTableEntry* ptrCLICommandEntry;
  9.     int32_t cliStatus;
  10.     uint32_t index;
  11.     /* Do we have a banner to be displayed? */
  12.     if (gCLI.cfg.cliBanner != NULL)
  13.     {
  14.         /* YES: Display the banner */
  15.         CLI_write (gCLI.cfg.cliBanner);
  16.     }
  17. #ifdef USE_HARD_CODED_CONFIG
  18.     hardCodedConfigIndex = 0;
  19.     Task_sleep(100);
  20. #endif
  21.     /* Loop around forever: */
  22.     while (1)
  23.     {
  24.         /* Demo Prompt: */
  25. // CLI_write (gCLI.cfg.cliPrompt);
  26.         /* Reset the command string: */
  27.         memset ((void *)&cmdString[0], 0, sizeof(cmdString));
  28. #ifdef USE_HARD_CODED_CONFIG
  29.         if (hardCodedConfigCommands[hardCodedConfigIndex][0] != ‘!’)
  30.         {
  31.             memcpy((void *)&cmdString[0], (void *)hardCodedConfigCommands[hardCodedConfigIndex], strlen(hardCodedConfigCommands[hardCodedConfigIndex]));
  32.             hardCodedConfigIndex++;
  33.         }
  34.         else
  35.         {
  36.             UART_read (gCLI.cfg.cliUartHandle, &cmdString[0], (sizeof(cmdString) – 1));
  37.         }
  38. #else
  39.         /* Read the command message from the UART: */
  40.         UART_read (gCLI.cfg.cliUartHandle, &cmdString[0], (sizeof(cmdString) – 1));
  41. #endif

 

コンフィグパラメータの設定部の修正

6843AOP_3d.cfgファイルの内容を配列データとして”cli.c”に追加します。


  1. #define USE_HARD_CODED_CONFIG
  2. #ifdef USE_HARD_CODED_CONFIG
  3. int32_t hardCodedConfigIndex;
  4. char * hardCodedConfigCommands[] =
  5. {
  6.  “sensorStop”,
  7.  “flushCfg”,
  8.  “dfeDataOutputMode 1”,
  9.  “channelCfg 15 7 0”,
  10.  “adcCfg 2 1”,
  11.  “adcbufCfg -1 0 1 1 1”,
  12.  “profileCfg 0 60 43 7 40 0 0 100 1 224 7000 0 0 30”,
  13.  “chirpCfg 0 0 0 0 0 0 0 1”,
  14.  “chirpCfg 1 1 0 0 0 0 0 2”,
  15.  “chirpCfg 2 2 0 0 0 0 0 4”,
  16.  “frameCfg 0 2 16 0 33.333 1 0”,
  17.  “lowPower 0 0”,
  18.  “guiMonitor -1 1 0 0 0 0 0”,
  19.  “cfarCfg -1 0 2 8 4 3 0 12 0”,
  20.  “cfarCfg -1 1 0 4 2 3 1 12 1”,
  21.  “multiObjBeamForming -1 1 0.5”,
  22.  “clutterRemoval -1 0”,
  23.  “calibDcRangeSig -1 0 -5 8 256”,
  24.  “extendedMaxVelocity -1 0”,
  25.  “lvdsStreamCfg -1 0 0 0”,
  26.  “compRangeBiasAndRxChanPhase 0.0 1 0 -1 0 1 0 -1 0 1 0 -1 0 1 0 -1 0 1 0 -1 0 1 0 -1 0”,
  27.  “measureRangeBiasAndRxChanPhase 0 1.5 0.2”,
  28.  “CQRxSatMonitor 0 3 4 99 0”,
  29.  “CQSigImgMonitor 0 111 4”,
  30.  “analogMonitor 0 0”,
  31.  “aoaFovCfg -1 -90 90 -90 90”,
  32.  “cfarFovCfg -1 0 0 8.40”,
  33.  “cfarFovCfg -1 1 -5.02 5.02”,
  34.  “sensorStart”,
  35.  “!!!END_OF_HARD_CODED_COMMANDS”
  36. };
  37. #endif

 

作成したソフトウェアをCCS上でリビルドし、実行用のバイナリファイルを作成しておきます。

評価ボードに書き込み

前回はデバッグ用にMMWAVEICBOOST+IWR6843AOPEVMの評価ボードにソフトウェアを書き込みましたが、今回は技適で使用するIWR6843AOPEVMで作成したミリ波モジュール(以下)にソフトウェアを書き込んでいきます。

 

Uniflashを使用し、CCSで作成したbinファイルを指定し書きこみます。

ROSアプリケーション側の修正

IWR6843AOPEVMのUSBポートと接続して使用するため、以下のUSBの設定ファイルを修正します。
/home/{username}/catkin_ws/src/ti_mmwave_rospkg/launch/6843AOP_multi_3d_0.launch

cfgファイルの設定を使用せずに動作するようにソフトウェアを修正しましたので、ROSのアプロケーションで使用しているcfgファイルの内容を以下のように”%”(コメント記号)に修正しておきます。
/home/{username}/catkin_ws/src/ti_mmwave_rospkg/cfg/6843AOP_3d.cfg

ROSアプリケーションで動作を確認

以下のコマンドでROSアプリケーションの動作を確認します。

    $> source ~/catkin_ws/devel/setup.bash
    $> roslaunch ti_mmwave_rospkg 6843AOP_multi_3d_0.launch

 

ソフトウェア修正(その2)

技適取得後はソフトウェアの変更ができませんので、試験時のテストに必要なChirp設定は予め複数実装しておき、切り替えて使用できるような修正を行いました。(主な修正箇所を赤字で記載)

UART-read部を追加

UART_readのAPIを使用しコンソールから文字を取得する記述を追加します。
取得した文字は、cmdString_modeに格納されます。

コンフィグパラメータの設定部の修正

複数のChirpコンフィグ(hardCodedConfig0, hardCodedConfig1)を準備しておき、UARTから取得した文字列に従って選択する処理追加したコード修正例を紹介いたします。

※以下の色付き部分が主な修正箇所です。


  1. static void CLI_task(UArg arg0, UArg arg1)
  2. {
  3.     uint8_t cmdString[256];
  4.     uint8_t cmdString_mode[256]; // add
  5.     char* tokenizedArgs[CLI_MAX_ARGS];
  6.     char* ptrCLICommand;
  7.     char delimitter[] = ” \r\n”;
  8.     uint32_t argIndex;
  9.     CLI_CmdTableEntry* ptrCLICommandEntry;
  10.     int32_t cliStatus;
  11.     uint32_t index;
  12.     /* Do we have a banner to be displayed? */
  13.     if (gCLI.cfg.cliBanner != NULL)
  14.     {
  15.         /* YES: Display the banner */
  16.         CLI_write (gCLI.cfg.cliBanner);
  17.     }
  18. #ifdef USE_HARD_CODED_CONFIG
  19.     hardCodedConfigIndex = 0;
  20.     Task_sleep(100);
  21.     UART_read (gCLI.cfg.cliUartHandle, &cmdString_mode[0], (sizeof(cmdString_mode) – 1)); // add
  22. #endif
  23.     /* Loop around forever: */
  24.     while (1)
  25.     {
  26.         /* Demo Prompt: */
  27. // CLI_write (gCLI.cfg.cliPrompt);
  28.         /* Reset the command string: */
  29.         memset ((void *)&cmdString[0], 0, sizeof(cmdString));
  30. #ifdef USE_HARD_CODED_CONFIG
  31.         if (cmdString_mode[0]==’1′)
  32.         {
  33.             if (hardCodedConfigCommands1[hardCodedConfigIndex][0] != ‘!’)
  34.             {
  35.                 memcpy((void *)&cmdString[0], (void *)hardCodedConfigCommands1[hardCodedConfigIndex], strlen(hardCodedConfigCommands1[hardCodedConfigIndex]));
  36.                 hardCodedConfigIndex++;
  37.             }
  38.             else
  39.             {
  40.                 UART_read (gCLI.cfg.cliUartHandle, &cmdString[0], (sizeof(cmdString) – 1));
  41.             }
  42.         } else
  43.         {
  44.             if (hardCodedConfigCommands0[hardCodedConfigIndex][0] != ‘!’)
  45.             {
  46.                 memcpy((void *)&cmdString[0], (void *)hardCodedConfigCommands0[hardCodedConfigIndex], strlen(hardCodedConfigCommands0[hardCodedConfigIndex]));
  47.                 hardCodedConfigIndex++;
  48.             }
  49.             else
  50.             {
  51.                 UART_read (gCLI.cfg.cliUartHandle, &cmdString[0], (sizeof(cmdString) – 1));
  52.             }
  53.          }
  54. #else
  55.         /* Read the command message from the UART: */
  56.         UART_read (gCLI.cfg.cliUartHandle, &cmdString[0], (sizeof(cmdString) – 1));
  57. #endif

 

cfgファイルの設定部

複数のChirpコンフィグ(hardCodedConfig0, hardCodedConfig1)の内容を配列データとして”cli.c”に記載します。


  1. #define USE_HARD_CODED_CONFIG
  2. #ifdef USE_HARD_CODED_CONFIG
  3. int32_t hardCodedConfigIndex;
  4. char * hardCodedConfigCommands0[] =
  5. {
  6.  “sensorStop”,
  7.  “flushCfg”,
  8.  “dfeDataOutputMode 1”,
  9.  “channelCfg 15 7 0”,
  10.  “adcCfg 2 1”,
  11.  “adcbufCfg -1 0 1 1 1”,
  12.  “profileCfg 0 60 43 7 40 0 0 100 1 224 7000 0 0 30”,
  13.  “chirpCfg 0 0 0 0 0 0 0 1”,
  14.  “chirpCfg 1 1 0 0 0 0 0 2”,
  15.  “chirpCfg 2 2 0 0 0 0 0 4”,
  16.  “frameCfg 0 2 16 0 33.333 1 0”,
  17.  “lowPower 0 0”,
  18.  “guiMonitor -1 1 0 0 0 0 0”,
  19.  “cfarCfg -1 0 2 8 4 3 0 12 0”,
  20.  “cfarCfg -1 1 0 4 2 3 1 12 1”,
  21.  “multiObjBeamForming -1 1 0.5”,
  22.  “clutterRemoval -1 0”,
  23.  “calibDcRangeSig -1 0 -5 8 256”,
  24.  “extendedMaxVelocity -1 0”,
  25.  “lvdsStreamCfg -1 0 0 0”,
  26.  “compRangeBiasAndRxChanPhase 0.0 1 0 -1 0 1 0 -1 0 1 0 -1 0 1 0 -1 0 1 0 -1 0 1 0 -1 0”,
  27.  “measureRangeBiasAndRxChanPhase 0 1.5 0.2”,
  28.  “CQRxSatMonitor 0 3 4 99 0”,
  29.  “CQSigImgMonitor 0 111 4”,
  30.  “analogMonitor 0 0”,
  31.  “aoaFovCfg -1 -90 90 -90 90”,
  32.  “cfarFovCfg -1 0 0 8.40”,
  33.  “cfarFovCfg -1 1 -5.02 5.02”,
  34.  “sensorStart”,
  35.  “!!!END_OF_HARD_CODED_COMMANDS”
  36. };
  37. char * hardCodedConfigCommands1[] =
  38. {
  39.  “sensorStop”,
  40.  “flushCfg”,
  41.  “dfeDataOutputMode 1”,
  42.  “channelCfg 15 7 0”,
  43.  “adcCfg 2 1”,
  44.  “adcbufCfg -1 0 1 1 1”,
  45.  “profileCfg 0 60 7 7 40 0 0 100 1 224 7000 0 0 30”,
  46.  “chirpCfg 0 0 0 0 0 0 0 1”,
  47.  “chirpCfg 1 1 0 0 0 0 0 2”,
  48.  “chirpCfg 2 2 0 0 0 0 0 4”,
  49.  “frameCfg 0 2 16 0 33.333 1 0”,
  50.  “lowPower 0 0”,
  51.  “guiMonitor -1 1 0 0 0 0 0”,
  52.  “cfarCfg -1 0 2 8 4 3 0 12 0”,
  53.  “cfarCfg -1 1 0 4 2 3 1 12 1”,
  54.  “multiObjBeamForming -1 1 0.5”,
  55.  “clutterRemoval -1 0”,
  56.  “calibDcRangeSig -1 0 -5 8 256”,
  57.  “extendedMaxVelocity -1 0”,
  58.  “lvdsStreamCfg -1 0 0 0”,
  59.  “compRangeBiasAndRxChanPhase 0.0 1 0 -1 0 1 0 -1 0 1 0 -1 0 1 0 -1 0 1 0 -1 0 1 0 -1 0”,
  60.  “measureRangeBiasAndRxChanPhase 0 1.5 0.2”,
  61.  “CQRxSatMonitor 0 3 4 99 0”,
  62.  “CQSigImgMonitor 0 111 4”,
  63.  “analogMonitor 0 0”,
  64.  “aoaFovCfg -1 -90 90 -90 90”,
  65.  “cfarFovCfg -1 0 0 8.40”,
  66.  “cfarFovCfg -1 1 -5.02 5.02”,
  67.  “sensorStart”,
  68.  “!!!END_OF_HARD_CODED_COMMANDS”
  69. };
  70. #endif

 

ROSアプリケーション側の修正

ROSのdemoを実行する前にconsoleでタイプする内容を以下のファイルに記載しておきます。
/home/{username}/catkin_ws/src/ti_mmwave_rospkg/cfg/6843AOP_3d.cfg

以下のコマンドでROSアプリケーションの動作を確認します。

    $> source ~/catkin_ws/devel/setup.bash
    $> roslaunch ti_mmwave_rospkg 6843AOP_multi_3d_0.launch

 

まとめ

本記事ではTI社ミリ波センサーの評価ボードを使用し、技適を取得するためのソフトウェアの修正方法についてご紹介させていただきました。
技適取得に向けて、ハードウェア(ミリ波デモキット)とソフトウェアの準備が整いましたので、次回は技適取得に挑みます!

ミリ波の技適を取ってみた!

  ・第1話:仕様を考えよう
  ・第2話:ROSアプリへの組込み方法(TIのデモベース)
  ・第3話:技適取得のためのソフトウェア
  ・第4話:いざ技適取得へ