ROS2の自動cmakeツールament_cmake_auto

はじめに

ament_cmake_autoは、package.xmlに記載してあるパッケージを探してくれる自動cmakeツールなので、CmakeLists.txtはシンプルに書けるようになる。

find_package

ament_cmake_autoは必要なので、これのみをfind_packageしておく。

find_package(ament_cmake_auto REQUIRED)

依存を見つける=ament_auto_find_build_dependencies

package.xmlに記載してあるdependenciesを、すべてfind_packageしてくれる。

ament_auto_find_build_dependencies()

ライブラリの生成=ament_auto_add_library

add_library、target_include_directories、target_link_libraries、ament_target_dependenciesをまとめてくれる。
マルチライブラリーのの場合、ライブラリーずつリストするのみで済む。

ament_auto_add_library(lite_serial src/lite_serial.cpp include/lite_serial.hpp)

実行ファイルの生成=ament_auto_add_executable

add_executable、target_include_directories、target_link_libraries、ament_target_dependenciesをまとめてくれる。
マルチノードの場合、ノードずつリストするのみで済む。

ament_auto_add_executable(haya_imu_node src/haya_imu_node.cpp)
ament_auto_add_executable(haya_topic_echo src/haya_topic_echo.cpp)
ament_auto_add_executable(haya_topic_hz src/haya_topic_hz.cpp)

msg/srvの生成=ament_auto_generate_code

メッセージも、サービスも以下1行で済む。

ament_auto_generate_code()

ライブラリーのビルド=ament_auto_package

1行のみでexport、install関係をまとめて仕上げてくれる。

ament_auto_package()

構文のチェック=ament_lint_auto

BUILD_TESTINGデフォルト=ON、colon build – -BUILD_TESTING=OFFに指定可能。

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  ament_lint_auto_find_test_dependencies()
endif()

テストを行う=ament_auto_add_gtest

冒頭の使用例にテストは入っていないが、ament_auto_add_gtestでテストできるようにしている。

ament_auto_find_test_dependencies()
ament_auto_add_gtest()

ament_cmake_autoの使用例

筆者はament_cmake_autoを自社開発したROS2パッケージhaya_imu_ros2に取り組んだので、CmakeLists.txtは以下のとおりとなる。

# CmakeLists.txt of haya_imu_ros2
cmake_minimum_required(VERSION 3.8)
project(haya_imu_ros2)
find_package(ament_cmake_auto REQUIRED)
ament_auto_find_build_dependencies()
ament_auto_add_library(lite_serial src/lite_serial.cpp include/lite_serial.hpp)
ament_auto_add_executable(haya_imu_node src/haya_imu_node.cpp)
ament_auto_add_executable(haya_topic_echo src/haya_topic_echo.cpp)
ament_auto_add_executable(haya_topic_hz src/haya_topic_hz.cpp)
if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  ament_lint_auto_find_test_dependencies()
endif()
install(DIRECTORY launch config DESTINATION share/${PROJECT_NAME})
ament_auto_package()

リポジトリ

https://github.com/soarbear/haya_imu_ros2 に公開済み(BSD 3-Clause License)

参考資料

https://github.com/ament/ament_cmake
Ament-CMake-Documentation(humble)

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

9軸センサーICM-42688+MMC5983 6軸&9軸回転ベクトル&3軸オイラー角 MAX1000Hz同時出力 ROS/ROS2対応 USB接続

はじめに

令和3年度発売の旧型機種のhayate_imu v2は多くの企業、学校法人のユーザー様にご利用いただいたことに、厚く御礼申し上げます。ありがとうございます。旧機種はv2.4までとリリースさせていただいておりますが、いまユーザー様のお手元にある旧バージョン製品のファームバージョンアップは、ユーザー様のもとで実施可能なので、詳細については、別途順次ご案内申し上げます。昨今の半導体ショックにより供給不足、価格高騰などの影響を受ける中、後継機種の開発を続けてきた結果、令和5年4月下旬より、9軸IMU/AHRS haya_imu v3.2の発売をお知らせさせていただきます。

製品紹介

