由于今天晚上吃了夜宵,写点有意思的东西哈哈哈哈。
在ROS 的基础学习里面,一个重要的基础是rostopic中消息的发布与订阅,一个简单的例子嘿嘿。
一.节点与包的联系
在机器人操作的学习里,要运作一个机器人需要很多部分的一起作用,就像一个手机里面有很多APP,APP相当于一个pacakge,然后APP里面有许多功能,相当于一个一个的节点node。节点之间的合作运行就可以控制机器人的运作。
那各个节点如何联系起来?就需要一个共同的话题叫rostopic。
比如今天晚上fan跟xie想吃夜宵,那么他们就需要一个共同的话题ye_xiao_topic,那么他们两个才能互相联系起来
二.编写程序
2.1创立工作空间与pacakge
首先打开Ctrl+Alt+T打开终端,输入以下指令:完成对pacakge的创建。
mkdir -p catkin_ws/src//创建工作空间
cd catkin_ws/src //进入到工作空间中的src文件
catkin_create_pkg fan_pkg rospy rpscpp std_msgs//catkin_create_pkg<包的名称><依赖项>
2.2利用vscode进行程序的编写
2.2.1信息发布者节点的编写
在文件fan_pkg下打开终端输入code package.xml,然后回车【输入一半可以用Tab键自动补全,方便检查拼写是否错误】。命令将会将工作空间自动导入到vscode。
进入我们的vscode 编写程序,点击src右键新建文件取名fan_node.cpp创建一个C++文件,进行我们信息发布节点的一个编写,相当于消息发布者需要在群里管理员的管理下进行消息的发布,其中while(ros::ok())是ros中自带的,帮助我们在终端里面结束程序,跳出循环。代码如下:
#include<ros/ros.h>//ros库中的头文件
#include<std_msgs/String.h>
int main(int argc,char *argv[])
{
ros::init(argc,argv,"fan_node");//对节点进行初始化
ros::NodeHandle nh;//此变量相当于群管理员
ros::Publisher fan=nh.advertise<std_msgs::String>("ye_xiao_topic",10);
//加入群聊ye_xiao_topic
while (ros::ok())//一直在群聊发消息寻找饭搭子。
{
/* code */
printf("好罪恶,快一起吃夜宵!\n");
std_msgs::String msg;//定义在群里面要发送的消息类型是std_msgs中的String类型
msg.data="吃炒米粉,吃炸鸡!";//不断在群消息里面发消息寻找饭搭子
fan.publish(msg);//fan将消息发布出去
}
}
对所写代码进行编译环境的配置在工作去找到Cmake.Lists.txt文件双击打开,在build一栏下面Declare a C++ executable一栏下面【双#表示解释,单#表示指令】,将单#那一条指令,add_executable(${PROJECT_NAME}_node src/fan_pkg_node.cpp)粘贴复制到最下面。并将其修改为add_executable(fan_node src/fan_node.cpp),括号的内容表示(什么节点/待编译的文件)。除此之外,build的最后的三行指令同样去掉单#复制到文件的最末尾,将target_link_libraries(${PROJECT_NAME}_node修改为target_link_libraries(fan_node,最终修改之后如下图所示:
2.2.2 消息订阅者的程序编写
按照以上内容重新创建包与节点与文件,此时我创建的为xie_node,进入vs进行程序的编辑,由于我们是消息订阅者,可以写一个回调函数,将接受到的消息打印出来,涉及到一个新的函数ros::spinOnce();相当于一会儿又进行对群里的消息进行窥屏,嘿嘿。程序代码如下:
#include<ros/ros.h>
#include<std_msgs/String.h>
void xie_callback(std_msgs::String mgs)
{
ROS_INFO(mgs.data.c_str());//进行数据类型的一个转换,来接受fan发送的消息
}
int main(int argc,char *argv[])
{
setlocale(LC_ALL,"");//设置本地模式,不然中文显示乱码
ros::init(argc,argv,"xie_node");//对节点进行初始化
ros::NodeHandle nh;//定义群管家
ros::Subscriber xie=nh.subscribe("ye_xiao_topic",10,xie_callback);
//相当于进群申请,已加入群聊,加入ye_xiao_topic
while (ros::ok())//循环里面不断的对群消息进行窥屏
{
/* code */
ros::spinOnce();
}
return 0;
}
最后像以上内容一样进行编译文件配置。
三.运行节点
打开终端输入以下指令:
cd catkin_ws //进入工作空间
catkin _make //编译
成功之后就像以上一样进行source ./devel/setup.bash
然后进行roscore,再打开新的终端运行rosrun <包的名称> <节点名称>,最后开一个新的终端运行另一个节点。,代码如下:
roscore //启动ros核心,第一个终端
rosrun fan_pkg fan_node //第二个终端,运行节点
rosrun xie_pkg xie_node //第三个终端,运行节点
运行结果如下: