質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

729閲覧

rtimulib_ros.cppについて

yamasn

総合スコア23

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/10/04 17:19

C言語初心者です
rtimulib_rosというパッケージ内についてお聞きしたいです。
リンク内容
srcフォルダにこのプログラムがあるのですが
意味が理解できないところがあります コメントはほぼ自分の書き込みです。
//??をつけている所の処理や意味がよくわかりませんので教えていただきたいです。
またコメント書いてあるところも間違いがあれば教えていただけると嬉しいです。

<補足>
出来ればプログラムがどういう動きをしているか、プログラムの意味を教えていただきたいです。
センサ:MPU9250
最後のほうだけ少しプログラム追加しています。
言葉が変なところが少なからずあると思いますが よろしければお願いします。

#include <RTIMULib2/RTIMULib/RTIMULib.h //RTIMULib用ヘッダ #include <ros/ros.h> //ros用ヘッダ #include <sensor_msgs/Imu.h> //センサ関連のヘッダ #include <tf/tf.h> #include <tf/transform_datatypes.h> //座標変換のためのヘッダ static const double G_TO_MPSS = 9.80665; //?? int main(int argc, char **argv) { ros::init(argc, argv, "rtimulib_node"); //このノード名がrtimulib_nodeであるという意味 ROS_INFO("Imu driver is now running"); //ROS INFOログ表示 ros::NodeHandle nh("~"); //ノードハンドラの宣言 ~空間にnh格納 std::string calibration_file_path; //calibration file pathというローカル変数を生成 if(!nh.getParam("calibration_file_path", calibration_file_path)) { ROS_ERROR("The calibration_file_path parameter must be set to use a " "calibration file."); ROS_BREAK(); } //もしcalibration_file_pathのパラメータ獲得しなかった場合 //ROS_ERROR上記のメッセージをログ表示 std::string calibration_file_name = "RTIMULib"; //calibration_file_nameというローカル変数を生成しRTIMULibとする if(!nh.getParam("calibration_file_name", calibration_file_name)) { ROS_WARN_STREAM("No calibration_file_name provided - default: " << calibration_file_name); } //ストリームフォーマットログ表示 ?? std::string frame_id = "imu_link"; //frame_idというローカル変数を生成しimu_linkとする if(!nh.getParam("frame_id", frame_id)) { ROS_WARN_STREAM("No frame_id provided - default: " << frame_id); } //ストリームフォーマットログ表示 ?? ros::Publisher imu_pub = nh.advertise<sensor_msgs::Imu>("imu", 1); //?? // Load the RTIMULib.ini config file RTIMUSettings *settings = new RTIMUSettings(calibration_file_path.c_str(), calibration_file_name.c_str()); RTIMU *imu = RTIMU::createIMU(settings); //上の4行の意味がよくわかってません ?? if ((imu == NULL) || (imu->IMUType() == RTIMU_TYPE_NULL)) { ROS_ERROR("No Imu found"); ROS_BREAK(); } //もしimuがNULL(空)もしくはIMUTypeがRTIMU_TIPE_NULLなら //ROS_ERRORログ表示 imu->IMUInit(); // IMUInit初期化 imu->setSlerpPower(0.02); //?? imu->setGyroEnable(true); imu->setAccelEnable(true); imu->setCompassEnable(true); //センサを利用可能に 各メンバがtrue sensor_msgs::Imu imu_msg; //Imu空間内にimu_msgを生成 while (ros::ok()) { if (imu->IMURead()) { RTIMU_DATA imu_data = imu->getIMUData(); //?? imu_msg.header.stamp = ros::Time::now(); //nowをimu_msg.header.stampに代入 imu_msg.header.frame_id = frame_id; //frame_idをimu_msg.header.frameに代入 imu_msg.orientation.x = imu_data.fusionQPose.x(); imu_msg.orientation.y = imu_data.fusionQPose.y(); imu_msg.orientation.z = imu_data.fusionQPose.z(); imu_msg.orientation.w = imu_data.fusionQPose.scalar(); //imu_data.fusionQPoseをimu_msg.orientationに代入 tf::Quaternion q(imu_msg.orientation.x, imu_msg.orientation.y , imu_msg.orientation.z , imu_msg.orientation.w); //Quatetion qにimu_msg.orientation代入 tf::Matrix3x3 m(q); double roll, pitch, yaw; m.getRPY(roll, pitch, yaw); //roll pitch yaw演算 printf("%f %f %f", roll, pitch, yaw); //ノード立ち上げ時出力 imu_msg.angular_velocity.x = imu_data.gyro.x(); imu_msg.angular_velocity.y = imu_data.gyro.y(); imu_msg.angular_velocity.z = imu_data.gyro.z(); imu_msg.linear_acceleration.x = imu_data.accel.x() * G_TO_MPSS; imu_msg.linear_acceleration.y = imu_data.accel.y() * G_TO_MPSS; imu_msg.linear_acceleration.z = imu_data.accel.z() * G_TO_MPSS; //同じく代入 imu_pub.publish(imu_msg); //トピックにimu_msgを配信 } ros::spinOnce(); ros::Duration(imu->IMUGetPollInterval() / 1000.0).sleep(); } return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

