前回に引き続いて、ROSについてもう少しテストをしてみました。
今回は、C++のコードによる通信プログラムと、そのメッセージをプロットしたりノードの状態を表示するツールを使ってみました。
参照元:
ビルドについて
http://forestofazumino.web.fc2.com/ros/ros_simple_program.html
ソースコード
http://forestofazumino.web.fc2.com/ros/ros_message.html
わかりやすい説明で書かれていてとても参考になりました。
環境は前回のものを使います。(ROS Indigo/ Ubuntu 14.04)
ワークスペース、パッケージの作成
$ mkdir ~/sample_ws
$ mkdir ~/sample_ws/src
$ cd ~/sample_ws/src
$ catkin_create_pkg sample std_msgs roscpp rospy
$ cd ~/sample_ws
$ catkin_make
C++を使うために、roscppが必要のようです。
ソースは、
~/sample_ws/src/sample/src
において、
~/sample_ws/sample/CMakeLists.txt
を編集します。
add_executable(pub_test1 src/pub_test1.cpp)
add_executable(sub_test1 src/sub_test1.cpp)
target_link_libraries(pub_test1 ${catkin_LIBRARIES})
target_link_libraries(sub_test1 ${catkin_LIBRARIES})
コマンドの実行
rosrun sample pub_test1
rosrun sample sub_test1
pub_test1.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <ros/ros.h> #include <std_msgs/Float64.h> int main(int argc, char **argv) { ros::init(argc, argv, "pub_test"); ros::NodeHandle nh; ros::Publisher pub = nh.advertise<std_msgs::Float64>("test/num", 100); ros::Rate rate(1); while(ros::ok()) { std_msgs::Float64 msg; for(int i=0;i<2; i++){ msg.data = i; pub.publish(msg); rate.sleep(); } } } |
sub_test1.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <ros/ros.h> #include <std_msgs/Float64.h> void messageCallBack(const std_msgs::Float64& msg) { ROS_INFO_STREAM(msg.data); } int main(int argc, char **argv) { ros::init(argc, argv, "sub_test"); ros::NodeHandle nh; ros::Subscriber sub = nh.subscribe("test/num", 100, &messageCallBack); ros::spin(); } |
ノード間でメッセージをやりとりして一つのシステムが構成される柔軟なしくみになっているのがよく理解できます。言語を選べるということはその言語が得意とするライブラリも選べるということなので、たくさんの機能があるのもうなずけます。