ROS实战篇(一)如何在ROS中编写自己的package?------ 以节点通信为例

package(软件包),是ROS项目的基本组成单位,每个package都有其特定的实现功能。本文以在ROS中自己从零开始实现节点通信为例,讲解如何编写自己的package。

1、创建工作区,即工作目录:

mkdir -p ~/roswhite_ws/src

这里使用 -p 关键字,可以创建两层目录,即roswhite和子目录src。

我们自己创建的package或者从别人那里拷贝过来的package必须要放在src目录下。

2、创建package

进入src

cd ~/roswhite_ws/src

创建package目录

catkin_create_pkg roswhite std_msgs roscpp

roswhite是package名称(最好不要有大写), std_msgs(ROS原始数据类型)和roscpp(如果用python编程,就用rospy)是依赖项。

3、编写cpp文件

进入刚刚创建的package目录下

cd ~/roswhite_ws/src/roswhite/src

使用vim创建cpp文件,这里我们需要两个文件,一个用于发布递增数字(topic_publisher.cpp),另一个用于订阅已经发布的数字(topic_subscribler.cpp)。

1) vim topic_publisher.cpp

内容如下:

#include "ros/ros.h"
#include "std_msgs/Int32.h"

int main(int argc, char **argv)
{
	ros::init(argc, argv, "topic_publisher");
	ros::NodeHandle node_handle;

	ros::Publisher pub_number = node_handle.advertise<std_msgs::Int32>("/count",10);
	ros::Rate rate(1);
	int number_count = 0;
	while(ros::ok())
	{
		std_msgs::Int32 msg;
		msg.data = number_count;
		pub_number.publish(msg);

		ROS_INFO("%d", msg.data);

		ros::spinOnce();
		rate.sleep();
		number_count++;
	}

	return 0;
}

2) vim topic_subscribler.cpp

内容如下

#include 
#include 

void num_callback(const std_msgs::Int32::ConstPtr& msg)
{
ROS_INFO("Get Topic Msg: [%d]",msg->data);
}

int main(int argc, char **argv)
{
	ros::init(argc, argv, "topic_subscribler");
	ros::NodeHandle node_handle;

	ros::Subscriber number_subscriber = node_handle.subscribe("/count", 10, num_callback);

	ros::spin();
	return 0;
}

4、修改CMakeLists.txt配置文件

这里注意,修改的是~/roswhite_ws/src/roswhite/目录下的CMakeLists.txt配置文件。

1)将cpp文件设置为节点:

ROS实战篇(一)如何在ROS中编写自己的package?------ 以节点通信为例_第1张图片
2)完成与库的链接

ROS实战篇(一)如何在ROS中编写自己的package?------ 以节点通信为例_第2张图片
5、编译执行

回到工作区根目录下进行编译:

cd ~/roswhite_ws/
catkin_make
source devel/setup.bash

打开ROS核心

roscore

执行发布数据的节点:

rosrun roswhite publish_node 

另外打开一个新的terminal

cd ~/roswhite_ws/

注意:新的terminal需要重新配置environment,即:

source devel/setup.bash

执行接受数据的节点:

rosrun roswhite subscribe_node

6、结果:

接受节点:
ROS实战篇(一)如何在ROS中编写自己的package?------ 以节点通信为例_第3张图片
发布数据的节点:

ROS实战篇(一)如何在ROS中编写自己的package?------ 以节点通信为例_第4张图片
最终实现了节点之间的一个简单通信,即接收节点接收到了发布节点发出的递增数字。

本文内容参考了大佬的视频教程:https://www.bilibili.com/video/BV1rT4y1L7eb

你可能感兴趣的:(c++,linux)