プログラムの内容

  1. IMUセンサーから IMU情報を取得する。
  2. 取得したIMU情報を sensor_msgs::Imu というメッセージに入れ、"imu" というトピック名で配信している。

不明とか書かれてる点について

ROS の API に関する部分だけコメントします。
RTIMULib という IMU センサーのライブラリ部分に関しては、その製品を持っていないのでコメントできません。
お使いの製品のメーカーにドキュメント等はないのでしょうか。もしないのであれば、理解するにはソースコードを読むしかないと思います。

ROS のログ出力

if(!nh.getParam("calibration_file_name", calibration_file_name)) { ROS_WARN_STREAM("No calibration_file_name provided - default: " << calibration_file_name); } //ストリームフォーマットログ表示 ??

関数ではなく、std::cout << "メッセージ" << std::endl; と展開されるようなただのマクロです。ROS APIでは、printf 風と iostream 風に使える2種類のログ出力マクロが提供されています。

ROS_WARN("error value: %d", 2): printf() 風のログ出力
ROS_WARN_STREAM("error value: " << 2): iostream 風のログ出力

参考 ログ表示

Publisher

ros::Publisher imu_pub = nh.advertise<sensor_msgs::Imu>("imu", 1); //??

sensor_msgs::Imu メッセージ (ROS 標準のものです) を "imu" というトピック名で publish する publisher を作成しています。

参考 Publisher を作成する。

RTIMULib

以下はわからないので、詳細なコメントはできません。
使われてる RTIMULib のソースコードを読んでください。

static const double G_TO_MPSS = 9.80665; //??

この値は重力加速度ですが、なにか心当たりはないですか?
G から MPSS (なにか不明) に単位を変換するのに必要な定数なのでは?

追記

単位を G から m/s^2 に変換するための重力加速度ですね。
1G = 9.8 m/s^2

asm さんのコメントでわかりました。ありがとうございます。

// Load the RTIMULib.ini config file RTIMUSettings *settings = new RTIMUSettings(calibration_file_path.c_str(), calibration_file_name.c_str()); RTIMU *imu = RTIMU::createIMU(settings); //上の4行の意味がよくわかってません ??

キャリブレーションのファイルを読み込んでいるのではないでしょうか。

imu->setSlerpPower(0.02); //??

slerp は球面線形補間ですが、なにかのパラメータでしょうか?

その他

ROS Wiki のチュートリアル がまだ完了してないようであれば、やっておいたほうがよいです。

投稿2018/10/05 04:04

編集2018/10/05 04:27
tiitoi

総合スコア21954

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2018/10/05 04:18

> 重要加速度 重力加速度 g to m/ss g → m/s^2 だろうか
tiitoi

2018/10/05 04:27

MPSS は meter per second^2 の意味だったのですね。 それだとしっくりきます。コメントありがとうございます。
yamasn

2018/10/06 15:18

tiitoiさん今回もご意見ありがとうございます 参考にさせていただきます! pはperだったのですね・・asmさんありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問