こんにちは。二足歩行ロボット研修中のshota(@マウス、@ヒューマノイド)です。
この研修では、ROBOTIS社のロボットキットMAX-E1を動かし、競技会HACの走破を目指しています。
今回はDynamixel SDKを使って、Linux PC(Ubuntu)からMAX-E1を動かします。
前回の記事はこちら
MAX-E1をDynamixel SDKで動かす方法
MAX-E1にはCM-550というモジュールが搭載されており、CM-550にデータを送信することでMAX-E1を動かせます。
対応しているデータは、CM-550のマニュアルにあるControl Tableに記載されています。
この表の使い方を簡単に紹介します。
表のAddress = 7のところには、Data Name = IDの項目があり、Default Value = 200というデータが格納されています。
これはCM-550のIDを示しており、CM-500と通信する際にはこのIDを指定します。
表のAddress = 90には、Data Name = Temperatureの項目があり、CM-550の温度データが格納されています。
CM-550の温度を知りたいときは、ID = 200、Address = 90のデータを読み取ればOKです。
Address = 92には、Green LEDという項目があります。
このアドレスに対して ‘1’ を書き込むことで、CM-550のLEDを緑色に点灯できます。
Address = 102 ~ 106にはCM-550に内蔵されたIMUモジュールのデータが格納されています。
CM-550の傾きを知りたいときは、このアドレスのデータを読み取ればOKです。
そしてCM-550との通信に使用するものが、Dynamixel SDKです。
Dynamixel SDKは、通信対象のID、アクセスするアドレス、データのサイズを指定して、データを読み書きできるライブラリです。
サーボモータのDynamixelシリーズだけでなく、CM-550のようなモジュールにも対応しています。
ということで、より便利にMAX-E1(CM-550)を動かせるようにC++ライブラリを作成したので、紹介します。
MAX-E1のC++ライブラリの紹介
実際に作成したライブラリがこちらです。GitHubに公開しています。
※ライブラリ以外に、サンプルアプリケーションを追加していく予定なので、max_e1_appsという名前にしています。
ライブラリの構造は下図のとおりです。
簡単に言うと、MAX-E1の機能を、センサー(sensors)、アクチュエータ(actuators)、モーション(motions)の3つに分けただけです。
そして、Dynamixel SDKの通信部分をライブラリの中に隠しているので、ユーザはDynamixel SDKの機能を知らなくてもMAX-E1を動かせます。
ライブラリのインストール
READMEからライブラリのインストール手順を抜粋します。
下記のコマンドを実行するだけでインストールできます。
※このライブラリは、Ubuntu 20.04、gcc v5.4、cmake v3.16にて動作確認しています。
# Dynamixel SDKのインストール $ sudo apt install build-essential $ cd ~ $ git clone https://github.com/ROBOTIS-GIT/DynamixelSDK.git $ cd ~/DynamixelSDK/c++/build/linux64 $ make $ sudo make install # MAX-E1 Applicationsのビルド&インストール $ git clone https://github.com/ShotaAk/max_e1_apps $ cd max_e1_apps $ ./build_install.bash
ライブラリの使い方
max_e1_examplesにサンプルコードを用意しています。
そこからコード例を抜粋します。
センサデータ(温度、IMU)を読み取る場合は次のようなコードを書きます。
#include <iostream> #include "max_e1.hpp" int main() { MaxE1 max_e1("/dev/ttyACM0", 1000000); if(max_e1.connect()){ max_e1.init(); max_e1.sensors->update(); std::cout<<"voltage:"<<max_e1.sensors->voltage()<< std::endl; std::cout<<"temperature:"<<max_e1.sensors->temperature() << std::endl; std::cout<<"orientation_r:"<<max_e1.sensors->orientation_r() << std::endl; std::cout<<"orientation_p:"<<max_e1.sensors->orientation_p() << std::endl; std::cout<<"orientation_y:"<<max_e1.sensors->orientation_y() << std::endl; } max_e1.disconnect(); }
LEDを点灯させる場合は次のようなコードを書きます。
#include <iostream> #include "max_e1.hpp" int main() { MaxE1 max_e1("/dev/ttyACM0", 1000000); if(max_e1.connect()){ max_e1.init(); std::cout<<"LED on: RGB"<<std::endl; max_e1.actuators->led(true, true, true); } max_e1.disconnect(); }
モーションを再生する場合は次のようなコードを書きます。
#include <iostream> #include "max_e1.hpp" int main() { MaxE1 max_e1("/dev/ttyACM0", 1000000); if(max_e1.connect()){ max_e1.init(); std::cout<<"Move forward"<<std::endl; max_e1.motions->play(18); max_e1.motions->play(20); max_e1.motions->play(22); std::cout<<"Move backward"<<std::endl; max_e1.motions->play(23); max_e1.motions->play(25); max_e1.motions->play(27); } max_e1.disconnect(); }
実際にモーションを再生するとこのような動きをします。
次に取り組むこと
ライブラリにはCM-550の一部の機能しか搭載していないため、どんどん実装していきます。
それと並行して、競技会に向けた作業を開始します。
競技会では画像処理が必須です。
そのため、どんなカメラを使うのか、どんなコンピュータでMAX-E1に指示を送るのか、それらをどのようにMAX-E1に組み付けるのか、を考えていこうと思います