【Unitree Go2】キーボードからGo2を操作する2次開発方法

初めに


本記事では、unitree_ros2を用いて、Go2をキーボードから操作する2次開発方法についてご案内します。

 

環境


環境は、次のようなものを想定しています。

  • 機種: Go2 R&D(Edu), R&D+(Edu+)(AIR/PROではないもの)
  • Docking Station or 外部PC:ubuntu20/22, ROS2 foxy/humble

 

1.環境設定


【Unitree Go2】SDK or ROSを使う方法

を参考に、unitree_ros2の環境構築が完了しているものとします。

 

2.開発に必要な参考情報


が参考になります。
ただしサンプルコードは、TrajectoryFollowの用法になり、今回使用したいMove関数は使っておりません。

 

3.実装例:cmd_vel_control


今回作成したもの

$ git clone https://github.com/TechShare-inc/go2_unitree_ros2 -b cmd_vel_control

cmd_vel_control.cppが新たに作成したプログラムになります。
このコードは、ROS2ノードを使用して/cmd_velトピックを購読し、Go2ロボットの動作を制御します。特に、cmdVelCallback関数で、キーボード操作から得た速度指令(/cmd_vel)をGo2ロボットの制御コマンドに変換しています

#include <iostream>
#include "rclcpp/rclcpp.hpp"
#include "unitree_api/msg/request.hpp"
#include "geometry_msgs/msg/twist.hpp"
#include "common/ros2_sport_client.h"

using namespace std::placeholders;

class CmdVelToSportRequest : public rclcpp::Node
{
public:
    CmdVelToSportRequest() : Node("cmd_vel_to_sport_request")
    {
        // コマンド速度トピックを購読
        cmd_vel_subscriber_ = this->create_subscription<geometry_msgs::msg::Twist>(
            "/cmd_vel", 10, std::bind(&CmdVelToSportRequest::cmdVelCallback, this, _1));

        // リクエスト送信用パブリッシャ
        request_publisher_ = this->create_publisher<unitree_api::msg::Request>("/api/sport/request", 10);
    }

private:
    void cmdVelCallback(const geometry_msgs::msg::Twist::SharedPtr cmd_vel_msg)
    {
        // 受け取った/cmd_velメッセージを出力
        RCLCPP_INFO(this->get_logger(), "Received cmd_vel: LinearX=%f, LinearY=%f, AngularZ=%f",
                    cmd_vel_msg->linear.x, cmd_vel_msg->linear.y, cmd_vel_msg->angular.z);

        // /cmd_velメッセージをスポーツリクエストに変換
        unitree_api::msg::Request req;
        sport_client_.Move(req, cmd_vel_msg->linear.x, cmd_vel_msg->linear.y, cmd_vel_msg->angular.z);

        // リクエストを送信
        request_publisher_->publish(req);
        // RCLCPP_INFO(this->get_logger(), "Published Request: LinearX=%f, LinearY=%f, AngularZ=%f",
        //             cmd_vel_msg->linear.x, cmd_vel_msg->linear.y, cmd_vel_msg->angular.z);
    }

    // 購読者
    rclcpp::Subscription<geometry_msgs::msg::Twist>::SharedPtr cmd_vel_subscriber_;

    // パブリッシャ
    rclcpp::Publisher<unitree_api::msg::Request>::SharedPtr request_publisher_;

    // SportClientインスタンス
    SportClient sport_client_;
};

int main(int argc, char *argv[])
{
    rclcpp::init(argc, argv);
    auto node = std::make_shared<CmdVelToSportRequest>();
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}

 

4.実行

$ cd example_ws
$ colcon build

terminal 1:

$ source unitree_ros2/setup.sh
$ ros2 run unitree_ros2_examaple cmd_vel_control

terminal 2:

$ source unitree_ros2/setup.sh
$ ros2 run teleop_twist_keyboard teleop_twist_keyboard

実行後、terminal 1で動作ログが確認でき、terminal 2でキーボード操作を行います。

実行の様子:動画リンク
※動画は、Payloadに外部PC(Ubuntu22/humble)を搭載して行っているが、JetsonOrinからでも問題なく実行できる。

このように行うと、Go2をキーボードから操作することができます。


 

おわりに

本記事では、unitree_ros2を用いて、Go2をキーボードから操作する2次開発方法について、解説しました。
本記事を参考に、Move関数の使い方や他の制御方法を使用する際のヒントになれば幸いです。
この記事が少しでも役に立てたのなら幸いです。

 

コメントを残す

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