Cortex-M4 (クロック周波数120MHz)、新型6軸IMUのICM-42688(ICM-42688-Pまたは、ICM-42688-V)、高精度3軸AMR方式地磁気センサMMC5983MAの実装により、通常出力モード、デモストレーションモード、キャリブレーションモード(初期バイアス測定)、6軸フュージョン回転ベクトルクォータニオン、9軸フュージョン回転ベクトルクォータニオン、3軸オイラー角の同時出力は最大1000Hzまで可能となります。ROS/ROS2とも対応しており、ドライバーはGithubよりダウンロードして製品とセットでご利用いただけます。

主な仕様

・型番 haya_imu v3.x
・内蔵チップ Microchip Cortex-M4(120MHz)、ICM-42688-VまたはICM-42688-P、MMC5983MA実装
・外部接続 USB2.0+ Type-C、USB+5V給電
・最大出力レート
  - 6軸/9軸フュージョン回転ベクトル四元数 1000Hz
  - 3軸オイラー角  1000Hz
  - 3軸加速度(アクセル)データ  1000Hz
  - 3軸角速度(ジャイロ)データ  1000Hz
  - IMU内部温度データ      1000Hz
  - 3軸地磁気(コンパス)データ  500Hz

・測定レンジ
  - 加速度(アクセル)センサ  ±8g
  - 角速度(ジャイロ)センサ  ±2000dps
  - 地磁気(コンパス)センサ  ±800µT

・バイアス測定補正 初期バイアス測定、動作時即時測定、内蔵補正機能あり
・消費電力 150mW以下(環境温度21℃ 実測値)
・寸法 38.0mm × 39.0mm × 4.8mm(突起物含む)
・取付穴 M3x4、隣り合う穴の中心間距離32.0mm

主な特長

・サービスモード 通常出力モード、デモンストレーションモード、キャリブレーションモード
・結果出力 6軸フュージョン回転クォータニオン、9軸フュージョン回転クォータニオン、3軸オイラー角1KHzまで同時出力、結果出力レートに関わらずIMU/地磁気センサのデータサンプリング周波数、フュージョン周波数は常に1000Hz/500Hzに設定済み
・初期バイアス測定 使用環境変化あった際に利用可能なキャリブレーションモードで最短数分程度で初期バイアス測定完了、MCUフラッシュに自動的に保存して、動作時に読み込んで即時バイアス測定&補正あり
・地磁気センサ温度補償 地磁気センサは、計測時間1msにわたるセットリセット計測(温度補償機能)使用済み
・磁気外乱による干渉 受けにくいことが当社実験(磁束密度約2G)にて確認済み
・ROS/ROS2対応 本体にはROS/ROS2ライブラリを実装せず、対向装置にドライバーインストールにより実現

詳細情報

【製品名称】haya_imu v3.x
【開発会社】ROBOT翔(株式会社翔雲)
【発売時期】令和5年4月下旬頃
【商品情報】9軸センサー6軸&9軸回転ベクトル 3軸オイラー角 MAX1000Hz同時出力 ROS/ROS2対応 USB接続 | ROBOT翔

参考情報

エンコーダ付きDCモータPID制御の実験-haya_imu応用例

3+

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

rosserialをSTM32F4に対応させてみる

はじめに

rosserialは、ROSノードらをシリアルで繋ぐ役割を果たすROSパッケージとしてよく知られている。但し、ArduinoノードとしてSTM32F4は公式に対応されておらず、今回はROS melodicベースのArduinoノード(STM32F411CEU6搭載の開発ボード、通称Balck pill)にrosserialを立ち上げてみた。ソースコードはGithubに公開済み。ROS melodicにおいて動作確認済み。

ソースコード

https://github.com/soarbear/stm32f4_rosseialリポジトリーとして公開済み。

環境

ターゲットボード(MCU) Black pill(STM32F411CEU6実装)
コンパイル環境 Arduino V1.8.13
テスト環境 Ubuntu 18.04 / ROS melodic

参考文献

rosserial melodic-devel branch@Github

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

外部32.768KHzクリスタルからSAMD21クロック設定まで

