1:建立工作空间站
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace (初始化catkin工作空间的命令,这个命令会在工作空间中生成一个CMakeLists.txt文件和一个 src 目录。)
2:创建一个功能包
$ cd ~/catkin_ws/src
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
#beginner_tutorials为功能包名,std_msgs rospy roscpp 为三个依赖,std_msgs为ROS自定义的一些基本数据格式,rospy为依赖于python,roscpp为依赖于C++.
$ cd ~/catkin_ws
$ catkin_make
3:编写talker.cpp,listener.cpp
// talker.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker");
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; //定义ros里的string类型的消息message对象;
std::stringstream ss;
ss << "hello world " << count;//将需要发布的消息存到ss里;
msg.data = ss.str(); //将ss赋给msg.data;
ROS_INFO("%s", msg.data.c_str()); //设置ROSINFO输出格式
chatter_pub.publish(msg); //核心:发布
ros::spinOnce(); //与回调相关;
loop_rate.sleep();
++count;
}
return 0;
}
// listener.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
// 回调函数
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback); //()里写订阅的话题名字,缓存区大小,收到消息后执行的回调函数
ros::spin();
return 0;
}
4:编辑CMakeLists文件(每个包都有camke文件,跟编译有关)
cd ~/catkin_ws/src/beginner_tutorials/src
gedit CMakeLists.txt
在最后面加上(等下运行报错,就把add_dependencies那两行打上#注释掉)
(add_executable
是CMake的一个命令,用于向构建系统添加可执行文件的配置。在ROS中,每个ROS包通常会有一个或多个可执行文件,用于实现节点、功能包等。)
include_directories(include ${catkin_INCLUDE_DIRS})
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)
5:编译(最后不报错才算成功)
(在执行 catkin_make
命令时,catkin会读取CMakeLists.txt文件,并根据其中的命令和配置信息来进行编译和构建。这样,catkin构建系统就知道如何处理该ROS包,包括如何编译可执行文件,如何链接依赖库等。)
$ cd ~/catkin_ws
$ catkin_make
6: 使路径生效,不然无法直接找到(每次新开一个终端都要用一次)
##setup.bash
是一个用来设置环境变量的脚本文件,setup.bash
脚本会将 ROS 相关的路径(如安装路径、工作空间路径等)添加到环境变量中,以便你可以使用ROS提供的命令和工具。
$ cd ~/catkin_ws
$ source ./devel/setup.bash
#这里是使路径生效,如果不执行ros将找不到该路径下的文件
$ rosrun beginner_tutorials talker
7:开启ros
$ roscore
8:运行listener与talker
$ cd ~/catkin_ws
$ source ./devel/setup.bash
$ rosrun beginner_tutorials listener