今回は簡単なPublishとSubscribeをするノードの作成をします
Requirement
Make Package
ここではすでにbeginner_tutorialsというパッケージができていると仮定します
環境変数の読み込み忘れずに
source /opt/ros/melodic/setup.bash
workspaceに移動しmakeします
cd ~/catkin_ws
catkin_make
これでbuild完了です
以下でできたファイルが確認できます
cd ~/catkin_ws/
ls
実行するとこんな感じです
build devel src
これ以降ターミナルを実行するたびに以下を実行すれば環境変数を読み込めます
source ~/catkin_ws/devel/setup.bash
毎回読み込むのがめんどくさかったら以下を実行しましょう!
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
プログラムはPCLをみこしてC++で書いていきます
まずはフォルダーに移動します。VSCode入ってる人はcode .でフォルダーを開けます
cd ~catkin_ws/src/beginner_tutorials
code .
ここからはコードです
PCLをみこしてあえてC++の推奨に準拠して書いていきます
まずはメッセージをPublishするノードを書きます
# include<ros/ros.h>
# include<std_msgs/String.h>
namespace talker_node{
class Talker{
public:
Talker();
~Talker();
void talker_publish(std_msgs::String &msg);
private:
ros::NodeHandle nh_;
ros::Publisher std_pub_;
};
}
# include<beginner_tutorials/talker.h>
namespace talker_node{
Talker::Talker(){
std_pub_=nh_.advertise<std_msgs::String>("talker_node/string", 10);
}
Talker::~Talker(){}
void Talker::talker_publish(std_msgs::String &msg){
std_pub_.publish(msg);
}
}
# include <ros/ros.h>
# include <beginner_tutorials/talker.h>
int main(int argc, char **argv){
ros::init(argc, argv, "talker_node");
talker_node:Talker talker;
ros::Rate loop_rate(10);
while(ros::ok()){
std_msgs::String msg;
msg.data = "hello ros&pcl!!";
talker.talker_publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
}
次にPublishされたメッセージをSubscribeして表示するノードを書きます
# include<ros/ros.h>
# include<std_msgs/String.h>
namespace listener_node{
class Listener{
public:
Listener();
~Listener();
void string_callback(const std_msgs::String &msg);
private:
ros::NodeHandle nh_;
ros::Subscriber std_sub_;
};
}
# include<beginner_tutorials/listener.h>
namespace listener_node{
Listener::Listener(){
std_sub_ = nh_.subscribe("talker_node/string", 10, &Listener::string_callback, this);
}
Listener::~Listener(){}
void Listener::string_callback(const std_msgs::String &msg){
ROS_INFO("get msg is ~%s~", msg.data.c_str());
}
}
# include <ros/ros.h>
# include <beginner_tutorials/listener.h>
int main(int argc, char **argv){
ros::init(argc, argv, "listener_node");
listener_node::Listener listener;
ros::spin();
}
以上でコードは完成です
最後にCMakeファイルを編集します
cmake_minimum_required(VERSION 3.0.2)
project(beginner_tutorials)
## Find catkin and any catkin packages
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs)
## Declare a catkin package
catkin_package()
## Build talker and listener
include_directories(include ${catkin_INCLUDE_DIRS})
## Declare C++ library
add_library(${PROJECT_NAME}
src/talker.cpp
src/listener.cpp
)
add_executable(talker_node src/talker.cpp src/talker_main.cpp)
target_link_libraries(talker_node ${catkin_LIBRARIES})
add_executable(listener_node src/listener.cpp src/listener_main.cpp)
target_link_libraries(listener_node ${catkin_LIBRARIES})
もうちょいです
最後にmakeしましょう
cd ~/catkin_ws
catkin_make
これで完成!
実行してみます
その前にターミナルをいくつも開くと面倒なのでteminatorをインストールしましょう
sudo apt install terminator
これでCtrl+Shift+eでターミナルが横分割にでき、Ctrl+Shift+oで縦分割にできます
では新しくターミナルを開き以下を実行します
sourceを自動で読み込むようにしてない人はsourceを忘れずに
1つめ roscore
roscore
2つ目
rosrun beginner_tutorials talker_node
3つ目
rosrun beginner_tutorials listener_node
うごきましたか??
おつした!
next
previous
references