刚开始学习ROS,参考网上的资料完成了测试节点的编写,记录一下。
个人习惯在home/Develop目录中做开发,于是在Develop目录下面创建了一个ROS目录,专门用作ROS开发
在自己的ROS目录(随便一个目录即可)下面新建一个工程目录demo,在demo目录下面创建一个工作空间
创建相关目录
cd /home/Develop/ROS
mkdir demo
cd demo
mkdir src
初始化工作空间
cd ~/Develop/ROS/demo/src/
catkin_init_workspace
cd ~/Develop/ROS/demo/
catkin_make
完成之后会在demo目录下面新增两个目录,一个是build目录(编译目录),另外一个是devel目录(开发目录)
接下来需要将我们的工作空间添加到环境变量,以便让ros可以在我们的工作空间下找ros包
source ~/Develop/ROS/demo/devel/setup.bash
上面创建的工作空间是没有功能包的,我们可以使用catkin_create_pkg创建自己的功能包
cd ~/Develop/ROS/demo/src
catkin_create_pkg mytest std_msgs roscpp
上面的命令在src目录下面创建了一个依赖于std::msgs和 roscpp的mytest功能包,创建包完成后,我们的目录下面多出了一些文件和目录。
cd ~/Develop/ROS/demo
catkin_make
此时因为我们未编写任何节点,因此不会编译出可执行程序
在mytest包中添加两个节点,一个发布者node_publisher,一个订阅者node_subscriber
在我们的mytest包目录下的src文件夹下面创建两个cpp源文件,作为两个节点的源文件
cd ~/Develop/ROS/demo/src/mytest/src
touch node_publisher.cpp
touch node_subscriber.cpp
两个文件内容如下
发布者节点 node_publisher.cpp
#include
#include
#include
int main(int argc, char** argv)
{
ros::init(argc, argv,"node_publisher");
ros::NodeHandle nd;
/*publish string msg, 100 is the catch queue*/
ros::Publisher pub = nd.advertise<std_msgs::String>("mytest_msg", 100);
/*10 Hz*/
ros::Rate loop_rate(10);
int cnt = 0;
while(ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss << "current:" << cnt;
cnt++;
msg.data = ss.str();
pub.publish(msg);
/*if some topics is subscribed,this is necessary*/
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
订阅者节点 node_subscriber.cpp
#include
#include
#include
/*msg callback function*/
void msgCallBack(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("info: [%s]", msg->data.c_str());
}
int main(int argc, char** argv)
{
ros::init(argc, argv,"node_subscriber");
ros::NodeHandle nd;
/*publish string msg, 100 is the catch queue*/
ros::Subscriber sub = nd.subscribe("mytest_msg", 100, msgCallBack);
ros::spin();
return 0;
}
修该mytest包的CMakeLists.txt文件,将cpp文件编译成节点
gedit ~/Develop/ROS/demo/mytest/CMakeLists.txt
在文件末尾添加如下语句
add_executable(node_publisher src/node_publisher.cpp)
add_executable(node_subscriber src/node_subscriber.cpp)
target_link_libraries(node_publisher ${catkin_LIBRARIES})
target_link_libraries(node_subscriber ${catkin_LIBRARIES})
编译节点
cd ~/Develop/ROS/demo
catkin_make
打开一个终端,运行如下命令,打开rosmaster主节点
打开另一个终端,运行如下命令,打开node_publisher节点,开始发布字符串类型的消息
rosrun mytest node_publisher
打开另一个终端,运行如下命令,打开node_subscriber节点,开始接收并打印字符串消息
使用如下命令查看结点之间的关系
上面编写的发布者节点node_publisher和订阅者节点node_subscriber之间的关系
rosrun rqt_graph rqt_graph
古月大神
ROS节点订阅与发布
ros学习笔记–如何看可视化的话题与节点