はじめに

外部32.768KHz水晶発振子からSAMD21クロックを48MHzに設定する手順、ソースをメモにしておく。

設定手順

1. DFLL48Mリファレンスとして使用されるXOSC32Kクロック(オンボード外部32.768Hzクリスタル)を有効にする。
2. XOSC32Kを汎用クロックジェネレーター1として使用する。
3. 汎用クロックジェネレータ1を汎用クロックマルチプレクサ0(DFLL48Mリファレンス)のソースとして使用する。
4. DFLL48Mクロックを有効にする。
5. 汎用クロックジェネレータ0をDFLL48Mに切り替える。
6. CPUのクロックは48MHzで動作する。

ソースコード

下記参考資料から抜粋したソースは以下のとおり。

/* Set 1 Flash Wait State for 48MHz, cf tables 20.9 and 35.27 in SAMD21 Datasheet */
NVMCTRL->CTRLB.bit.RWS = NVMCTRL_CTRLB_RWS_HALF_Val ;

/* Turn on the digital interface clock */
PM->APBAMASK.reg |= PM_APBAMASK_GCLK ;

/* Enable XOSC32K clock (External on-board 32.768Hz oscillator) */
SYSCTRL->XOSC32K.reg = SYSCTRL_XOSC32K_STARTUP( 0x6u ) | /* cf table 15.10 of product datasheet in chapter 15.8.6 */
                       SYSCTRL_XOSC32K_XTALEN | SYSCTRL_XOSC32K_EN32K ;
SYSCTRL->XOSC32K.bit.ENABLE = 1 ; /* separate call, as described in chapter 15.6.3 */
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_XOSC32KRDY) == 0 )
{
  /* Wait for oscillator stabilization */
}

/* Software reset the module to ensure it is re-initialized correctly */
GCLK->CTRL.reg = GCLK_CTRL_SWRST ;
while ( (GCLK->CTRL.reg & GCLK_CTRL_SWRST) && (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY) )
{
  /* Wait for reset to complete */
}

/* Put XOSC32K as source of Generic Clock Generator 1 */
GCLK->GENDIV.reg = GCLK_GENDIV_ID( GENERIC_CLOCK_GENERATOR_XOSC32K ) ; // Generic Clock Generator 1
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

/* Write Generic Clock Generator 1 configuration */
GCLK->GENCTRL.reg = GCLK_GENCTRL_ID( GENERIC_CLOCK_GENERATOR_OSC32K ) | // Generic Clock Generator 1
                    GCLK_GENCTRL_SRC_XOSC32K | // Selected source is External 32KHz Oscillator
//                  GCLK_GENCTRL_OE | // Output clock to a pin for tests
                    GCLK_GENCTRL_GENEN ;
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

/* Put Generic Clock Generator 1 as source for Generic Clock Multiplexer 0 (DFLL48M reference) */
GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID( GENERIC_CLOCK_MULTIPLEXER_DFLL48M ) | // Generic Clock Multiplexer 0
                  GCLK_CLKCTRL_GEN_GCLK1 | // Generic Clock Generator 1 is source
                  GCLK_CLKCTRL_CLKEN ;
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

/* Enable DFLL48M clock */  
SYSCTRL->DFLLCTRL.reg = SYSCTRL_DFLLCTRL_ENABLE;
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 )
{
  /* Wait for synchronization */
}
SYSCTRL->DFLLMUL.reg = SYSCTRL_DFLLMUL_CSTEP( 31 ) | // Coarse step is 31, half of the max value
                       SYSCTRL_DFLLMUL_FSTEP( 511 ) | // Fine step is 511, half of the max value
                       SYSCTRL_DFLLMUL_MUL( (VARIANT_MCK + VARIANT_MAINOSC/2) / VARIANT_MAINOSC ) ; // External 32KHz is the reference
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 )
{
  /* Wait for synchronization */
}

/* Write full configuration to DFLL control register */
SYSCTRL->DFLLCTRL.reg |= SYSCTRL_DFLLCTRL_MODE | /* Enable the closed loop mode */
                         SYSCTRL_DFLLCTRL_WAITLOCK |
                         SYSCTRL_DFLLCTRL_QLDIS ; /* Disable Quick lock */
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 )
{
  /* Wait for synchronization */
}

