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

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

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

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

Ubuntu

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

ビルド

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

C++

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

解決済

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

kotekote
kotekote

総合スコア5

CMake

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

Ubuntu

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

ビルド

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

C++

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

1回答

0リアクション

0クリップ

6778閲覧

投稿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!」が一定時間間隔で表示されていました。

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

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回目のビルドなので他のケースのビルドを経験していない状況です。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

CMake

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

Ubuntu

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

ビルド

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

C++

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