### 前提・実現したいこと
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!」が一定時間間隔で表示されていました。
回答1件
あなたの回答
tips
プレビュー