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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

C++

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

Q&A

解決済

1回答

9309閲覧

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

kotekote

総合スコア5

CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

C++

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

0グッド

0クリップ

投稿2020/04/06 15:46

編集2020/04/20 06:14

イメージ説明### 前提・実現したいこと
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!」が一定時間間隔で表示されていました。

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

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

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

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

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

sin_250

2020/04/18 11:36

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

2020/04/19 04:29

返信ありがとうございます。 http://forestofazumino.web.fc2.com/ros/ros_simple_program.html 上記リンクの「簡単なプログラムを作って動かしてみる」というものを動かしてみたことがあります。 お恥ずかしながら、上記のリンクの丸写しが1回目で、今回の問題が2回目のビルドなので他のケースのビルドを経験していない状況です。
guest

回答1

0

ベストアンサー

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

cp

1target_link_libraries(topic_publisher ${catkin_LIBRALIES})

投稿2020/04/19 06:36

sin_250

総合スコア112

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

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

kotekote

2020/04/19 08:23

返信ありがとうございます。 助言の通り、スペルミスでした。cppのほうにもスペルミスがいくつかあり、それらを直した結果、ビルドは成功しました。ありがとうございます。 しかし、ノード実行を行うrosrunを下記のように行ってもうまくいきません。もう一度だけ助言をいただけないでしょうか。 rosrun ros_tutorials_topic topic_pulisher エラー内容としては、下記のようになっております。 [rosrun] Couldn't find executable named topic_publisher below /home/taku/catkin_ws/src/ros_tutorials_topic 一応、下記のディレクトリにtopic_publisherという実行ファイルは作られています。 /home/taku/catkin_ws/devel/lib/ros_tutorials_topic
sin_250

2020/04/19 09:22

↑で書かれたコードをコピペして、LIBRARLIESのスペルミスと、topic_subscriber.cppのソース(コールバック関数の引数の型と、セミコロンのつけ忘れ)を一部修正すれば問題なくrosrunから起動できましたよ。 質問1 .bashrcで source ~/catkin_ws/devel/setup.bash は書かれていますか? ターミナルで echo $ROS_PACKAGE_PATH を実行するとなにが返ってきますか? rosrun ros_tuto と打った時にTAB補完は効いてますか? roscd ros_tutorials_topic は正しく動作しますか? 質問2 CMakeLists.txtはLIBRALIESのスペル以外変えてませんか?
kotekote

2020/04/20 06: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!」が一定時間間隔で表示されていました。 何度も申し訳ありませんが、よろしくお願いします。
sin_250

2020/04/20 11: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を作成してみてはどうでしょうか。 私の環境では問題なく動くので、ソースコードの問題ではないと思います。
kotekote

2020/04/21 15:45

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問