LoginSignup
3
3

More than 5 years have passed since last update.

ROSでロボットの重心を推定する

Last updated at Posted at 2017-08-17

ロボットの要素の中で大きなウエイトを占めるものに制御系があると思います。
制御系を設計するにあたり大切なものの一つに重心推定があると思います。
今回ロボットの制御系を勉強したいと思い、まずはROSでロボットの重心を推定するパッケージを自作してみました。
ソースコードはこちら
https://github.com/hakuturu583/robot_kinetics_pkgs
で公開しています。
基本的には前回の記事でまとめたコードをベースに開発しました。
このパッケージの動作する仕組み以下のようになっています。

cog_publisher_node.cpp
//headers in this package
#include <cog_publisher.h>

//headers for ROS
#include <ros/ros.h>

int main(int argc, char *argv[])
{
  // ROSノードとして初期化
  ros::init(argc, argv, "com_publisher");
  // cog_publisherクラスのコンストラクタ内で/robot_descriptionパラメータを取得、各リンクの重心、質量を入手
  cog_publisher center_of_gravity_publisher = cog_publisher();
  // /publish_rateパラメータを取得、重心位置のpublishレートを決定
  ros::Rate rate(center_of_gravity_publisher.get_publish_rate());
  // rosが機能している間以下の処理を繰り返す
  while(ros::ok())
  {
    // /tfトピックより/base_linkフレームから見た各リンクの重心位置を計算
    // 各リンクの重心位置と質量を合成してロボット全体の重心を推定
    // /cog/linksトピックで各リンクの重心をsensor_msgs/PointCloud形式でpublish
    // /cog/robotトピックでロボット全体の重心をgeometry_msgs/PointStamped形式でpublish
    center_of_gravity_publisher.publish();
    // /publish_rateパラメータに合わせてデータを出力するようにsleep
    rate.sleep();
  }
  return 0;
}

動作テスト

ピンク色の点が重心を表しています。
今回は実機ではなくgazeboでシミュレーションを行ってみました。
まずは初期姿勢から
Screenshot from 2017-08-17 15:55:10.png
左腕を開いて・・
Screenshot from 2017-08-17 15:55:49.png
上に上げて・・
Screenshot from 2017-08-17 15:56:09.png
最後に後ろへ
Screenshot from 2017-08-17 15:56:43.png

直感的にこんな動きするだろうなという動きしてますし、naoの実機で重心を取得(ALMotionProxy::getCOM)した時と似たような動きしてるので多分あってると思います・・・

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3