二足歩行ロボットキット研修(shota編) 二足歩行ロボット研修

MAX-E1のC++ライブラリ作成しました【二足歩行ロボットキット研修(shota編)7】

サムネイル210521 二足歩行ロボットキット研修(shota編)

こんにちは。二足歩行ロボット研修中の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を指定します。

CM-550 Control Table①

表の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 Control Table②

そしてCM-550との通信に使用するものが、Dynamixel SDKです。

Dynamixel SDKは、通信対象のID、アクセスするアドレス、データのサイズを指定して、データを読み書きできるライブラリです。
サーボモータのDynamixelシリーズだけでなく、CM-550のようなモジュールにも対応しています。

ということで、より便利にMAX-E1(CM-550)を動かせるようにC++ライブラリを作成したので、紹介します。

MAX-E1のC++ライブラリの紹介

実際に作成したライブラリがこちらです。GitHubに公開しています。

※ライブラリ以外に、サンプルアプリケーションを追加していく予定なので、max_e1_appsという名前にしています。

ライブラリの構造は下図のとおりです。

MAX-E1ライブラリの構造

簡単に言うと、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に組み付けるのか、を考えていこうと思います

タイトルとURLをコピーしました