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

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

ただいまの
回答率

89.23%

ROSを用いたパブリッシャとサブスクライバによるメッセージでのビルドエラーの解消方法についての助言をお願いします。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 443

kotekote

score 5

イメージ説明### 前提・実現したいこと
ROSを用いたパブリッシャとサブスクライバによるメッセージのやりとりを行いたいと思っています。

ROSロボットプログラミングバイブルという参考書を元にROSを勉強しています。
そして、プログラムを動かしながらROSの基本を学んでいる最中です。

パブリッシャとサブスクライバのノードを実装し、通信を行うという演習をしています。
そこで。ビルドが通らない状況にあります。
package.xmlのパッケージの著者やURLなどの情報以外は参考書のサンプルプログラムをそのまま使っています。

ワークスペース catkin_ws
catkin_wsの直下 src, dev, build
srcの直下 ros_tutorials_topic, CMakeLists.txt, my_first_ros_pkg(おそらく関係ないですが、一応記載)
ros_tutorials_topicの直下 include, src, msg, CMakeLists.txt, package.xml
srcの直下 topic_publisher.cpp, topic_publisher.cpp


ros_tutorials_topicの直下のmsgには、以下のメッセージMsgTutorial.msgが含まれています。
time stamp
int32 data

発生している問題・エラーメッセージ

ビルドを通すと、以下のような画面になります(一部掲載)。
cppファイルのros::の箇所が定義されていない参照となります。

おそらく、CMakeLists.txtのところで間違えていると思います。
一応、全てのコードを載せます。

エラーメッセージ

