1. 创建一个工作空间
- 在根目录下创建一个名为catkin_ws的文件夹(也可自己定义文件夹名字,但是在后续操作中记得改成自己对应的名字),在catkin_ws文件夹下在创建一个src文件夹(必须要有这个文件夹,后续的包都放在里面),在终端中指令如下
mkdir -p ~/catkin_ws/src
- 通过cd指令进入src文件夹下,在终端中输入
cd ~/catkin_ws/src
3.将src文件夹创建工作空间,在终端中输入
catkin_init_workspace
4.创建完成后,回到根目录下,使用catkin_make指令进行编译整个工作空间。
cd ~/catkin_ws/
catkin_make
如果编译没有报错,工作空间就创建成功了,如果有错误请一定修改好,否则会影响后续工作,错误种类很多这里不多加赘述
5.设置环境变量
source /devel/setup.bash
如果使用的终端是zsh则把上面指令的bash改为zsh即可
注意:这里设置的环境变量只在当前终端生效,打开新的终端要重新设这相关路径的环境变量,如果想在所有终端生效,有两种方法:
(1).打开.bashrc或者 .zshrc文件,取决于你使用的哪种终端。系统默认终端是bash,这两个文件是隐藏文件,按Ctrl+H可以查看。如图是我输入Ctrl+H厚的隐藏文件列表,可以看到~ /.bashrc或和~/.zshrc
打开自己计算机对应的文件,在最后一行加入
source ~/catkin_ws/devel/setup.sh
(2)直接在终端输入(bash终端)
echo "source ~/catkin_ws/devel/setup.sh" >> ~/.bashrc
source ~/.bashrc
(zsh终端)
echo "source ~/catkin_ws/devel/setup.sh" >> ~/.zshrc
source ~/.zshrc
6.检查环境变量
echo $ROS_PACKAGE_PATH
如果看到我们刚刚设置的路径就是设置成功了
2.创建Publisher
Publisher作用是针对某一话题发布特定类型的消息指令,现在节点中创建一个Publisher并发布字符串“Hello World”
- 首先在src文件夹中新建一个名为 learning_communication的功能包
打开终端使用cd命令进入刚刚创建的/catkin_ws/src目录下
cd ~/catkin_ws/src
使用catkin_creat_pkg命令创建功能包
catkin_create_pkg learning_communication std_msgs rospy roscpp
后边的std_msgs rospy roscpp是相关依赖,可以根据个人需求添加其他依赖,也可以日后在CmakeList.txt里手动添加。
打开learning_communication文件夹可以看到以下目录。
打开learning_communication中的src文件夹,创建一个名为talker.cpp的cpp文件,文件代码如下(如果使用本文提供的代码,文件名请保持一致)
#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "talker");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String
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类型的消息
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;
}
保存退出
3.创建Subscriber接收端
打开learning_communication中的src文件夹,创建一个名为listener.cpp的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节点
ros::init(argc, argv, "listener");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Subscriber,订阅名为chatter的topic,注册回调函数chatterCallback
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
// 循环等待回调函数
ros::spin();
return 0;
}
4.编译代码设置依赖
打开learning_communication中的CMakeLists.txt文件,在后边加上
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
作用是将刚刚写的两个cpp文件添加到 配置文件中使其可以进行编译操作。
注:在CMakeLists.txt中找到以下代码把注释去掉。去掉后结果如下。
include_directories(
include
${catkin_INCLUDE_DIRS}
)
保存退出。
5.配置完成后就可以打开终端进行编译操作
首先在终端进入/catkin_ws/目录下
cd ~/catkin_ws/
进行编译
catkin_make
没有报错就是编译成功可以运行代码了。
先启动master
roscore
打开新的终端,运行talker.cpp
rosrun learning_communication talker
输出结果如下
再打开新的终端,运行listener.cpp
rosrun learning_communication listener
这样Subscriber就可以接收发布者发布的指令,并输出出来。