/* Enable the DFLL */
SYSCTRL->DFLLCTRL.reg |= SYSCTRL_DFLLCTRL_ENABLE ;
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLLCKC) == 0 ||
        (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLLCKF) == 0 )
{
  /* Wait for locks flags */
}
while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 )
{
  /* Wait for synchronization */
}

/* Switch Generic Clock Generator 0 to DFLL48M. CPU will run at 48MHz. */
GCLK->GENDIV.reg = GCLK_GENDIV_ID( GENERIC_CLOCK_GENERATOR_MAIN ) ; // Generic Clock Generator 0
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

/* Write Generic Clock Generator 0 configuration */
GCLK->GENCTRL.reg = GCLK_GENCTRL_ID( GENERIC_CLOCK_GENERATOR_MAIN ) | // Generic Clock Generator 0
                    GCLK_GENCTRL_SRC_DFLL48M | // Selected source is DFLL 48MHz
//                  GCLK_GENCTRL_OE | // Output clock to a pin for tests
                    GCLK_GENCTRL_IDC | // Set 50/50 duty cycle
                    GCLK_GENCTRL_GENEN ;
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
{
  /* Wait for synchronization */
}

参考資料

ArduinoCore-samd | Github

0

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア

PCBをJLCPCBに発注してみた

はじめに

今回は、PCB生産を評判の良いJLC(嘉立創、深せん市)に任せてみたので、お問い合せからPCBが届くまでの経過をメモにしておく。

お問い合せ

英文のサイトに、対応もサイトから英文でLive chat可能、土日含めて何回もリクエストを出してほぼ待たさずにすぐに返事が来る。リクエストへ回答の質も良く、PCBに詳しい、プロの印象を受けた。のちほど自分が注文のオプション設定にミスを犯して向こうエンジニアの経験で自主回避して細心の注意を払っていることが分かった。

発注

1回発注するとあとはスムーズにいくはず、質問があるとすぐ聞けるので大きな支障がなかった。ホームページは使いやすいほうと。今回12cm寸法のPCB 5枚にサイズ16cmのステンシルを1枚依頼した。GerbビュアーがついてUploadのあとで便利に確認できる。ところで、何故かクーポンの使えるところがいないではないかと聞いたら、すぐ「ご迷惑をかけた」と謝った。

生産

16日(金)夕方の発注からステンシルは16日(金)22時頃の開始~18日(日)14時頃、PCBは21日(水)6時頃の完成、約5.3日間かかった。予定の3日間を超えた。以下履歴画面と見ると、生産のプロセス、スケジュール、いま現在のステータスが明確になっている。また、今回は不透明レジストを聞いたら、対応できないと即答してくれた。ごく普通に依頼した。

決済

送料込み4,400円ほど。支払いにJPay、クレジット、Paypalが使える。JPayについては説明を見ると銀行の振込みみたいなので申し込みが必要。追記:カード決済の場合、3~4パーセント加算、恐らくカード決済手数料だろうか、この点においては優しくない。

配送

送料の高い順からDHL、SFexpress、ダイレクトメールが選べる。1kgなら2000円未満。今回の配送はDHLを選んで、深せん~香港~届くまで、約5日間かかった。梱包はしっかりしている。

検収

目視検査および回路の動作を確認済み。シルクはセラミックのようにきれいに見えて繊細の表現までできている。

所感

依頼したあとで企業情報を調べてみると大きな工場を持つ企業であることと分かった。電子部品のほとんどは東南アジア生産なので、コストのみならず物流の利便性からみても深せんのほうは都合が良いかもしれない。きちんと生産、技術、社会貢献に注力する企業ならば支持すべきだと思う。同社の部品サイトLCSCは、まだDIGIKEY、MOUSERほど部品が揃っていないのでこれからと期待する。

jlcpcb-order
jlcpcb-order
1+

ロボット・ドローン部品お探しなら
ROBOT翔・電子部品ストア