话题订阅发布是ros实现功能的主要方式之一,但对于初学者而言,整个流程并不算十分友好,尤其是对CMAKEFILE不熟悉的同志,如果只是一味地按照教程写程序,很有可能发生错误,可能是版本或者不同库的原因。
下面简要介绍一个简单的发布流程(订阅尚在调试学习中):
1.建立工作空间:
mkdir -p ~/demo01_ws/src
cd ~/demo01_ws/src ##(注意可以使用tab加快打字速度)
catkin_init_workspace
cd demo01_ws
catkin_make
source ./devel/setup.bash
2.创建功能包:
catkin_create_pkg learning_communication roscpp rospy std_msgs
cd ~/demo01_ws
catkin_make
source ./devel/setup.bash
3.关于空间覆盖,我没有做,也能实现发布,但还是写着以供参考:
sudo apt-get install ros-kinetic-ros-tutorials
rospack find roscpp_tutorials
cd ~/demo01_ws/src
git clone git://github.com/ros/ros_tutorials.git
cd ..
catkin_make
source ./devel/setup.bash
4.在learning_communication/src中创建talker.cpp文件
vim talker.cpp
--------------------
#include<sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc,char *argv[]){
ros::init(argc,argv,"talker");//ros节点初始化
ros::NodeHandle n;//节点句柄创建
ros::Publisher chatter_pub=n.advertise<std_msgs::string>("chatter",1000);
//创建发布者
ros:rate loop_rate(10);//设置循环频率
int count=0;
while(ros::ok()){
std_msgs::String msg;
std::stringstream ss;
ss << "Hello World!" <<count;
msg.data=ss.str();
ROS_INFO("%s",msg.data.c_str());
chatter_pub.publish(msg);//消息发布
ros::spinOnce();//循环等待回调函数
loop_rate.sleep();//按循环频率延时
count++;
}
return 0;
}
5.修改CMakeList.txt
对以下语句去除注释并修改:
include_directories(include ${catkin_INCLUDE_DIRS})
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_depandencies(talker ${PROJECT_NAME}_generate_messages_cpp)
注意这些语句的顺序,顺序错误会导致报错,修改会显得很繁琐;
不要修改:
project(learning_communication)
catkin_package(
INCLUDE_DIRS include
# LIBRARIES strands_gazing
CATKIN_DEPENDS std_msgs
# DEPENDS system_lib
)
以及:find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
)
网上对这两部分的修改在本程序中会导致报错
之后在demo01_ws中:
catkin_make
6.启动publisher
在主界面终端启动:
roscore
在demo01_ws中:
source ./devel/setup.bash
rosrun learning_communication talker.
--------------------------------
之后会出现Hello World!1等字样,那恭喜你成功了
程序可以通过ctrl C来暂停