[ 72%] Linking CXX executable /home/taku/catkin_ws/devel/lib/ros_tutorials_topic/topic_publisher
CMakeFiles/topic_publisher.dir/src/topic_publisher.cpp.o: 関数 `main' 内:
topic_publisher.cpp:(.text+0x70): `ros::init(int&, char**, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)' に対する定義されていない参照です
topic_publisher.cpp:(.text+0xcc): `ros::NodeHandle::NodeHandle(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)' に対する定義されていない参照です
topic_publisher.cpp:(.text+0x182): `ros::Rate::Rate(double)' に対する定義されていない参照です
topic_publisher.cpp:(.text+0x1a0): `ros::ok()' に対する定義されていない参照です

新たなエラーメッセージ

[rosrun] Couldn't find executable named topic_publisher below /home/taku/catkin_ws/src/ros_tutorials_topic

該当のソースコード(txt, pkg, cpp×2の4つ)

**CMakeLists.txt**
cmake_minimum_required(VERSION 2.8.3)
project(ros_tutorials_topic)

find_package(catkin REQUIRED COMPONENTS
message_generation
std_msgs
roscpp
)

add_message_files(FILES MsgTutorial.msg)

generate_messages(DEPENDENCIES std_msgs)

catkin_package(
INCLUDE_DIRS include
LIBRARIES ros_tutorials_topic
CATKIN_DEPENDS std_msgs roscpp
DEPENDS system_lib
)

include_directories(${catkin_INCLUDE_DIRS})

add_executable(topic_publisher src/topic_publisher.cpp)
add_dependencies(topic_publisher ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(topic_publisher ${catkin_LIBRALIES})

add_executable(topic_subscriber src/topic_subscriber.cpp)
add_dependencies(topic_subscriber ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(topic_subscriber ${catkin_LIBRALIES})

****package.xml****
<?xml version="1.0"?>
<package>
  <name>ros_tutorials_topic</name>
  <version>0.1.0</version>
  <description>The ros_tutorials_topic package</description>

  <maintainer email="pyo@todo.todo">taku</maintainer>

  <license>apache license 2.0</license>

<author email="kotemen0724@gmail.com">Jane Doe</author>
<url type="website">http://wiki.ros.org/ros_tutorials_topic</url>

  <buildtool_depend>catkin</buildtool_depend>


  <build_depend>roscpp</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_depend>message_generation</build_depend>

  <run_depend>message_runtime</run_depend>
  <run_depend>roscpp</run_depend>
  <run_depend>std_msgs</run_depend>

  <export></export>
</package>


パブリッシャのノード作成のcpp
****topic_publisher.cpp****
#include <ros/ros.h>        // ROSヘッダファイル
#include <ros_tutorials_topic/MsgTutorial.h>

int main(int argc, char **argv) {
  ros::init(argc, argv, "topic_publisher");           // ノード初期化(ノード名を"hello"に設定)
  ros::NodeHandle nh;                       // ノードハンドルの生成


//ros_tutorial_pubはパブリッシャ
//トピック名はros_tutorial_msg
//パブリッシャのキューのサイズを100に設定
//キューとは、データ構造の一種。データ列において、新しいデータは列の後ろ、取り出すときは前からとる
ros::Publisher ros_tutorial_pub=nh.advertise<ros_tutorials_topic::MsgTutorial>("ros_tutorial_msg",100);

  ros::Rate loop_rate(10);  // 周期設定(10Hz=0.1秒に設定)

//メッセージファイル
//MsgTutorial.msg形式で記述したメッセージmsgの宣言
//timeとint32型の変数が格納されてた
ros_tutorials_topic::MsgTutorial msg;

int count=0;



  while(ros::ok()) {
msg.stamp=ros::Time::now();  //現在時間
msg.data=count;              //count変数をdataに

//stamp.secメッセージを表示
ROS_INFO("send msg = %d",msg.stamp.sec);

//stamp.nsecメッセージを表示
ROS_INFO("send msg = %d",msg.stamp.nsec);

ROS_INFO("count = %d",msg.data);


//作成したros_tutorial_pubパブリッシャにおいて、メッセージmsgをパブリッシュする
ros_tutorial_pub.publish(msg);

loop_rate.sleep();  // 指定された周期待ち(ループ内の他処理時間を引いた時間分を待つ)

++count;
  }
return 0;
}


サブスクライバのノード作成のcpp
****topic_subscriber.cpp****
#include <ros/ros.h>  // ROSヘッダファイル
#include <ros_tutorials_topic/MsgTutorial.h>

//メッセージファイル
//MsgTutorial.msg形式で記述したメッセージmsgの宣言
//timeとint32型の変数が格納されてた
//ros_tutorials_topic::MsgTutorial msg;

//メッセージのコールバック関数
//ros_tutorial_msgトピックにおいてメッセージを受信した時に動作する関数
//引数はros_tutorials_topicトピックのMsgTutorialメッセージ
void msgCallback(const ros_tutorials_topic::ConstPtr& msg){
//stamp.secメッセージを表示
ROS_INFO("receive msg = %d",msg.stamp.sec);

//stamp.nsecメッセージを表示
ROS_INFO("receive msg = %d",msg.stamp.nsec);

ROS_INFO("receive msg = %d",msg.data);
}

int main(int argc, char **argv) {
  ros::init(argc, argv, "topic_subscriber");           // ノード初期化(ノード名を"hello"に設定)
  ros::NodeHandle nh;                       // ノードハンドルの生成


//ros_tutorial_pubはパブリッシャ
//トピック名はros_tutorial_msg
//パブリッシャのキューのサイズを100に設定
//キューとは、データ構造の一種。データ列において、新しいデータは列の後ろ、取り出すときは前からとる
ros::Subscriber ros_tutorial_sub=nh.subscribe("ros_tutorial_msg",100,msgCallback)

//メッセージの受信があったらコールバック関数を呼び出す
ros::spin();

return 0;
}

試したこと

https://qiita.com/srs/items/de7bf71b96dc26b1f53b

上記のリンクを参考にし、CMakeLists.txtに問題があるのでは?と考えました。
しかし、そこからのアプローチが考えられず、助言をいただきたいです。

補足情報(FW/ツールのバージョンなど)

windows10で、VMware Workstation 15 Playerを用いて「16.04.6 LTS (Xenial Xerus)」のubuntuで動かしてます。
ROSは「Kinetic Kame」です。

どちらも、参考書ROSロボットプログラミングバイブルの通りです(仮想マシンを使うことを除きます)。

<追記>
http://forestofazumino.web.fc2.com/ros/ros_simple_program.html
上記のサンプルを実行できました。

書籍に従って、turtlesimを実行しました

おかげさまで、ビルドはできたのですが、実行が以下のコマンドでできませんでした。
rosrun ros_tutorials_topic topic_publisher

[rosrun] Couldn't find executable named topic_publisher below /home/taku/catkin_ws/src/ros_tutorials_topic

下記ディレクトリに実行ファイルは作られていました。
/home/taku/catkin_ws/devel/lib/ros_tutorials_topic

質問1
・「source ~/catkin_ws/devel/setup.bash」は.bashrcに追加済みです。

・ターミナルで「 echo $ROS_PACKAGE_PATH 」を実行すると、以下が返ってきました。
/home/taku/sample_ws/src:/home/taku/catkin_ws/src:/opt/ros/kinetic/share

・rosrun ros_tuto と打った時にTAB補完を行うと、以下のように補完されました。
rosrun ros_tutorials_topic

・roscd ros_tutorials_topic を行うと、以下のようにディレクトリが変化しました。
~/catkin_ws/src/ros_tutorials_topic

質問2
CMakeLists.txtはLIBRALIESのスペル以外変えていません。

質問3
参照リンクの「 rosrun sample hello 」は実行できました。「Hello World!」が一定時間間隔で表示されていました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sin_250

    2020/04/18 20:36

    出てるエラーメッセージは単にROS本体とリンクできないから、ros::initやros::okなどの関数の定義(実体)が見つからないよ、と言っています。
    おっしゃるように、CMakeLists.txtに問題がある可能性は低くないですが、それ以前にそもそもROSが正しくインストールされているだろうかというレベルで問題ないかを知りたいです。
    ・ 他のもっとシンプルなケースで、ビルドおよびプログラム実行できた実績はありますか?
    ・ 他のケースはビルドできるけど、今回のケース「だけ」出来ないのでしょうか?

    キャンセル

  • kotekote

    2020/04/19 13:29

    返信ありがとうございます。

    http://forestofazumino.web.fc2.com/ros/ros_simple_program.html
    上記リンクの「簡単なプログラムを作って動かしてみる」というものを動かしてみたことがあります。

    お恥ずかしながら、上記のリンクの丸写しが1回目で、今回の問題が2回目のビルドなので他のケースのビルドを経験していない状況です。

    キャンセル

回答 1

checkベストアンサー

0

スペルミスですね。
LIBRALIESではなくLIBRARIESです。

target_link_libraries(topic_publisher ${catkin_LIBRALIES})

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/20 15:15

    丁寧に見てくださり、本当にありがとうございます。指摘の通り、スペルミスの他にtopic_subscriber.cppで::や;をつけ忘れていました。これを修正することでビルドは完了しました。
    以下、質問に回答します。

    質問1
    ・「source ~/catkin_ws/devel/setup.bash」は.bashrcに追加済みです。

    ・ターミナルで「 echo $ROS_PACKAGE_PATH 」を実行すると、以下が返ってきました。
    /home/taku/sample_ws/src:/home/taku/catkin_ws/src:/opt/ros/kinetic/share

    ・rosrun ros_tuto と打った時にTAB補完を行うと、以下のように補完されました。
    rosrun ros_tutorials_topic

    ・roscd ros_tutorials_topic を行うと、以下のようにディレクトリが変化しました。
    ~/catkin_ws/src/ros_tutorials_topic


    質問2
    CMakeLists.txtはLIBRALIESのスペル以外変えていません。


    質問3
    参照リンクの「 rosrun sample hello 」は実行できました。「Hello World!」が一定時間間隔で表示されていました。


    何度も申し訳ありませんが、よろしくお願いします。

    キャンセル

  • 2020/04/20 20:50

    正直ちょっとわかりません、
    唯一気になるのは echo $ROS_PACKAGE_PATHの結果が以下なことですね。
    /home/taku/sample_ws/src:/home/taku/catkin_ws/src:/opt/ros/kinetic/share
    例えば私の環境だと、以下です。
    /home/<ユーザ名>/catkin_ws/src:/opt/ros/kinetic/share

    sample_wsというのは rosrun sample hello で実行したプログラムが格納されているworkspaceということでしょうか?
    おそらく今まで試行錯誤で色々やられていると思うので、1回sample_wsもcatkin_wsも消して(もちろんソースコードは退避しておいて)
    Cleanな状態からworkspaceを作成してみてはどうでしょうか。
    私の環境では問題なく動くので、ソースコードの問題ではないと思います。

    キャンセル

  • 2020/04/22 00:45

    数々の助言ありがとうございました。ワークスペースを作り直すことで、パブリッシャ、サブスクライバともに動かすことができました。
    おかげさまで、再び参考書を読み進めることができます。

    キャンセル

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

  • ただいまの回答率 89.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • C++に関する質問
  • ROSを用いたパブリッシャとサブスクライバによるメッセージでのビルドエラーの解消方法についての助言をお願いします。